Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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)  * cs.c -- Kernel Card Services - core services
^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)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/moduleparam.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/major.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #include <linux/ioport.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #include <linux/pm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #include <linux/kthread.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #include <linux/freezer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #include <asm/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #include <pcmcia/ss.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #include <pcmcia/cistpl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #include <pcmcia/cisreg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #include <pcmcia/ds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #include "cs_internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) /* Module parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) MODULE_DESCRIPTION("Linux Kernel Card Services");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) INT_MODULE_PARM(setup_delay,	10);		/* centiseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) INT_MODULE_PARM(resume_delay,	20);		/* centiseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) INT_MODULE_PARM(shutdown_delay,	3);		/* centiseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) INT_MODULE_PARM(vcc_settle,	40);		/* centiseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) INT_MODULE_PARM(reset_time,	10);		/* usecs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) INT_MODULE_PARM(unreset_delay,	10);		/* centiseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) INT_MODULE_PARM(unreset_check,	10);		/* centiseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) INT_MODULE_PARM(unreset_limit,	30);		/* unreset_check's */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) /* Access speed for attribute memory windows */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) INT_MODULE_PARM(cis_speed,	300);		/* ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) socket_state_t dead_socket = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	.csc_mask	= SS_DETECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) EXPORT_SYMBOL(dead_socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) /* List of all sockets, protected by a rwsem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) LIST_HEAD(pcmcia_socket_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) EXPORT_SYMBOL(pcmcia_socket_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) DECLARE_RWSEM(pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) EXPORT_SYMBOL(pcmcia_socket_list_rwsem);
^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) struct pcmcia_socket *pcmcia_get_socket(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	struct device *dev = get_device(&skt->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	return dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) EXPORT_SYMBOL(pcmcia_get_socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) void pcmcia_put_socket(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	put_device(&skt->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) EXPORT_SYMBOL(pcmcia_put_socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) static void pcmcia_release_socket(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	struct pcmcia_socket *socket = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	complete(&socket->socket_released);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) static int pccardd(void *__skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  * pcmcia_register_socket - add a new pcmcia socket device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)  * @socket: the &socket to register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) int pcmcia_register_socket(struct pcmcia_socket *socket)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	struct task_struct *tsk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	if (!socket || !socket->ops || !socket->dev.parent || !socket->resource_ops)
^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) 	dev_dbg(&socket->dev, "pcmcia_register_socket(0x%p)\n", socket->ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	/* try to obtain a socket number [yes, it gets ugly if we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	 * register more than 2^sizeof(unsigned int) pcmcia
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	 * sockets... but the socket number is deprecated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	 * anyways, so I don't care] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	down_write(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	if (list_empty(&pcmcia_socket_list))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 		socket->sock = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 		unsigned int found, i = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 		struct pcmcia_socket *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 			found = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 			list_for_each_entry(tmp, &pcmcia_socket_list, socket_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 				if (tmp->sock == i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 					found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 			i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 		} while (!found);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		socket->sock = i - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	list_add_tail(&socket->socket_list, &pcmcia_socket_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	up_write(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #ifndef CONFIG_CARDBUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	 * If we do not support Cardbus, ensure that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	 * the Cardbus socket capability is disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	socket->features &= ~SS_CAP_CARDBUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	/* set proper values in socket->dev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	dev_set_drvdata(&socket->dev, socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	socket->dev.class = &pcmcia_socket_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	dev_set_name(&socket->dev, "pcmcia_socket%u", socket->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	/* base address = 0, map = 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	socket->cis_mem.flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	socket->cis_mem.speed = cis_speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	INIT_LIST_HEAD(&socket->cis_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	init_completion(&socket->socket_released);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	init_completion(&socket->thread_done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	mutex_init(&socket->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	mutex_init(&socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	spin_lock_init(&socket->thread_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	if (socket->resource_ops->init) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 		mutex_lock(&socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 		ret = socket->resource_ops->init(socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 		mutex_unlock(&socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 			goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	tsk = kthread_run(pccardd, socket, "pccardd");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	if (IS_ERR(tsk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 		ret = PTR_ERR(tsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	wait_for_completion(&socket->thread_done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	if (!socket->thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		dev_warn(&socket->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 			 "PCMCIA: warning: socket thread did not start\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	pcmcia_parse_events(socket, SS_DETECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	 * Let's try to get the PCMCIA module for 16-bit PCMCIA support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	 * If it fails, it doesn't matter -- we still have 32-bit CardBus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	 * support to offer, so this is not a failure mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	request_module_nowait("pcmcia");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)  err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	down_write(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	list_del(&socket->socket_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	up_write(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) } /* pcmcia_register_socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) EXPORT_SYMBOL(pcmcia_register_socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)  * pcmcia_unregister_socket - remove a pcmcia socket device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)  * @socket: the &socket to unregister
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) void pcmcia_unregister_socket(struct pcmcia_socket *socket)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	if (!socket)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	dev_dbg(&socket->dev, "pcmcia_unregister_socket(0x%p)\n", socket->ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	if (socket->thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 		kthread_stop(socket->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	/* remove from our own list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	down_write(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	list_del(&socket->socket_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	up_write(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	/* wait for sysfs to drop all references */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	if (socket->resource_ops->exit) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		mutex_lock(&socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		socket->resource_ops->exit(socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		mutex_unlock(&socket->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	wait_for_completion(&socket->socket_released);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) } /* pcmcia_unregister_socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) EXPORT_SYMBOL(pcmcia_unregister_socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	struct pcmcia_socket *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	down_read(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	list_for_each_entry(s, &pcmcia_socket_list, socket_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		if (s->sock == nr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 			up_read(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 			return s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	up_read(&pcmcia_socket_list_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) EXPORT_SYMBOL(pcmcia_get_socket_by_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) static int socket_reset(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	int status, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	dev_dbg(&skt->dev, "reset\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	skt->ops->set_socket(skt, &skt->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	udelay((long)reset_time);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	skt->socket.flags &= ~SS_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	skt->ops->set_socket(skt, &skt->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	msleep(unreset_delay * 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	for (i = 0; i < unreset_limit; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 		skt->ops->get_status(skt, &status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 		if (!(status & SS_DETECT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 			return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 		if (status & SS_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 		msleep(unreset_check * 10);
^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) 	dev_err(&skt->dev, "time out after reset\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)  * socket_setup() and socket_shutdown() are called by the main event handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)  * when card insertion and removal events are received.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)  * socket_setup() turns on socket power and resets the socket, in two stages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)  * socket_shutdown() unconfigures a socket and turns off socket power.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static void socket_shutdown(struct pcmcia_socket *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	dev_dbg(&s->dev, "shutdown\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	if (s->callback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 		s->callback->remove(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	mutex_lock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	s->state &= SOCKET_INUSE | SOCKET_PRESENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	msleep(shutdown_delay * 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	s->state &= SOCKET_INUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	/* Blank out the socket state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	s->socket = dead_socket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	s->ops->init(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	s->ops->set_socket(s, &s->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	s->lock_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	kfree(s->fake_cis);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	s->fake_cis = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	s->functions = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	/* From here on we can be sure that only we (that is, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	 * pccardd thread) accesses this socket, and all (16-bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	 * PCMCIA interactions are gone. Therefore, release
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	 * ops_mutex so that we don't get a sysfs-related lockdep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	 * warning.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	mutex_unlock(&s->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) #ifdef CONFIG_CARDBUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	cb_free(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	/* give socket some time to power down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	s->ops->get_status(s, &status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	if (status & SS_POWERON) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 		dev_err(&s->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 			"*** DANGER *** unable to remove socket power\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	s->state &= ~SOCKET_INUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	int status, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	dev_dbg(&skt->dev, "setup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	skt->ops->get_status(skt, &status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	if (!(status & SS_DETECT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	msleep(initial_delay * 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	for (i = 0; i < 100; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 		skt->ops->get_status(skt, &status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 		if (!(status & SS_DETECT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 			return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 		if (!(status & SS_PENDING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 		msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	if (status & SS_PENDING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 		dev_err(&skt->dev, "voltage interrogation timed out\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 		return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	if (status & SS_CARDBUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		if (!(skt->features & SS_CAP_CARDBUS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 			dev_err(&skt->dev, "cardbus cards are not supported\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 		skt->state |= SOCKET_CARDBUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 		skt->state &= ~SOCKET_CARDBUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	 * Decode the card voltage requirements, and apply power to the card.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	if (status & SS_3VCARD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 		skt->socket.Vcc = skt->socket.Vpp = 33;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	else if (!(status & SS_XVCARD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		skt->socket.Vcc = skt->socket.Vpp = 50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 		dev_err(&skt->dev, "unsupported voltage key\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	if (skt->power_hook)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 		skt->power_hook(skt, HOOK_POWER_PRE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	skt->socket.flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	skt->ops->set_socket(skt, &skt->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	 * Wait "vcc_settle" for the supply to stabilise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	msleep(vcc_settle * 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	skt->ops->get_status(skt, &status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	if (!(status & SS_POWERON)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 		dev_err(&skt->dev, "unable to apply power\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	status = socket_reset(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	if (skt->power_hook)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 		skt->power_hook(skt, HOOK_POWER_POST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)  * Handle card insertion.  Setup the socket, reset the card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)  * and then tell the rest of PCMCIA that a card is present.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) static int socket_insert(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	dev_dbg(&skt->dev, "insert\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 	if (skt->state & SOCKET_INUSE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 		mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	skt->state |= SOCKET_INUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	ret = socket_setup(skt, setup_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	if (ret == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 		skt->state |= SOCKET_PRESENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 		dev_notice(&skt->dev, "pccard: %s card inserted into slot %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 			   (skt->state & SOCKET_CARDBUS) ? "CardBus" : "PCMCIA",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 			   skt->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) #ifdef CONFIG_CARDBUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 		if (skt->state & SOCKET_CARDBUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 			cb_alloc(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 			skt->state |= SOCKET_CARDBUS_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 		dev_dbg(&skt->dev, "insert done\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 		mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 		if (!(skt->state & SOCKET_CARDBUS) && (skt->callback))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 			skt->callback->add(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 		mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 		socket_shutdown(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) static int socket_suspend(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	if ((skt->state & SOCKET_SUSPEND) && !(skt->state & SOCKET_IN_RESUME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 	mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	/* store state on first suspend, but not after spurious wakeups */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	if (!(skt->state & SOCKET_IN_RESUME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 		skt->suspended_state = skt->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	skt->socket = dead_socket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	skt->ops->set_socket(skt, &skt->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	if (skt->ops->suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 		skt->ops->suspend(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	skt->state |= SOCKET_SUSPEND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	skt->state &= ~SOCKET_IN_RESUME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) static int socket_early_resume(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	skt->socket = dead_socket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 	skt->ops->init(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	skt->ops->set_socket(skt, &skt->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	if (skt->state & SOCKET_PRESENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 		skt->resume_status = socket_setup(skt, resume_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 	skt->state |= SOCKET_IN_RESUME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 	mutex_unlock(&skt->ops_mutex);
^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) static int socket_late_resume(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 	mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	skt->state &= ~(SOCKET_SUSPEND | SOCKET_IN_RESUME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	if (!(skt->state & SOCKET_PRESENT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 		ret = socket_insert(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 		if (ret == -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	if (skt->resume_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 		socket_shutdown(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	if (skt->suspended_state != skt->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 		dev_dbg(&skt->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 			"suspend state 0x%x != resume state 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 			skt->suspended_state, skt->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 		socket_shutdown(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 		return socket_insert(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 	if (!(skt->state & SOCKET_CARDBUS) && (skt->callback))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 		ret = skt->callback->early_resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)  * Finalize the resume. In case of a cardbus socket, we have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)  * to rebind the devices as we can't be certain that it has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)  * replaced, or not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) static int socket_complete_resume(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) #ifdef CONFIG_CARDBUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 	if (skt->state & SOCKET_CARDBUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 		/* We can't be sure the CardBus card is the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 		 * as the one previously inserted. Therefore, remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 		 * and re-add... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 		cb_free(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 		ret = cb_alloc(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 			cb_free(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)  * Resume a socket.  If a card is present, verify its CIS against
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)  * our cached copy.  If they are different, the card has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)  * replaced, and we need to tell the drivers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) static int socket_resume(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	if (!(skt->state & SOCKET_SUSPEND))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 	socket_early_resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	err = socket_late_resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 		err = socket_complete_resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) static void socket_remove(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	dev_notice(&skt->dev, "pccard: card ejected from slot %d\n", skt->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	socket_shutdown(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)  * Process a socket card detect status change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)  * If we don't have a card already present, delay the detect event for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)  * about 20ms (to be on the safe side) before reading the socket status.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)  * Some i82365-based systems send multiple SS_DETECT events during card
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)  * insertion, and the "card present" status bit seems to bounce.  This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)  * will probably be true with GPIO-based card detection systems after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)  * the product has aged.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) static void socket_detect_change(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 	if (!(skt->state & SOCKET_SUSPEND)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 		int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 		if (!(skt->state & SOCKET_PRESENT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 			msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 		skt->ops->get_status(skt, &status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 		if ((skt->state & SOCKET_PRESENT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 		     !(status & SS_DETECT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 			socket_remove(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 		if (!(skt->state & SOCKET_PRESENT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 		    (status & SS_DETECT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 			socket_insert(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) static int pccardd(void *__skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 	struct pcmcia_socket *skt = __skt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 	skt->thread = current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 	skt->socket = dead_socket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 	skt->ops->init(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 	skt->ops->set_socket(skt, &skt->socket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 	/* register with the device core */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 	ret = device_register(&skt->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 		dev_warn(&skt->dev, "PCMCIA: unable to register socket\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 		skt->thread = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 		complete(&skt->thread_done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 	ret = pccard_sysfs_add_socket(&skt->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 		dev_warn(&skt->dev, "err %d adding socket attributes\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 	complete(&skt->thread_done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 	/* wait for userspace to catch up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 	msleep(250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 	set_freezable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 	for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 		unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 		unsigned int events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 		unsigned int sysfs_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 		spin_lock_irqsave(&skt->thread_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 		events = skt->thread_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 		skt->thread_events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 		sysfs_events = skt->sysfs_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 		skt->sysfs_events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 		spin_unlock_irqrestore(&skt->thread_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 		mutex_lock(&skt->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 		if (events & SS_DETECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 			socket_detect_change(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 		if (sysfs_events) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 			if (sysfs_events & PCMCIA_UEVENT_EJECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 				socket_remove(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 			if (sysfs_events & PCMCIA_UEVENT_INSERT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 				socket_insert(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 			if ((sysfs_events & PCMCIA_UEVENT_SUSPEND) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 				!(skt->state & SOCKET_CARDBUS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 				if (skt->callback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 					ret = skt->callback->suspend(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 					ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 				if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 					socket_suspend(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 					msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 			if ((sysfs_events & PCMCIA_UEVENT_RESUME) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 				!(skt->state & SOCKET_CARDBUS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 				ret = socket_resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 				if (!ret && skt->callback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 					skt->callback->resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 			if ((sysfs_events & PCMCIA_UEVENT_REQUERY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 				!(skt->state & SOCKET_CARDBUS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 				if (!ret && skt->callback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 					skt->callback->requery(skt);
^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) 		mutex_unlock(&skt->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 		if (events || sysfs_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 		set_current_state(TASK_INTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 		if (kthread_should_stop())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 		schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 		try_to_freeze();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 	/* make sure we are running before we exit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 	__set_current_state(TASK_RUNNING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 	/* shut down socket, if a device is still present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 	if (skt->state & SOCKET_PRESENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 		mutex_lock(&skt->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 		socket_remove(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 		mutex_unlock(&skt->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 	/* remove from the device core */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 	pccard_sysfs_remove_socket(&skt->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 	device_unregister(&skt->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)  * Yenta (at least) probes interrupts before registering the socket and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)  * starting the handler thread.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 	dev_dbg(&s->dev, "parse_events: events %08x\n", events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 	if (s->thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 		spin_lock_irqsave(&s->thread_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 		s->thread_events |= events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 		spin_unlock_irqrestore(&s->thread_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 		wake_up_process(s->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) } /* pcmcia_parse_events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) EXPORT_SYMBOL(pcmcia_parse_events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)  * pcmcia_parse_uevents() - tell pccardd to issue manual commands
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)  * @s:		the PCMCIA socket we wan't to command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)  * @events:	events to pass to pccardd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)  * userspace-issued insert, eject, suspend and resume commands must be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)  * handled by pccardd to avoid any sysfs-related deadlocks. Valid events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)  * are PCMCIA_UEVENT_EJECT (for eject), PCMCIA_UEVENT__INSERT (for insert),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)  * PCMCIA_UEVENT_RESUME (for resume), PCMCIA_UEVENT_SUSPEND (for suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)  * and PCMCIA_UEVENT_REQUERY (for re-querying the PCMCIA card).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) void pcmcia_parse_uevents(struct pcmcia_socket *s, u_int events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 	dev_dbg(&s->dev, "parse_uevents: events %08x\n", events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 	if (s->thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 		spin_lock_irqsave(&s->thread_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 		s->sysfs_events |= events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 		spin_unlock_irqrestore(&s->thread_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 		wake_up_process(s->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) EXPORT_SYMBOL(pcmcia_parse_uevents);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) /* register pcmcia_callback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 	/* s->skt_mutex also protects s->callback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 	mutex_lock(&s->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 	if (c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 		/* registration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 		if (s->callback) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 			ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 			goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 		s->callback = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 		if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 			s->callback->add(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 		s->callback = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)  err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 	mutex_unlock(&s->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) EXPORT_SYMBOL(pccard_register_pcmcia);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) /* I'm not sure which "reset" function this is supposed to use,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)  * but for now, it uses the low-level interface's reset, not the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)  * CIS register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) int pcmcia_reset_card(struct pcmcia_socket *skt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 	dev_dbg(&skt->dev, "resetting socket\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 	mutex_lock(&skt->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 		if (!(skt->state & SOCKET_PRESENT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) 			dev_dbg(&skt->dev, "can't reset, not present\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) 			ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) 		if (skt->state & SOCKET_SUSPEND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) 			dev_dbg(&skt->dev, "can't reset, suspended\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 			ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 		if (skt->state & SOCKET_CARDBUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 			dev_dbg(&skt->dev, "can't reset, is cardbus\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) 			ret = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 		if (skt->callback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) 			skt->callback->suspend(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) 		mutex_lock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) 		ret = socket_reset(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 		mutex_unlock(&skt->ops_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) 		if ((ret == 0) && (skt->callback))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) 			skt->callback->resume(skt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) 	} while (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) 	mutex_unlock(&skt->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) } /* reset_card */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) EXPORT_SYMBOL(pcmcia_reset_card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) static int pcmcia_socket_uevent(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) 				struct kobj_uevent_env *env)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) 	struct pcmcia_socket *s = container_of(dev, struct pcmcia_socket, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) 	if (add_uevent_var(env, "SOCKET_NO=%u", s->sock))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) static struct completion pcmcia_unload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) static void pcmcia_release_socket_class(struct class *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) 	complete(&pcmcia_unload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) }
^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) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) static int __pcmcia_pm_op(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) 			  int (*callback) (struct pcmcia_socket *skt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) 	struct pcmcia_socket *s = container_of(dev, struct pcmcia_socket, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) 	mutex_lock(&s->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) 	ret = callback(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) 	mutex_unlock(&s->skt_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) static int pcmcia_socket_dev_suspend_noirq(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) 	return __pcmcia_pm_op(dev, socket_suspend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) static int pcmcia_socket_dev_resume_noirq(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) 	return __pcmcia_pm_op(dev, socket_early_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) static int __used pcmcia_socket_dev_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) 	return __pcmcia_pm_op(dev, socket_late_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) static void __used pcmcia_socket_dev_complete(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) 	WARN(__pcmcia_pm_op(dev, socket_complete_resume),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) 		"failed to complete resume");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) static const struct dev_pm_ops pcmcia_socket_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) 	/* dev_resume may be called with IRQs enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) 	SET_SYSTEM_SLEEP_PM_OPS(NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) 				pcmcia_socket_dev_resume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) 	/* late suspend must be called with IRQs disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) 	.suspend_noirq = pcmcia_socket_dev_suspend_noirq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) 	.freeze_noirq = pcmcia_socket_dev_suspend_noirq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) 	.poweroff_noirq = pcmcia_socket_dev_suspend_noirq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) 	/* early resume must be called with IRQs disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) 	.resume_noirq = pcmcia_socket_dev_resume_noirq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) 	.thaw_noirq = pcmcia_socket_dev_resume_noirq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) 	.restore_noirq = pcmcia_socket_dev_resume_noirq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) 	.complete = pcmcia_socket_dev_complete,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) #define PCMCIA_SOCKET_CLASS_PM_OPS (&pcmcia_socket_pm_ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) #else /* CONFIG_PM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) #define PCMCIA_SOCKET_CLASS_PM_OPS NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) #endif /* CONFIG_PM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) struct class pcmcia_socket_class = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) 	.name = "pcmcia_socket",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) 	.dev_uevent = pcmcia_socket_uevent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) 	.dev_release = pcmcia_release_socket,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) 	.class_release = pcmcia_release_socket_class,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) 	.pm = PCMCIA_SOCKET_CLASS_PM_OPS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) EXPORT_SYMBOL(pcmcia_socket_class);
^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 __init init_pcmcia_cs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) 	init_completion(&pcmcia_unload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) 	return class_register(&pcmcia_socket_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) static void __exit exit_pcmcia_cs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) 	class_unregister(&pcmcia_socket_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) 	wait_for_completion(&pcmcia_unload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) subsys_initcall(init_pcmcia_cs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) module_exit(exit_pcmcia_cs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)