Blame view
drivers/pcmcia/sa1100_cerf.c
2.4 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 |
/* * drivers/pcmcia/sa1100_cerf.c * * PCMCIA implementation routines for CerfBoard * Based off the Assabet. * */ |
1da177e4c Linux-2.6.12-rc2 |
8 9 |
#include <linux/module.h> #include <linux/kernel.h> |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 |
#include <linux/device.h> #include <linux/init.h> #include <linux/delay.h> |
a09e64fbc [ARM] Move includ... |
13 |
#include <mach/hardware.h> |
1da177e4c Linux-2.6.12-rc2 |
14 15 |
#include <asm/mach-types.h> #include <asm/irq.h> |
a09e64fbc [ARM] Move includ... |
16 |
#include <mach/cerf.h> |
1da177e4c Linux-2.6.12-rc2 |
17 18 19 20 21 22 23 24 25 26 27 28 |
#include "sa1100_generic.h" #define CERF_SOCKET 1 static struct pcmcia_irqs irqs[] = { { CERF_SOCKET, CERF_IRQ_GPIO_CF_CD, "CF_CD" }, { CERF_SOCKET, CERF_IRQ_GPIO_CF_BVD2, "CF_BVD2" }, { CERF_SOCKET, CERF_IRQ_GPIO_CF_BVD1, "CF_BVD1" } }; static int cerf_pcmcia_hw_init(struct soc_pcmcia_socket *skt) { |
66024db57 PCMCIA: stop dupl... |
29 |
skt->socket.pci_irq = CERF_IRQ_GPIO_CF_IRQ; |
1da177e4c Linux-2.6.12-rc2 |
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); } static void cerf_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) { soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); } static void cerf_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) { unsigned long levels = GPLR; state->detect = (levels & CERF_GPIO_CF_CD) ?0:1; state->ready = (levels & CERF_GPIO_CF_IRQ) ?1:0; state->bvd1 = (levels & CERF_GPIO_CF_BVD1)?1:0; state->bvd2 = (levels & CERF_GPIO_CF_BVD2)?1:0; state->wrprot = 0; state->vs_3v = 1; state->vs_Xv = 0; } static int cerf_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { switch (state->Vcc) { case 0: case 50: case 33: break; default: printk(KERN_ERR "%s(): unrecognized Vcc %u ", |
2e11cb4c5 pcmcia: replace r... |
66 |
__func__, state->Vcc); |
1da177e4c Linux-2.6.12-rc2 |
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
return -1; } if (state->flags & SS_RESET) { GPSR = CERF_GPIO_CF_RESET; } else { GPCR = CERF_GPIO_CF_RESET; } return 0; } static void cerf_pcmcia_socket_init(struct soc_pcmcia_socket *skt) { soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs)); } static void cerf_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) { soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs)); } static struct pcmcia_low_level cerf_pcmcia_ops = { .owner = THIS_MODULE, .hw_init = cerf_pcmcia_hw_init, .hw_shutdown = cerf_pcmcia_hw_shutdown, .socket_state = cerf_pcmcia_socket_state, .configure_socket = cerf_pcmcia_configure_socket, .socket_init = cerf_pcmcia_socket_init, .socket_suspend = cerf_pcmcia_socket_suspend, }; |
5b85e04e9 pcmcia/sa1100: do... |
99 |
int __devinit pcmcia_cerf_init(struct device *dev) |
1da177e4c Linux-2.6.12-rc2 |
100 101 102 103 104 105 106 107 |
{ int ret = -ENODEV; if (machine_is_cerf()) ret = sa11xx_drv_pcmcia_probe(dev, &cerf_pcmcia_ops, CERF_SOCKET, 1); return ret; } |