Commit 0db6095d4ff8918350797dfe299d572980e82fa0

Authored by David Brownell
Committed by Dominik Brodowski
1 parent 5040cb8b7e

[PATCH] pcmcia: at91_cf suspend/resume/wakeup

AT91 CF updates, mostly for power management:

 - Add suspend/resume methods to the AT91 CF driver, disabling
   non-wakeup IRQs during system suspend.  The card detect IRQ
   serves as a wakeup event source.

 - Convert the driver to the more-current "platform_driver" style.

So inserting or removing a CF card will wake the system, unless that
has been disabled by updating the sysfs file; and there will be no
more warnings about spurious IRQs during suspend/resume cycles.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>

Showing 1 changed file with 59 additions and 16 deletions Inline Diff

drivers/pcmcia/at91_cf.c
1 /* 1 /*
2 * at91_cf.c -- AT91 CompactFlash controller driver 2 * at91_cf.c -- AT91 CompactFlash controller driver
3 * 3 *
4 * Copyright (C) 2005 David Brownell 4 * Copyright (C) 2005 David Brownell
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify 6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by 7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or 8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version. 9 * (at your option) any later version.
10 */ 10 */
11 11
12 #include <linux/module.h> 12 #include <linux/module.h>
13 #include <linux/kernel.h> 13 #include <linux/kernel.h>
14 #include <linux/sched.h> 14 #include <linux/sched.h>
15 #include <linux/platform_device.h> 15 #include <linux/platform_device.h>
16 #include <linux/errno.h> 16 #include <linux/errno.h>
17 #include <linux/init.h> 17 #include <linux/init.h>
18 #include <linux/interrupt.h> 18 #include <linux/interrupt.h>
19 19
20 #include <pcmcia/ss.h> 20 #include <pcmcia/ss.h>
21 21
22 #include <asm/hardware.h> 22 #include <asm/hardware.h>
23 #include <asm/io.h> 23 #include <asm/io.h>
24 #include <asm/sizes.h> 24 #include <asm/sizes.h>
25 25
26 #include <asm/arch/at91rm9200.h> 26 #include <asm/arch/at91rm9200.h>
27 #include <asm/arch/board.h> 27 #include <asm/arch/board.h>
28 #include <asm/arch/gpio.h> 28 #include <asm/arch/gpio.h>
29 29
30 30
31 /* 31 /*
32 * A0..A10 work in each range; A23 indicates I/O space; A25 is CFRNW; 32 * A0..A10 work in each range; A23 indicates I/O space; A25 is CFRNW;
33 * some other bit in {A24,A22..A11} is nREG to flag memory access 33 * some other bit in {A24,A22..A11} is nREG to flag memory access
34 * (vs attributes). So more than 2KB/region would just be waste. 34 * (vs attributes). So more than 2KB/region would just be waste.
35 */ 35 */
36 #define CF_ATTR_PHYS (AT91_CF_BASE) 36 #define CF_ATTR_PHYS (AT91_CF_BASE)
37 #define CF_IO_PHYS (AT91_CF_BASE + (1 << 23)) 37 #define CF_IO_PHYS (AT91_CF_BASE + (1 << 23))
38 #define CF_MEM_PHYS (AT91_CF_BASE + 0x017ff800) 38 #define CF_MEM_PHYS (AT91_CF_BASE + 0x017ff800)
39 39
40 /*--------------------------------------------------------------------------*/ 40 /*--------------------------------------------------------------------------*/
41 41
42 static const char driver_name[] = "at91_cf"; 42 static const char driver_name[] = "at91_cf";
43 43
44 struct at91_cf_socket { 44 struct at91_cf_socket {
45 struct pcmcia_socket socket; 45 struct pcmcia_socket socket;
46 46
47 unsigned present:1; 47 unsigned present:1;
48 48
49 struct platform_device *pdev; 49 struct platform_device *pdev;
50 struct at91_cf_data *board; 50 struct at91_cf_data *board;
51 }; 51 };
52 52
53 #define SZ_2K (2 * SZ_1K) 53 #define SZ_2K (2 * SZ_1K)
54 54
55 static inline int at91_cf_present(struct at91_cf_socket *cf) 55 static inline int at91_cf_present(struct at91_cf_socket *cf)
56 { 56 {
57 return !at91_get_gpio_value(cf->board->det_pin); 57 return !at91_get_gpio_value(cf->board->det_pin);
58 } 58 }
59 59
60 /*--------------------------------------------------------------------------*/ 60 /*--------------------------------------------------------------------------*/
61 61
62 static int at91_cf_ss_init(struct pcmcia_socket *s) 62 static int at91_cf_ss_init(struct pcmcia_socket *s)
63 { 63 {
64 return 0; 64 return 0;
65 } 65 }
66 66
67 static irqreturn_t at91_cf_irq(int irq, void *_cf, struct pt_regs *r) 67 static irqreturn_t at91_cf_irq(int irq, void *_cf, struct pt_regs *r)
68 { 68 {
69 struct at91_cf_socket *cf = (struct at91_cf_socket *) _cf; 69 struct at91_cf_socket *cf = (struct at91_cf_socket *) _cf;
70 70
71 if (irq == cf->board->det_pin) { 71 if (irq == cf->board->det_pin) {
72 unsigned present = at91_cf_present(cf); 72 unsigned present = at91_cf_present(cf);
73 73
74 /* kick pccard as needed */ 74 /* kick pccard as needed */
75 if (present != cf->present) { 75 if (present != cf->present) {
76 cf->present = present; 76 cf->present = present;
77 pr_debug("%s: card %s\n", driver_name, 77 pr_debug("%s: card %s\n", driver_name,
78 present ? "present" : "gone"); 78 present ? "present" : "gone");
79 pcmcia_parse_events(&cf->socket, SS_DETECT); 79 pcmcia_parse_events(&cf->socket, SS_DETECT);
80 } 80 }
81 } 81 }
82 82
83 return IRQ_HANDLED; 83 return IRQ_HANDLED;
84 } 84 }
85 85
86 static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp) 86 static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp)
87 { 87 {
88 struct at91_cf_socket *cf; 88 struct at91_cf_socket *cf;
89 89
90 if (!sp) 90 if (!sp)
91 return -EINVAL; 91 return -EINVAL;
92 92
93 cf = container_of(s, struct at91_cf_socket, socket); 93 cf = container_of(s, struct at91_cf_socket, socket);
94 94
95 /* NOTE: CF is always 3VCARD */ 95 /* NOTE: CF is always 3VCARD */
96 if (at91_cf_present(cf)) { 96 if (at91_cf_present(cf)) {
97 int rdy = cf->board->irq_pin; /* RDY/nIRQ */ 97 int rdy = cf->board->irq_pin; /* RDY/nIRQ */
98 int vcc = cf->board->vcc_pin; 98 int vcc = cf->board->vcc_pin;
99 99
100 *sp = SS_DETECT | SS_3VCARD; 100 *sp = SS_DETECT | SS_3VCARD;
101 if (!rdy || at91_get_gpio_value(rdy)) 101 if (!rdy || at91_get_gpio_value(rdy))
102 *sp |= SS_READY; 102 *sp |= SS_READY;
103 if (!vcc || at91_get_gpio_value(vcc)) 103 if (!vcc || at91_get_gpio_value(vcc))
104 *sp |= SS_POWERON; 104 *sp |= SS_POWERON;
105 } else 105 } else
106 *sp = 0; 106 *sp = 0;
107 107
108 return 0; 108 return 0;
109 } 109 }
110 110
111 static int 111 static int
112 at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s) 112 at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
113 { 113 {
114 struct at91_cf_socket *cf; 114 struct at91_cf_socket *cf;
115 115
116 cf = container_of(sock, struct at91_cf_socket, socket); 116 cf = container_of(sock, struct at91_cf_socket, socket);
117 117
118 /* switch Vcc if needed and possible */ 118 /* switch Vcc if needed and possible */
119 if (cf->board->vcc_pin) { 119 if (cf->board->vcc_pin) {
120 switch (s->Vcc) { 120 switch (s->Vcc) {
121 case 0: 121 case 0:
122 at91_set_gpio_value(cf->board->vcc_pin, 0); 122 at91_set_gpio_value(cf->board->vcc_pin, 0);
123 break; 123 break;
124 case 33: 124 case 33:
125 at91_set_gpio_value(cf->board->vcc_pin, 1); 125 at91_set_gpio_value(cf->board->vcc_pin, 1);
126 break; 126 break;
127 default: 127 default:
128 return -EINVAL; 128 return -EINVAL;
129 } 129 }
130 } 130 }
131 131
132 /* toggle reset if needed */ 132 /* toggle reset if needed */
133 at91_set_gpio_value(cf->board->rst_pin, s->flags & SS_RESET); 133 at91_set_gpio_value(cf->board->rst_pin, s->flags & SS_RESET);
134 134
135 pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n", 135 pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n",
136 driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask); 136 driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask);
137 137
138 return 0; 138 return 0;
139 } 139 }
140 140
141 static int at91_cf_ss_suspend(struct pcmcia_socket *s) 141 static int at91_cf_ss_suspend(struct pcmcia_socket *s)
142 { 142 {
143 return at91_cf_set_socket(s, &dead_socket); 143 return at91_cf_set_socket(s, &dead_socket);
144 } 144 }
145 145
146 /* we already mapped the I/O region */ 146 /* we already mapped the I/O region */
147 static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io) 147 static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
148 { 148 {
149 struct at91_cf_socket *cf; 149 struct at91_cf_socket *cf;
150 u32 csr; 150 u32 csr;
151 151
152 cf = container_of(s, struct at91_cf_socket, socket); 152 cf = container_of(s, struct at91_cf_socket, socket);
153 io->flags &= (MAP_ACTIVE | MAP_16BIT | MAP_AUTOSZ); 153 io->flags &= (MAP_ACTIVE | MAP_16BIT | MAP_AUTOSZ);
154 154
155 /* 155 /*
156 * Use 16 bit accesses unless/until we need 8-bit i/o space. 156 * Use 16 bit accesses unless/until we need 8-bit i/o space.
157 * Always set CSR4 ... PCMCIA won't always unmap things. 157 * Always set CSR4 ... PCMCIA won't always unmap things.
158 */ 158 */
159 csr = at91_sys_read(AT91_SMC_CSR(4)) & ~AT91_SMC_DBW; 159 csr = at91_sys_read(AT91_SMC_CSR(4)) & ~AT91_SMC_DBW;
160 160
161 /* 161 /*
162 * NOTE: this CF controller ignores IOIS16, so we can't really do 162 * NOTE: this CF controller ignores IOIS16, so we can't really do
163 * MAP_AUTOSZ. The 16bit mode allows single byte access on either 163 * MAP_AUTOSZ. The 16bit mode allows single byte access on either
164 * D0-D7 (even addr) or D8-D15 (odd), so it's close enough for many 164 * D0-D7 (even addr) or D8-D15 (odd), so it's close enough for many
165 * purposes (and handles ide-cs). 165 * purposes (and handles ide-cs).
166 * 166 *
167 * The 8bit mode is needed for odd byte access on D0-D7. It seems 167 * The 8bit mode is needed for odd byte access on D0-D7. It seems
168 * some cards only like that way to get at the odd byte, despite 168 * some cards only like that way to get at the odd byte, despite
169 * CF 3.0 spec table 35 also giving the D8-D15 option. 169 * CF 3.0 spec table 35 also giving the D8-D15 option.
170 */ 170 */
171 if (!(io->flags & (MAP_16BIT|MAP_AUTOSZ))) { 171 if (!(io->flags & (MAP_16BIT|MAP_AUTOSZ))) {
172 csr |= AT91_SMC_DBW_8; 172 csr |= AT91_SMC_DBW_8;
173 pr_debug("%s: 8bit i/o bus\n", driver_name); 173 pr_debug("%s: 8bit i/o bus\n", driver_name);
174 } else { 174 } else {
175 csr |= AT91_SMC_DBW_16; 175 csr |= AT91_SMC_DBW_16;
176 pr_debug("%s: 16bit i/o bus\n", driver_name); 176 pr_debug("%s: 16bit i/o bus\n", driver_name);
177 } 177 }
178 at91_sys_write(AT91_SMC_CSR(4), csr); 178 at91_sys_write(AT91_SMC_CSR(4), csr);
179 179
180 io->start = cf->socket.io_offset; 180 io->start = cf->socket.io_offset;
181 io->stop = io->start + SZ_2K - 1; 181 io->stop = io->start + SZ_2K - 1;
182 182
183 return 0; 183 return 0;
184 } 184 }
185 185
186 /* pcmcia layer maps/unmaps mem regions */ 186 /* pcmcia layer maps/unmaps mem regions */
187 static int 187 static int
188 at91_cf_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *map) 188 at91_cf_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *map)
189 { 189 {
190 struct at91_cf_socket *cf; 190 struct at91_cf_socket *cf;
191 191
192 if (map->card_start) 192 if (map->card_start)
193 return -EINVAL; 193 return -EINVAL;
194 194
195 cf = container_of(s, struct at91_cf_socket, socket); 195 cf = container_of(s, struct at91_cf_socket, socket);
196 196
197 map->flags &= MAP_ACTIVE|MAP_ATTRIB|MAP_16BIT; 197 map->flags &= MAP_ACTIVE|MAP_ATTRIB|MAP_16BIT;
198 if (map->flags & MAP_ATTRIB) 198 if (map->flags & MAP_ATTRIB)
199 map->static_start = CF_ATTR_PHYS; 199 map->static_start = CF_ATTR_PHYS;
200 else 200 else
201 map->static_start = CF_MEM_PHYS; 201 map->static_start = CF_MEM_PHYS;
202 202
203 return 0; 203 return 0;
204 } 204 }
205 205
206 static struct pccard_operations at91_cf_ops = { 206 static struct pccard_operations at91_cf_ops = {
207 .init = at91_cf_ss_init, 207 .init = at91_cf_ss_init,
208 .suspend = at91_cf_ss_suspend, 208 .suspend = at91_cf_ss_suspend,
209 .get_status = at91_cf_get_status, 209 .get_status = at91_cf_get_status,
210 .set_socket = at91_cf_set_socket, 210 .set_socket = at91_cf_set_socket,
211 .set_io_map = at91_cf_set_io_map, 211 .set_io_map = at91_cf_set_io_map,
212 .set_mem_map = at91_cf_set_mem_map, 212 .set_mem_map = at91_cf_set_mem_map,
213 }; 213 };
214 214
215 /*--------------------------------------------------------------------------*/ 215 /*--------------------------------------------------------------------------*/
216 216
217 static int __init at91_cf_probe(struct device *dev) 217 static int __init at91_cf_probe(struct platform_device *pdev)
218 { 218 {
219 struct at91_cf_socket *cf; 219 struct at91_cf_socket *cf;
220 struct at91_cf_data *board = dev->platform_data; 220 struct at91_cf_data *board = pdev->dev.platform_data;
221 struct platform_device *pdev = to_platform_device(dev);
222 struct resource *io; 221 struct resource *io;
223 unsigned int csa; 222 unsigned int csa;
224 int status; 223 int status;
225 224
226 if (!board || !board->det_pin || !board->rst_pin) 225 if (!board || !board->det_pin || !board->rst_pin)
227 return -ENODEV; 226 return -ENODEV;
228 227
229 io = platform_get_resource(pdev, IORESOURCE_MEM, 0); 228 io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
230 if (!io) 229 if (!io)
231 return -ENODEV; 230 return -ENODEV;
232 231
233 cf = kcalloc(1, sizeof *cf, GFP_KERNEL); 232 cf = kcalloc(1, sizeof *cf, GFP_KERNEL);
234 if (!cf) 233 if (!cf)
235 return -ENOMEM; 234 return -ENOMEM;
236 235
237 cf->board = board; 236 cf->board = board;
238 cf->pdev = pdev; 237 cf->pdev = pdev;
239 dev_set_drvdata(dev, cf); 238 platform_set_drvdata(pdev, cf);
240 239
241 /* CF takes over CS4, CS5, CS6 */ 240 /* CF takes over CS4, CS5, CS6 */
242 csa = at91_sys_read(AT91_EBI_CSA); 241 csa = at91_sys_read(AT91_EBI_CSA);
243 at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH); 242 at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH);
244 243
245 /* force poweron defaults for these pins ... */ 244 /* force poweron defaults for these pins ... */
246 (void) at91_set_A_periph(AT91_PIN_PC9, 0); /* A25/CFRNW */ 245 (void) at91_set_A_periph(AT91_PIN_PC9, 0); /* A25/CFRNW */
247 (void) at91_set_A_periph(AT91_PIN_PC10, 0); /* NCS4/CFCS */ 246 (void) at91_set_A_periph(AT91_PIN_PC10, 0); /* NCS4/CFCS */
248 (void) at91_set_A_periph(AT91_PIN_PC11, 0); /* NCS5/CFCE1 */ 247 (void) at91_set_A_periph(AT91_PIN_PC11, 0); /* NCS5/CFCE1 */
249 (void) at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */ 248 (void) at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */
250 249
251 /* nWAIT is _not_ a default setting */ 250 /* nWAIT is _not_ a default setting */
252 (void) at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */ 251 (void) at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */
253 252
254 /* 253 /*
255 * Static memory controller timing adjustments. 254 * Static memory controller timing adjustments.
256 * REVISIT: these timings are in terms of MCK cycles, so 255 * REVISIT: these timings are in terms of MCK cycles, so
257 * when MCK changes (cpufreq etc) so must these values... 256 * when MCK changes (cpufreq etc) so must these values...
258 */ 257 */
259 at91_sys_write(AT91_SMC_CSR(4), 258 at91_sys_write(AT91_SMC_CSR(4),
260 AT91_SMC_ACSS_STD 259 AT91_SMC_ACSS_STD
261 | AT91_SMC_DBW_16 260 | AT91_SMC_DBW_16
262 | AT91_SMC_BAT 261 | AT91_SMC_BAT
263 | AT91_SMC_WSEN 262 | AT91_SMC_WSEN
264 | AT91_SMC_NWS_(32) /* wait states */ 263 | AT91_SMC_NWS_(32) /* wait states */
265 | AT91_SMC_RWSETUP_(6) /* setup time */ 264 | AT91_SMC_RWSETUP_(6) /* setup time */
266 | AT91_SMC_RWHOLD_(4) /* hold time */ 265 | AT91_SMC_RWHOLD_(4) /* hold time */
267 ); 266 );
268 267
269 /* must be a GPIO; ergo must trigger on both edges */ 268 /* must be a GPIO; ergo must trigger on both edges */
270 status = request_irq(board->det_pin, at91_cf_irq, 269 status = request_irq(board->det_pin, at91_cf_irq,
271 SA_SAMPLE_RANDOM, driver_name, cf); 270 SA_SAMPLE_RANDOM, driver_name, cf);
272 if (status < 0) 271 if (status < 0)
273 goto fail0; 272 goto fail0;
273 device_init_wakeup(&pdev->dev, 1);
274 274
275 /* 275 /*
276 * The card driver will request this irq later as needed. 276 * The card driver will request this irq later as needed.
277 * but it causes lots of "irqNN: nobody cared" messages 277 * but it causes lots of "irqNN: nobody cared" messages
278 * unless we report that we handle everything (sigh). 278 * unless we report that we handle everything (sigh).
279 * (Note: DK board doesn't wire the IRQ pin...) 279 * (Note: DK board doesn't wire the IRQ pin...)
280 */ 280 */
281 if (board->irq_pin) { 281 if (board->irq_pin) {
282 status = request_irq(board->irq_pin, at91_cf_irq, 282 status = request_irq(board->irq_pin, at91_cf_irq,
283 SA_SHIRQ, driver_name, cf); 283 SA_SHIRQ, driver_name, cf);
284 if (status < 0) 284 if (status < 0)
285 goto fail0a; 285 goto fail0a;
286 cf->socket.pci_irq = board->irq_pin; 286 cf->socket.pci_irq = board->irq_pin;
287 } else 287 } else
288 cf->socket.pci_irq = NR_IRQS + 1; 288 cf->socket.pci_irq = NR_IRQS + 1;
289 289
290 /* pcmcia layer only remaps "real" memory not iospace */ 290 /* pcmcia layer only remaps "real" memory not iospace */
291 cf->socket.io_offset = (unsigned long) ioremap(CF_IO_PHYS, SZ_2K); 291 cf->socket.io_offset = (unsigned long) ioremap(CF_IO_PHYS, SZ_2K);
292 if (!cf->socket.io_offset) 292 if (!cf->socket.io_offset)
293 goto fail1; 293 goto fail1;
294 294
295 /* reserve CS4, CS5, and CS6 regions; but use just CS4 */ 295 /* reserve CS4, CS5, and CS6 regions; but use just CS4 */
296 if (!request_mem_region(io->start, io->end + 1 - io->start, 296 if (!request_mem_region(io->start, io->end + 1 - io->start,
297 driver_name)) 297 driver_name))
298 goto fail1; 298 goto fail1;
299 299
300 pr_info("%s: irqs det #%d, io #%d\n", driver_name, 300 pr_info("%s: irqs det #%d, io #%d\n", driver_name,
301 board->det_pin, board->irq_pin); 301 board->det_pin, board->irq_pin);
302 302
303 cf->socket.owner = THIS_MODULE; 303 cf->socket.owner = THIS_MODULE;
304 cf->socket.dev.dev = dev; 304 cf->socket.dev.dev = &pdev->dev;
305 cf->socket.ops = &at91_cf_ops; 305 cf->socket.ops = &at91_cf_ops;
306 cf->socket.resource_ops = &pccard_static_ops; 306 cf->socket.resource_ops = &pccard_static_ops;
307 cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP 307 cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP
308 | SS_CAP_MEM_ALIGN; 308 | SS_CAP_MEM_ALIGN;
309 cf->socket.map_size = SZ_2K; 309 cf->socket.map_size = SZ_2K;
310 cf->socket.io[0].res = io; 310 cf->socket.io[0].res = io;
311 311
312 status = pcmcia_register_socket(&cf->socket); 312 status = pcmcia_register_socket(&cf->socket);
313 if (status < 0) 313 if (status < 0)
314 goto fail2; 314 goto fail2;
315 315
316 return 0; 316 return 0;
317 317
318 fail2: 318 fail2:
319 iounmap((void __iomem *) cf->socket.io_offset); 319 iounmap((void __iomem *) cf->socket.io_offset);
320 release_mem_region(io->start, io->end + 1 - io->start); 320 release_mem_region(io->start, io->end + 1 - io->start);
321 fail1: 321 fail1:
322 if (board->irq_pin) 322 if (board->irq_pin)
323 free_irq(board->irq_pin, cf); 323 free_irq(board->irq_pin, cf);
324 fail0a: 324 fail0a:
325 free_irq(board->det_pin, cf); 325 free_irq(board->det_pin, cf);
326 device_init_wakeup(&pdev->dev, 0);
326 fail0: 327 fail0:
327 at91_sys_write(AT91_EBI_CSA, csa); 328 at91_sys_write(AT91_EBI_CSA, csa);
328 kfree(cf); 329 kfree(cf);
329 return status; 330 return status;
330 } 331 }
331 332
332 static int __exit at91_cf_remove(struct device *dev) 333 static int __exit at91_cf_remove(struct platform_device *pdev)
333 { 334 {
334 struct at91_cf_socket *cf = dev_get_drvdata(dev); 335 struct at91_cf_socket *cf = platform_get_drvdata(pdev);
336 struct at91_cf_data *board = cf->board;
335 struct resource *io = cf->socket.io[0].res; 337 struct resource *io = cf->socket.io[0].res;
336 unsigned int csa; 338 unsigned int csa;
337 339
338 pcmcia_unregister_socket(&cf->socket); 340 pcmcia_unregister_socket(&cf->socket);
339 free_irq(cf->board->irq_pin, cf); 341 if (board->irq_pin)
340 free_irq(cf->board->det_pin, cf); 342 free_irq(board->irq_pin, cf);
343 free_irq(board->det_pin, cf);
344 device_init_wakeup(&pdev->dev, 0);
341 iounmap((void __iomem *) cf->socket.io_offset); 345 iounmap((void __iomem *) cf->socket.io_offset);
342 release_mem_region(io->start, io->end + 1 - io->start); 346 release_mem_region(io->start, io->end + 1 - io->start);
343 347
344 csa = at91_sys_read(AT91_EBI_CSA); 348 csa = at91_sys_read(AT91_EBI_CSA);
345 at91_sys_write(AT91_EBI_CSA, csa & ~AT91_EBI_CS4A); 349 at91_sys_write(AT91_EBI_CSA, csa & ~AT91_EBI_CS4A);
346 350
347 kfree(cf); 351 kfree(cf);
348 return 0; 352 return 0;
349 } 353 }
350 354
351 static struct device_driver at91_cf_driver = { 355 #ifdef CONFIG_PM
352 .name = (char *) driver_name, 356
353 .bus = &platform_bus_type, 357 static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
358 {
359 struct at91_cf_socket *cf = platform_get_drvdata(pdev);
360 struct at91_cf_data *board = cf->board;
361
362 pcmcia_socket_dev_suspend(&pdev->dev, mesg);
363 if (device_may_wakeup(&pdev->dev))
364 enable_irq_wake(board->det_pin);
365 else {
366 disable_irq_wake(board->det_pin);
367 disable_irq(board->det_pin);
368 }
369 if (board->irq_pin)
370 disable_irq(board->irq_pin);
371 return 0;
372 }
373
374 static int at91_cf_resume(struct platform_device *pdev)
375 {
376 struct at91_cf_socket *cf = platform_get_drvdata(pdev);
377 struct at91_cf_data *board = cf->board;
378
379 if (board->irq_pin)
380 enable_irq(board->irq_pin);
381 if (!device_may_wakeup(&pdev->dev))
382 enable_irq(board->det_pin);
383 pcmcia_socket_dev_resume(&pdev->dev);
384 return 0;
385 }
386
387 #else
388 #define at91_cf_suspend NULL
389 #define at91_cf_resume NULL
390 #endif
391
392 static struct platform_driver at91_cf_driver = {
393 .driver = {
394 .name = (char *) driver_name,
395 .owner = THIS_MODULE,
396 },
354 .probe = at91_cf_probe, 397 .probe = at91_cf_probe,
355 .remove = __exit_p(at91_cf_remove), 398 .remove = __exit_p(at91_cf_remove),
356 .suspend = pcmcia_socket_dev_suspend, 399 .suspend = at91_cf_suspend,
357 .resume = pcmcia_socket_dev_resume, 400 .resume = at91_cf_resume,
358 }; 401 };
359 402
360 /*--------------------------------------------------------------------------*/ 403 /*--------------------------------------------------------------------------*/
361 404
362 static int __init at91_cf_init(void) 405 static int __init at91_cf_init(void)
363 { 406 {
364 return driver_register(&at91_cf_driver); 407 return platform_driver_register(&at91_cf_driver);
365 } 408 }
366 module_init(at91_cf_init); 409 module_init(at91_cf_init);
367 410
368 static void __exit at91_cf_exit(void) 411 static void __exit at91_cf_exit(void)
369 { 412 {
370 driver_unregister(&at91_cf_driver); 413 platform_driver_unregister(&at91_cf_driver);
371 } 414 }
372 module_exit(at91_cf_exit); 415 module_exit(at91_cf_exit);
373 416
374 MODULE_DESCRIPTION("AT91 Compact Flash Driver"); 417 MODULE_DESCRIPTION("AT91 Compact Flash Driver");
375 MODULE_AUTHOR("David Brownell"); 418 MODULE_AUTHOR("David Brownell");
376 MODULE_LICENSE("GPL"); 419 MODULE_LICENSE("GPL");