aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2011-12-19 18:04:22 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-02-04 09:32:23 -0500
commit81f33c65e6c09597e748288010476861ac5bd166 (patch)
treefdc080d5d7ca25dfe4a033f31f419d8bb1124e7d
parenta9bb5a4bf9f84256499c802fd397d56d55227e4f (diff)
PCMCIA: sa1111: use new per-socket irq/gpio infrastructure
Convert sa1111 PCMCIA drivers to use the new per-socket irq/gpio infrastructure. As the core takes care of handling the IRQs, we can get rid of sa1111_pcmcia_socket_init(), sa1111_pcmcia_socket_suspend(), sa1111_pcmcia_hw_init() and sa1111_pcmcia_hw_shutdown(), as well as the private IRQ table. We remove the NCR_0 setting in Neponset, as this is duplicating what's already done via configure_socket in suspend. Acked-by: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--drivers/pcmcia/pxa2xx_lubbock.c1
-rw-r--r--drivers/pcmcia/sa1100_badge4.c1
-rw-r--r--drivers/pcmcia/sa1100_jornada720.c1
-rw-r--r--drivers/pcmcia/sa1100_neponset.c9
-rw-r--r--drivers/pcmcia/sa1111_generic.c52
-rw-r--r--drivers/pcmcia/sa1111_generic.h1
6 files changed, 13 insertions, 52 deletions
diff --git a/drivers/pcmcia/pxa2xx_lubbock.c b/drivers/pcmcia/pxa2xx_lubbock.c
index c21888eebb58..c5caf5790451 100644
--- a/drivers/pcmcia/pxa2xx_lubbock.c
+++ b/drivers/pcmcia/pxa2xx_lubbock.c
@@ -202,7 +202,6 @@ lubbock_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
202static struct pcmcia_low_level lubbock_pcmcia_ops = { 202static struct pcmcia_low_level lubbock_pcmcia_ops = {
203 .owner = THIS_MODULE, 203 .owner = THIS_MODULE,
204 .configure_socket = lubbock_pcmcia_configure_socket, 204 .configure_socket = lubbock_pcmcia_configure_socket,
205 .socket_init = sa1111_pcmcia_socket_init,
206 .first = 0, 205 .first = 0,
207 .nr = 2, 206 .nr = 2,
208}; 207};
diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c
index 1ce53f493bef..ca97cb863896 100644
--- a/drivers/pcmcia/sa1100_badge4.c
+++ b/drivers/pcmcia/sa1100_badge4.c
@@ -128,7 +128,6 @@ badge4_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state
128static struct pcmcia_low_level badge4_pcmcia_ops = { 128static struct pcmcia_low_level badge4_pcmcia_ops = {
129 .owner = THIS_MODULE, 129 .owner = THIS_MODULE,
130 .configure_socket = badge4_pcmcia_configure_socket, 130 .configure_socket = badge4_pcmcia_configure_socket,
131 .socket_init = sa1111_pcmcia_socket_init,
132 .first = 0, 131 .first = 0,
133 .nr = 2, 132 .nr = 2,
134}; 133};
diff --git a/drivers/pcmcia/sa1100_jornada720.c b/drivers/pcmcia/sa1100_jornada720.c
index 6bcabee6bde4..61b443e8e074 100644
--- a/drivers/pcmcia/sa1100_jornada720.c
+++ b/drivers/pcmcia/sa1100_jornada720.c
@@ -92,7 +92,6 @@ jornada720_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
92static struct pcmcia_low_level jornada720_pcmcia_ops = { 92static struct pcmcia_low_level jornada720_pcmcia_ops = {
93 .owner = THIS_MODULE, 93 .owner = THIS_MODULE,
94 .configure_socket = jornada720_pcmcia_configure_socket, 94 .configure_socket = jornada720_pcmcia_configure_socket,
95 .socket_init = sa1111_pcmcia_socket_init,
96 .first = 0, 95 .first = 0,
97 .nr = 2, 96 .nr = 2,
98}; 97};
diff --git a/drivers/pcmcia/sa1100_neponset.c b/drivers/pcmcia/sa1100_neponset.c
index c95639b5f2a0..1eac3fd60d73 100644
--- a/drivers/pcmcia/sa1100_neponset.c
+++ b/drivers/pcmcia/sa1100_neponset.c
@@ -106,18 +106,9 @@ neponset_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_sta
106 return 0; 106 return 0;
107} 107}
108 108
109static void neponset_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
110{
111 if (skt->nr == 0)
112 NCR_0 &= ~(NCR_A0VPP | NCR_A1VPP);
113
114 sa1111_pcmcia_socket_init(skt);
115}
116
117static struct pcmcia_low_level neponset_pcmcia_ops = { 109static struct pcmcia_low_level neponset_pcmcia_ops = {
118 .owner = THIS_MODULE, 110 .owner = THIS_MODULE,
119 .configure_socket = neponset_pcmcia_configure_socket, 111 .configure_socket = neponset_pcmcia_configure_socket,
120 .socket_init = neponset_pcmcia_socket_init,
121 .first = 0, 112 .first = 0,
122 .nr = 2, 113 .nr = 2,
123}; 114};
diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c
index 7d6d3d423ef0..7510d506b8c3 100644
--- a/drivers/pcmcia/sa1111_generic.c
+++ b/drivers/pcmcia/sa1111_generic.c
@@ -29,23 +29,6 @@
29#define IDX_IRQ_S1_CD_VALID (4) 29#define IDX_IRQ_S1_CD_VALID (4)
30#define IDX_IRQ_S1_BVD1_STSCHG (5) 30#define IDX_IRQ_S1_BVD1_STSCHG (5)
31 31
32static struct pcmcia_irqs irqs[] = {
33 { 0, NO_IRQ, "SA1111 PCMCIA card detect" },
34 { 0, NO_IRQ, "SA1111 PCMCIA BVD1" },
35 { 1, NO_IRQ, "SA1111 CF card detect" },
36 { 1, NO_IRQ, "SA1111 CF BVD1" },
37};
38
39static int sa1111_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
40{
41 return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
42}
43
44static void sa1111_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
45{
46 soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
47}
48
49void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) 32void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
50{ 33{
51 struct sa1111_pcmcia_socket *s = to_skt(skt); 34 struct sa1111_pcmcia_socket *s = to_skt(skt);
@@ -114,26 +97,13 @@ int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_s
114 return 0; 97 return 0;
115} 98}
116 99
117void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
118{
119 soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs));
120}
121
122static void sa1111_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
123{
124 soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
125}
126
127int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops, 100int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
128 int (*add)(struct soc_pcmcia_socket *)) 101 int (*add)(struct soc_pcmcia_socket *))
129{ 102{
130 struct sa1111_pcmcia_socket *s; 103 struct sa1111_pcmcia_socket *s;
131 int i, ret = 0; 104 int i, ret = 0;
132 105
133 ops->hw_init = sa1111_pcmcia_hw_init;
134 ops->hw_shutdown = sa1111_pcmcia_hw_shutdown;
135 ops->socket_state = sa1111_pcmcia_socket_state; 106 ops->socket_state = sa1111_pcmcia_socket_state;
136 ops->socket_suspend = sa1111_pcmcia_socket_suspend;
137 107
138 for (i = 0; i < ops->nr; i++) { 108 for (i = 0; i < ops->nr; i++) {
139 s = kzalloc(sizeof(*s), GFP_KERNEL); 109 s = kzalloc(sizeof(*s), GFP_KERNEL);
@@ -142,10 +112,20 @@ int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
142 112
143 s->soc.nr = ops->first + i; 113 s->soc.nr = ops->first + i;
144 soc_pcmcia_init_one(&s->soc, ops, &dev->dev); 114 soc_pcmcia_init_one(&s->soc, ops, &dev->dev);
145 s->soc.socket.pci_irq = s->soc.nr ?
146 dev->irq[IDX_IRQ_S0_READY_NINT] :
147 dev->irq[IDX_IRQ_S1_READY_NINT];
148 s->dev = dev; 115 s->dev = dev;
116 if (s->soc.nr) {
117 s->soc.socket.pci_irq = dev->irq[IDX_IRQ_S1_READY_NINT];
118 s->soc.stat[SOC_STAT_CD].irq = dev->irq[IDX_IRQ_S1_CD_VALID];
119 s->soc.stat[SOC_STAT_CD].name = "SA1111 CF card detect";
120 s->soc.stat[SOC_STAT_BVD1].irq = dev->irq[IDX_IRQ_S1_BVD1_STSCHG];
121 s->soc.stat[SOC_STAT_BVD1].name = "SA1111 CF BVD1";
122 } else {
123 s->soc.socket.pci_irq = dev->irq[IDX_IRQ_S0_READY_NINT];
124 s->soc.stat[SOC_STAT_CD].irq = dev->irq[IDX_IRQ_S0_CD_VALID];
125 s->soc.stat[SOC_STAT_CD].name = "SA1111 PCMCIA card detect";
126 s->soc.stat[SOC_STAT_BVD1].irq = dev->irq[IDX_IRQ_S0_BVD1_STSCHG];
127 s->soc.stat[SOC_STAT_BVD1].name = "SA1111 PCMCIA BVD1";
128 }
149 129
150 ret = add(&s->soc); 130 ret = add(&s->soc);
151 if (ret == 0) { 131 if (ret == 0) {
@@ -170,12 +150,6 @@ static int pcmcia_probe(struct sa1111_dev *dev)
170 150
171 base = dev->mapbase; 151 base = dev->mapbase;
172 152
173 /* Initialize PCMCIA IRQs */
174 irqs[0].irq = dev->irq[IDX_IRQ_S0_CD_VALID];
175 irqs[1].irq = dev->irq[IDX_IRQ_S0_BVD1_STSCHG];
176 irqs[2].irq = dev->irq[IDX_IRQ_S1_CD_VALID];
177 irqs[3].irq = dev->irq[IDX_IRQ_S1_BVD1_STSCHG];
178
179 /* 153 /*
180 * Initialise the suspend state. 154 * Initialise the suspend state.
181 */ 155 */
diff --git a/drivers/pcmcia/sa1111_generic.h b/drivers/pcmcia/sa1111_generic.h
index 02dc8577cdaf..f6376e34a7e4 100644
--- a/drivers/pcmcia/sa1111_generic.h
+++ b/drivers/pcmcia/sa1111_generic.h
@@ -17,7 +17,6 @@ int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops,
17 17
18extern void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *, struct pcmcia_state *); 18extern void sa1111_pcmcia_socket_state(struct soc_pcmcia_socket *, struct pcmcia_state *);
19extern int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *, const socket_state_t *); 19extern int sa1111_pcmcia_configure_socket(struct soc_pcmcia_socket *, const socket_state_t *);
20extern void sa1111_pcmcia_socket_init(struct soc_pcmcia_socket *);
21 20
22extern int pcmcia_badge4_init(struct device *); 21extern int pcmcia_badge4_init(struct device *);
23extern int pcmcia_jornada720_init(struct device *); 22extern int pcmcia_jornada720_init(struct device *);