Merge branch 'for-linus-4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/mason...
[sfrench/cifs-2.6.git] / drivers / pcmcia / sa1100_shannon.c
1 /*
2  * drivers/pcmcia/sa1100_shannon.c
3  *
4  * PCMCIA implementation routines for Shannon
5  *
6  */
7 #include <linux/module.h>
8 #include <linux/kernel.h>
9 #include <linux/device.h>
10 #include <linux/init.h>
11 #include <linux/io.h>
12
13 #include <mach/hardware.h>
14 #include <asm/mach-types.h>
15 #include <mach/shannon.h>
16 #include <asm/irq.h>
17 #include "sa1100_generic.h"
18
19 static int shannon_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
20 {
21         /* All those are inputs */
22         GAFR &= ~(GPIO_GPIO(SHANNON_GPIO_EJECT_0) |
23                   GPIO_GPIO(SHANNON_GPIO_EJECT_1) |
24                   GPIO_GPIO(SHANNON_GPIO_RDY_0) |
25                   GPIO_GPIO(SHANNON_GPIO_RDY_1));
26
27         if (skt->nr == 0) {
28                 skt->stat[SOC_STAT_CD].gpio = SHANNON_GPIO_EJECT_0;
29                 skt->stat[SOC_STAT_CD].name = "PCMCIA_CD_0";
30                 skt->stat[SOC_STAT_RDY].gpio = SHANNON_GPIO_RDY_0;
31                 skt->stat[SOC_STAT_RDY].name = "PCMCIA_RDY_0";
32         } else {
33                 skt->stat[SOC_STAT_CD].gpio = SHANNON_GPIO_EJECT_1;
34                 skt->stat[SOC_STAT_CD].name = "PCMCIA_CD_1";
35                 skt->stat[SOC_STAT_RDY].gpio = SHANNON_GPIO_RDY_1;
36                 skt->stat[SOC_STAT_RDY].name = "PCMCIA_RDY_1";
37         }
38
39         return 0;
40 }
41
42 static void
43 shannon_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
44                             struct pcmcia_state *state)
45 {
46         switch (skt->nr) {
47         case 0:
48                 state->bvd1   = 1; 
49                 state->bvd2   = 1; 
50                 state->vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
51                 state->vs_Xv  = 0;
52                 break;
53
54         case 1:
55                 state->bvd1   = 1; 
56                 state->bvd2   = 1; 
57                 state->vs_3v  = 1; /* FIXME Can only apply 3.3V on Shannon. */
58                 state->vs_Xv  = 0;
59                 break;
60         }
61 }
62
63 static int
64 shannon_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
65                                 const socket_state_t *state)
66 {
67         switch (state->Vcc) {
68         case 0: /* power off */
69                 printk(KERN_WARNING "%s(): CS asked for 0V, still applying 3.3V..\n", __func__);
70                 break;
71         case 50:
72                 printk(KERN_WARNING "%s(): CS asked for 5V, applying 3.3V..\n", __func__);
73         case 33:
74                 break;
75         default:
76                 printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
77                        __func__, state->Vcc);
78                 return -1;
79         }
80
81         printk(KERN_WARNING "%s(): Warning, Can't perform reset\n", __func__);
82         
83         /* Silently ignore Vpp, output enable, speaker enable. */
84
85         return 0;
86 }
87
88 static struct pcmcia_low_level shannon_pcmcia_ops = {
89         .owner                  = THIS_MODULE,
90         .hw_init                = shannon_pcmcia_hw_init,
91         .socket_state           = shannon_pcmcia_socket_state,
92         .configure_socket       = shannon_pcmcia_configure_socket,
93 };
94
95 int pcmcia_shannon_init(struct device *dev)
96 {
97         int ret = -ENODEV;
98
99         if (machine_is_shannon())
100                 ret = sa11xx_drv_pcmcia_probe(dev, &shannon_pcmcia_ops, 0, 2);
101
102         return ret;
103 }