1 /*======================================================================
3 Device driver for the PCMCIA control functionality of StrongARM
4 SA-1100 microprocessors.
6 The contents of this file are subject to the Mozilla Public
7 License Version 1.1 (the "License"); you may not use this file
8 except in compliance with the License. You may obtain a copy of
9 the License at http://www.mozilla.org/MPL/
11 Software distributed under the License is distributed on an "AS
12 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
13 implied. See the License for the specific language governing
14 rights and limitations under the License.
16 The initial developer of the original code is John G. Dorsey
17 <john+@cs.cmu.edu>. Portions created by John G. Dorsey are
18 Copyright (C) 1999 John G. Dorsey. All Rights Reserved.
20 Alternatively, the contents of this file may be used under the
21 terms of the GNU Public License version 2 (the "GPL"), in which
22 case the provisions of the GPL are applicable instead of the
23 above. If you wish to allow the use of your version of this file
24 only under the terms of the GPL and not to allow others to use
25 your version of this file under the MPL, indicate your decision
26 by deleting the provisions above and replace them with the notice
27 and other provisions required by the GPL. If you do not delete
28 the provisions above, a recipient may use your version of this
29 file under either the MPL or the GPL.
31 ======================================================================*/
33 * Please see linux/Documentation/arm/SA1100/PCMCIA for more information
34 * on the low-level kernel interface.
37 #include <linux/module.h>
38 #include <linux/init.h>
39 #include <linux/config.h>
40 #include <linux/cpufreq.h>
41 #include <linux/delay.h>
42 #include <linux/ioport.h>
43 #include <linux/kernel.h>
44 #include <linux/tqueue.h>
45 #include <linux/timer.h>
47 #include <linux/notifier.h>
48 #include <linux/proc_fs.h>
49 #include <linux/version.h>
51 #include <pcmcia/version.h>
52 #include <pcmcia/cs_types.h>
53 #include <pcmcia/cs.h>
54 #include <pcmcia/ss.h>
55 #include <pcmcia/bus_ops.h>
57 #include <asm/hardware.h>
60 #include <asm/system.h>
61 #include <asm/arch/assabet.h>
69 /* This structure maintains housekeeping state for each socket, such
70 * as the last known values of the card detect pins, or the Card Services
71 * callback value associated with the socket:
73 static int sa1100_pcmcia_socket_count;
74 static struct sa1100_pcmcia_socket sa1100_pcmcia_socket[SA1100_PCMCIA_MAX_SOCK];
76 #define PCMCIA_SOCKET(x) (sa1100_pcmcia_socket + (x))
78 /* Returned by the low-level PCMCIA interface: */
79 static struct pcmcia_low_level *pcmcia_low_level;
81 static struct timer_list poll_timer;
82 static struct tq_struct sa1100_pcmcia_task;
85 * sa1100_pcmcia_state_to_config
86 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
88 * Convert PCMCIA socket state to our socket configure structure.
90 static struct pcmcia_configure
91 sa1100_pcmcia_state_to_config(unsigned int sock, socket_state_t *state)
93 struct pcmcia_configure conf;
96 conf.vcc = state->Vcc;
97 conf.vpp = state->Vpp;
98 conf.output = state->flags & SS_OUTPUT_ENA ? 1 : 0;
99 conf.speaker = state->flags & SS_SPKR_ENA ? 1 : 0;
100 conf.reset = state->flags & SS_RESET ? 1 : 0;
101 conf.irq = state->io_irq != 0;
106 /* sa1100_pcmcia_init()
107 * ^^^^^^^^^^^^^^^^^^^^
109 * (Re-)Initialise the socket, turning on status interrupts
110 * and PCMCIA bus. This must wait for power to stabilise
111 * so that the card status signals report correctly.
115 static int sa1100_pcmcia_init(unsigned int sock)
117 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
118 struct pcmcia_configure conf;
120 DEBUG(2, "%s(): initializing socket %u\n", __FUNCTION__, sock);
122 skt->cs_state = dead_socket;
124 conf = sa1100_pcmcia_state_to_config(sock, &dead_socket);
126 pcmcia_low_level->configure_socket(&conf);
128 return pcmcia_low_level->socket_init(sock);
133 * sa1100_pcmcia_suspend()
134 * ^^^^^^^^^^^^^^^^^^^^^^^
136 * Remove power on the socket, disable IRQs from the card.
137 * Turn off status interrupts, and disable the PCMCIA bus.
141 static int sa1100_pcmcia_suspend(unsigned int sock)
143 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
144 struct pcmcia_configure conf;
147 DEBUG(2, "%s(): suspending socket %u\n", __FUNCTION__, sock);
149 conf = sa1100_pcmcia_state_to_config(sock, &dead_socket);
151 ret = pcmcia_low_level->configure_socket(&conf);
154 skt->cs_state = dead_socket;
155 ret = pcmcia_low_level->socket_suspend(sock);
162 /* sa1100_pcmcia_events()
163 * ^^^^^^^^^^^^^^^^^^^^^^
164 * Helper routine to generate a Card Services event mask based on
165 * state information obtained from the kernel low-level PCMCIA layer
166 * in a recent (and previous) sampling. Updates `prev_state'.
168 * Returns: an event mask for the given socket state.
170 static inline unsigned int
171 sa1100_pcmcia_events(struct pcmcia_state *state,
172 struct pcmcia_state *prev_state,
173 unsigned int mask, unsigned int flags)
175 unsigned int events = 0;
177 if (state->detect != prev_state->detect) {
178 DEBUG(3, "%s(): card detect value %u\n", __FUNCTION__, state->detect);
183 if (state->ready != prev_state->ready) {
184 DEBUG(3, "%s(): card ready value %u\n", __FUNCTION__, state->ready);
186 events |= flags & SS_IOCARD ? 0 : SS_READY;
189 if (state->bvd1 != prev_state->bvd1) {
190 DEBUG(3, "%s(): card BVD1 value %u\n", __FUNCTION__, state->bvd1);
192 events |= flags & SS_IOCARD ? SS_STSCHG : SS_BATDEAD;
195 if (state->bvd2 != prev_state->bvd2) {
196 DEBUG(3, "%s(): card BVD2 value %u\n", __FUNCTION__, state->bvd2);
198 events |= flags & SS_IOCARD ? 0 : SS_BATWARN;
201 *prev_state = *state;
205 DEBUG(2, "events: %s%s%s%s%s%s\n",
206 events == 0 ? "<NONE>" : "",
207 events & SS_DETECT ? "DETECT " : "",
208 events & SS_READY ? "READY " : "",
209 events & SS_BATDEAD ? "BATDEAD " : "",
210 events & SS_BATWARN ? "BATWARN " : "",
211 events & SS_STSCHG ? "STSCHG " : "");
214 } /* sa1100_pcmcia_events() */
217 /* sa1100_pcmcia_task_handler()
218 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
219 * Processes serviceable socket events using the "eventd" thread context.
221 * Event processing (specifically, the invocation of the Card Services event
222 * callback) occurs in this thread rather than in the actual interrupt
223 * handler due to the use of scheduling operations in the PCMCIA core.
225 static void sa1100_pcmcia_task_handler(void *data)
227 struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK];
228 struct pcmcia_state_array state_array;
229 unsigned int all_events;
231 DEBUG(4, "%s(): entering PCMCIA monitoring thread\n", __FUNCTION__);
233 state_array.size = sa1100_pcmcia_socket_count;
234 state_array.state = state;
240 memset(state, 0, sizeof(state));
242 DEBUG(4, "%s(): interrogating low-level PCMCIA service\n", __FUNCTION__);
244 ret = pcmcia_low_level->socket_state(&state_array);
246 printk(KERN_ERR "sa1100_pcmcia: unable to read socket status\n");
252 for (i = 0; i < state_array.size; i++, all_events |= events) {
253 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i);
255 events = sa1100_pcmcia_events(&state[i], &skt->k_state,
256 skt->cs_state.csc_mask,
257 skt->cs_state.flags);
259 if (events && sa1100_pcmcia_socket[i].handler != NULL)
260 skt->handler(skt->handler_info, events);
263 } /* sa1100_pcmcia_task_handler() */
265 static struct tq_struct sa1100_pcmcia_task = {
266 routine: sa1100_pcmcia_task_handler
270 /* sa1100_pcmcia_poll_event()
271 * ^^^^^^^^^^^^^^^^^^^^^^^^^^
272 * Let's poll for events in addition to IRQs since IRQ only is unreliable...
274 static void sa1100_pcmcia_poll_event(unsigned long dummy)
276 DEBUG(4, "%s(): polling for events\n", __FUNCTION__);
277 poll_timer.function = sa1100_pcmcia_poll_event;
278 poll_timer.expires = jiffies + SA1100_PCMCIA_POLL_PERIOD;
279 add_timer(&poll_timer);
280 schedule_task(&sa1100_pcmcia_task);
284 /* sa1100_pcmcia_interrupt()
285 * ^^^^^^^^^^^^^^^^^^^^^^^^^
286 * Service routine for socket driver interrupts (requested by the
287 * low-level PCMCIA init() operation via sa1100_pcmcia_thread()).
288 * The actual interrupt-servicing work is performed by
289 * sa1100_pcmcia_thread(), largely because the Card Services event-
290 * handling code performs scheduling operations which cannot be
291 * executed from within an interrupt context.
293 static void sa1100_pcmcia_interrupt(int irq, void *dev, struct pt_regs *regs)
295 DEBUG(3, "%s(): servicing IRQ %d\n", __FUNCTION__, irq);
296 schedule_task(&sa1100_pcmcia_task);
300 /* sa1100_pcmcia_register_callback()
301 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
302 * Implements the register_callback() operation for the in-kernel
303 * PCMCIA service (formerly SS_RegisterCallback in Card Services). If
304 * the function pointer `handler' is not NULL, remember the callback
305 * location in the state for `sock', and increment the usage counter
306 * for the driver module. (The callback is invoked from the interrupt
307 * service routine, sa1100_pcmcia_interrupt(), to notify Card Services
308 * of interesting events.) Otherwise, clear the callback pointer in the
309 * socket state and decrement the module usage count.
314 sa1100_pcmcia_register_callback(unsigned int sock,
315 void (*handler)(void *, unsigned int),
318 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
320 if (handler == NULL) {
325 skt->handler_info = info;
326 skt->handler = handler;
333 /* sa1100_pcmcia_inquire_socket()
334 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
335 * Implements the inquire_socket() operation for the in-kernel PCMCIA
336 * service (formerly SS_InquireSocket in Card Services). Of note is
337 * the setting of the SS_CAP_PAGE_REGS bit in the `features' field of
338 * `cap' to "trick" Card Services into tolerating large "I/O memory"
339 * addresses. Also set is SS_CAP_STATIC_MAP, which disables the memory
340 * resource database check. (Mapped memory is set up within the socket
343 * In conjunction with the STATIC_MAP capability is a new field,
344 * `io_offset', recommended by David Hinds. Rather than go through
345 * the SetIOMap interface (which is not quite suited for communicating
346 * window locations up from the socket driver), we just pass up
347 * an offset which is applied to client-requested base I/O addresses
348 * in alloc_io_space().
350 * SS_CAP_PAGE_REGS: used by setup_cis_mem() in cistpl.c to set the
351 * force_low argument to validate_mem() in rsrc_mgr.c -- since in
352 * general, the mapped * addresses of the PCMCIA memory regions
353 * will not be within 0xffff, setting force_low would be
356 * SS_CAP_STATIC_MAP: don't bother with the (user-configured) memory
357 * resource database; we instead pass up physical address ranges
358 * and allow other parts of Card Services to deal with remapping.
360 * SS_CAP_PCCARD: we can deal with 16-bit PCMCIA & CF cards, but
361 * not 32-bit CardBus devices.
363 * Return value is irrelevant; the pcmcia subsystem ignores it.
366 sa1100_pcmcia_inquire_socket(unsigned int sock, socket_cap_t *cap)
368 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
371 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
373 if (sock < sa1100_pcmcia_socket_count) {
374 cap->features = SS_CAP_PAGE_REGS | SS_CAP_STATIC_MAP | SS_CAP_PCCARD;
376 cap->map_size = PAGE_SIZE;
377 cap->pci_irq = skt->irq;
378 cap->io_offset = (unsigned long)skt->virt_io;
387 /* sa1100_pcmcia_get_status()
388 * ^^^^^^^^^^^^^^^^^^^^^^^^^^
389 * Implements the get_status() operation for the in-kernel PCMCIA
390 * service (formerly SS_GetStatus in Card Services). Essentially just
391 * fills in bits in `status' according to internal driver state or
392 * the value of the voltage detect chipselect register.
394 * As a debugging note, during card startup, the PCMCIA core issues
395 * three set_socket() commands in a row the first with RESET deasserted,
396 * the second with RESET asserted, and the last with RESET deasserted
397 * again. Following the third set_socket(), a get_status() command will
398 * be issued. The kernel is looking for the SS_READY flag (see
399 * setup_socket(), reset_socket(), and unreset_socket() in cs.c).
404 sa1100_pcmcia_get_status(unsigned int sock, unsigned int *status)
406 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
407 struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK];
408 struct pcmcia_state_array state_array;
411 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
413 state_array.size = sa1100_pcmcia_socket_count;
414 state_array.state = state;
416 memset(state, 0, sizeof(state));
418 if ((pcmcia_low_level->socket_state(&state_array)) < 0) {
419 printk(KERN_ERR "sa1100_pcmcia: unable to get socket status\n");
423 skt->k_state = state[sock];
425 stat = state[sock].detect ? SS_DETECT : 0;
426 stat |= state[sock].ready ? SS_READY : 0;
427 stat |= state[sock].vs_3v ? SS_3VCARD : 0;
428 stat |= state[sock].vs_Xv ? SS_XVCARD : 0;
430 /* The power status of individual sockets is not available
431 * explicitly from the hardware, so we just remember the state
432 * and regurgitate it upon request:
434 stat |= skt->cs_state.Vcc ? SS_POWERON : 0;
436 if (skt->cs_state.flags & SS_IOCARD)
437 stat |= state[sock].bvd1 ? SS_STSCHG : 0;
439 if (state[sock].bvd1 == 0)
441 else if (state[sock].bvd2 == 0)
445 DEBUG(3, "\tstatus: %s%s%s%s%s%s%s%s\n",
446 stat & SS_DETECT ? "DETECT " : "",
447 stat & SS_READY ? "READY " : "",
448 stat & SS_BATDEAD ? "BATDEAD " : "",
449 stat & SS_BATWARN ? "BATWARN " : "",
450 stat & SS_POWERON ? "POWERON " : "",
451 stat & SS_STSCHG ? "STSCHG " : "",
452 stat & SS_3VCARD ? "3VCARD " : "",
453 stat & SS_XVCARD ? "XVCARD " : "");
458 } /* sa1100_pcmcia_get_status() */
461 /* sa1100_pcmcia_get_socket()
462 * ^^^^^^^^^^^^^^^^^^^^^^^^^^
463 * Implements the get_socket() operation for the in-kernel PCMCIA
464 * service (formerly SS_GetSocket in Card Services). Not a very
470 sa1100_pcmcia_get_socket(unsigned int sock, socket_state_t *state)
472 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
474 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
476 *state = skt->cs_state;
481 /* sa1100_pcmcia_set_socket()
482 * ^^^^^^^^^^^^^^^^^^^^^^^^^^
483 * Implements the set_socket() operation for the in-kernel PCMCIA
484 * service (formerly SS_SetSocket in Card Services). We more or
485 * less punt all of this work and let the kernel handle the details
486 * of power configuration, reset, &c. We also record the value of
487 * `state' in order to regurgitate it to the PCMCIA core later.
492 sa1100_pcmcia_set_socket(unsigned int sock, socket_state_t *state)
494 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
495 struct pcmcia_configure conf;
497 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
499 DEBUG(3, "\tmask: %s%s%s%s%s%s\n\tflags: %s%s%s%s%s%s\n",
500 (state->csc_mask==0)?"<NONE>":"",
501 (state->csc_mask&SS_DETECT)?"DETECT ":"",
502 (state->csc_mask&SS_READY)?"READY ":"",
503 (state->csc_mask&SS_BATDEAD)?"BATDEAD ":"",
504 (state->csc_mask&SS_BATWARN)?"BATWARN ":"",
505 (state->csc_mask&SS_STSCHG)?"STSCHG ":"",
506 (state->flags==0)?"<NONE>":"",
507 (state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"",
508 (state->flags&SS_IOCARD)?"IOCARD ":"",
509 (state->flags&SS_RESET)?"RESET ":"",
510 (state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"",
511 (state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"");
512 DEBUG(3, "\tVcc %d Vpp %d irq %d\n",
513 state->Vcc, state->Vpp, state->io_irq);
515 conf = sa1100_pcmcia_state_to_config(sock, state);
517 if (pcmcia_low_level->configure_socket(&conf) < 0) {
518 printk(KERN_ERR "sa1100_pcmcia: unable to configure socket %d\n", sock);
522 skt->cs_state = *state;
525 } /* sa1100_pcmcia_set_socket() */
528 /* sa1100_pcmcia_get_io_map()
529 * ^^^^^^^^^^^^^^^^^^^^^^^^^^
530 * Implements the get_io_map() operation for the in-kernel PCMCIA
531 * service (formerly SS_GetIOMap in Card Services). Just returns an
532 * I/O map descriptor which was assigned earlier by a set_io_map().
534 * Returns: 0 on success, -1 if the map index was out of range
537 sa1100_pcmcia_get_io_map(unsigned int sock, struct pccard_io_map *map)
539 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
542 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
544 if (map->map < MAX_IO_WIN) {
545 *map = skt->io_map[map->map];
553 /* sa1100_pcmcia_set_io_map()
554 * ^^^^^^^^^^^^^^^^^^^^^^^^^^
555 * Implements the set_io_map() operation for the in-kernel PCMCIA
556 * service (formerly SS_SetIOMap in Card Services). We configure
557 * the map speed as requested, but override the address ranges
558 * supplied by Card Services.
560 * Returns: 0 on success, -1 on error
563 sa1100_pcmcia_set_io_map(unsigned int sock, struct pccard_io_map *map)
565 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
567 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
569 DEBUG(3, "\tmap %u speed %u\n\tstart 0x%08x stop 0x%08x\n",
570 map->map, map->speed, map->start, map->stop);
571 DEBUG(3, "\tflags: %s%s%s%s%s%s%s%s\n",
572 (map->flags==0)?"<NONE>":"",
573 (map->flags&MAP_ACTIVE)?"ACTIVE ":"",
574 (map->flags&MAP_16BIT)?"16BIT ":"",
575 (map->flags&MAP_AUTOSZ)?"AUTOSZ ":"",
576 (map->flags&MAP_0WS)?"0WS ":"",
577 (map->flags&MAP_WRPROT)?"WRPROT ":"",
578 (map->flags&MAP_USE_WAIT)?"USE_WAIT ":"",
579 (map->flags&MAP_PREFETCH)?"PREFETCH ":"");
581 if (map->map >= MAX_IO_WIN) {
582 printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__,
587 if (map->flags & MAP_ACTIVE) {
588 unsigned int clock, speed = map->speed;
592 speed = SA1100_PCMCIA_IO_ACCESS;
594 clock = cpufreq_get(0);
598 MECR_BSIO_SET(mecr, sock, sa1100_pcmcia_mecr_bs(speed, clock));
600 skt->speed_io = speed;
602 DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n",
603 __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock,
604 MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock),
605 sock, MECR_BSIO_GET(mecr, sock));
611 map->stop = PAGE_SIZE-1;
613 map->stop -= map->start;
614 map->stop += (unsigned long)skt->virt_io;
615 map->start = (unsigned long)skt->virt_io;
617 skt->io_map[map->map] = *map;
620 } /* sa1100_pcmcia_set_io_map() */
623 /* sa1100_pcmcia_get_mem_map()
624 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
625 * Implements the get_mem_map() operation for the in-kernel PCMCIA
626 * service (formerly SS_GetMemMap in Card Services). Just returns a
627 * memory map descriptor which was assigned earlier by a
628 * set_mem_map() request.
630 * Returns: 0 on success, -1 if the map index was out of range
633 sa1100_pcmcia_get_mem_map(unsigned int sock, struct pccard_mem_map *map)
635 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
638 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
640 if (map->map < MAX_WIN) {
641 *map = skt->mem_map[map->map];
649 /* sa1100_pcmcia_set_mem_map()
650 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
651 * Implements the set_mem_map() operation for the in-kernel PCMCIA
652 * service (formerly SS_SetMemMap in Card Services). We configure
653 * the map speed as requested, but override the address ranges
654 * supplied by Card Services.
656 * Returns: 0 on success, -1 on error
659 sa1100_pcmcia_set_mem_map(unsigned int sock, struct pccard_mem_map *map)
661 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
664 DEBUG(2, "%s() for sock %u\n", __FUNCTION__, sock);
666 DEBUG(3, "\tmap %u speed %u sys_start %08lx sys_stop %08lx card_start %08x\n",
667 map->map, map->speed, map->sys_start, map->sys_stop, map->card_start);
668 DEBUG(3, "\tflags: %s%s%s%s%s%s%s%s\n",
669 (map->flags==0)?"<NONE>":"",
670 (map->flags&MAP_ACTIVE)?"ACTIVE ":"",
671 (map->flags&MAP_16BIT)?"16BIT ":"",
672 (map->flags&MAP_AUTOSZ)?"AUTOSZ ":"",
673 (map->flags&MAP_0WS)?"0WS ":"",
674 (map->flags&MAP_WRPROT)?"WRPROT ":"",
675 (map->flags&MAP_ATTRIB)?"ATTRIB ":"",
676 (map->flags&MAP_USE_WAIT)?"USE_WAIT ":"");
678 if (map->map >= MAX_WIN){
679 printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__,
684 if (map->flags & MAP_ACTIVE) {
685 unsigned int clock, speed = map->speed;
689 * When clients issue RequestMap, the access speed is not always
690 * properly configured. Choose some sensible defaults.
693 if (skt->cs_state.Vcc == 33)
694 speed = SA1100_PCMCIA_3V_MEM_ACCESS;
696 speed = SA1100_PCMCIA_5V_MEM_ACCESS;
699 clock = cpufreq_get(0);
701 /* Fixme: MECR is not pre-empt safe. */
704 if (map->flags & MAP_ATTRIB) {
705 MECR_BSA_SET(mecr, sock, sa1100_pcmcia_mecr_bs(speed, clock));
706 skt->speed_attr = speed;
708 MECR_BSM_SET(mecr, sock, sa1100_pcmcia_mecr_bs(speed, clock));
709 skt->speed_mem = speed;
712 DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n",
713 __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock,
714 MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock),
715 sock, MECR_BSIO_GET(mecr, sock));
720 start = (map->flags & MAP_ATTRIB) ? skt->phys_attr : skt->phys_mem;
722 if (map->sys_stop == 0)
723 map->sys_stop = PAGE_SIZE-1;
725 map->sys_stop -= map->sys_start;
726 map->sys_stop += start;
727 map->sys_start = start;
729 skt->mem_map[map->map] = *map;
732 } /* sa1100_pcmcia_set_mem_map() */
735 #if defined(CONFIG_PROC_FS)
737 /* sa1100_pcmcia_proc_status()
738 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
739 * Implements the /proc/bus/pccard/??/status file.
741 * Returns: the number of characters added to the buffer
744 sa1100_pcmcia_proc_status(char *buf, char **start, off_t pos,
745 int count, int *eof, void *data)
747 unsigned int sock = (unsigned int)data;
748 unsigned int clock = cpufreq_get(0);
749 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
750 unsigned long mecr = MECR;
753 p+=sprintf(p, "k_state : %s%s%s%s%s%s%s\n",
754 skt->k_state.detect ? "detect " : "",
755 skt->k_state.ready ? "ready " : "",
756 skt->k_state.bvd1 ? "bvd1 " : "",
757 skt->k_state.bvd2 ? "bvd2 " : "",
758 skt->k_state.wrprot ? "wrprot " : "",
759 skt->k_state.vs_3v ? "vs_3v " : "",
760 skt->k_state.vs_Xv ? "vs_Xv " : "");
762 p+=sprintf(p, "status : %s%s%s%s%s%s%s%s%s\n",
763 skt->k_state.detect ? "SS_DETECT " : "",
764 skt->k_state.ready ? "SS_READY " : "",
765 skt->cs_state.Vcc ? "SS_POWERON " : "",
766 skt->cs_state.flags & SS_IOCARD ? "SS_IOCARD " : "",
767 (skt->cs_state.flags & SS_IOCARD &&
768 skt->k_state.bvd1) ? "SS_STSCHG " : "",
769 ((skt->cs_state.flags & SS_IOCARD)==0 &&
770 (skt->k_state.bvd1==0)) ? "SS_BATDEAD " : "",
771 ((skt->cs_state.flags & SS_IOCARD)==0 &&
772 (skt->k_state.bvd2==0)) ? "SS_BATWARN " : "",
773 skt->k_state.vs_3v ? "SS_3VCARD " : "",
774 skt->k_state.vs_Xv ? "SS_XVCARD " : "");
776 p+=sprintf(p, "mask : %s%s%s%s%s\n",
777 skt->cs_state.csc_mask & SS_DETECT ? "SS_DETECT " : "",
778 skt->cs_state.csc_mask & SS_READY ? "SS_READY " : "",
779 skt->cs_state.csc_mask & SS_BATDEAD ? "SS_BATDEAD " : "",
780 skt->cs_state.csc_mask & SS_BATWARN ? "SS_BATWARN " : "",
781 skt->cs_state.csc_mask & SS_STSCHG ? "SS_STSCHG " : "");
783 p+=sprintf(p, "cs_flags : %s%s%s%s%s\n",
784 skt->cs_state.flags & SS_PWR_AUTO ? "SS_PWR_AUTO " : "",
785 skt->cs_state.flags & SS_IOCARD ? "SS_IOCARD " : "",
786 skt->cs_state.flags & SS_RESET ? "SS_RESET " : "",
787 skt->cs_state.flags & SS_SPKR_ENA ? "SS_SPKR_ENA " : "",
788 skt->cs_state.flags & SS_OUTPUT_ENA ? "SS_OUTPUT_ENA " : "");
790 p+=sprintf(p, "Vcc : %d\n", skt->cs_state.Vcc);
791 p+=sprintf(p, "Vpp : %d\n", skt->cs_state.Vpp);
792 p+=sprintf(p, "IRQ : %d\n", skt->cs_state.io_irq);
794 p+=sprintf(p, "I/O : %u (%u)\n", skt->speed_io,
795 sa1100_pcmcia_cmd_time(clock, MECR_BSIO_GET(mecr, sock)));
797 p+=sprintf(p, "attribute: %u (%u)\n", skt->speed_attr,
798 sa1100_pcmcia_cmd_time(clock, MECR_BSA_GET(mecr, sock)));
800 p+=sprintf(p, "common : %u (%u)\n", skt->speed_mem,
801 sa1100_pcmcia_cmd_time(clock, MECR_BSM_GET(mecr, sock)));
806 /* sa1100_pcmcia_proc_setup()
807 * ^^^^^^^^^^^^^^^^^^^^^^^^^^
808 * Implements the proc_setup() operation for the in-kernel PCMCIA
809 * service (formerly SS_ProcSetup in Card Services).
811 * Returns: 0 on success, -1 on error
814 sa1100_pcmcia_proc_setup(unsigned int sock, struct proc_dir_entry *base)
816 struct proc_dir_entry *entry;
818 DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock);
820 if ((entry = create_proc_entry("status", 0, base)) == NULL){
821 printk(KERN_ERR "unable to install \"status\" procfs entry\n");
825 entry->read_proc = sa1100_pcmcia_proc_status;
826 entry->data = (void *)sock;
829 #endif /* defined(CONFIG_PROC_FS) */
831 static struct pccard_operations sa1100_pcmcia_operations = {
832 init: sa1100_pcmcia_init,
833 suspend: sa1100_pcmcia_suspend,
834 register_callback: sa1100_pcmcia_register_callback,
835 inquire_socket: sa1100_pcmcia_inquire_socket,
836 get_status: sa1100_pcmcia_get_status,
837 get_socket: sa1100_pcmcia_get_socket,
838 set_socket: sa1100_pcmcia_set_socket,
839 get_io_map: sa1100_pcmcia_get_io_map,
840 set_io_map: sa1100_pcmcia_set_io_map,
841 get_mem_map: sa1100_pcmcia_get_mem_map,
842 set_mem_map: sa1100_pcmcia_set_mem_map,
843 #ifdef CONFIG_PROC_FS
844 proc_setup: sa1100_pcmcia_proc_setup
848 #ifdef CONFIG_CPU_FREQ
850 /* sa1100_pcmcia_update_mecr()
851 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
852 * When sa1100_pcmcia_notifier() decides that a MECR adjustment (due
853 * to a core clock frequency change) is needed, this routine establishes
854 * new BS_xx values consistent with the clock speed `clock'.
856 static void sa1100_pcmcia_update_mecr(unsigned int clock)
859 unsigned long mecr = MECR;
861 for(sock = 0; sock < SA1100_PCMCIA_MAX_SOCK; ++sock){
863 MECR_BSIO_SET(mecr, sock,
864 sa1100_pcmcia_mecr_bs(sa1100_pcmcia_socket[sock].speed_io,
866 MECR_BSA_SET(mecr, sock,
867 sa1100_pcmcia_mecr_bs(sa1100_pcmcia_socket[sock].speed_attr,
869 MECR_BSM_SET(mecr, sock,
870 sa1100_pcmcia_mecr_bs(sa1100_pcmcia_socket[sock].speed_mem,
878 /* sa1100_pcmcia_notifier()
879 * ^^^^^^^^^^^^^^^^^^^^^^^^
880 * When changing the processor core clock frequency, it is necessary
881 * to adjust the MECR timings accordingly. We've recorded the timings
882 * requested by Card Services, so this is just a matter of finding
883 * out what our current speed is, and then recomputing the new MECR
886 * Returns: 0 on success, -1 on error
889 sa1100_pcmcia_notifier(struct notifier_block *nb, unsigned long val,
892 struct cpufreq_info *ci = data;
895 case CPUFREQ_PRECHANGE:
896 if (ci->new_freq > ci->old_freq) {
897 DEBUG(2, "%s(): new frequency %u.%uMHz > %u.%uMHz, pre-updating\n",
899 ci->new_freq / 1000, (ci->new_freq / 100) % 10,
900 ci->old_freq / 1000, (ci->old_freq / 100) % 10);
901 sa1100_pcmcia_update_mecr(ci->new_freq);
905 case CPUFREQ_POSTCHANGE:
906 if (ci->new_freq < ci->old_freq) {
907 DEBUG(2, "%s(): new frequency %u.%uMHz < %u.%uMHz, post-updating\n",
909 ci->new_freq / 1000, (ci->new_freq / 100) % 10,
910 ci->old_freq / 1000, (ci->old_freq / 100) % 10);
911 sa1100_pcmcia_update_mecr(ci->new_freq);
919 static struct notifier_block sa1100_pcmcia_notifier_block = {
920 notifier_call: sa1100_pcmcia_notifier
924 static int __init sa1100_pcmcia_machine_init(void)
926 #ifdef CONFIG_SA1100_ASSABET
927 if(machine_is_assabet()) {
928 if(machine_has_neponset()) {
929 #ifdef CONFIG_ASSABET_NEPONSET
930 pcmcia_low_level = &neponset_pcmcia_ops;
932 printk(KERN_ERR "Card Services disabled: missing Neponset support\n");
936 pcmcia_low_level = &assabet_pcmcia_ops;
939 #ifdef CONFIG_SA1100_BADGE4
940 if (machine_is_badge4())
941 pcmcia_low_level = &badge4_pcmcia_ops;
943 #ifdef CONFIG_SA1100_FREEBIRD
944 if (machine_is_freebird())
945 pcmcia_low_level = &freebird_pcmcia_ops;
947 #ifdef CONFIG_SA1100_H3600
948 if (machine_is_h3600())
949 pcmcia_low_level = &h3600_pcmcia_ops;
951 #ifdef CONFIG_SA1100_CERF
952 if (machine_is_cerf())
953 pcmcia_low_level = &cerf_pcmcia_ops;
955 #ifdef CONFIG_SA1100_GRAPHICSCLIENT
956 if (machine_is_graphicsclient())
957 pcmcia_low_level = &gcplus_pcmcia_ops;
959 #ifdef CONFIG_SA1100_XP860
960 if (machine_is_xp860())
961 pcmcia_low_level = &xp860_pcmcia_ops;
963 #ifdef CONFIG_SA1100_YOPY
964 if (machine_is_yopy())
965 pcmcia_low_level = &yopy_pcmcia_ops;
967 #ifdef CONFIG_SA1100_SHANNON
968 if (machine_is_shannon())
969 pcmcia_low_level = &shannon_pcmcia_ops;
971 #ifdef CONFIG_SA1100_PANGOLIN
972 if (machine_is_pangolin())
973 pcmcia_low_level = &pangolin_pcmcia_ops;
975 #ifdef CONFIG_SA1100_JORNADA720
976 if (machine_is_jornada720())
977 pcmcia_low_level = &jornada720_pcmcia_ops;
979 #ifdef CONFIG_SA1100_PFS168
980 if(machine_is_pfs168())
981 pcmcia_low_level = &pfs168_pcmcia_ops;
983 #ifdef CONFIG_SA1100_FLEXANET
984 if(machine_is_flexanet())
985 pcmcia_low_level = &flexanet_pcmcia_ops;
987 #ifdef CONFIG_SA1100_SIMPAD
988 if(machine_is_simpad())
989 pcmcia_low_level = &simpad_pcmcia_ops;
991 #ifdef CONFIG_SA1100_GRAPHICSMASTER
992 if(machine_is_graphicsmaster())
993 pcmcia_low_level = &graphicsmaster_pcmcia_ops;
995 #ifdef CONFIG_SA1100_ADSBITSY
996 if(machine_is_adsbitsy())
997 pcmcia_low_level = &adsbitsy_pcmcia_ops;
999 #ifdef CONFIG_SA1100_STORK
1000 if(machine_is_stork())
1001 pcmcia_low_level = &stork_pcmcia_ops;
1004 if (!pcmcia_low_level) {
1005 printk(KERN_ERR "This hardware is not supported by the SA1100 Card Service driver\n");
1012 /* sa1100_pcmcia_driver_init()
1013 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1015 * This routine performs a basic sanity check to ensure that this
1016 * kernel has been built with the appropriate board-specific low-level
1017 * PCMCIA support, performs low-level PCMCIA initialization, registers
1018 * this socket driver with Card Services, and then spawns the daemon
1019 * thread which is the real workhorse of the socket driver.
1021 * Returns: 0 on success, -1 on error
1023 static int __init sa1100_pcmcia_driver_init(void)
1026 struct pcmcia_init pcmcia_init;
1027 struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK];
1028 struct pcmcia_state_array state_array;
1029 unsigned int i, clock;
1033 printk(KERN_INFO "SA-1100 PCMCIA (CS release %s)\n", CS_RELEASE);
1035 CardServices(GetCardServicesInfo, &info);
1037 if (info.Revision != CS_RELEASE_CODE) {
1038 printk(KERN_ERR "Card Services release codes do not match\n");
1042 ret = sa1100_pcmcia_machine_init();
1046 pcmcia_init.handler = sa1100_pcmcia_interrupt;
1048 ret = pcmcia_low_level->init(&pcmcia_init);
1050 printk(KERN_ERR "Unable to initialize kernel PCMCIA service (%d).\n", ret);
1051 return ret == -1 ? -EIO : ret;
1054 sa1100_pcmcia_socket_count = ret;
1055 state_array.size = sa1100_pcmcia_socket_count;
1056 state_array.state = state;
1058 memset(state, 0, sizeof(state));
1060 if (pcmcia_low_level->socket_state(&state_array) < 0) {
1061 pcmcia_low_level->shutdown();
1062 printk(KERN_ERR "Unable to get PCMCIA status from kernel.\n");
1067 * We initialize the MECR to default values here, because we are
1068 * not guaranteed to see a SetIOMap operation at runtime.
1072 clock = cpufreq_get(0);
1074 for (i = 0; i < sa1100_pcmcia_socket_count; i++) {
1075 struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i);
1076 struct pcmcia_irq_info irq_info;
1078 if (!request_mem_region(_PCMCIA(i), PCMCIASp, "PCMCIA")) {
1085 ret = pcmcia_low_level->get_irq_info(&irq_info);
1087 printk(KERN_ERR "Unable to get IRQ for socket %u (%d)\n", i, ret);
1089 skt->irq = irq_info.irq;
1090 skt->k_state = state[i];
1091 skt->speed_io = SA1100_PCMCIA_IO_ACCESS;
1092 skt->speed_attr = SA1100_PCMCIA_5V_MEM_ACCESS;
1093 skt->speed_mem = SA1100_PCMCIA_5V_MEM_ACCESS;
1094 skt->phys_attr = _PCMCIAAttr(i);
1095 skt->phys_mem = _PCMCIAMem(i);
1096 skt->virt_io = ioremap(_PCMCIAIO(i), 0x10000);
1098 if (skt->virt_io == NULL) {
1103 MECR_FAST_SET(mecr, i, 0);
1104 MECR_BSIO_SET(mecr, i, sa1100_pcmcia_mecr_bs(skt->speed_io, clock));
1105 MECR_BSA_SET(mecr, i, sa1100_pcmcia_mecr_bs(skt->speed_attr, clock));
1106 MECR_BSM_SET(mecr, i, sa1100_pcmcia_mecr_bs(skt->speed_mem, clock));
1111 #ifdef CONFIG_CPU_FREQ
1112 ret = cpufreq_register_notifier(&sa1100_pcmcia_notifier_block);
1114 printk(KERN_ERR "Unable to register CPU frequency change notifier (%d)\n", ret);
1119 /* Only advertise as many sockets as we can detect */
1120 ret = register_ss_entry(sa1100_pcmcia_socket_count,
1121 &sa1100_pcmcia_operations);
1123 printk(KERN_ERR "Unable to register sockets\n");
1128 * Start the event poll timer. It will reschedule by itself afterwards.
1130 sa1100_pcmcia_poll_event(0);
1135 for (i = 0; i < sa1100_pcmcia_socket_count; i++) {
1136 iounmap(sa1100_pcmcia_socket[i].virt_io);
1137 release_mem_region(_PCMCIA(i), PCMCIASp);
1140 pcmcia_low_level->shutdown();
1143 } /* sa1100_pcmcia_driver_init() */
1145 /* sa1100_pcmcia_driver_shutdown()
1146 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1147 * Invokes the low-level kernel service to free IRQs associated with this
1148 * socket controller and reset GPIO edge detection.
1150 static void __exit sa1100_pcmcia_driver_shutdown(void)
1154 del_timer_sync(&poll_timer);
1156 unregister_ss_entry(&sa1100_pcmcia_operations);
1158 #ifdef CONFIG_CPU_FREQ
1159 cpufreq_unregister_notifier(&sa1100_pcmcia_notifier_block);
1162 for (i = 0; i < sa1100_pcmcia_socket_count; i++) {
1163 iounmap(sa1100_pcmcia_socket[i].virt_io);
1164 release_mem_region(_PCMCIA(i), PCMCIASp);
1167 pcmcia_low_level->shutdown();
1169 flush_scheduled_tasks();
1172 MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
1173 MODULE_DESCRIPTION("Linux PCMCIA Card Services: SA-1100 Socket Controller");
1174 MODULE_LICENSE("Dual MPL/GPL");
1176 module_init(sa1100_pcmcia_driver_init);
1177 module_exit(sa1100_pcmcia_driver_shutdown);