10
10
#include <linux/interrupt.h>
11
11
#include <linux/init.h>
12
12
#include <linux/delay.h>
13
#include <linux/gpio.h>
14
15
#include <mach/hardware.h>
15
16
#include <asm/irq.h>
16
17
#include <asm/mach-types.h>
17
#include <mach/h3600.h>
18
#include <mach/h3xxx.h>
19
20
#include "sa1100_generic.h"
21
22
static struct pcmcia_irqs irqs[] = {
22
{ 0, IRQ_GPIO_H3600_PCMCIA_CD0, "PCMCIA CD0" },
23
{ 1, IRQ_GPIO_H3600_PCMCIA_CD1, "PCMCIA CD1" }
23
{ .sock = 0, .str = "PCMCIA CD0" }, /* .irq will be filled later */
24
{ .sock = 1, .str = "PCMCIA CD1" }
26
27
static int h3600_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
28
skt->irq = skt->nr ? IRQ_GPIO_H3600_PCMCIA_IRQ1
29
: IRQ_GPIO_H3600_PCMCIA_IRQ0;
32
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
33
err = gpio_request(H3XXX_GPIO_PCMCIA_IRQ0, "PCMCIA IRQ0");
36
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_IRQ0);
39
skt->socket.pci_irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_IRQ0);
41
err = gpio_request(H3XXX_GPIO_PCMCIA_CD0, "PCMCIA CD0");
44
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_CD0);
47
irqs[0].irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_CD0);
49
err = gpio_request(H3XXX_EGPIO_OPT_NVRAM_ON, "OPT NVRAM ON");
52
err = gpio_direction_output(H3XXX_EGPIO_OPT_NVRAM_ON, 0);
55
err = gpio_request(H3XXX_EGPIO_OPT_ON, "OPT ON");
58
err = gpio_direction_output(H3XXX_EGPIO_OPT_ON, 0);
61
err = gpio_request(H3XXX_EGPIO_OPT_RESET, "OPT RESET");
64
err = gpio_direction_output(H3XXX_EGPIO_OPT_RESET, 0);
67
err = gpio_request(H3XXX_EGPIO_CARD_RESET, "PCMCIA CARD RESET");
70
err = gpio_direction_output(H3XXX_EGPIO_CARD_RESET, 0);
73
err = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
78
err = gpio_request(H3XXX_GPIO_PCMCIA_IRQ1, "PCMCIA IRQ1");
81
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_IRQ1);
84
skt->socket.pci_irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_IRQ1);
86
err = gpio_request(H3XXX_GPIO_PCMCIA_CD1, "PCMCIA CD1");
89
err = gpio_direction_input(H3XXX_GPIO_PCMCIA_CD1);
92
irqs[1].irq = gpio_to_irq(H3XXX_GPIO_PCMCIA_CD1);
94
err = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
101
err06: gpio_free(H3XXX_EGPIO_CARD_RESET);
102
err05: gpio_free(H3XXX_EGPIO_OPT_RESET);
103
err04: gpio_free(H3XXX_EGPIO_OPT_ON);
104
err03: gpio_free(H3XXX_EGPIO_OPT_NVRAM_ON);
105
err02: gpio_free(H3XXX_GPIO_PCMCIA_CD0);
106
err01: gpio_free(H3XXX_GPIO_PCMCIA_IRQ0);
109
err12: gpio_free(H3XXX_GPIO_PCMCIA_CD0);
110
err11: gpio_free(H3XXX_GPIO_PCMCIA_IRQ0);
35
114
static void h3600_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
37
116
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
40
assign_h3600_egpio(IPAQ_EGPIO_OPT_NVRAM_ON, 0);
41
assign_h3600_egpio(IPAQ_EGPIO_OPT_ON, 0);
42
assign_h3600_egpio(IPAQ_EGPIO_OPT_RESET, 1);
120
/* Disable CF bus: */
121
gpio_set_value(H3XXX_EGPIO_OPT_NVRAM_ON, 0);
122
gpio_set_value(H3XXX_EGPIO_OPT_ON, 0);
123
gpio_set_value(H3XXX_EGPIO_OPT_RESET, 1);
125
gpio_free(H3XXX_EGPIO_CARD_RESET);
126
gpio_free(H3XXX_EGPIO_OPT_RESET);
127
gpio_free(H3XXX_EGPIO_OPT_ON);
128
gpio_free(H3XXX_EGPIO_OPT_NVRAM_ON);
129
gpio_free(H3XXX_GPIO_PCMCIA_CD0);
130
gpio_free(H3XXX_GPIO_PCMCIA_IRQ0);
133
gpio_free(H3XXX_GPIO_PCMCIA_CD1);
134
gpio_free(H3XXX_GPIO_PCMCIA_IRQ1);
46
140
h3600_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
48
unsigned long levels = GPLR;
50
142
switch (skt->nr) {
52
state->detect = levels & GPIO_H3600_PCMCIA_CD0 ? 0 : 1;
53
state->ready = levels & GPIO_H3600_PCMCIA_IRQ0 ? 1 : 0;
144
state->detect = !gpio_get_value(H3XXX_GPIO_PCMCIA_CD0);
145
state->ready = !!gpio_get_value(H3XXX_GPIO_PCMCIA_IRQ0);
56
148
state->wrprot = 0; /* Not available on H3600. */