PCMCIA: sa11x0: cerf: convert to use new irq/gpio management
[linux-2.6.git] / drivers / pcmcia / sa1100_cerf.c
1 /*
2  * drivers/pcmcia/sa1100_cerf.c
3  *
4  * PCMCIA implementation routines for CerfBoard
5  * Based off the Assabet.
6  *
7  */
8 #include <linux/module.h>
9 #include <linux/kernel.h>
10 #include <linux/device.h>
11 #include <linux/init.h>
12 #include <linux/delay.h>
13
14 #include <mach/hardware.h>
15 #include <asm/mach-types.h>
16 #include <asm/irq.h>
17 #include <mach/cerf.h>
18 #include "sa1100_generic.h"
19
20 #define CERF_SOCKET     1
21
22 static int cerf_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
23 {
24         skt->stat[SOC_STAT_CD].gpio = CERF_GPIO_CF_CD;
25         skt->stat[SOC_STAT_CD].name = "CF_CD";
26         skt->stat[SOC_STAT_BVD1].gpio = CERF_GPIO_CF_BVD1;
27         skt->stat[SOC_STAT_BVD1].name = "CF_BVD1";
28         skt->stat[SOC_STAT_BVD2].gpio = CERF_GPIO_CF_BVD2;
29         skt->stat[SOC_STAT_BVD2].name = "CF_BVD2";
30         skt->stat[SOC_STAT_RDY].gpio = CERF_GPIO_CF_IRQ;
31         skt->stat[SOC_STAT_RDY].name = "CF_IRQ";
32
33         return 0;
34 }
35
36 static void
37 cerf_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
38 {
39         state->wrprot   = 0;
40         state->vs_3v    = 1;
41         state->vs_Xv    = 0;
42 }
43
44 static int
45 cerf_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
46                              const socket_state_t *state)
47 {
48         switch (state->Vcc) {
49         case 0:
50         case 50:
51         case 33:
52                 break;
53
54         default:
55                 printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
56                         __func__, state->Vcc);
57                 return -1;
58         }
59
60         if (state->flags & SS_RESET) {
61                 GPSR = CERF_GPIO_CF_RESET;
62         } else {
63                 GPCR = CERF_GPIO_CF_RESET;
64         }
65
66         return 0;
67 }
68
69 static struct pcmcia_low_level cerf_pcmcia_ops = { 
70         .owner                  = THIS_MODULE,
71         .hw_init                = cerf_pcmcia_hw_init,
72         .socket_state           = cerf_pcmcia_socket_state,
73         .configure_socket       = cerf_pcmcia_configure_socket,
74 };
75
76 int __devinit pcmcia_cerf_init(struct device *dev)
77 {
78         int ret = -ENODEV;
79
80         if (machine_is_cerf())
81                 ret = sa11xx_drv_pcmcia_probe(dev, &cerf_pcmcia_ops, CERF_SOCKET, 1);
82
83         return ret;
84 }