2 * drivers/pcmcia/sa1100_simpad.c
4 * PCMCIA implementation routines for simpad
7 #include <linux/module.h>
8 #include <linux/kernel.h>
9 #include <linux/sched.h>
10 #include <linux/device.h>
11 #include <linux/init.h>
13 #include <asm/hardware.h>
14 #include <asm/mach-types.h>
16 #include <asm/arch/simpad.h>
17 #include "sa1100_generic.h"
19 extern long get_cs3_shadow(void);
20 extern void set_cs3_bit(int value
);
21 extern void clear_cs3_bit(int value
);
23 static struct pcmcia_irqs irqs
[] = {
24 { 1, IRQ_GPIO_CF_CD
, "CF_CD" },
27 static int simpad_pcmcia_hw_init(struct soc_pcmcia_socket
*skt
)
30 clear_cs3_bit(VCC_3V_EN
|VCC_5V_EN
|EN0
|EN1
);
32 skt
->irq
= IRQ_GPIO_CF_IRQ
;
34 return soc_pcmcia_request_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
37 static void simpad_pcmcia_hw_shutdown(struct soc_pcmcia_socket
*skt
)
39 soc_pcmcia_free_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
42 //set_cs3_bit(PCMCIA_BUFF_DIS);
43 clear_cs3_bit(PCMCIA_RESET
);
47 simpad_pcmcia_socket_state(struct soc_pcmcia_socket
*skt
,
48 struct pcmcia_state
*state
)
50 unsigned long levels
= GPLR
;
51 long cs3reg
= get_cs3_shadow();
53 state
->detect
=((levels
& GPIO_CF_CD
)==0)?1:0;
54 state
->ready
=(levels
& GPIO_CF_IRQ
)?1:0;
55 state
->bvd1
=1; /* Not available on Simpad. */
56 state
->bvd2
=1; /* Not available on Simpad. */
57 state
->wrprot
=0; /* Not available on Simpad. */
59 if((cs3reg
& 0x0c) == 0x0c) {
69 simpad_pcmcia_configure_socket(struct soc_pcmcia_socket
*skt
,
70 const socket_state_t
*state
)
74 local_irq_save(flags
);
76 /* Murphy: see table of MIC2562a-1 */
79 clear_cs3_bit(VCC_3V_EN
|VCC_5V_EN
|EN0
|EN1
);
83 clear_cs3_bit(VCC_3V_EN
|EN1
);
84 set_cs3_bit(VCC_5V_EN
|EN0
);
88 clear_cs3_bit(VCC_5V_EN
|EN1
);
89 set_cs3_bit(VCC_3V_EN
|EN0
);
93 printk(KERN_ERR
"%s(): unrecognized Vcc %u\n",
94 __FUNCTION__
, state
->Vcc
);
95 clear_cs3_bit(VCC_3V_EN
|VCC_5V_EN
|EN0
|EN1
);
96 local_irq_restore(flags
);
101 local_irq_restore(flags
);
106 static void simpad_pcmcia_socket_init(struct soc_pcmcia_socket
*skt
)
108 soc_pcmcia_enable_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
111 static void simpad_pcmcia_socket_suspend(struct soc_pcmcia_socket
*skt
)
113 soc_pcmcia_disable_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
114 set_cs3_bit(PCMCIA_RESET
);
117 static struct pcmcia_low_level simpad_pcmcia_ops
= {
118 .owner
= THIS_MODULE
,
119 .hw_init
= simpad_pcmcia_hw_init
,
120 .hw_shutdown
= simpad_pcmcia_hw_shutdown
,
121 .socket_state
= simpad_pcmcia_socket_state
,
122 .configure_socket
= simpad_pcmcia_configure_socket
,
123 .socket_init
= simpad_pcmcia_socket_init
,
124 .socket_suspend
= simpad_pcmcia_socket_suspend
,
127 int __init
pcmcia_simpad_init(struct device
*dev
)
131 if (machine_is_simpad())
132 ret
= sa11xx_drv_pcmcia_probe(dev
, &simpad_pcmcia_ops
, 1, 1);