1 /*======================================================================
3 Kernel Card Services -- core services
5 cs.c 1.271 2000/10/02 20:27:49
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in which
23 case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
32 ======================================================================*/
34 #include <linux/module.h>
35 #include <linux/init.h>
36 #include <linux/kernel.h>
37 #include <linux/config.h>
38 #include <linux/string.h>
39 #include <linux/major.h>
40 #include <linux/errno.h>
41 #include <linux/slab.h>
43 #include <linux/sched.h>
44 #include <linux/timer.h>
45 #include <linux/ioport.h>
46 #include <linux/delay.h>
47 #include <linux/proc_fs.h>
49 #include <linux/pci.h>
50 #include <asm/system.h>
53 #define IN_CARD_SERVICES
54 #include <pcmcia/version.h>
55 #include <pcmcia/cs_types.h>
56 #include <pcmcia/ss.h>
57 #include <pcmcia/cs.h>
58 #include <pcmcia/bulkmem.h>
59 #include <pcmcia/cistpl.h>
60 #include <pcmcia/cisreg.h>
61 #include <pcmcia/bus_ops.h>
62 #include "cs_internal.h"
65 #define PCI_OPT " [pci]"
70 #define CB_OPT " [cardbus]"
75 #define PM_OPT " [pm]"
79 #if !defined(CONFIG_CARDBUS) && !defined(CONFIG_PCI) && !defined(CONFIG_PM)
80 #define OPTIONS " none"
82 #define OPTIONS PCI_OPT CB_OPT PM_OPT
85 static const char *release = "Linux Kernel Card Services " CS_RELEASE;
86 static const char *options = "options: " OPTIONS;
88 /*====================================================================*/
90 /* Module parameters */
92 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
93 MODULE_DESCRIPTION("Linux Kernel Card Services " CS_RELEASE
94 "\n options:" OPTIONS);
95 MODULE_LICENSE("Dual MPL/GPL");
97 #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
99 INT_MODULE_PARM(setup_delay, 10); /* centiseconds */
100 INT_MODULE_PARM(resume_delay, 20); /* centiseconds */
101 INT_MODULE_PARM(shutdown_delay, 3); /* centiseconds */
102 INT_MODULE_PARM(vcc_settle, 40); /* centiseconds */
103 INT_MODULE_PARM(reset_time, 10); /* usecs */
104 INT_MODULE_PARM(unreset_delay, 10); /* centiseconds */
105 INT_MODULE_PARM(unreset_check, 10); /* centiseconds */
106 INT_MODULE_PARM(unreset_limit, 30); /* unreset_check's */
108 /* Access speed for attribute memory windows */
109 INT_MODULE_PARM(cis_speed, 300); /* ns */
111 /* Access speed for IO windows */
112 INT_MODULE_PARM(io_speed, 0); /* ns */
114 /* Optional features */
116 INT_MODULE_PARM(do_apm, 1);
118 INT_MODULE_PARM(do_apm, 0);
122 INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
123 static const char *version =
124 "cs.c 1.279 2001/10/13 00:08:28 (David Hinds)";
127 /*====================================================================*/
129 socket_state_t dead_socket = {
130 0, SS_DETECT, 0, 0, 0
133 /* Table of sockets */
134 socket_t sockets = 0;
135 socket_info_t *socket_table[MAX_SOCK];
137 #ifdef CONFIG_PROC_FS
138 struct proc_dir_entry *proc_pccard = NULL;
141 /*====================================================================*/
143 /* String tables for error messages */
145 typedef struct lookup_t {
150 static const lookup_t error_table[] = {
151 { CS_SUCCESS, "Operation succeeded" },
152 { CS_BAD_ADAPTER, "Bad adapter" },
153 { CS_BAD_ATTRIBUTE, "Bad attribute", },
154 { CS_BAD_BASE, "Bad base address" },
155 { CS_BAD_EDC, "Bad EDC" },
156 { CS_BAD_IRQ, "Bad IRQ" },
157 { CS_BAD_OFFSET, "Bad offset" },
158 { CS_BAD_PAGE, "Bad page number" },
159 { CS_READ_FAILURE, "Read failure" },
160 { CS_BAD_SIZE, "Bad size" },
161 { CS_BAD_SOCKET, "Bad socket" },
162 { CS_BAD_TYPE, "Bad type" },
163 { CS_BAD_VCC, "Bad Vcc" },
164 { CS_BAD_VPP, "Bad Vpp" },
165 { CS_BAD_WINDOW, "Bad window" },
166 { CS_WRITE_FAILURE, "Write failure" },
167 { CS_NO_CARD, "No card present" },
168 { CS_UNSUPPORTED_FUNCTION, "Usupported function" },
169 { CS_UNSUPPORTED_MODE, "Unsupported mode" },
170 { CS_BAD_SPEED, "Bad speed" },
171 { CS_BUSY, "Resource busy" },
172 { CS_GENERAL_FAILURE, "General failure" },
173 { CS_WRITE_PROTECTED, "Write protected" },
174 { CS_BAD_ARG_LENGTH, "Bad argument length" },
175 { CS_BAD_ARGS, "Bad arguments" },
176 { CS_CONFIGURATION_LOCKED, "Configuration locked" },
177 { CS_IN_USE, "Resource in use" },
178 { CS_NO_MORE_ITEMS, "No more items" },
179 { CS_OUT_OF_RESOURCE, "Out of resource" },
180 { CS_BAD_HANDLE, "Bad handle" },
181 { CS_BAD_TUPLE, "Bad CIS tuple" }
183 #define ERROR_COUNT (sizeof(error_table)/sizeof(lookup_t))
185 static const lookup_t service_table[] = {
186 { AccessConfigurationRegister, "AccessConfigurationRegister" },
187 { AddSocketServices, "AddSocketServices" },
188 { AdjustResourceInfo, "AdjustResourceInfo" },
189 { CheckEraseQueue, "CheckEraseQueue" },
190 { CloseMemory, "CloseMemory" },
191 { DeregisterClient, "DeregisterClient" },
192 { DeregisterEraseQueue, "DeregisterEraseQueue" },
193 { GetCardServicesInfo, "GetCardServicesInfo" },
194 { GetClientInfo, "GetClientInfo" },
195 { GetConfigurationInfo, "GetConfigurationInfo" },
196 { GetEventMask, "GetEventMask" },
197 { GetFirstClient, "GetFirstClient" },
198 { GetFirstRegion, "GetFirstRegion" },
199 { GetFirstTuple, "GetFirstTuple" },
200 { GetNextClient, "GetNextClient" },
201 { GetNextRegion, "GetNextRegion" },
202 { GetNextTuple, "GetNextTuple" },
203 { GetStatus, "GetStatus" },
204 { GetTupleData, "GetTupleData" },
205 { MapMemPage, "MapMemPage" },
206 { ModifyConfiguration, "ModifyConfiguration" },
207 { ModifyWindow, "ModifyWindow" },
208 { OpenMemory, "OpenMemory" },
209 { ParseTuple, "ParseTuple" },
210 { ReadMemory, "ReadMemory" },
211 { RegisterClient, "RegisterClient" },
212 { RegisterEraseQueue, "RegisterEraseQueue" },
213 { RegisterMTD, "RegisterMTD" },
214 { ReleaseConfiguration, "ReleaseConfiguration" },
215 { ReleaseIO, "ReleaseIO" },
216 { ReleaseIRQ, "ReleaseIRQ" },
217 { ReleaseWindow, "ReleaseWindow" },
218 { RequestConfiguration, "RequestConfiguration" },
219 { RequestIO, "RequestIO" },
220 { RequestIRQ, "RequestIRQ" },
221 { RequestSocketMask, "RequestSocketMask" },
222 { RequestWindow, "RequestWindow" },
223 { ResetCard, "ResetCard" },
224 { SetEventMask, "SetEventMask" },
225 { ValidateCIS, "ValidateCIS" },
226 { WriteMemory, "WriteMemory" },
227 { BindDevice, "BindDevice" },
228 { BindMTD, "BindMTD" },
229 { ReportError, "ReportError" },
230 { SuspendCard, "SuspendCard" },
231 { ResumeCard, "ResumeCard" },
232 { EjectCard, "EjectCard" },
233 { InsertCard, "InsertCard" },
234 { ReplaceCIS, "ReplaceCIS" }
236 #define SERVICE_COUNT (sizeof(service_table)/sizeof(lookup_t))
238 /*======================================================================
240 These functions are just shorthand for the actual low-level drivers
242 ======================================================================*/
244 static int register_callback(socket_info_t *s, void (*handler)(void *, unsigned int), void * info)
246 return s->ss_entry->register_callback(s->sock, handler, info);
249 static int get_socket_status(socket_info_t *s, int *val)
251 return s->ss_entry->get_status(s->sock, val);
254 static int set_socket(socket_info_t *s, socket_state_t *state)
256 return s->ss_entry->set_socket(s->sock, state);
259 static int set_io_map(socket_info_t *s, struct pccard_io_map *io)
261 return s->ss_entry->set_io_map(s->sock, io);
264 static int set_mem_map(socket_info_t *s, struct pccard_mem_map *mem)
266 return s->ss_entry->set_mem_map(s->sock, mem);
269 static int suspend_socket(socket_info_t *s)
271 s->socket = dead_socket;
272 return s->ss_entry->suspend(s->sock);
275 static int init_socket(socket_info_t *s)
277 s->socket = dead_socket;
278 return s->ss_entry->init(s->sock);
281 /*====================================================================*/
283 #if defined(CONFIG_PROC_FS) && defined(PCMCIA_DEBUG)
284 static int proc_read_clients(char *buf, char **start, off_t pos,
285 int count, int *eof, void *data)
287 socket_info_t *s = data;
291 for (c = s->clients; c; c = c->next)
292 p += sprintf(p, "fn %x: '%s' [attr 0x%04x] [state 0x%04x]\n",
293 c->Function, c->dev_info, c->Attributes, c->state);
298 /*======================================================================
300 Low-level PC Card interface drivers need to register with Card
301 Services using these calls.
303 ======================================================================*/
305 static int setup_socket(socket_info_t *);
306 static void shutdown_socket(socket_info_t *);
307 static void reset_socket(socket_info_t *);
308 static void unreset_socket(socket_info_t *);
309 static void parse_events(void *info, u_int events);
311 socket_info_t *pcmcia_register_socket (int slot,
312 struct pccard_operations * ss_entry,
318 DEBUG(0, "cs: pcmcia_register_socket(0x%p)\n", ss_entry);
320 s = kmalloc(sizeof(struct socket_info_t), GFP_KERNEL);
323 memset(s, 0, sizeof(socket_info_t));
325 s->ss_entry = ss_entry;
328 /* base address = 0, map = 0 */
329 s->cis_mem.flags = 0;
330 s->cis_mem.speed = cis_speed;
331 s->use_bus_pm = use_bus_pm;
332 s->erase_busy.next = s->erase_busy.prev = &s->erase_busy;
333 spin_lock_init(&s->lock);
335 for (i = 0; i < sockets; i++)
336 if (socket_table[i] == NULL) break;
338 if (i == sockets) sockets++;
341 ss_entry->inquire_socket(slot, &s->cap);
342 #ifdef CONFIG_PROC_FS
345 sprintf(name, "%02d", i);
346 s->proc = proc_mkdir(name, proc_pccard);
348 ss_entry->proc_setup(slot, s->proc);
351 create_proc_read_entry("clients", 0, s->proc,
352 proc_read_clients, s);
357 } /* pcmcia_register_socket */
359 int register_ss_entry(int nsock, struct pccard_operations * ss_entry)
363 DEBUG(0, "cs: register_ss_entry(%d, 0x%p)\n", nsock, ss_entry);
365 for (ns = 0; ns < nsock; ns++) {
366 pcmcia_register_socket (ns, ss_entry, 0);
370 } /* register_ss_entry */
372 /*====================================================================*/
374 void pcmcia_unregister_socket(socket_info_t *s)
379 for (j = 0; j < MAX_SOCK; j++)
380 if (socket_table [j] == s) {
387 #ifdef CONFIG_PROC_FS
390 sprintf(name, "%02d", socket);
392 remove_proc_entry("clients", s->proc);
394 remove_proc_entry(name, proc_pccard);
402 s->clients = s->clients->next;
408 socket_table[socket] = NULL;
409 for (j = socket; j < sockets-1; j++)
410 socket_table[j] = socket_table[j+1];
412 } /* pcmcia_unregister_socket */
414 void unregister_ss_entry(struct pccard_operations * ss_entry)
418 for (i = sockets-1; i >= 0; i-- ) {
419 socket_info_t *socket = socket_table[i];
420 if (socket->ss_entry == ss_entry)
421 pcmcia_unregister_socket (socket);
423 } /* unregister_ss_entry */
425 /*======================================================================
427 Shutdown_Socket() and setup_socket() are scheduled using add_timer
428 calls by the main event handler when card insertion and removal
429 events are received. Shutdown_Socket() unconfigures a socket and
430 turns off socket power. Setup_socket() turns on socket power
431 and resets the socket, in two stages.
433 ======================================================================*/
435 static void free_regions(memory_handle_t *list)
438 while (*list != NULL) {
440 *list = tmp->info.next;
441 tmp->region_magic = 0;
446 static int send_event(socket_info_t *s, event_t event, int priority);
449 * Sleep for n_cs centiseconds (1 cs = 1/100th of a second)
451 static void cs_sleep(unsigned int n_cs)
453 current->state = TASK_INTERRUPTIBLE;
454 schedule_timeout( (n_cs * HZ + 99) / 100);
457 static void shutdown_socket(socket_info_t *s)
461 DEBUG(1, "cs: shutdown_socket(%p)\n", s);
463 /* Blank out the socket state */
464 s->state &= SOCKET_PRESENT|SOCKET_SETUP_PENDING;
466 s->irq.AssignedIRQ = s->irq.Config = 0;
473 /* Should not the socket be forced quiet as well? e.g. turn off Vcc */
474 /* Without these changes, the socket is left hot, even though card-services */
475 /* realizes that no card is in place. */
476 s->socket.flags &= ~SS_OUTPUT_ENA;
479 s->socket.io_irq = 0;
480 set_socket(s, &s->socket);
482 #ifdef CONFIG_CARDBUS
483 cb_release_cis_mem(s);
491 for (c = &s->clients; *c; ) {
492 if ((*c)->state & CLIENT_UNBOUND) {
500 free_regions(&s->a_region);
501 free_regions(&s->c_region);
502 } /* shutdown_socket */
505 * Return zero if we think the card isn't actually present
507 static int setup_socket(socket_info_t *s)
510 int setup_timeout = 100;
512 /* Wait for "not pending" */
514 get_socket_status(s, &val);
515 if (!(val & SS_PENDING))
517 if (--setup_timeout) {
521 printk(KERN_NOTICE "cs: socket %p voltage interrogation"
527 if (val & SS_DETECT) {
528 DEBUG(1, "cs: setup_socket(%p): applying power\n", s);
529 s->state |= SOCKET_PRESENT;
530 s->socket.flags &= SS_DEBOUNCED;
532 s->socket.Vcc = s->socket.Vpp = 33;
533 else if (!(val & SS_XVCARD))
534 s->socket.Vcc = s->socket.Vpp = 50;
536 printk(KERN_NOTICE "cs: socket %p: unsupported "
540 if (val & SS_CARDBUS) {
541 s->state |= SOCKET_CARDBUS;
542 #ifndef CONFIG_CARDBUS
543 printk(KERN_NOTICE "cs: unsupported card type detected!\n");
546 set_socket(s, &s->socket);
547 cs_sleep(vcc_settle);
551 DEBUG(0, "cs: setup_socket(%p): no card!\n", s);
558 /*======================================================================
560 Reset_socket() and unreset_socket() handle hard resets. Resets
561 have several causes: card insertion, a call to reset_socket, or
562 recovery from a suspend/resume cycle. Unreset_socket() sends
563 a CS event that matches the cause of the reset.
565 ======================================================================*/
567 static void reset_socket(socket_info_t *s)
569 DEBUG(1, "cs: resetting socket %p\n", s);
570 s->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
571 set_socket(s, &s->socket);
572 udelay((long)reset_time);
573 s->socket.flags &= ~SS_RESET;
574 set_socket(s, &s->socket);
575 cs_sleep(unreset_delay);
580 (SOCKET_SETUP_PENDING|SOCKET_SUSPEND|SOCKET_RESET_PENDING)
582 static void unreset_socket(socket_info_t *s)
584 int setup_timeout = unreset_limit;
587 /* Wait for "ready" */
589 get_socket_status(s, &val);
592 DEBUG(2, "cs: socket %d not ready yet\n", s->sock);
593 if (--setup_timeout) {
594 cs_sleep(unreset_check);
597 printk(KERN_NOTICE "cs: socket %p timed out during"
598 " reset. Try increasing setup_delay.\n", s);
599 s->state &= ~EVENT_MASK;
603 DEBUG(1, "cs: reset done on socket %p\n", s);
604 if (s->state & SOCKET_SUSPEND) {
605 s->state &= ~EVENT_MASK;
606 if (verify_cis_cache(s) != 0)
607 parse_events(s, SS_DETECT);
609 send_event(s, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
610 } else if (s->state & SOCKET_SETUP_PENDING) {
611 #ifdef CONFIG_CARDBUS
612 if (s->state & SOCKET_CARDBUS)
615 send_event(s, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
616 s->state &= ~SOCKET_SETUP_PENDING;
618 send_event(s, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
619 if (s->reset_handle) {
620 s->reset_handle->event_callback_args.info = NULL;
621 EVENT(s->reset_handle, CS_EVENT_RESET_COMPLETE,
624 s->state &= ~EVENT_MASK;
626 } /* unreset_socket */
628 /*======================================================================
630 The central event handler. Send_event() sends an event to all
631 valid clients. Parse_events() interprets the event bits from
632 a card status change report. Do_shutdown() handles the high
633 priority stuff associated with a card removal.
635 ======================================================================*/
637 static int send_event(socket_info_t *s, event_t event, int priority)
639 client_t *client = s->clients;
641 DEBUG(1, "cs: send_event(sock %d, event %d, pri %d)\n",
642 s->sock, event, priority);
644 for (; client; client = client->next) {
645 if (client->state & (CLIENT_UNBOUND|CLIENT_STALE))
647 if (client->EventMask & event) {
648 ret = EVENT(client, event, priority);
656 static void do_shutdown(socket_info_t *s)
659 if (s->state & SOCKET_SHUTDOWN_PENDING)
661 s->state |= SOCKET_SHUTDOWN_PENDING;
662 send_event(s, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
663 for (client = s->clients; client; client = client->next)
664 if (!(client->Attributes & INFO_MASTER_CLIENT))
665 client->state |= CLIENT_STALE;
666 if (s->state & (SOCKET_SETUP_PENDING|SOCKET_RESET_PENDING)) {
667 DEBUG(0, "cs: flushing pending setup\n");
668 s->state &= ~EVENT_MASK;
670 cs_sleep(shutdown_delay);
671 s->state &= ~SOCKET_PRESENT;
675 static void parse_events(void *info, u_int events)
677 socket_info_t *s = info;
678 if (events & SS_DETECT) {
681 get_socket_status(s, &status);
682 if ((s->state & SOCKET_PRESENT) &&
683 (!(s->state & SOCKET_SUSPEND) ||
684 !(status & SS_DETECT)))
686 if (status & SS_DETECT) {
687 if (s->state & SOCKET_SETUP_PENDING) {
688 DEBUG(1, "cs: delaying pending setup\n");
691 s->state |= SOCKET_SETUP_PENDING;
692 if (s->state & SOCKET_SUSPEND)
693 cs_sleep(resume_delay);
695 cs_sleep(setup_delay);
696 s->socket.flags |= SS_DEBOUNCED;
697 if (setup_socket(s) == 0)
698 s->state &= ~SOCKET_SETUP_PENDING;
699 s->socket.flags &= ~SS_DEBOUNCED;
702 if (events & SS_BATDEAD)
703 send_event(s, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
704 if (events & SS_BATWARN)
705 send_event(s, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
706 if (events & SS_READY) {
707 if (!(s->state & SOCKET_RESET_PENDING))
708 send_event(s, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
709 else DEBUG(1, "cs: ready change during reset\n");
713 /*======================================================================
715 Another event handler, for power management events.
717 This does not comply with the latest PC Card spec for handling
718 power management events.
720 ======================================================================*/
722 void pcmcia_suspend_socket (socket_info_t *s)
724 if ((s->state & SOCKET_PRESENT) && !(s->state & SOCKET_SUSPEND)) {
725 send_event(s, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
727 s->state |= SOCKET_SUSPEND;
731 void pcmcia_resume_socket (socket_info_t *s)
735 /* Do this just to reinitialize the socket */
737 get_socket_status(s, &stat);
739 /* If there was or is a card here, we need to do something
740 about it... but parse_events will sort it all out. */
741 if ((s->state & SOCKET_PRESENT) || (stat & SS_DETECT))
742 parse_events(s, SS_DETECT);
745 static int handle_pm_event(struct pm_dev *dev, pm_request_t rqst, void *data)
750 /* only for busses that don't suspend/resume slots directly */
754 DEBUG(1, "cs: received suspend notification\n");
755 for (i = 0; i < sockets; i++) {
756 s = socket_table [i];
758 pcmcia_suspend_socket (socket_table [i]);
762 DEBUG(1, "cs: received resume notification\n");
763 for (i = 0; i < sockets; i++) {
764 s = socket_table [i];
766 pcmcia_resume_socket (socket_table [i]);
771 } /* handle_pm_event */
773 /*======================================================================
775 Special stuff for managing IO windows, because they are scarce.
777 ======================================================================*/
779 static int alloc_io_space(socket_info_t *s, u_int attr, ioaddr_t *base,
780 ioaddr_t num, u_int lines, char *name)
785 align = (*base) ? (lines ? 1<<lines : 0) : 1;
786 if (align && (align < num)) {
788 DEBUG(0, "odd IO request: num %04x align %04x\n",
792 while (align && (align < num)) align <<= 1;
794 if (*base & ~(align-1)) {
795 DEBUG(0, "odd IO request: base %04x align %04x\n",
799 if ((s->cap.features & SS_CAP_STATIC_MAP) && s->cap.io_offset) {
800 *base = s->cap.io_offset | (*base & 0x0fff);
803 /* Check for an already-allocated window that must conflict with
804 what was asked for. It is a hack because it does not catch all
805 potential conflicts, just the most obvious ones. */
806 for (i = 0; i < MAX_IO_WIN; i++)
807 if ((s->io[i].NumPorts != 0) &&
808 ((s->io[i].BasePort & (align-1)) == *base))
810 for (i = 0; i < MAX_IO_WIN; i++) {
811 if (s->io[i].NumPorts == 0) {
812 if (find_io_region(base, num, align, name, s) == 0) {
813 s->io[i].Attributes = attr;
814 s->io[i].BasePort = *base;
815 s->io[i].NumPorts = s->io[i].InUse = num;
819 } else if (s->io[i].Attributes != attr)
821 /* Try to extend top of window */
822 try = s->io[i].BasePort + s->io[i].NumPorts;
823 if ((*base == 0) || (*base == try))
824 if (find_io_region(&try, num, 0, name, s) == 0) {
826 s->io[i].NumPorts += num;
827 s->io[i].InUse += num;
830 /* Try to extend bottom of window */
831 try = s->io[i].BasePort - num;
832 if ((*base == 0) || (*base == try))
833 if (find_io_region(&try, num, 0, name, s) == 0) {
834 s->io[i].BasePort = *base = try;
835 s->io[i].NumPorts += num;
836 s->io[i].InUse += num;
840 return (i == MAX_IO_WIN);
841 } /* alloc_io_space */
843 static void release_io_space(socket_info_t *s, ioaddr_t base,
847 if(!(s->cap.features & SS_CAP_STATIC_MAP))
848 release_region(base, num);
849 for (i = 0; i < MAX_IO_WIN; i++) {
850 if ((s->io[i].BasePort <= base) &&
851 (s->io[i].BasePort+s->io[i].NumPorts >= base+num)) {
852 s->io[i].InUse -= num;
853 /* Free the window if no one else is using it */
854 if (s->io[i].InUse == 0)
855 s->io[i].NumPorts = 0;
860 /*======================================================================
862 Access_configuration_register() reads and writes configuration
863 registers in attribute memory. Memory window 0 is reserved for
864 this and the tuple reading services.
866 ======================================================================*/
868 int pcmcia_access_configuration_register(client_handle_t handle,
876 if (CHECK_HANDLE(handle))
877 return CS_BAD_HANDLE;
879 if (handle->Function == BIND_FN_ALL) {
880 if (reg->Function >= s->functions)
882 c = &s->config[reg->Function];
889 if (!(c->state & CONFIG_LOCKED))
890 return CS_CONFIGURATION_LOCKED;
892 addr = (c->ConfigBase + reg->Offset) >> 1;
894 switch (reg->Action) {
896 read_cis_mem(s, 1, addr, 1, &val);
901 write_cis_mem(s, 1, addr, 1, &val);
908 } /* access_configuration_register */
910 /*======================================================================
912 Bind_device() associates a device driver with a particular socket.
913 It is normally called by Driver Services after it has identified
914 a newly inserted card. An instance of that driver will then be
915 eligible to register as a client of this socket.
917 ======================================================================*/
919 int pcmcia_bind_device(bind_req_t *req)
924 if (CHECK_SOCKET(req->Socket))
925 return CS_BAD_SOCKET;
928 client = (client_t *)kmalloc(sizeof(client_t), GFP_KERNEL);
929 if (!client) return CS_OUT_OF_RESOURCE;
930 memset(client, '\0', sizeof(client_t));
931 client->client_magic = CLIENT_MAGIC;
932 strncpy(client->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
933 client->Socket = req->Socket;
934 client->Function = req->Function;
935 client->state = CLIENT_UNBOUND;
936 client->erase_busy.next = &client->erase_busy;
937 client->erase_busy.prev = &client->erase_busy;
938 init_waitqueue_head(&client->mtd_req);
939 client->next = s->clients;
941 DEBUG(1, "cs: bind_device(): client 0x%p, sock %d, dev %s\n",
942 client, client->Socket, client->dev_info);
946 /*======================================================================
948 Bind_mtd() associates a device driver with a particular memory
949 region. It is normally called by Driver Services after it has
950 identified a memory device type. An instance of the corresponding
951 driver will then be able to register to control this region.
953 ======================================================================*/
955 int pcmcia_bind_mtd(mtd_bind_t *req)
958 memory_handle_t region;
960 if (CHECK_SOCKET(req->Socket))
961 return CS_BAD_SOCKET;
964 if (req->Attributes & REGION_TYPE_AM)
965 region = s->a_region;
967 region = s->c_region;
970 if (region->info.CardOffset == req->CardOffset) break;
971 region = region->info.next;
973 if (!region || (region->mtd != NULL))
974 return CS_BAD_OFFSET;
975 strncpy(region->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
977 DEBUG(1, "cs: bind_mtd(): attr 0x%x, offset 0x%x, dev %s\n",
978 req->Attributes, req->CardOffset, (char *)req->dev_info);
982 /*====================================================================*/
984 int pcmcia_deregister_client(client_handle_t handle)
988 memory_handle_t region;
992 DEBUG(1, "cs: deregister_client(%p)\n", handle);
993 if (CHECK_HANDLE(handle))
994 return CS_BAD_HANDLE;
996 (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED))
998 for (i = 0; i < MAX_WIN; i++)
999 if (handle->state & CLIENT_WIN_REQ(i))
1002 /* Disconnect all MTD links */
1004 if (handle->mtd_count) {
1005 for (region = s->a_region; region; region = region->info.next)
1006 if (region->mtd == handle) region->mtd = NULL;
1007 for (region = s->c_region; region; region = region->info.next)
1008 if (region->mtd == handle) region->mtd = NULL;
1011 sn = handle->Socket; s = socket_table[sn];
1013 if ((handle->state & CLIENT_STALE) ||
1014 (handle->Attributes & INFO_MASTER_CLIENT)) {
1015 spin_lock_irqsave(&s->lock, flags);
1016 client = &s->clients;
1017 while ((*client) && ((*client) != handle))
1018 client = &(*client)->next;
1019 if (*client == NULL) {
1020 spin_unlock_irqrestore(&s->lock, flags);
1021 return CS_BAD_HANDLE;
1023 *client = handle->next;
1024 handle->client_magic = 0;
1026 spin_unlock_irqrestore(&s->lock, flags);
1028 handle->state = CLIENT_UNBOUND;
1029 handle->mtd_count = 0;
1030 handle->event_handler = NULL;
1033 if (--s->real_clients == 0)
1034 register_callback(s, NULL, NULL);
1037 } /* deregister_client */
1039 /*====================================================================*/
1041 int pcmcia_get_configuration_info(client_handle_t handle,
1042 config_info_t *config)
1047 if (CHECK_HANDLE(handle))
1048 return CS_BAD_HANDLE;
1050 if (!(s->state & SOCKET_PRESENT))
1053 if (handle->Function == BIND_FN_ALL) {
1054 if (config->Function && (config->Function >= s->functions))
1057 config->Function = handle->Function;
1059 #ifdef CONFIG_CARDBUS
1060 if (s->state & SOCKET_CARDBUS) {
1061 u_char fn = config->Function;
1062 memset(config, 0, sizeof(config_info_t));
1063 config->Function = fn;
1064 config->Vcc = s->socket.Vcc;
1065 config->Vpp1 = config->Vpp2 = s->socket.Vpp;
1066 config->Option = s->cap.cb_dev->subordinate->number;
1068 config->Attributes = CONF_VALID_CLIENT;
1069 config->IntType = INT_CARDBUS;
1070 config->AssignedIRQ = s->irq.AssignedIRQ;
1071 if (config->AssignedIRQ)
1072 config->Attributes |= CONF_ENABLE_IRQ;
1073 config->BasePort1 = s->io[0].BasePort;
1074 config->NumPorts1 = s->io[0].NumPorts;
1080 c = (s->config != NULL) ? &s->config[config->Function] : NULL;
1082 if ((c == NULL) || !(c->state & CONFIG_LOCKED)) {
1083 config->Attributes = 0;
1084 config->Vcc = s->socket.Vcc;
1085 config->Vpp1 = config->Vpp2 = s->socket.Vpp;
1089 /* !!! This is a hack !!! */
1090 memcpy(&config->Attributes, &c->Attributes, sizeof(config_t));
1091 config->Attributes |= CONF_VALID_CLIENT;
1092 config->CardValues = c->CardValues;
1093 config->IRQAttributes = c->irq.Attributes;
1094 config->AssignedIRQ = s->irq.AssignedIRQ;
1095 config->BasePort1 = c->io.BasePort1;
1096 config->NumPorts1 = c->io.NumPorts1;
1097 config->Attributes1 = c->io.Attributes1;
1098 config->BasePort2 = c->io.BasePort2;
1099 config->NumPorts2 = c->io.NumPorts2;
1100 config->Attributes2 = c->io.Attributes2;
1101 config->IOAddrLines = c->io.IOAddrLines;
1104 } /* get_configuration_info */
1106 /*======================================================================
1108 Return information about this version of Card Services.
1110 ======================================================================*/
1112 int pcmcia_get_card_services_info(servinfo_t *info)
1114 info->Signature[0] = 'C';
1115 info->Signature[1] = 'S';
1116 info->Count = sockets;
1117 info->Revision = CS_RELEASE_CODE;
1118 info->CSLevel = 0x0210;
1119 info->VendorString = (char *)release;
1121 } /* get_card_services_info */
1123 /*======================================================================
1125 Note that get_first_client() *does* recognize the Socket field
1126 in the request structure.
1128 ======================================================================*/
1130 int pcmcia_get_first_client(client_handle_t *handle, client_req_t *req)
1133 if (req->Attributes & CLIENT_THIS_SOCKET)
1137 if (CHECK_SOCKET(req->Socket))
1138 return CS_BAD_SOCKET;
1139 if (socket_table[s]->clients == NULL)
1140 return CS_NO_MORE_ITEMS;
1141 *handle = socket_table[s]->clients;
1143 } /* get_first_client */
1145 /*====================================================================*/
1147 int pcmcia_get_next_client(client_handle_t *handle, client_req_t *req)
1150 if ((handle == NULL) || CHECK_HANDLE(*handle))
1151 return CS_BAD_HANDLE;
1152 if ((*handle)->next == NULL) {
1153 if (req->Attributes & CLIENT_THIS_SOCKET)
1154 return CS_NO_MORE_ITEMS;
1155 s = SOCKET(*handle);
1156 if (s->clients == NULL)
1157 return CS_NO_MORE_ITEMS;
1158 *handle = s->clients;
1160 *handle = (*handle)->next;
1162 } /* get_next_client */
1164 /*====================================================================*/
1166 int pcmcia_get_window(window_handle_t *handle, int idx, win_req_t *req)
1173 s = SOCKET((client_handle_t)*handle);
1175 s = (*handle)->sock;
1176 if (!(s->state & SOCKET_PRESENT))
1178 for (w = idx; w < MAX_WIN; w++)
1179 if (s->state & SOCKET_WIN_REQ(w)) break;
1181 return CS_NO_MORE_ITEMS;
1183 req->Base = win->ctl.sys_start;
1184 req->Size = win->ctl.sys_stop - win->ctl.sys_start + 1;
1185 req->AccessSpeed = win->ctl.speed;
1186 req->Attributes = 0;
1187 if (win->ctl.flags & MAP_ATTRIB)
1188 req->Attributes |= WIN_MEMORY_TYPE_AM;
1189 if (win->ctl.flags & MAP_ACTIVE)
1190 req->Attributes |= WIN_ENABLE;
1191 if (win->ctl.flags & MAP_16BIT)
1192 req->Attributes |= WIN_DATA_WIDTH_16;
1193 if (win->ctl.flags & MAP_USE_WAIT)
1194 req->Attributes |= WIN_USE_WAIT;
1199 int pcmcia_get_first_window(window_handle_t *win, win_req_t *req)
1201 if ((win == NULL) || ((*win)->magic != WINDOW_MAGIC))
1202 return CS_BAD_HANDLE;
1203 return pcmcia_get_window(win, 0, req);
1206 int pcmcia_get_next_window(window_handle_t *win, win_req_t *req)
1208 if ((win == NULL) || ((*win)->magic != WINDOW_MAGIC))
1209 return CS_BAD_HANDLE;
1210 return pcmcia_get_window(win, (*win)->index+1, req);
1213 /*=====================================================================
1215 Return the PCI device associated with a card..
1217 ======================================================================*/
1219 #ifdef CONFIG_CARDBUS
1221 struct pci_bus *pcmcia_lookup_bus(client_handle_t handle)
1225 if (CHECK_HANDLE(handle))
1228 if (!(s->state & SOCKET_CARDBUS))
1231 return s->cap.cb_dev->subordinate;
1234 EXPORT_SYMBOL(pcmcia_lookup_bus);
1238 /*======================================================================
1240 Get the current socket state bits. We don't support the latched
1241 SocketState yet: I haven't seen any point for it.
1243 ======================================================================*/
1245 int pcmcia_get_status(client_handle_t handle, cs_status_t *status)
1251 if (CHECK_HANDLE(handle))
1252 return CS_BAD_HANDLE;
1254 get_socket_status(s, &val);
1255 status->CardState = status->SocketState = 0;
1256 status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0;
1257 status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0;
1258 status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0;
1259 status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0;
1260 if (s->state & SOCKET_SUSPEND)
1261 status->CardState |= CS_EVENT_PM_SUSPEND;
1262 if (!(s->state & SOCKET_PRESENT))
1264 if (s->state & SOCKET_SETUP_PENDING)
1265 status->CardState |= CS_EVENT_CARD_INSERTION;
1267 /* Get info from the PRR, if necessary */
1268 if (handle->Function == BIND_FN_ALL) {
1269 if (status->Function && (status->Function >= s->functions))
1271 c = (s->config != NULL) ? &s->config[status->Function] : NULL;
1274 if ((c != NULL) && (c->state & CONFIG_LOCKED) &&
1275 (c->IntType & (INT_MEMORY_AND_IO|INT_ZOOMED_VIDEO))) {
1277 if (c->Present & PRESENT_PIN_REPLACE) {
1278 read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®);
1279 status->CardState |=
1280 (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0;
1281 status->CardState |=
1282 (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0;
1283 status->CardState |=
1284 (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0;
1285 status->CardState |=
1286 (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0;
1288 /* No PRR? Then assume we're always ready */
1289 status->CardState |= CS_EVENT_READY_CHANGE;
1291 if (c->Present & PRESENT_EXT_STATUS) {
1292 read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, ®);
1293 status->CardState |=
1294 (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0;
1298 status->CardState |=
1299 (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0;
1300 status->CardState |=
1301 (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0;
1302 status->CardState |=
1303 (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0;
1304 status->CardState |=
1305 (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0;
1309 /*======================================================================
1311 Change the card address of an already open memory window.
1313 ======================================================================*/
1315 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req)
1317 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1318 return CS_BAD_HANDLE;
1320 req->CardOffset = win->ctl.card_start;
1322 } /* get_mem_page */
1324 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req)
1327 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1328 return CS_BAD_HANDLE;
1332 win->ctl.card_start = req->CardOffset;
1333 if (set_mem_map(s, &win->ctl) != 0)
1334 return CS_BAD_OFFSET;
1336 } /* map_mem_page */
1338 /*======================================================================
1340 Modify a locked socket configuration
1342 ======================================================================*/
1344 int pcmcia_modify_configuration(client_handle_t handle,
1350 if (CHECK_HANDLE(handle))
1351 return CS_BAD_HANDLE;
1352 s = SOCKET(handle); c = CONFIG(handle);
1353 if (!(s->state & SOCKET_PRESENT))
1355 if (!(c->state & CONFIG_LOCKED))
1356 return CS_CONFIGURATION_LOCKED;
1358 if (mod->Attributes & CONF_IRQ_CHANGE_VALID) {
1359 if (mod->Attributes & CONF_ENABLE_IRQ) {
1360 c->Attributes |= CONF_ENABLE_IRQ;
1361 s->socket.io_irq = s->irq.AssignedIRQ;
1363 c->Attributes &= ~CONF_ENABLE_IRQ;
1364 s->socket.io_irq = 0;
1366 set_socket(s, &s->socket);
1369 if (mod->Attributes & CONF_VCC_CHANGE_VALID)
1372 /* We only allow changing Vpp1 and Vpp2 to the same value */
1373 if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) &&
1374 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) {
1375 if (mod->Vpp1 != mod->Vpp2)
1377 c->Vpp1 = c->Vpp2 = s->socket.Vpp = mod->Vpp1;
1378 if (set_socket(s, &s->socket))
1380 } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) ||
1381 (mod->Attributes & CONF_VPP2_CHANGE_VALID))
1385 } /* modify_configuration */
1387 /*======================================================================
1389 Modify the attributes of a window returned by RequestWindow.
1391 ======================================================================*/
1393 int pcmcia_modify_window(window_handle_t win, modwin_t *req)
1395 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1396 return CS_BAD_HANDLE;
1398 win->ctl.flags &= ~(MAP_ATTRIB|MAP_ACTIVE);
1399 if (req->Attributes & WIN_MEMORY_TYPE)
1400 win->ctl.flags |= MAP_ATTRIB;
1401 if (req->Attributes & WIN_ENABLE)
1402 win->ctl.flags |= MAP_ACTIVE;
1403 if (req->Attributes & WIN_DATA_WIDTH_16)
1404 win->ctl.flags |= MAP_16BIT;
1405 if (req->Attributes & WIN_USE_WAIT)
1406 win->ctl.flags |= MAP_USE_WAIT;
1407 win->ctl.speed = req->AccessSpeed;
1408 set_mem_map(win->sock, &win->ctl);
1411 } /* modify_window */
1413 /*======================================================================
1415 Register_client() uses the dev_info_t handle to match the
1416 caller with a socket. The driver must have already been bound
1417 to a socket with bind_device() -- in fact, bind_device()
1418 allocates the client structure that will be used.
1420 ======================================================================*/
1422 int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
1428 /* Look for unbound client with matching dev_info */
1430 for (ns = 0; ns < sockets; ns++) {
1431 client = socket_table[ns]->clients;
1432 while (client != NULL) {
1433 if ((strcmp(client->dev_info, (char *)req->dev_info) == 0)
1434 && (client->state & CLIENT_UNBOUND)) break;
1435 client = client->next;
1437 if (client != NULL) break;
1440 return CS_OUT_OF_RESOURCE;
1442 s = socket_table[ns];
1443 if (++s->real_clients == 1) {
1445 register_callback(s, &parse_events, s);
1446 get_socket_status(s, &status);
1447 if ((status & SS_DETECT) &&
1448 !(s->state & SOCKET_SETUP_PENDING)) {
1449 s->state |= SOCKET_SETUP_PENDING;
1450 if (setup_socket(s) == 0)
1451 s->state &= ~SOCKET_SETUP_PENDING;
1456 client->state &= ~CLIENT_UNBOUND;
1457 client->Socket = ns;
1458 client->Attributes = req->Attributes;
1459 client->EventMask = req->EventMask;
1460 client->event_handler = req->event_handler;
1461 client->event_callback_args = req->event_callback_args;
1462 client->event_callback_args.client_handle = client;
1463 client->event_callback_args.bus = s->cap.bus;
1465 if (s->state & SOCKET_CARDBUS)
1466 client->state |= CLIENT_CARDBUS;
1468 if ((!(s->state & SOCKET_CARDBUS)) && (s->functions == 0) &&
1469 (client->Function != BIND_FN_ALL)) {
1470 cistpl_longlink_mfc_t mfc;
1471 if (read_tuple(client, CISTPL_LONGLINK_MFC, &mfc)
1473 s->functions = mfc.nfn;
1476 s->config = kmalloc(sizeof(config_t) * s->functions,
1479 return CS_OUT_OF_RESOURCE;
1480 memset(s->config, 0, sizeof(config_t) * s->functions);
1483 DEBUG(1, "cs: register_client(): client 0x%p, sock %d, dev %s\n",
1484 client, client->Socket, client->dev_info);
1485 if (client->EventMask & CS_EVENT_REGISTRATION_COMPLETE)
1486 EVENT(client, CS_EVENT_REGISTRATION_COMPLETE, CS_EVENT_PRI_LOW);
1487 if ((socket_table[ns]->state & SOCKET_PRESENT) &&
1488 !(socket_table[ns]->state & SOCKET_SETUP_PENDING)) {
1489 if (client->EventMask & CS_EVENT_CARD_INSERTION)
1490 EVENT(client, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
1492 client->PendingEvents |= CS_EVENT_CARD_INSERTION;
1495 } /* register_client */
1497 /*====================================================================*/
1499 int pcmcia_release_configuration(client_handle_t handle)
1501 pccard_io_map io = { 0, 0, 0, 0, 1 };
1505 if (CHECK_HANDLE(handle) ||
1506 !(handle->state & CLIENT_CONFIG_LOCKED))
1507 return CS_BAD_HANDLE;
1508 handle->state &= ~CLIENT_CONFIG_LOCKED;
1511 #ifdef CONFIG_CARDBUS
1512 if (handle->state & CLIENT_CARDBUS) {
1519 if (!(handle->state & CLIENT_STALE)) {
1520 config_t *c = CONFIG(handle);
1521 if (--(s->lock_count) == 0) {
1522 s->socket.flags = SS_OUTPUT_ENA; /* Is this correct? */
1524 s->socket.io_irq = 0;
1525 set_socket(s, &s->socket);
1527 if (c->state & CONFIG_IO_REQ)
1528 for (i = 0; i < MAX_IO_WIN; i++) {
1529 if (s->io[i].NumPorts == 0)
1532 if (s->io[i].Config != 0)
1537 c->state &= ~CONFIG_LOCKED;
1541 } /* release_configuration */
1543 /*======================================================================
1545 Release_io() releases the I/O ranges allocated by a client. This
1546 may be invoked some time after a card ejection has already dumped
1547 the actual socket configuration, so if the client is "stale", we
1548 don't bother checking the port ranges against the current socket
1551 ======================================================================*/
1553 int pcmcia_release_io(client_handle_t handle, io_req_t *req)
1557 if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IO_REQ))
1558 return CS_BAD_HANDLE;
1559 handle->state &= ~CLIENT_IO_REQ;
1562 #ifdef CONFIG_CARDBUS
1563 if (handle->state & CLIENT_CARDBUS) {
1569 if (!(handle->state & CLIENT_STALE)) {
1570 config_t *c = CONFIG(handle);
1571 if (c->state & CONFIG_LOCKED)
1572 return CS_CONFIGURATION_LOCKED;
1573 if ((c->io.BasePort1 != req->BasePort1) ||
1574 (c->io.NumPorts1 != req->NumPorts1) ||
1575 (c->io.BasePort2 != req->BasePort2) ||
1576 (c->io.NumPorts2 != req->NumPorts2))
1578 c->state &= ~CONFIG_IO_REQ;
1581 release_io_space(s, req->BasePort1, req->NumPorts1);
1583 release_io_space(s, req->BasePort2, req->NumPorts2);
1588 /*====================================================================*/
1590 int pcmcia_release_irq(client_handle_t handle, irq_req_t *req)
1593 if (CHECK_HANDLE(handle) || !(handle->state & CLIENT_IRQ_REQ))
1594 return CS_BAD_HANDLE;
1595 handle->state &= ~CLIENT_IRQ_REQ;
1598 if (!(handle->state & CLIENT_STALE)) {
1599 config_t *c = CONFIG(handle);
1600 if (c->state & CONFIG_LOCKED)
1601 return CS_CONFIGURATION_LOCKED;
1602 if (c->irq.Attributes != req->Attributes)
1603 return CS_BAD_ATTRIBUTE;
1604 if (s->irq.AssignedIRQ != req->AssignedIRQ)
1606 if (--s->irq.Config == 0) {
1607 c->state &= ~CONFIG_IRQ_REQ;
1608 s->irq.AssignedIRQ = 0;
1612 if (req->Attributes & IRQ_HANDLE_PRESENT) {
1613 bus_free_irq(s->cap.bus, req->AssignedIRQ, req->Instance);
1617 if (req->AssignedIRQ != s->cap.pci_irq)
1618 undo_irq(req->Attributes, req->AssignedIRQ);
1622 } /* cs_release_irq */
1624 /*====================================================================*/
1626 int pcmcia_release_window(window_handle_t win)
1630 if ((win == NULL) || (win->magic != WINDOW_MAGIC))
1631 return CS_BAD_HANDLE;
1633 if (!(win->handle->state & CLIENT_WIN_REQ(win->index)))
1634 return CS_BAD_HANDLE;
1636 /* Shut down memory window */
1637 win->ctl.flags &= ~MAP_ACTIVE;
1638 set_mem_map(s, &win->ctl);
1639 s->state &= ~SOCKET_WIN_REQ(win->index);
1641 /* Release system memory */
1642 if(!(s->cap.features & SS_CAP_STATIC_MAP))
1643 release_mem_region(win->base, win->size);
1644 win->handle->state &= ~CLIENT_WIN_REQ(win->index);
1649 } /* release_window */
1651 /*====================================================================*/
1653 int pcmcia_request_configuration(client_handle_t handle,
1660 pccard_io_map iomap;
1662 if (CHECK_HANDLE(handle))
1663 return CS_BAD_HANDLE;
1664 i = handle->Socket; s = socket_table[i];
1665 if (!(s->state & SOCKET_PRESENT))
1668 #ifdef CONFIG_CARDBUS
1669 if (handle->state & CLIENT_CARDBUS) {
1670 if (!(req->IntType & INT_CARDBUS))
1671 return CS_UNSUPPORTED_MODE;
1672 if (s->lock_count != 0)
1673 return CS_CONFIGURATION_LOCKED;
1675 handle->state |= CLIENT_CONFIG_LOCKED;
1681 if (req->IntType & INT_CARDBUS)
1682 return CS_UNSUPPORTED_MODE;
1684 if (c->state & CONFIG_LOCKED)
1685 return CS_CONFIGURATION_LOCKED;
1687 /* Do power control. We don't allow changes in Vcc. */
1688 if (s->socket.Vcc != req->Vcc)
1690 if (req->Vpp1 != req->Vpp2)
1692 s->socket.Vpp = req->Vpp1;
1693 if (set_socket(s, &s->socket))
1696 c->Vcc = req->Vcc; c->Vpp1 = c->Vpp2 = req->Vpp1;
1698 /* Pick memory or I/O card, DMA mode, interrupt */
1699 c->IntType = req->IntType;
1700 c->Attributes = req->Attributes;
1701 if (req->IntType & INT_MEMORY_AND_IO)
1702 s->socket.flags |= SS_IOCARD;
1703 if (req->IntType & INT_ZOOMED_VIDEO)
1704 s->socket.flags |= SS_ZVCARD|SS_IOCARD;
1705 if (req->Attributes & CONF_ENABLE_DMA)
1706 s->socket.flags |= SS_DMA_MODE;
1707 if (req->Attributes & CONF_ENABLE_SPKR)
1708 s->socket.flags |= SS_SPKR_ENA;
1709 if (req->Attributes & CONF_ENABLE_IRQ)
1710 s->socket.io_irq = s->irq.AssignedIRQ;
1712 s->socket.io_irq = 0;
1713 set_socket(s, &s->socket);
1716 /* Set up CIS configuration registers */
1717 base = c->ConfigBase = req->ConfigBase;
1718 c->Present = c->CardValues = req->Present;
1719 if (req->Present & PRESENT_COPY) {
1720 c->Copy = req->Copy;
1721 write_cis_mem(s, 1, (base + CISREG_SCR)>>1, 1, &c->Copy);
1723 if (req->Present & PRESENT_OPTION) {
1724 if (s->functions == 1) {
1725 c->Option = req->ConfigIndex & COR_CONFIG_MASK;
1727 c->Option = req->ConfigIndex & COR_MFC_CONFIG_MASK;
1728 c->Option |= COR_FUNC_ENA|COR_IREQ_ENA;
1729 if (req->Present & PRESENT_IOBASE_0)
1730 c->Option |= COR_ADDR_DECODE;
1732 if (c->state & CONFIG_IRQ_REQ)
1733 if (!(c->irq.Attributes & IRQ_FORCED_PULSE))
1734 c->Option |= COR_LEVEL_REQ;
1735 write_cis_mem(s, 1, (base + CISREG_COR)>>1, 1, &c->Option);
1738 if (req->Present & PRESENT_STATUS) {
1739 c->Status = req->Status;
1740 write_cis_mem(s, 1, (base + CISREG_CCSR)>>1, 1, &c->Status);
1742 if (req->Present & PRESENT_PIN_REPLACE) {
1744 write_cis_mem(s, 1, (base + CISREG_PRR)>>1, 1, &c->Pin);
1746 if (req->Present & PRESENT_EXT_STATUS) {
1747 c->ExtStatus = req->ExtStatus;
1748 write_cis_mem(s, 1, (base + CISREG_ESR)>>1, 1, &c->ExtStatus);
1750 if (req->Present & PRESENT_IOBASE_0) {
1751 u_char b = c->io.BasePort1 & 0xff;
1752 write_cis_mem(s, 1, (base + CISREG_IOBASE_0)>>1, 1, &b);
1753 b = (c->io.BasePort1 >> 8) & 0xff;
1754 write_cis_mem(s, 1, (base + CISREG_IOBASE_1)>>1, 1, &b);
1756 if (req->Present & PRESENT_IOSIZE) {
1757 u_char b = c->io.NumPorts1 + c->io.NumPorts2 - 1;
1758 write_cis_mem(s, 1, (base + CISREG_IOSIZE)>>1, 1, &b);
1761 /* Configure I/O windows */
1762 if (c->state & CONFIG_IO_REQ) {
1763 iomap.speed = io_speed;
1764 for (i = 0; i < MAX_IO_WIN; i++)
1765 if (s->io[i].NumPorts != 0) {
1767 iomap.flags = MAP_ACTIVE;
1768 switch (s->io[i].Attributes & IO_DATA_PATH_WIDTH) {
1769 case IO_DATA_PATH_WIDTH_16:
1770 iomap.flags |= MAP_16BIT; break;
1771 case IO_DATA_PATH_WIDTH_AUTO:
1772 iomap.flags |= MAP_AUTOSZ; break;
1776 iomap.start = s->io[i].BasePort;
1777 iomap.stop = iomap.start + s->io[i].NumPorts - 1;
1778 set_io_map(s, &iomap);
1783 c->state |= CONFIG_LOCKED;
1784 handle->state |= CLIENT_CONFIG_LOCKED;
1786 } /* request_configuration */
1788 /*======================================================================
1790 Request_io() reserves ranges of port addresses for a socket.
1791 I have not implemented range sharing or alias addressing.
1793 ======================================================================*/
1795 int pcmcia_request_io(client_handle_t handle, io_req_t *req)
1800 if (CHECK_HANDLE(handle))
1801 return CS_BAD_HANDLE;
1803 if (!(s->state & SOCKET_PRESENT))
1806 if (handle->state & CLIENT_CARDBUS) {
1807 #ifdef CONFIG_CARDBUS
1808 int ret = cb_config(s);
1809 if (ret == CS_SUCCESS)
1810 handle->state |= CLIENT_IO_REQ;
1813 return CS_UNSUPPORTED_FUNCTION;
1818 return CS_UNSUPPORTED_MODE;
1820 if (c->state & CONFIG_LOCKED)
1821 return CS_CONFIGURATION_LOCKED;
1822 if (c->state & CONFIG_IO_REQ)
1824 if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))
1825 return CS_BAD_ATTRIBUTE;
1826 if ((req->NumPorts2 > 0) &&
1827 (req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)))
1828 return CS_BAD_ATTRIBUTE;
1830 if (alloc_io_space(s, req->Attributes1, &req->BasePort1,
1831 req->NumPorts1, req->IOAddrLines,
1835 if (req->NumPorts2) {
1836 if (alloc_io_space(s, req->Attributes2, &req->BasePort2,
1837 req->NumPorts2, req->IOAddrLines,
1838 handle->dev_info)) {
1839 release_io_space(s, req->BasePort1, req->NumPorts1);
1845 c->state |= CONFIG_IO_REQ;
1846 handle->state |= CLIENT_IO_REQ;
1850 /*======================================================================
1852 Request_irq() reserves an irq for this client.
1854 Also, since Linux only reserves irq's when they are actually
1855 hooked, we don't guarantee that an irq will still be available
1856 when the configuration is locked. Now that I think about it,
1857 there might be a way to fix this using a dummy handler.
1859 ======================================================================*/
1861 int pcmcia_request_irq(client_handle_t handle, irq_req_t *req)
1865 int ret = CS_IN_USE, irq = 0;
1867 if (CHECK_HANDLE(handle))
1868 return CS_BAD_HANDLE;
1870 if (!(s->state & SOCKET_PRESENT))
1873 if (c->state & CONFIG_LOCKED)
1874 return CS_CONFIGURATION_LOCKED;
1875 if (c->state & CONFIG_IRQ_REQ)
1879 if (s->irq.AssignedIRQ != 0) {
1880 /* If the interrupt is already assigned, it must match */
1881 irq = s->irq.AssignedIRQ;
1882 if (req->IRQInfo1 & IRQ_INFO2_VALID) {
1883 u_int mask = req->IRQInfo2 & s->cap.irq_mask;
1884 ret = ((mask >> irq) & 1) ? 0 : CS_BAD_ARGS;
1886 ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
1888 if (req->IRQInfo1 & IRQ_INFO2_VALID) {
1889 u_int try, mask = req->IRQInfo2 & s->cap.irq_mask;
1890 for (try = 0; try < 2; try++) {
1891 for (irq = 0; irq < 32; irq++)
1892 if ((mask >> irq) & 1) {
1893 ret = try_irq(req->Attributes, irq, try);
1894 if (ret == 0) break;
1896 if (ret == 0) break;
1899 irq = req->IRQInfo1 & IRQ_MASK;
1900 ret = try_irq(req->Attributes, irq, 1);
1905 if (!s->cap.pci_irq)
1907 irq = s->cap.pci_irq;
1910 if (req->Attributes & IRQ_HANDLE_PRESENT) {
1911 if (bus_request_irq(s->cap.bus, irq, req->Handler,
1912 ((req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) ||
1913 (s->functions > 1) ||
1914 (irq == s->cap.pci_irq)) ? SA_SHIRQ : 0,
1915 handle->dev_info, req->Instance))
1919 c->irq.Attributes = req->Attributes;
1920 s->irq.AssignedIRQ = req->AssignedIRQ = irq;
1923 c->state |= CONFIG_IRQ_REQ;
1924 handle->state |= CLIENT_IRQ_REQ;
1926 } /* pcmcia_request_irq */
1928 /*======================================================================
1930 Request_window() establishes a mapping between card memory space
1931 and system memory space.
1933 ======================================================================*/
1935 int pcmcia_request_window(client_handle_t *handle, win_req_t *req, window_handle_t *wh)
1942 if (CHECK_HANDLE(*handle))
1943 return CS_BAD_HANDLE;
1944 s = SOCKET(*handle);
1945 if (!(s->state & SOCKET_PRESENT))
1947 if (req->Attributes & (WIN_PAGED | WIN_SHARED))
1948 return CS_BAD_ATTRIBUTE;
1950 /* Window size defaults to smallest available */
1952 req->Size = s->cap.map_size;
1953 align = (((s->cap.features & SS_CAP_MEM_ALIGN) ||
1954 (req->Attributes & WIN_STRICT_ALIGN)) ?
1955 req->Size : s->cap.map_size);
1956 if (req->Size & (s->cap.map_size-1))
1958 if ((req->Base && (s->cap.features & SS_CAP_STATIC_MAP)) ||
1959 (req->Base & (align-1)))
1964 /* Allocate system memory window */
1965 for (w = 0; w < MAX_WIN; w++)
1966 if (!(s->state & SOCKET_WIN_REQ(w))) break;
1968 return CS_OUT_OF_RESOURCE;
1971 win->magic = WINDOW_MAGIC;
1973 win->handle = *handle;
1975 win->base = req->Base;
1976 win->size = req->Size;
1978 if (!(s->cap.features & SS_CAP_STATIC_MAP) &&
1979 find_mem_region(&win->base, win->size, align,
1980 (req->Attributes & WIN_MAP_BELOW_1MB) ||
1981 !(s->cap.features & SS_CAP_PAGE_REGS),
1982 (*handle)->dev_info, s))
1984 (*handle)->state |= CLIENT_WIN_REQ(w);
1986 /* Configure the socket controller */
1989 win->ctl.speed = req->AccessSpeed;
1990 if (req->Attributes & WIN_MEMORY_TYPE)
1991 win->ctl.flags |= MAP_ATTRIB;
1992 if (req->Attributes & WIN_ENABLE)
1993 win->ctl.flags |= MAP_ACTIVE;
1994 if (req->Attributes & WIN_DATA_WIDTH_16)
1995 win->ctl.flags |= MAP_16BIT;
1996 if (req->Attributes & WIN_USE_WAIT)
1997 win->ctl.flags |= MAP_USE_WAIT;
1998 win->ctl.sys_start = win->base;
1999 win->ctl.sys_stop = win->base + win->size-1;
2000 win->ctl.card_start = 0;
2001 if (set_mem_map(s, &win->ctl) != 0)
2003 s->state |= SOCKET_WIN_REQ(w);
2005 /* Return window handle */
2006 req->Base = win->ctl.sys_start;
2010 } /* request_window */
2012 /*======================================================================
2014 I'm not sure which "reset" function this is supposed to use,
2015 but for now, it uses the low-level interface's reset, not the
2018 ======================================================================*/
2020 int pcmcia_reset_card(client_handle_t handle, client_req_t *req)
2025 if (CHECK_HANDLE(handle))
2026 return CS_BAD_HANDLE;
2027 i = handle->Socket; s = socket_table[i];
2028 if (!(s->state & SOCKET_PRESENT))
2030 if (s->state & SOCKET_RESET_PENDING)
2032 s->state |= SOCKET_RESET_PENDING;
2034 ret = send_event(s, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
2036 s->state &= ~SOCKET_RESET_PENDING;
2037 handle->event_callback_args.info = (void *)(u_long)ret;
2038 EVENT(handle, CS_EVENT_RESET_COMPLETE, CS_EVENT_PRI_LOW);
2040 DEBUG(1, "cs: resetting socket %d\n", i);
2041 send_event(s, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
2042 s->reset_handle = handle;
2048 /*======================================================================
2050 These shut down or wake up a socket. They are sort of user
2051 initiated versions of the APM suspend and resume actions.
2053 ======================================================================*/
2055 int pcmcia_suspend_card(client_handle_t handle, client_req_t *req)
2060 if (CHECK_HANDLE(handle))
2061 return CS_BAD_HANDLE;
2062 i = handle->Socket; s = socket_table[i];
2063 if (!(s->state & SOCKET_PRESENT))
2065 if (s->state & SOCKET_SUSPEND)
2068 DEBUG(1, "cs: suspending socket %d\n", i);
2069 send_event(s, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
2071 s->state |= SOCKET_SUSPEND;
2074 } /* suspend_card */
2076 int pcmcia_resume_card(client_handle_t handle, client_req_t *req)
2081 if (CHECK_HANDLE(handle))
2082 return CS_BAD_HANDLE;
2083 i = handle->Socket; s = socket_table[i];
2084 if (!(s->state & SOCKET_PRESENT))
2086 if (!(s->state & SOCKET_SUSPEND))
2089 DEBUG(1, "cs: waking up socket %d\n", i);
2095 /*======================================================================
2097 These handle user requests to eject or insert a card.
2099 ======================================================================*/
2101 int pcmcia_eject_card(client_handle_t handle, client_req_t *req)
2107 if (CHECK_HANDLE(handle))
2108 return CS_BAD_HANDLE;
2109 i = handle->Socket; s = socket_table[i];
2110 if (!(s->state & SOCKET_PRESENT))
2113 DEBUG(1, "cs: user eject request on socket %d\n", i);
2115 ret = send_event(s, CS_EVENT_EJECTION_REQUEST, CS_EVENT_PRI_LOW);
2119 spin_lock_irqsave(&s->lock, flags);
2121 spin_unlock_irqrestore(&s->lock, flags);
2127 int pcmcia_insert_card(client_handle_t handle, client_req_t *req)
2133 if (CHECK_HANDLE(handle))
2134 return CS_BAD_HANDLE;
2135 i = handle->Socket; s = socket_table[i];
2136 if (s->state & SOCKET_PRESENT)
2139 DEBUG(1, "cs: user insert request on socket %d\n", i);
2141 spin_lock_irqsave(&s->lock, flags);
2142 if (!(s->state & SOCKET_SETUP_PENDING)) {
2143 s->state |= SOCKET_SETUP_PENDING;
2144 spin_unlock_irqrestore(&s->lock, flags);
2145 get_socket_status(s, &status);
2146 if ((status & SS_DETECT) == 0 || (setup_socket(s) == 0)) {
2147 s->state &= ~SOCKET_SETUP_PENDING;
2151 spin_unlock_irqrestore(&s->lock, flags);
2156 /*======================================================================
2158 Maybe this should send a CS_EVENT_CARD_INSERTION event if we
2159 haven't sent one to this client yet?
2161 ======================================================================*/
2163 int pcmcia_set_event_mask(client_handle_t handle, eventmask_t *mask)
2166 if (CHECK_HANDLE(handle))
2167 return CS_BAD_HANDLE;
2168 if (handle->Attributes & CONF_EVENT_MASK_VALID)
2169 return CS_BAD_SOCKET;
2170 handle->EventMask = mask->EventMask;
2171 events = handle->PendingEvents & handle->EventMask;
2172 handle->PendingEvents -= events;
2173 while (events != 0) {
2174 bit = ((events ^ (events-1)) + 1) >> 1;
2175 EVENT(handle, bit, CS_EVENT_PRI_LOW);
2179 } /* set_event_mask */
2181 /*====================================================================*/
2183 int pcmcia_report_error(client_handle_t handle, error_info_t *err)
2188 if (CHECK_HANDLE(handle))
2189 printk(KERN_NOTICE);
2191 printk(KERN_NOTICE "%s: ", handle->dev_info);
2193 for (i = 0; i < SERVICE_COUNT; i++)
2194 if (service_table[i].key == err->func) break;
2195 if (i < SERVICE_COUNT)
2196 serv = service_table[i].msg;
2198 serv = "Unknown service number";
2200 for (i = 0; i < ERROR_COUNT; i++)
2201 if (error_table[i].key == err->retcode) break;
2202 if (i < ERROR_COUNT)
2203 printk("%s: %s\n", serv, error_table[i].msg);
2205 printk("%s: Unknown error code %#x\n", serv, err->retcode);
2208 } /* report_error */
2210 /*====================================================================*/
2212 int CardServices(int func, void *a1, void *a2, void *a3)
2218 for (i = 0; i < SERVICE_COUNT; i++)
2219 if (service_table[i].key == func) break;
2220 if (i < SERVICE_COUNT)
2221 printk(KERN_DEBUG "cs: CardServices(%s, 0x%p, 0x%p)\n",
2222 service_table[i].msg, a1, a2);
2224 printk(KERN_DEBUG "cs: CardServices(Unknown func %d, "
2225 "0x%p, 0x%p)\n", func, a1, a2);
2229 case AccessConfigurationRegister:
2230 return pcmcia_access_configuration_register(a1, a2); break;
2231 case AdjustResourceInfo:
2232 return pcmcia_adjust_resource_info(a1, a2); break;
2233 case CheckEraseQueue:
2234 return pcmcia_check_erase_queue(a1); break;
2236 return pcmcia_close_memory(a1); break;
2238 return pcmcia_copy_memory(a1, a2); break;
2239 case DeregisterClient:
2240 return pcmcia_deregister_client(a1); break;
2241 case DeregisterEraseQueue:
2242 return pcmcia_deregister_erase_queue(a1); break;
2243 case GetFirstClient:
2244 return pcmcia_get_first_client(a1, a2); break;
2245 case GetCardServicesInfo:
2246 return pcmcia_get_card_services_info(a1); break;
2247 case GetConfigurationInfo:
2248 return pcmcia_get_configuration_info(a1, a2); break;
2250 return pcmcia_get_next_client(a1, a2); break;
2251 case GetFirstRegion:
2252 return pcmcia_get_first_region(a1, a2); break;
2254 return pcmcia_get_first_tuple(a1, a2); break;
2256 return pcmcia_get_next_region(a1, a2); break;
2258 return pcmcia_get_next_tuple(a1, a2); break;
2260 return pcmcia_get_status(a1, a2); break;
2262 return pcmcia_get_tuple_data(a1, a2); break;
2264 return pcmcia_map_mem_page(a1, a2); break;
2265 case ModifyConfiguration:
2266 return pcmcia_modify_configuration(a1, a2); break;
2268 return pcmcia_modify_window(a1, a2); break;
2270 /* return pcmcia_open_memory(a1, a2); */
2273 int ret = pcmcia_open_memory(a1, a2, &m);
2274 *(memory_handle_t *)a1 = m;
2279 return pcmcia_parse_tuple(a1, a2, a3); break;
2281 return pcmcia_read_memory(a1, a2, a3); break;
2282 case RegisterClient:
2283 return pcmcia_register_client(a1, a2); break;
2284 case RegisterEraseQueue:
2287 int ret = pcmcia_register_erase_queue(a1, a2, &w);
2288 *(eraseq_handle_t *)a1 = w;
2292 /* return pcmcia_register_erase_queue(a1, a2); break; */
2294 return pcmcia_register_mtd(a1, a2); break;
2295 case ReleaseConfiguration:
2296 return pcmcia_release_configuration(a1); break;
2298 return pcmcia_release_io(a1, a2); break;
2300 return pcmcia_release_irq(a1, a2); break;
2302 return pcmcia_release_window(a1); break;
2303 case RequestConfiguration:
2304 return pcmcia_request_configuration(a1, a2); break;
2306 return pcmcia_request_io(a1, a2); break;
2308 return pcmcia_request_irq(a1, a2); break;
2312 int ret = pcmcia_request_window(a1, a2, &w);
2313 *(window_handle_t *)a1 = w;
2318 return pcmcia_reset_card(a1, a2); break;
2320 return pcmcia_set_event_mask(a1, a2); break;
2322 return pcmcia_validate_cis(a1, a2); break;
2324 return pcmcia_write_memory(a1, a2, a3); break;
2326 return pcmcia_bind_device(a1); break;
2328 return pcmcia_bind_mtd(a1); break;
2330 return pcmcia_report_error(a1, a2); break;
2332 return pcmcia_suspend_card(a1, a2); break;
2334 return pcmcia_resume_card(a1, a2); break;
2336 return pcmcia_eject_card(a1, a2); break;
2338 return pcmcia_insert_card(a1, a2); break;
2340 return pcmcia_replace_cis(a1, a2); break;
2341 case GetFirstWindow:
2342 return pcmcia_get_first_window(a1, a2); break;
2344 return pcmcia_get_next_window(a1, a2); break;
2346 return pcmcia_get_mem_page(a1, a2); break;
2348 return CS_UNSUPPORTED_FUNCTION; break;
2351 } /* CardServices */
2353 /*======================================================================
2355 OS-specific module glue goes here
2357 ======================================================================*/
2358 /* in alpha order */
2359 EXPORT_SYMBOL(pcmcia_access_configuration_register);
2360 EXPORT_SYMBOL(pcmcia_adjust_resource_info);
2361 EXPORT_SYMBOL(pcmcia_bind_device);
2362 EXPORT_SYMBOL(pcmcia_bind_mtd);
2363 EXPORT_SYMBOL(pcmcia_check_erase_queue);
2364 EXPORT_SYMBOL(pcmcia_close_memory);
2365 EXPORT_SYMBOL(pcmcia_copy_memory);
2366 EXPORT_SYMBOL(pcmcia_deregister_client);
2367 EXPORT_SYMBOL(pcmcia_deregister_erase_queue);
2368 EXPORT_SYMBOL(pcmcia_eject_card);
2369 EXPORT_SYMBOL(pcmcia_get_first_client);
2370 EXPORT_SYMBOL(pcmcia_get_card_services_info);
2371 EXPORT_SYMBOL(pcmcia_get_configuration_info);
2372 EXPORT_SYMBOL(pcmcia_get_mem_page);
2373 EXPORT_SYMBOL(pcmcia_get_next_client);
2374 EXPORT_SYMBOL(pcmcia_get_first_region);
2375 EXPORT_SYMBOL(pcmcia_get_first_tuple);
2376 EXPORT_SYMBOL(pcmcia_get_first_window);
2377 EXPORT_SYMBOL(pcmcia_get_next_region);
2378 EXPORT_SYMBOL(pcmcia_get_next_tuple);
2379 EXPORT_SYMBOL(pcmcia_get_next_window);
2380 EXPORT_SYMBOL(pcmcia_get_status);
2381 EXPORT_SYMBOL(pcmcia_get_tuple_data);
2382 EXPORT_SYMBOL(pcmcia_insert_card);
2383 EXPORT_SYMBOL(pcmcia_map_mem_page);
2384 EXPORT_SYMBOL(pcmcia_modify_configuration);
2385 EXPORT_SYMBOL(pcmcia_modify_window);
2386 EXPORT_SYMBOL(pcmcia_open_memory);
2387 EXPORT_SYMBOL(pcmcia_parse_tuple);
2388 EXPORT_SYMBOL(pcmcia_read_memory);
2389 EXPORT_SYMBOL(pcmcia_register_client);
2390 EXPORT_SYMBOL(pcmcia_register_erase_queue);
2391 EXPORT_SYMBOL(pcmcia_register_mtd);
2392 EXPORT_SYMBOL(pcmcia_release_configuration);
2393 EXPORT_SYMBOL(pcmcia_release_io);
2394 EXPORT_SYMBOL(pcmcia_release_irq);
2395 EXPORT_SYMBOL(pcmcia_release_window);
2396 EXPORT_SYMBOL(pcmcia_replace_cis);
2397 EXPORT_SYMBOL(pcmcia_report_error);
2398 EXPORT_SYMBOL(pcmcia_request_configuration);
2399 EXPORT_SYMBOL(pcmcia_request_io);
2400 EXPORT_SYMBOL(pcmcia_request_irq);
2401 EXPORT_SYMBOL(pcmcia_request_window);
2402 EXPORT_SYMBOL(pcmcia_reset_card);
2403 EXPORT_SYMBOL(pcmcia_resume_card);
2404 EXPORT_SYMBOL(pcmcia_set_event_mask);
2405 EXPORT_SYMBOL(pcmcia_suspend_card);
2406 EXPORT_SYMBOL(pcmcia_validate_cis);
2407 EXPORT_SYMBOL(pcmcia_write_memory);
2409 EXPORT_SYMBOL(dead_socket);
2410 EXPORT_SYMBOL(register_ss_entry);
2411 EXPORT_SYMBOL(unregister_ss_entry);
2412 EXPORT_SYMBOL(CardServices);
2413 EXPORT_SYMBOL(MTDHelperEntry);
2414 #ifdef CONFIG_PROC_FS
2415 EXPORT_SYMBOL(proc_pccard);
2418 EXPORT_SYMBOL(pcmcia_register_socket);
2419 EXPORT_SYMBOL(pcmcia_unregister_socket);
2420 EXPORT_SYMBOL(pcmcia_suspend_socket);
2421 EXPORT_SYMBOL(pcmcia_resume_socket);
2423 static int __init init_pcmcia_cs(void)
2425 printk(KERN_INFO "%s\n", release);
2426 printk(KERN_INFO " %s\n", options);
2427 DEBUG(0, "%s\n", version);
2429 pm_register(PM_SYS_DEV, PM_SYS_PCMCIA, handle_pm_event);
2430 #ifdef CONFIG_PROC_FS
2431 proc_pccard = proc_mkdir("pccard", proc_bus);
2436 static void __exit exit_pcmcia_cs(void)
2438 printk(KERN_INFO "unloading Kernel Card Services\n");
2439 #ifdef CONFIG_PROC_FS
2441 remove_proc_entry("pccard", proc_bus);
2445 pm_unregister_all(handle_pm_event);
2446 release_resource_db();
2449 module_init(init_pcmcia_cs);
2450 module_exit(exit_pcmcia_cs);
2452 /*====================================================================*/