hh.org updates
[hh.org.git] / arch / arm / mach-pxa / h4000 / h4000_pcmcia.c
blob792a5f10790d5ae06735e8f9b56d03014f77b41b
1 /*
2 * h4000_pcmcia.c
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.
10 * * * */
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;
62 state->bvd1 = 1;
63 state->bvd2 = 1;
64 state->wrprot = 0;
65 state->vs_3v = asic3_get_gpio_status_c(&h4000_asic3.dev)
66 & GPIOC_WLAN_POWER_ON;
67 state->vs_Xv = 0;
70 static int h4000_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
71 const socket_state_t * state)
73 switch (state->Vcc) {
74 case 0:
75 asic3_set_gpio_out_c(&h4000_asic3.dev, GPIOC_WLAN_POWER_ON,
76 GPIOC_WLAN_POWER_ON);
77 break;
78 case 50:
79 case 33:
80 asic3_set_gpio_out_c(&h4000_asic3.dev, GPIOC_WLAN_POWER_ON,
81 GPIOC_WLAN_POWER_ON);
82 break;
83 default:
84 printk(KERN_ERR "%s: Unsupported Vcc:%d\n", __FUNCTION__,
85 state->Vcc);
87 return 0;
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,
103 .first = 0,
104 .nr = 1,
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 = {
124 .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");