4 * Created Apr 2, 2005, by Shawn Anderson
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/interrupt.h>
15 #include <linux/platform_device.h>
16 #include <asm/hardware.h>
17 #include <asm/arch/pxa-regs.h>
18 #include <asm/hardware/ipaq-asic3.h>
19 #include <linux/soc/asic3_base.h>
20 #include "../../../../drivers/pcmcia/soc_common.h"
21 #include <asm/arch/h4000-gpio.h>
22 #include <asm/arch/h4000-asic.h>
24 extern struct platform_device h4000_asic3
;
26 static struct pcmcia_irqs irqs
[] = {
27 {0, IRQ_GPIO(GPIO_NR_H4000_WLAN_MAC_IRQ_N
), "PCMCIA0"},
30 static int h4000_pcmcia_hw_init(struct soc_pcmcia_socket
*skt
)
32 GPSR(GPIO48_nPOE
) = GPIO_bit(GPIO48_nPOE
) | GPIO_bit(GPIO49_nPWE
) |
33 GPIO_bit(GPIO52_nPCE_1_MD
) | GPIO_bit(GPIO53_nPCE_2_MD
) |
34 GPIO_bit(GPIO55_nPREG_MD
) | GPIO_bit(GPIO56_nPWAIT_MD
);
36 pxa_gpio_mode(GPIO48_nPOE_MD
);
37 pxa_gpio_mode(GPIO49_nPWE_MD
);
38 pxa_gpio_mode(GPIO52_nPCE_1_MD
);
39 pxa_gpio_mode(GPIO55_nPREG_MD
);
40 pxa_gpio_mode(GPIO56_nPWAIT_MD
);
42 asic3_set_clock_cdex(&h4000_asic3
.dev
, CLOCK_CDEX_EX1
, CLOCK_CDEX_EX1
);
43 asic3_set_gpio_out_d(&h4000_asic3
.dev
, GPIOD_WLAN_MAC_RESET
,
44 GPIOD_WLAN_MAC_RESET
);
45 asic3_set_gpio_out_d(&h4000_asic3
.dev
, GPIOD_WLAN_MAC_RESET
, 0);
47 skt
->irq
= irqs
[0].irq
;
49 return soc_pcmcia_request_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
52 static void h4000_pcmcia_hw_shutdown(struct soc_pcmcia_socket
*skt
)
54 soc_pcmcia_free_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
57 static void h4000_pcmcia_socket_state(struct soc_pcmcia_socket
*skt
,
58 struct pcmcia_state
*state
)
60 state
->detect
= 1; // always attached
61 state
->ready
= GET_H4000_GPIO(WLAN_MAC_IRQ_N
) ? 1 : 0;
65 state
->vs_3v
= asic3_get_gpio_status_c(&h4000_asic3
.dev
)
66 & GPIOC_WLAN_POWER_ON
;
70 static int h4000_pcmcia_configure_socket(struct soc_pcmcia_socket
*skt
,
71 const socket_state_t
* state
)
75 asic3_set_gpio_out_c(&h4000_asic3
.dev
, GPIOC_WLAN_POWER_ON
,
80 asic3_set_gpio_out_c(&h4000_asic3
.dev
, GPIOC_WLAN_POWER_ON
,
84 printk(KERN_ERR
"%s: Unsupported Vcc:%d\n", __FUNCTION__
,
91 static void h4000_pcmcia_socket_init(struct soc_pcmcia_socket
*skt
)
93 soc_pcmcia_enable_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
96 static void h4000_pcmcia_socket_suspend(struct soc_pcmcia_socket
*skt
)
98 soc_pcmcia_disable_irqs(skt
, irqs
, ARRAY_SIZE(irqs
));
101 static struct pcmcia_low_level h4000_pcmcia_ops
= {
102 .owner
= THIS_MODULE
,
105 .hw_init
= h4000_pcmcia_hw_init
,
106 .hw_shutdown
= h4000_pcmcia_hw_shutdown
,
107 .socket_state
= h4000_pcmcia_socket_state
,
108 .configure_socket
= h4000_pcmcia_configure_socket
,
109 .socket_init
= h4000_pcmcia_socket_init
,
110 .socket_suspend
= h4000_pcmcia_socket_suspend
,
113 static struct platform_device h4000_pcmcia
= {
114 .name
= "pxa2xx-pcmcia",
115 .dev
= {.platform_data
= &h4000_pcmcia_ops
},
118 static int __init
h4000_pcmcia_probe(struct platform_device
*pdev
)
120 return platform_device_register(&h4000_pcmcia
);
123 static struct platform_driver h4000_pcmcia_driver
= {
125 .name
= "h4000_pcmcia",
127 .probe
= h4000_pcmcia_probe
,
130 static int __init
h4000_pcmcia_init(void)
132 return platform_driver_register(&h4000_pcmcia_driver
);
135 static void __exit
h4000_pcmcia_exit(void)
137 platform_device_unregister(&h4000_pcmcia
);
138 platform_driver_unregister(&h4000_pcmcia_driver
);
141 module_init(h4000_pcmcia_init
);
142 module_exit(h4000_pcmcia_exit
);
144 MODULE_LICENSE("GPL");