diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /drivers/pcmcia/sa1100_jornada720.c | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'drivers/pcmcia/sa1100_jornada720.c')
-rw-r--r-- | drivers/pcmcia/sa1100_jornada720.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/drivers/pcmcia/sa1100_jornada720.c b/drivers/pcmcia/sa1100_jornada720.c new file mode 100644 index 00000000000..6bcabee6bde --- /dev/null +++ b/drivers/pcmcia/sa1100_jornada720.c | |||
@@ -0,0 +1,120 @@ | |||
1 | /* | ||
2 | * drivers/pcmcia/sa1100_jornada720.c | ||
3 | * | ||
4 | * Jornada720 PCMCIA specific routines | ||
5 | * | ||
6 | */ | ||
7 | #include <linux/module.h> | ||
8 | #include <linux/kernel.h> | ||
9 | #include <linux/device.h> | ||
10 | #include <linux/errno.h> | ||
11 | #include <linux/init.h> | ||
12 | |||
13 | #include <mach/hardware.h> | ||
14 | #include <asm/hardware/sa1111.h> | ||
15 | #include <asm/mach-types.h> | ||
16 | |||
17 | #include "sa1111_generic.h" | ||
18 | |||
19 | /* Does SOCKET1_3V actually do anything? */ | ||
20 | #define SOCKET0_POWER GPIO_GPIO0 | ||
21 | #define SOCKET0_3V GPIO_GPIO2 | ||
22 | #define SOCKET1_POWER (GPIO_GPIO1 | GPIO_GPIO3) | ||
23 | #define SOCKET1_3V GPIO_GPIO3 | ||
24 | |||
25 | static int | ||
26 | jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) | ||
27 | { | ||
28 | struct sa1111_pcmcia_socket *s = to_skt(skt); | ||
29 | unsigned int pa_dwr_mask, pa_dwr_set; | ||
30 | int ret; | ||
31 | |||
32 | printk(KERN_INFO "%s(): config socket %d vcc %d vpp %d\n", __func__, | ||
33 | skt->nr, state->Vcc, state->Vpp); | ||
34 | |||
35 | switch (skt->nr) { | ||
36 | case 0: | ||
37 | pa_dwr_mask = SOCKET0_POWER | SOCKET0_3V; | ||
38 | |||
39 | switch (state->Vcc) { | ||
40 | default: | ||
41 | case 0: | ||
42 | pa_dwr_set = 0; | ||
43 | break; | ||
44 | case 33: | ||
45 | pa_dwr_set = SOCKET0_POWER | SOCKET0_3V; | ||
46 | break; | ||
47 | case 50: | ||
48 | pa_dwr_set = SOCKET0_POWER; | ||
49 | break; | ||
50 | } | ||
51 | break; | ||
52 | |||
53 | case 1: | ||
54 | pa_dwr_mask = SOCKET1_POWER; | ||
55 | |||
56 | switch (state->Vcc) { | ||
57 | default: | ||
58 | case 0: | ||
59 | pa_dwr_set = 0; | ||
60 | break; | ||
61 | case 33: | ||
62 | pa_dwr_set = SOCKET1_POWER; | ||
63 | break; | ||
64 | case 50: | ||
65 | pa_dwr_set = SOCKET1_POWER; | ||
66 | break; | ||
67 | } | ||
68 | break; | ||
69 | |||
70 | default: | ||
71 | return -1; | ||
72 | } | ||
73 | |||
74 | if (state->Vpp != state->Vcc && state->Vpp != 0) { | ||
75 | printk(KERN_ERR "%s(): slot cannot support VPP %u\n", | ||
76 | __func__, state->Vpp); | ||
77 | return -EPERM; | ||
78 | } | ||
79 | |||
80 | ret = sa1111_pcmcia_configure_socket(skt, state); | ||
81 | if (ret == 0) { | ||
82 | unsigned long flags; | ||
83 | |||
84 | local_irq_save(flags); | ||
85 | sa1111_set_io(s->dev, pa_dwr_mask, pa_dwr_set); | ||
86 | local_irq_restore(flags); | ||
87 | } | ||
88 | |||
89 | return ret; | ||
90 | } | ||
91 | |||
92 | static struct pcmcia_low_level jornada720_pcmcia_ops = { | ||
93 | .owner = THIS_MODULE, | ||
94 | .configure_socket = jornada720_pcmcia_configure_socket, | ||
95 | .socket_init = sa1111_pcmcia_socket_init, | ||
96 | .first = 0, | ||
97 | .nr = 2, | ||
98 | }; | ||
99 | |||
100 | int __devinit pcmcia_jornada720_init(struct device *dev) | ||
101 | { | ||
102 | int ret = -ENODEV; | ||
103 | |||
104 | if (machine_is_jornada720()) { | ||
105 | unsigned int pin = GPIO_A0 | GPIO_A1 | GPIO_A2 | GPIO_A3; | ||
106 | |||
107 | GRER |= 0x00000002; | ||
108 | |||
109 | /* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */ | ||
110 | sa1111_set_io_dir(dev, pin, 0, 0); | ||
111 | sa1111_set_io(dev, pin, 0); | ||
112 | sa1111_set_sleep_io(dev, pin, 0); | ||
113 | |||
114 | sa11xx_drv_pcmcia_ops(&jornada720_pcmcia_ops); | ||
115 | ret = sa1111_pcmcia_add(dev, &jornada720_pcmcia_ops, | ||
116 | sa11xx_drv_pcmcia_add_one); | ||
117 | } | ||
118 | |||
119 | return ret; | ||
120 | } | ||