1 /*======================================================================
3 Common support code for the PCMCIA control functionality of
4 integrated SOCs like the SA-11x0 and PXA2xx 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 ======================================================================*/
34 #include <linux/cpufreq.h>
35 #include <linux/gpio.h>
36 #include <linux/gpio/consumer.h>
37 #include <linux/init.h>
38 #include <linux/interrupt.h>
40 #include <linux/irq.h>
41 #include <linux/kernel.h>
43 #include <linux/module.h>
44 #include <linux/moduleparam.h>
45 #include <linux/mutex.h>
46 #include <linux/spinlock.h>
47 #include <linux/timer.h>
49 #include <mach/hardware.h>
51 #include "soc_common.h"
53 static irqreturn_t
soc_common_pcmcia_interrupt(int irq
, void *dev
);
55 #ifdef CONFIG_PCMCIA_DEBUG
58 module_param(pc_debug
, int, 0644);
60 void soc_pcmcia_debug(struct soc_pcmcia_socket
*skt
, const char *func
,
61 int lvl
, const char *fmt
, ...)
71 printk(KERN_DEBUG
"skt%u: %s: %pV", skt
->nr
, func
, &vaf
);
76 EXPORT_SYMBOL(soc_pcmcia_debug
);
80 #define to_soc_pcmcia_socket(x) \
81 container_of(x, struct soc_pcmcia_socket, socket)
84 calc_speed(unsigned short *spds
, int num
, unsigned short dflt
)
86 unsigned short speed
= 0;
89 for (i
= 0; i
< num
; i
++)
98 void soc_common_pcmcia_get_timing(struct soc_pcmcia_socket
*skt
,
99 struct soc_pcmcia_timing
*timing
)
102 calc_speed(skt
->spd_io
, MAX_IO_WIN
, SOC_PCMCIA_IO_ACCESS
);
104 calc_speed(skt
->spd_mem
, MAX_WIN
, SOC_PCMCIA_3V_MEM_ACCESS
);
106 calc_speed(skt
->spd_attr
, MAX_WIN
, SOC_PCMCIA_3V_MEM_ACCESS
);
108 EXPORT_SYMBOL(soc_common_pcmcia_get_timing
);
110 static void __soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket
*skt
,
115 for (i
= 0; i
< nr
; i
++)
116 if (skt
->stat
[i
].irq
)
117 free_irq(skt
->stat
[i
].irq
, skt
);
119 if (skt
->ops
->hw_shutdown
)
120 skt
->ops
->hw_shutdown(skt
);
122 clk_disable_unprepare(skt
->clk
);
125 static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket
*skt
)
127 __soc_pcmcia_hw_shutdown(skt
, ARRAY_SIZE(skt
->stat
));
130 int soc_pcmcia_request_gpiods(struct soc_pcmcia_socket
*skt
)
132 struct device
*dev
= skt
->socket
.dev
.parent
;
133 struct gpio_desc
*desc
;
136 for (i
= 0; i
< ARRAY_SIZE(skt
->stat
); i
++) {
137 if (!skt
->stat
[i
].name
)
140 desc
= devm_gpiod_get(dev
, skt
->stat
[i
].name
, GPIOD_IN
);
142 dev_err(dev
, "Failed to get GPIO for %s: %ld\n",
143 skt
->stat
[i
].name
, PTR_ERR(desc
));
144 return PTR_ERR(desc
);
147 skt
->stat
[i
].desc
= desc
;
152 EXPORT_SYMBOL_GPL(soc_pcmcia_request_gpiods
);
154 static int soc_pcmcia_hw_init(struct soc_pcmcia_socket
*skt
)
158 clk_prepare_enable(skt
->clk
);
160 if (skt
->ops
->hw_init
) {
161 ret
= skt
->ops
->hw_init(skt
);
166 for (i
= 0; i
< ARRAY_SIZE(skt
->stat
); i
++) {
167 if (gpio_is_valid(skt
->stat
[i
].gpio
)) {
168 unsigned long flags
= GPIOF_IN
;
170 /* CD is active low by default */
171 if (i
== SOC_STAT_CD
)
172 flags
|= GPIOF_ACTIVE_LOW
;
174 ret
= devm_gpio_request_one(skt
->socket
.dev
.parent
,
175 skt
->stat
[i
].gpio
, flags
,
178 __soc_pcmcia_hw_shutdown(skt
, i
);
182 skt
->stat
[i
].desc
= gpio_to_desc(skt
->stat
[i
].gpio
);
185 if (skt
->stat
[i
].desc
) {
186 int irq
= gpiod_to_irq(skt
->stat
[i
].desc
);
189 if (i
== SOC_STAT_RDY
)
190 skt
->socket
.pci_irq
= irq
;
192 skt
->stat
[i
].irq
= irq
;
196 if (skt
->stat
[i
].irq
) {
197 ret
= request_irq(skt
->stat
[i
].irq
,
198 soc_common_pcmcia_interrupt
,
200 skt
->stat
[i
].name
, skt
);
202 __soc_pcmcia_hw_shutdown(skt
, i
);
211 static void soc_pcmcia_hw_enable(struct soc_pcmcia_socket
*skt
)
215 for (i
= 0; i
< ARRAY_SIZE(skt
->stat
); i
++)
216 if (skt
->stat
[i
].irq
) {
217 irq_set_irq_type(skt
->stat
[i
].irq
, IRQ_TYPE_EDGE_RISING
);
218 irq_set_irq_type(skt
->stat
[i
].irq
, IRQ_TYPE_EDGE_BOTH
);
222 static void soc_pcmcia_hw_disable(struct soc_pcmcia_socket
*skt
)
226 for (i
= 0; i
< ARRAY_SIZE(skt
->stat
); i
++)
227 if (skt
->stat
[i
].irq
)
228 irq_set_irq_type(skt
->stat
[i
].irq
, IRQ_TYPE_NONE
);
231 static unsigned int soc_common_pcmcia_skt_state(struct soc_pcmcia_socket
*skt
)
233 struct pcmcia_state state
;
236 memset(&state
, 0, sizeof(struct pcmcia_state
));
238 /* Make battery voltage state report 'good' */
242 if (skt
->stat
[SOC_STAT_CD
].desc
)
243 state
.detect
= !!gpiod_get_value(skt
->stat
[SOC_STAT_CD
].desc
);
244 if (skt
->stat
[SOC_STAT_RDY
].desc
)
245 state
.ready
= !!gpiod_get_value(skt
->stat
[SOC_STAT_RDY
].desc
);
246 if (skt
->stat
[SOC_STAT_BVD1
].desc
)
247 state
.bvd1
= !!gpiod_get_value(skt
->stat
[SOC_STAT_BVD1
].desc
);
248 if (skt
->stat
[SOC_STAT_BVD2
].desc
)
249 state
.bvd2
= !!gpiod_get_value(skt
->stat
[SOC_STAT_BVD2
].desc
);
251 skt
->ops
->socket_state(skt
, &state
);
253 stat
= state
.detect
? SS_DETECT
: 0;
254 stat
|= state
.ready
? SS_READY
: 0;
255 stat
|= state
.wrprot
? SS_WRPROT
: 0;
256 stat
|= state
.vs_3v
? SS_3VCARD
: 0;
257 stat
|= state
.vs_Xv
? SS_XVCARD
: 0;
259 /* The power status of individual sockets is not available
260 * explicitly from the hardware, so we just remember the state
261 * and regurgitate it upon request:
263 stat
|= skt
->cs_state
.Vcc
? SS_POWERON
: 0;
265 if (skt
->cs_state
.flags
& SS_IOCARD
)
266 stat
|= state
.bvd1
? 0 : SS_STSCHG
;
270 else if (state
.bvd2
== 0)
277 * soc_common_pcmcia_config_skt
278 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
280 * Convert PCMCIA socket state to our socket configure structure.
282 static int soc_common_pcmcia_config_skt(
283 struct soc_pcmcia_socket
*skt
, socket_state_t
*state
)
287 ret
= skt
->ops
->configure_socket(skt
, state
);
290 * This really needs a better solution. The IRQ
291 * may or may not be claimed by the driver.
293 if (skt
->irq_state
!= 1 && state
->io_irq
) {
295 irq_set_irq_type(skt
->socket
.pci_irq
,
296 IRQ_TYPE_EDGE_FALLING
);
297 } else if (skt
->irq_state
== 1 && state
->io_irq
== 0) {
299 irq_set_irq_type(skt
->socket
.pci_irq
, IRQ_TYPE_NONE
);
302 skt
->cs_state
= *state
;
306 printk(KERN_ERR
"soc_common_pcmcia: unable to configure "
307 "socket %d\n", skt
->nr
);
312 /* soc_common_pcmcia_sock_init()
313 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
315 * (Re-)Initialise the socket, turning on status interrupts
316 * and PCMCIA bus. This must wait for power to stabilise
317 * so that the card status signals report correctly.
321 static int soc_common_pcmcia_sock_init(struct pcmcia_socket
*sock
)
323 struct soc_pcmcia_socket
*skt
= to_soc_pcmcia_socket(sock
);
325 debug(skt
, 2, "initializing socket\n");
326 if (skt
->ops
->socket_init
)
327 skt
->ops
->socket_init(skt
);
328 soc_pcmcia_hw_enable(skt
);
334 * soc_common_pcmcia_suspend()
335 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
337 * Remove power on the socket, disable IRQs from the card.
338 * Turn off status interrupts, and disable the PCMCIA bus.
342 static int soc_common_pcmcia_suspend(struct pcmcia_socket
*sock
)
344 struct soc_pcmcia_socket
*skt
= to_soc_pcmcia_socket(sock
);
346 debug(skt
, 2, "suspending socket\n");
348 soc_pcmcia_hw_disable(skt
);
349 if (skt
->ops
->socket_suspend
)
350 skt
->ops
->socket_suspend(skt
);
355 static DEFINE_SPINLOCK(status_lock
);
357 static void soc_common_check_status(struct soc_pcmcia_socket
*skt
)
361 debug(skt
, 4, "entering PCMCIA monitoring thread\n");
367 status
= soc_common_pcmcia_skt_state(skt
);
369 spin_lock_irqsave(&status_lock
, flags
);
370 events
= (status
^ skt
->status
) & skt
->cs_state
.csc_mask
;
371 skt
->status
= status
;
372 spin_unlock_irqrestore(&status_lock
, flags
);
374 debug(skt
, 4, "events: %s%s%s%s%s%s\n",
375 events
== 0 ? "<NONE>" : "",
376 events
& SS_DETECT
? "DETECT " : "",
377 events
& SS_READY
? "READY " : "",
378 events
& SS_BATDEAD
? "BATDEAD " : "",
379 events
& SS_BATWARN
? "BATWARN " : "",
380 events
& SS_STSCHG
? "STSCHG " : "");
383 pcmcia_parse_events(&skt
->socket
, events
);
387 /* Let's poll for events in addition to IRQs since IRQ only is unreliable... */
388 static void soc_common_pcmcia_poll_event(unsigned long dummy
)
390 struct soc_pcmcia_socket
*skt
= (struct soc_pcmcia_socket
*)dummy
;
391 debug(skt
, 4, "polling for events\n");
393 mod_timer(&skt
->poll_timer
, jiffies
+ SOC_PCMCIA_POLL_PERIOD
);
395 soc_common_check_status(skt
);
400 * Service routine for socket driver interrupts (requested by the
401 * low-level PCMCIA init() operation via soc_common_pcmcia_thread()).
402 * The actual interrupt-servicing work is performed by
403 * soc_common_pcmcia_thread(), largely because the Card Services event-
404 * handling code performs scheduling operations which cannot be
405 * executed from within an interrupt context.
407 static irqreturn_t
soc_common_pcmcia_interrupt(int irq
, void *dev
)
409 struct soc_pcmcia_socket
*skt
= dev
;
411 debug(skt
, 3, "servicing IRQ %d\n", irq
);
413 soc_common_check_status(skt
);
420 * Implements the get_status() operation for the in-kernel PCMCIA
421 * service (formerly SS_GetStatus in Card Services). Essentially just
422 * fills in bits in `status' according to internal driver state or
423 * the value of the voltage detect chipselect register.
425 * As a debugging note, during card startup, the PCMCIA core issues
426 * three set_socket() commands in a row the first with RESET deasserted,
427 * the second with RESET asserted, and the last with RESET deasserted
428 * again. Following the third set_socket(), a get_status() command will
429 * be issued. The kernel is looking for the SS_READY flag (see
430 * setup_socket(), reset_socket(), and unreset_socket() in cs.c).
435 soc_common_pcmcia_get_status(struct pcmcia_socket
*sock
, unsigned int *status
)
437 struct soc_pcmcia_socket
*skt
= to_soc_pcmcia_socket(sock
);
439 skt
->status
= soc_common_pcmcia_skt_state(skt
);
440 *status
= skt
->status
;
447 * Implements the set_socket() operation for the in-kernel PCMCIA
448 * service (formerly SS_SetSocket in Card Services). We more or
449 * less punt all of this work and let the kernel handle the details
450 * of power configuration, reset, &c. We also record the value of
451 * `state' in order to regurgitate it to the PCMCIA core later.
453 static int soc_common_pcmcia_set_socket(
454 struct pcmcia_socket
*sock
, socket_state_t
*state
)
456 struct soc_pcmcia_socket
*skt
= to_soc_pcmcia_socket(sock
);
458 debug(skt
, 2, "mask: %s%s%s%s%s%s flags: %s%s%s%s%s%s Vcc %d Vpp %d irq %d\n",
459 (state
->csc_mask
== 0) ? "<NONE> " : "",
460 (state
->csc_mask
& SS_DETECT
) ? "DETECT " : "",
461 (state
->csc_mask
& SS_READY
) ? "READY " : "",
462 (state
->csc_mask
& SS_BATDEAD
) ? "BATDEAD " : "",
463 (state
->csc_mask
& SS_BATWARN
) ? "BATWARN " : "",
464 (state
->csc_mask
& SS_STSCHG
) ? "STSCHG " : "",
465 (state
->flags
== 0) ? "<NONE> " : "",
466 (state
->flags
& SS_PWR_AUTO
) ? "PWR_AUTO " : "",
467 (state
->flags
& SS_IOCARD
) ? "IOCARD " : "",
468 (state
->flags
& SS_RESET
) ? "RESET " : "",
469 (state
->flags
& SS_SPKR_ENA
) ? "SPKR_ENA " : "",
470 (state
->flags
& SS_OUTPUT_ENA
) ? "OUTPUT_ENA " : "",
471 state
->Vcc
, state
->Vpp
, state
->io_irq
);
473 return soc_common_pcmcia_config_skt(skt
, state
);
478 * Implements the set_io_map() operation for the in-kernel PCMCIA
479 * service (formerly SS_SetIOMap in Card Services). We configure
480 * the map speed as requested, but override the address ranges
481 * supplied by Card Services.
483 * Returns: 0 on success, -1 on error
485 static int soc_common_pcmcia_set_io_map(
486 struct pcmcia_socket
*sock
, struct pccard_io_map
*map
)
488 struct soc_pcmcia_socket
*skt
= to_soc_pcmcia_socket(sock
);
489 unsigned short speed
= map
->speed
;
491 debug(skt
, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n",
492 map
->map
, map
->speed
, (unsigned long long)map
->start
,
493 (unsigned long long)map
->stop
);
494 debug(skt
, 2, "flags: %s%s%s%s%s%s%s%s\n",
495 (map
->flags
== 0) ? "<NONE>" : "",
496 (map
->flags
& MAP_ACTIVE
) ? "ACTIVE " : "",
497 (map
->flags
& MAP_16BIT
) ? "16BIT " : "",
498 (map
->flags
& MAP_AUTOSZ
) ? "AUTOSZ " : "",
499 (map
->flags
& MAP_0WS
) ? "0WS " : "",
500 (map
->flags
& MAP_WRPROT
) ? "WRPROT " : "",
501 (map
->flags
& MAP_USE_WAIT
) ? "USE_WAIT " : "",
502 (map
->flags
& MAP_PREFETCH
) ? "PREFETCH " : "");
504 if (map
->map
>= MAX_IO_WIN
) {
505 printk(KERN_ERR
"%s(): map (%d) out of range\n", __func__
,
510 if (map
->flags
& MAP_ACTIVE
) {
512 speed
= SOC_PCMCIA_IO_ACCESS
;
517 skt
->spd_io
[map
->map
] = speed
;
518 skt
->ops
->set_timing(skt
);
521 map
->stop
= PAGE_SIZE
-1;
523 map
->stop
-= map
->start
;
524 map
->stop
+= skt
->socket
.io_offset
;
525 map
->start
= skt
->socket
.io_offset
;
532 * Implements the set_mem_map() operation for the in-kernel PCMCIA
533 * service (formerly SS_SetMemMap in Card Services). We configure
534 * the map speed as requested, but override the address ranges
535 * supplied by Card Services.
537 * Returns: 0 on success, -ERRNO on error
539 static int soc_common_pcmcia_set_mem_map(
540 struct pcmcia_socket
*sock
, struct pccard_mem_map
*map
)
542 struct soc_pcmcia_socket
*skt
= to_soc_pcmcia_socket(sock
);
543 struct resource
*res
;
544 unsigned short speed
= map
->speed
;
546 debug(skt
, 2, "map %u speed %u card_start %08x\n",
547 map
->map
, map
->speed
, map
->card_start
);
548 debug(skt
, 2, "flags: %s%s%s%s%s%s%s%s\n",
549 (map
->flags
== 0) ? "<NONE>" : "",
550 (map
->flags
& MAP_ACTIVE
) ? "ACTIVE " : "",
551 (map
->flags
& MAP_16BIT
) ? "16BIT " : "",
552 (map
->flags
& MAP_AUTOSZ
) ? "AUTOSZ " : "",
553 (map
->flags
& MAP_0WS
) ? "0WS " : "",
554 (map
->flags
& MAP_WRPROT
) ? "WRPROT " : "",
555 (map
->flags
& MAP_ATTRIB
) ? "ATTRIB " : "",
556 (map
->flags
& MAP_USE_WAIT
) ? "USE_WAIT " : "");
558 if (map
->map
>= MAX_WIN
)
561 if (map
->flags
& MAP_ACTIVE
) {
568 if (map
->flags
& MAP_ATTRIB
) {
569 res
= &skt
->res_attr
;
570 skt
->spd_attr
[map
->map
] = speed
;
571 skt
->spd_mem
[map
->map
] = 0;
574 skt
->spd_attr
[map
->map
] = 0;
575 skt
->spd_mem
[map
->map
] = speed
;
578 skt
->ops
->set_timing(skt
);
580 map
->static_start
= res
->start
+ map
->card_start
;
590 static struct bittbl status_bits
[] = {
591 { SS_WRPROT
, "SS_WRPROT" },
592 { SS_BATDEAD
, "SS_BATDEAD" },
593 { SS_BATWARN
, "SS_BATWARN" },
594 { SS_READY
, "SS_READY" },
595 { SS_DETECT
, "SS_DETECT" },
596 { SS_POWERON
, "SS_POWERON" },
597 { SS_STSCHG
, "SS_STSCHG" },
598 { SS_3VCARD
, "SS_3VCARD" },
599 { SS_XVCARD
, "SS_XVCARD" },
602 static struct bittbl conf_bits
[] = {
603 { SS_PWR_AUTO
, "SS_PWR_AUTO" },
604 { SS_IOCARD
, "SS_IOCARD" },
605 { SS_RESET
, "SS_RESET" },
606 { SS_DMA_MODE
, "SS_DMA_MODE" },
607 { SS_SPKR_ENA
, "SS_SPKR_ENA" },
608 { SS_OUTPUT_ENA
, "SS_OUTPUT_ENA" },
611 static void dump_bits(char **p
, const char *prefix
,
612 unsigned int val
, struct bittbl
*bits
, int sz
)
617 b
+= sprintf(b
, "%-9s:", prefix
);
618 for (i
= 0; i
< sz
; i
++)
619 if (val
& bits
[i
].mask
)
620 b
+= sprintf(b
, " %s", bits
[i
].name
);
626 * Implements the /sys/class/pcmcia_socket/??/status file.
628 * Returns: the number of characters added to the buffer
630 static ssize_t
show_status(
631 struct device
*dev
, struct device_attribute
*attr
, char *buf
)
633 struct soc_pcmcia_socket
*skt
=
634 container_of(dev
, struct soc_pcmcia_socket
, socket
.dev
);
637 p
+= sprintf(p
, "slot : %d\n", skt
->nr
);
639 dump_bits(&p
, "status", skt
->status
,
640 status_bits
, ARRAY_SIZE(status_bits
));
641 dump_bits(&p
, "csc_mask", skt
->cs_state
.csc_mask
,
642 status_bits
, ARRAY_SIZE(status_bits
));
643 dump_bits(&p
, "cs_flags", skt
->cs_state
.flags
,
644 conf_bits
, ARRAY_SIZE(conf_bits
));
646 p
+= sprintf(p
, "Vcc : %d\n", skt
->cs_state
.Vcc
);
647 p
+= sprintf(p
, "Vpp : %d\n", skt
->cs_state
.Vpp
);
648 p
+= sprintf(p
, "IRQ : %d (%d)\n", skt
->cs_state
.io_irq
,
649 skt
->socket
.pci_irq
);
650 if (skt
->ops
->show_timing
)
651 p
+= skt
->ops
->show_timing(skt
, p
);
655 static DEVICE_ATTR(status
, S_IRUGO
, show_status
, NULL
);
658 static struct pccard_operations soc_common_pcmcia_operations
= {
659 .init
= soc_common_pcmcia_sock_init
,
660 .suspend
= soc_common_pcmcia_suspend
,
661 .get_status
= soc_common_pcmcia_get_status
,
662 .set_socket
= soc_common_pcmcia_set_socket
,
663 .set_io_map
= soc_common_pcmcia_set_io_map
,
664 .set_mem_map
= soc_common_pcmcia_set_mem_map
,
668 static LIST_HEAD(soc_pcmcia_sockets
);
669 static DEFINE_MUTEX(soc_pcmcia_sockets_lock
);
671 #ifdef CONFIG_CPU_FREQ
673 soc_pcmcia_notifier(struct notifier_block
*nb
, unsigned long val
, void *data
)
675 struct soc_pcmcia_socket
*skt
;
676 struct cpufreq_freqs
*freqs
= data
;
679 mutex_lock(&soc_pcmcia_sockets_lock
);
680 list_for_each_entry(skt
, &soc_pcmcia_sockets
, node
)
681 if (skt
->ops
->frequency_change
)
682 ret
+= skt
->ops
->frequency_change(skt
, val
, freqs
);
683 mutex_unlock(&soc_pcmcia_sockets_lock
);
688 static struct notifier_block soc_pcmcia_notifier_block
= {
689 .notifier_call
= soc_pcmcia_notifier
692 static int soc_pcmcia_cpufreq_register(void)
696 ret
= cpufreq_register_notifier(&soc_pcmcia_notifier_block
,
697 CPUFREQ_TRANSITION_NOTIFIER
);
699 printk(KERN_ERR
"Unable to register CPU frequency change "
700 "notifier for PCMCIA (%d)\n", ret
);
703 fs_initcall(soc_pcmcia_cpufreq_register
);
705 static void soc_pcmcia_cpufreq_unregister(void)
707 cpufreq_unregister_notifier(&soc_pcmcia_notifier_block
,
708 CPUFREQ_TRANSITION_NOTIFIER
);
710 module_exit(soc_pcmcia_cpufreq_unregister
);
714 void soc_pcmcia_init_one(struct soc_pcmcia_socket
*skt
,
715 struct pcmcia_low_level
*ops
, struct device
*dev
)
720 skt
->socket
.owner
= ops
->owner
;
721 skt
->socket
.dev
.parent
= dev
;
722 skt
->socket
.pci_irq
= NO_IRQ
;
724 for (i
= 0; i
< ARRAY_SIZE(skt
->stat
); i
++)
725 skt
->stat
[i
].gpio
= -EINVAL
;
727 EXPORT_SYMBOL(soc_pcmcia_init_one
);
729 void soc_pcmcia_remove_one(struct soc_pcmcia_socket
*skt
)
731 mutex_lock(&soc_pcmcia_sockets_lock
);
732 del_timer_sync(&skt
->poll_timer
);
734 pcmcia_unregister_socket(&skt
->socket
);
736 soc_pcmcia_hw_shutdown(skt
);
738 /* should not be required; violates some lowlevel drivers */
739 soc_common_pcmcia_config_skt(skt
, &dead_socket
);
741 list_del(&skt
->node
);
742 mutex_unlock(&soc_pcmcia_sockets_lock
);
744 iounmap(skt
->virt_io
);
746 release_resource(&skt
->res_attr
);
747 release_resource(&skt
->res_mem
);
748 release_resource(&skt
->res_io
);
749 release_resource(&skt
->res_skt
);
751 EXPORT_SYMBOL(soc_pcmcia_remove_one
);
753 int soc_pcmcia_add_one(struct soc_pcmcia_socket
*skt
)
757 setup_timer(&skt
->poll_timer
, soc_common_pcmcia_poll_event
,
759 skt
->poll_timer
.expires
= jiffies
+ SOC_PCMCIA_POLL_PERIOD
;
761 ret
= request_resource(&iomem_resource
, &skt
->res_skt
);
765 ret
= request_resource(&skt
->res_skt
, &skt
->res_io
);
769 ret
= request_resource(&skt
->res_skt
, &skt
->res_mem
);
773 ret
= request_resource(&skt
->res_skt
, &skt
->res_attr
);
777 skt
->virt_io
= ioremap(skt
->res_io
.start
, 0x10000);
778 if (skt
->virt_io
== NULL
) {
783 mutex_lock(&soc_pcmcia_sockets_lock
);
785 list_add(&skt
->node
, &soc_pcmcia_sockets
);
788 * We initialize default socket timing here, because
789 * we are not guaranteed to see a SetIOMap operation at
792 skt
->ops
->set_timing(skt
);
794 ret
= soc_pcmcia_hw_init(skt
);
798 skt
->socket
.ops
= &soc_common_pcmcia_operations
;
799 skt
->socket
.features
= SS_CAP_STATIC_MAP
|SS_CAP_PCCARD
;
800 skt
->socket
.resource_ops
= &pccard_static_ops
;
801 skt
->socket
.irq_mask
= 0;
802 skt
->socket
.map_size
= PAGE_SIZE
;
803 skt
->socket
.io_offset
= (unsigned long)skt
->virt_io
;
805 skt
->status
= soc_common_pcmcia_skt_state(skt
);
807 ret
= pcmcia_register_socket(&skt
->socket
);
811 add_timer(&skt
->poll_timer
);
813 mutex_unlock(&soc_pcmcia_sockets_lock
);
815 ret
= device_create_file(&skt
->socket
.dev
, &dev_attr_status
);
822 mutex_lock(&soc_pcmcia_sockets_lock
);
823 del_timer_sync(&skt
->poll_timer
);
824 pcmcia_unregister_socket(&skt
->socket
);
827 soc_pcmcia_hw_shutdown(skt
);
829 list_del(&skt
->node
);
830 mutex_unlock(&soc_pcmcia_sockets_lock
);
831 iounmap(skt
->virt_io
);
833 release_resource(&skt
->res_attr
);
835 release_resource(&skt
->res_mem
);
837 release_resource(&skt
->res_io
);
839 release_resource(&skt
->res_skt
);
844 EXPORT_SYMBOL(soc_pcmcia_add_one
);
846 MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
847 MODULE_DESCRIPTION("Linux PCMCIA Card Services: Common SoC support");
848 MODULE_LICENSE("Dual MPL/GPL");