VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / pcmcia / pd6729.c
1 /*
2  * Driver for the Cirrus PD6729 PCI-PCMCIA bridge.
3  *
4  * Based on the i82092.c driver.
5  *
6  * This software may be used and distributed according to the terms of
7  * the GNU General Public License, incorporated herein by reference.
8  */
9
10 #include <linux/kernel.h>
11 #include <linux/config.h>
12 #include <linux/module.h>
13 #include <linux/pci.h>
14 #include <linux/init.h>
15 #include <linux/workqueue.h>
16 #include <linux/interrupt.h>
17 #include <linux/device.h>
18
19 #include <pcmcia/cs_types.h>
20 #include <pcmcia/ss.h>
21 #include <pcmcia/cs.h>
22
23 #include <asm/system.h>
24 #include <asm/io.h>
25
26 #include "pd6729.h"
27 #include "i82365.h"
28 #include "cirrus.h"
29
30 MODULE_LICENSE("GPL");
31 MODULE_DESCRIPTION("Driver for the Cirrus PD6729 PCI-PCMCIA bridge");
32 MODULE_AUTHOR("Jun Komuro <komurojun@mbn.nifty.com>");
33
34 #define MAX_SOCKETS 2
35
36 /*
37  * simple helper functions
38  * External clock time, in nanoseconds.  120 ns = 8.33 MHz
39  */
40 #define to_cycles(ns)   ((ns)/120)
41
42 static spinlock_t port_lock = SPIN_LOCK_UNLOCKED;
43
44 /* basic value read/write functions */
45
46 static unsigned char indirect_read(struct pd6729_socket *socket, unsigned short reg)
47 {
48         unsigned long port;
49         unsigned char val;
50         unsigned long flags;
51
52         spin_lock_irqsave(&port_lock, flags);
53         reg += socket->number * 0x40;
54         port = socket->io_base;
55         outb(reg, port);
56         val = inb(port + 1);
57         spin_unlock_irqrestore(&port_lock, flags);
58
59         return val;
60 }
61
62 static unsigned short indirect_read16(struct pd6729_socket *socket, unsigned short reg)
63 {
64         unsigned long port;
65         unsigned short tmp;
66         unsigned long flags;
67
68         spin_lock_irqsave(&port_lock, flags);
69         reg  = reg + socket->number * 0x40;
70         port = socket->io_base;
71         outb(reg, port);
72         tmp = inb(port + 1);
73         reg++;
74         outb(reg, port);
75         tmp = tmp | (inb(port + 1) << 8);
76         spin_unlock_irqrestore(&port_lock, flags);
77
78         return tmp;
79 }
80
81 static void indirect_write(struct pd6729_socket *socket, unsigned short reg, unsigned char value)
82 {
83         unsigned long port;
84         unsigned long flags;
85
86         spin_lock_irqsave(&port_lock, flags);
87         reg = reg + socket->number * 0x40;
88         port = socket->io_base;
89         outb(reg, port);
90         outb(value, port + 1);
91         spin_unlock_irqrestore(&port_lock, flags);
92 }
93
94 static void indirect_setbit(struct pd6729_socket *socket, unsigned short reg, unsigned char mask)
95 {
96         unsigned long port;
97         unsigned char val;
98         unsigned long flags;
99
100         spin_lock_irqsave(&port_lock, flags);
101         reg = reg + socket->number * 0x40;
102         port = socket->io_base;
103         outb(reg, port);
104         val = inb(port + 1);
105         val |= mask;
106         outb(reg, port);
107         outb(val, port + 1);
108         spin_unlock_irqrestore(&port_lock, flags);
109 }
110
111 static void indirect_resetbit(struct pd6729_socket *socket, unsigned short reg, unsigned char mask)
112 {
113         unsigned long port;
114         unsigned char val;
115         unsigned long flags;
116
117         spin_lock_irqsave(&port_lock, flags);
118         reg = reg + socket->number * 0x40;
119         port = socket->io_base;
120         outb(reg, port);
121         val = inb(port + 1);
122         val &= ~mask;
123         outb(reg, port);
124         outb(val, port + 1);
125         spin_unlock_irqrestore(&port_lock, flags);
126 }
127
128 static void indirect_write16(struct pd6729_socket *socket, unsigned short reg, unsigned short value)
129 {
130         unsigned long port;
131         unsigned char val;
132         unsigned long flags;
133
134         spin_lock_irqsave(&port_lock, flags);
135         reg = reg + socket->number * 0x40;
136         port = socket->io_base;
137
138         outb(reg, port);
139         val = value & 255;
140         outb(val, port + 1);
141
142         reg++;
143
144         outb(reg, port);
145         val = value >> 8;
146         outb(val, port + 1);
147         spin_unlock_irqrestore(&port_lock, flags);
148 }
149
150 /* Interrupt handler functionality */
151
152 static irqreturn_t pd6729_interrupt(int irq, void *dev, struct pt_regs *regs)
153 {
154         struct pd6729_socket *socket = (struct pd6729_socket *)dev;
155         int i;
156         int loopcount = 0;
157         int handled = 0;
158         unsigned int events, active = 0;
159
160         while (1) {
161                 loopcount++;
162                 if (loopcount > 20) {
163                         printk(KERN_ERR "pd6729: infinite eventloop in interrupt\n");
164                         break;
165                 }
166
167                 active = 0;
168
169                 for (i = 0; i < MAX_SOCKETS; i++) {
170                         unsigned int csc;
171
172                         /* card status change register */
173                         csc = indirect_read(&socket[i], I365_CSC);
174                         if (csc == 0)  /* no events on this socket */
175                                 continue;
176
177                         handled = 1;
178                         events = 0;
179
180                         if (csc & I365_CSC_DETECT) {
181                                 events |= SS_DETECT;
182                                 dprintk("Card detected in socket %i!\n", i);
183                         }
184
185                         if (indirect_read(&socket[i], I365_INTCTL) & I365_PC_IOCARD) {
186                                 /* For IO/CARDS, bit 0 means "read the card" */
187                                 events |= (csc & I365_CSC_STSCHG) ? SS_STSCHG : 0;
188                         } else {
189                                 /* Check for battery/ready events */
190                                 events |= (csc & I365_CSC_BVD1) ? SS_BATDEAD : 0;
191                                 events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0;
192                                 events |= (csc & I365_CSC_READY) ? SS_READY : 0;
193                         }
194
195                         if (events) {
196                                 pcmcia_parse_events(&socket[i].socket, events);
197                         }
198                         active |= events;
199                 }
200
201                 if (active == 0) /* no more events to handle */
202                         break;
203         }
204         return IRQ_RETVAL(handled);
205 }
206
207 /* socket functions */
208
209 static void set_bridge_state(struct pd6729_socket *socket)
210 {
211         indirect_write(socket, I365_GBLCTL, 0x00);
212         indirect_write(socket, I365_GENCTL, 0x00);
213
214         indirect_setbit(socket, I365_INTCTL, 0x08);
215 }
216
217 static int pd6729_get_status(struct pcmcia_socket *sock, u_int *value)
218 {
219         struct pd6729_socket *socket = container_of(sock, struct pd6729_socket, socket);
220         unsigned int status;
221         unsigned int data;
222         struct pd6729_socket *t;
223
224         /* Interface Status Register */
225         status = indirect_read(socket, I365_STATUS);
226         *value = 0;
227
228         if ((status & I365_CS_DETECT) == I365_CS_DETECT) {
229                 *value |= SS_DETECT;
230         }
231
232         /*
233          * IO cards have a different meaning of bits 0,1
234          * Also notice the inverse-logic on the bits
235          */
236         if (indirect_read(socket, I365_INTCTL) & I365_PC_IOCARD) {
237                 /* IO card */
238                 if (!(status & I365_CS_STSCHG))
239                         *value |= SS_STSCHG;
240         } else {
241                 /* non I/O card */
242                 if (!(status & I365_CS_BVD1))
243                         *value |= SS_BATDEAD;
244                 if (!(status & I365_CS_BVD2))
245                         *value |= SS_BATWARN;
246         }
247
248         if (status & I365_CS_WRPROT)
249                 *value |= SS_WRPROT;    /* card is write protected */
250
251         if (status & I365_CS_READY)
252                 *value |= SS_READY;     /* card is not busy */
253
254         if (status & I365_CS_POWERON)
255                 *value |= SS_POWERON;   /* power is applied to the card */
256
257         t = (socket->number) ? socket : socket + 1;
258         indirect_write(t, PD67_EXT_INDEX, PD67_EXTERN_DATA);
259         data = indirect_read16(t, PD67_EXT_DATA);
260         *value |= (data & PD67_EXD_VS1(socket->number)) ? 0 : SS_3VCARD;
261
262         return 0;
263 }
264
265
266 static int pd6729_get_socket(struct pcmcia_socket *sock, socket_state_t *state)
267 {
268         struct pd6729_socket *socket = container_of(sock, struct pd6729_socket, socket);
269         unsigned char reg, vcc, vpp;
270
271         state->flags    = 0;
272         state->Vcc      = 0;
273         state->Vpp      = 0;
274         state->io_irq   = 0;
275         state->csc_mask = 0;
276
277         /*
278          * First the power status of the socket
279          * PCTRL - Power Control Register
280          */
281         reg = indirect_read(socket, I365_POWER);
282
283         if (reg & I365_PWR_AUTO)
284                 state->flags |= SS_PWR_AUTO;  /* Automatic Power Switch */
285
286         if (reg & I365_PWR_OUT)
287                 state->flags |= SS_OUTPUT_ENA; /* Output signals are enabled */
288
289         vcc = reg & I365_VCC_MASK;    vpp = reg & I365_VPP1_MASK;
290
291         if (reg & I365_VCC_5V) {
292                 state->Vcc = (indirect_read(socket, PD67_MISC_CTL_1) &
293                         PD67_MC1_VCC_3V) ? 33 : 50;
294
295                 if (vpp == I365_VPP1_5V) {
296                         if (state->Vcc == 50)
297                                 state->Vpp = 50;
298                         else
299                                 state->Vpp = 33;
300                 }
301                 if (vpp == I365_VPP1_12V)
302                         state->Vpp = 120;
303         }
304
305         /*
306          * Now the IO card, RESET flags and IO interrupt
307          * IGENC, Interrupt and General Control
308          */
309         reg = indirect_read(socket, I365_INTCTL);
310
311         if ((reg & I365_PC_RESET) == 0)
312                 state->flags |= SS_RESET;
313         if (reg & I365_PC_IOCARD)
314                 state->flags |= SS_IOCARD; /* This is an IO card */
315
316         /* Set the IRQ number */
317         state->io_irq = socket->socket.pci_irq;
318
319         /*
320          * Card status change
321          * CSCICR, Card Status Change Interrupt Configuration
322          */
323         reg = indirect_read(socket, I365_CSCINT);
324
325         if (reg & I365_CSC_DETECT)
326                 state->csc_mask |= SS_DETECT; /* Card detect is enabled */
327
328         if (state->flags & SS_IOCARD) {/* IO Cards behave different */
329                 if (reg & I365_CSC_STSCHG)
330                         state->csc_mask |= SS_STSCHG;
331         } else {
332                 if (reg & I365_CSC_BVD1)
333                         state->csc_mask |= SS_BATDEAD;
334                 if (reg & I365_CSC_BVD2)
335                         state->csc_mask |= SS_BATWARN;
336                 if (reg & I365_CSC_READY)
337                         state->csc_mask |= SS_READY;
338         }
339
340         return 0;
341 }
342
343 static int pd6729_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
344 {
345         struct pd6729_socket *socket = container_of(sock, struct pd6729_socket, socket);
346         unsigned char reg;
347
348         /* First, set the global controller options */
349
350         set_bridge_state(socket);
351
352         /* Values for the IGENC register */
353
354         reg = 0;
355         /* The reset bit has "inverse" logic */
356         if (!(state->flags & SS_RESET))
357                 reg = reg | I365_PC_RESET;
358         if (state->flags & SS_IOCARD)
359                 reg = reg | I365_PC_IOCARD;
360
361         /* IGENC, Interrupt and General Control Register */
362         indirect_write(socket, I365_INTCTL, reg);
363
364         /* Power registers */
365
366         reg = I365_PWR_NORESET; /* default: disable resetdrv on resume */
367
368         if (state->flags & SS_PWR_AUTO) {
369                 dprintk("Auto power\n");
370                 reg |= I365_PWR_AUTO;   /* automatic power mngmnt */
371         }
372         if (state->flags & SS_OUTPUT_ENA) {
373                 dprintk("Power Enabled\n");
374                 reg |= I365_PWR_OUT;    /* enable power */
375         }
376
377         switch (state->Vcc) {
378         case 0:
379                 break;
380         case 33:
381                 dprintk("setting voltage to Vcc to 3.3V on socket %i\n",
382                         socket->number);
383                 reg |= I365_VCC_5V;
384                 indirect_setbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
385                 break;
386         case 50:
387                 dprintk("setting voltage to Vcc to 5V on socket %i\n",
388                         socket->number);
389                 reg |= I365_VCC_5V;
390                 indirect_resetbit(socket, PD67_MISC_CTL_1, PD67_MC1_VCC_3V);
391                 break;
392         default:
393                 dprintk("pd6729: pd6729_set_socket called with invalid VCC power value: %i\n",
394                         state->Vcc);
395                 return -EINVAL;
396         }
397
398         switch (state->Vpp) {
399         case 0:
400                 dprintk("not setting Vpp on socket %i\n", socket->number);
401                 break;
402         case 33:
403         case 50:
404                 dprintk("setting Vpp to Vcc for socket %i\n", socket->number);
405                 reg |= I365_VPP1_5V;
406                 break;
407         case 120:
408                 dprintk("setting Vpp to 12.0\n");
409                 reg |= I365_VPP1_12V;
410                 break;
411         default:
412                 dprintk("pd6729: pd6729_set_socket called with invalid VPP power value: %i\n",
413                         state->Vpp);
414                 return -EINVAL;
415         }
416
417         /* only write if changed */
418         if (reg != indirect_read(socket, I365_POWER))
419                 indirect_write(socket, I365_POWER, reg);
420
421         /* Now, specifiy that all interrupts are to be done as PCI interrupts */
422         indirect_write(socket, PD67_EXT_INDEX, PD67_EXT_CTL_1);
423         indirect_write(socket, PD67_EXT_DATA, PD67_EC1_INV_MGMT_IRQ | PD67_EC1_INV_CARD_IRQ);
424
425         /* Enable specific interrupt events */
426
427         reg = 0x00;
428         if (state->csc_mask & SS_DETECT) {
429                 reg |= I365_CSC_DETECT;
430         }
431         if (state->flags & SS_IOCARD) {
432                 if (state->csc_mask & SS_STSCHG)
433                         reg |= I365_CSC_STSCHG;
434         } else {
435                 if (state->csc_mask & SS_BATDEAD)
436                         reg |= I365_CSC_BVD1;
437                 if (state->csc_mask & SS_BATWARN)
438                         reg |= I365_CSC_BVD2;
439                 if (state->csc_mask & SS_READY)
440                         reg |= I365_CSC_READY;
441         }
442         reg |= 0x30;    /* management IRQ: PCI INTA# = "irq 3" */
443         indirect_write(socket, I365_CSCINT, reg);
444
445         reg = indirect_read(socket, I365_INTCTL);
446         reg |= 0x03;    /* card IRQ: PCI INTA# = "irq 3" */
447         indirect_write(socket, I365_INTCTL, reg);
448
449         /* now clear the (probably bogus) pending stuff by doing a dummy read */
450         (void)indirect_read(socket, I365_CSC);
451
452         return 0;
453 }
454
455 static int pd6729_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
456 {
457         struct pd6729_socket *socket = container_of(sock, struct pd6729_socket, socket);
458         unsigned char map, ioctl;
459
460         map = io->map;
461
462         /* Check error conditions */
463         if (map > 1) {
464                 dprintk("pd6729_set_io_map with invalid map");
465                 return -EINVAL;
466         }
467
468         /* Turn off the window before changing anything */
469         if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_IO(map))
470                 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_IO(map));
471
472 /*      dprintk("set_io_map: Setting range to %x - %x\n", io->start, io->stop);*/
473
474         /* write the new values */
475         indirect_write16(socket, I365_IO(map)+I365_W_START, io->start);
476         indirect_write16(socket, I365_IO(map)+I365_W_STOP, io->stop);
477
478         ioctl = indirect_read(socket, I365_IOCTL) & ~I365_IOCTL_MASK(map);
479
480         if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map);
481         if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map);
482         if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map);
483
484         indirect_write(socket, I365_IOCTL, ioctl);
485
486         /* Turn the window back on if needed */
487         if (io->flags & MAP_ACTIVE)
488                 indirect_setbit(socket, I365_ADDRWIN, I365_ENA_IO(map));
489
490         return 0;
491 }
492
493 static int pd6729_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *mem)
494 {
495         struct pd6729_socket *socket = container_of(sock, struct pd6729_socket, socket);
496         unsigned short base, i;
497         unsigned char map;
498
499         map = mem->map;
500         if (map > 4) {
501                 printk("pd6729_set_mem_map: invalid map");
502                 return -EINVAL;
503         }
504
505         if ((mem->sys_start > mem->sys_stop) || (mem->speed > 1000)) {
506                 printk("pd6729_set_mem_map: invalid address / speed");
507                 /* printk("invalid mem map for socket %i : %lx to %lx with a start of %x\n",
508                          sock, mem->sys_start, mem->sys_stop, mem->card_start); */
509                 return -EINVAL;
510         }
511
512         /* Turn off the window before changing anything */
513         if (indirect_read(socket, I365_ADDRWIN) & I365_ENA_MEM(map))
514                 indirect_resetbit(socket, I365_ADDRWIN, I365_ENA_MEM(map));
515
516         /* write the start address */
517         base = I365_MEM(map);
518         i = (mem->sys_start >> 12) & 0x0fff;
519         if (mem->flags & MAP_16BIT)
520                 i |= I365_MEM_16BIT;
521         if (mem->flags & MAP_0WS)
522                 i |= I365_MEM_0WS;
523         indirect_write16(socket, base + I365_W_START, i);
524
525         /* write the stop address */
526
527         i= (mem->sys_stop >> 12) & 0x0fff;
528         switch (to_cycles(mem->speed)) {
529         case 0:
530                 break;
531         case 1:
532                 i |= I365_MEM_WS0;
533                 break;
534         case 2:
535                 i |= I365_MEM_WS1;
536                 break;
537         default:
538                 i |= I365_MEM_WS1 | I365_MEM_WS0;
539                 break;
540         }
541
542         indirect_write16(socket, base + I365_W_STOP, i);
543
544         /* Take care of high byte */
545         indirect_write(socket, PD67_EXT_INDEX, PD67_MEM_PAGE(map));
546         indirect_write(socket, PD67_EXT_DATA, mem->sys_start >> 24);
547
548         /* card start */
549
550         i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff;
551         if (mem->flags & MAP_WRPROT)
552                 i |= I365_MEM_WRPROT;
553         if (mem->flags & MAP_ATTRIB) {
554 /*              dprintk("requesting attribute memory for socket %i\n",
555                         socket->number);*/
556                 i |= I365_MEM_REG;
557         } else {
558 /*              dprintk("requesting normal memory for socket %i\n",
559                         socket->number);*/
560         }
561         indirect_write16(socket, base + I365_W_OFF, i);
562
563         /* Enable the window if necessary */
564         if (mem->flags & MAP_ACTIVE)
565                 indirect_setbit(socket, I365_ADDRWIN, I365_ENA_MEM(map));
566
567         return 0;
568 }
569
570 static int pd6729_suspend(struct pcmcia_socket *sock)
571 {
572         return pd6729_set_socket(sock, &dead_socket);
573 }
574
575 static int pd6729_init(struct pcmcia_socket *sock)
576 {
577         int i;
578         struct resource res = { .end = 0x0fff };
579         pccard_io_map io = { 0, 0, 0, 0, 1 };
580         pccard_mem_map mem = { .res = &res, .sys_stop = 0x0fff };
581
582         pd6729_set_socket(sock, &dead_socket);
583         for (i = 0; i < 2; i++) {
584                 io.map = i;
585                 pd6729_set_io_map(sock, &io);
586         }
587         for (i = 0; i < 5; i++) {
588                 mem.map = i;
589                 pd6729_set_mem_map(sock, &mem);
590         }
591
592         return 0;
593 }
594
595
596 /* the pccard structure and its functions */
597 static struct pccard_operations pd6729_operations = {
598         .init                   = pd6729_init,
599         .suspend                = pd6729_suspend,
600         .get_status             = pd6729_get_status,
601         .get_socket             = pd6729_get_socket,
602         .set_socket             = pd6729_set_socket,
603         .set_io_map             = pd6729_set_io_map,
604         .set_mem_map            = pd6729_set_mem_map,
605 };
606
607 static int __devinit pd6729_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
608 {
609         int i, j, ret;
610         char configbyte;
611         struct pd6729_socket *socket;
612
613         socket = kmalloc(sizeof(struct pd6729_socket) * MAX_SOCKETS, GFP_KERNEL);
614         if (!socket)
615                 return -ENOMEM;
616
617         memset(socket, 0, sizeof(struct pd6729_socket) * MAX_SOCKETS);
618
619         if ((ret = pci_enable_device(dev)))
620                 goto err_out_free_mem;
621
622         printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge at 0x%lx on irq %d\n",
623                 pci_resource_start(dev, 0), dev->irq);
624         printk(KERN_INFO "pd6729: configured as a %d socket device.\n", MAX_SOCKETS);
625         /*
626          * Since we have no memory BARs some firmware we may not
627          * have had PCI_COMMAND_MEM enabled, yet the device needs
628          * it.
629          */
630         pci_read_config_byte(dev, PCI_COMMAND, &configbyte);
631         if (!(configbyte & PCI_COMMAND_MEMORY)) {
632                 printk(KERN_DEBUG "pd6729: Enabling PCI_COMMAND_MEMORY.\n");
633                 configbyte |= PCI_COMMAND_MEMORY;
634                 pci_write_config_byte(dev, PCI_COMMAND, configbyte);
635         }
636
637         ret = pci_request_regions(dev, "pd6729");
638         if (ret) {
639                 printk(KERN_INFO "pd6729: pci request region failed.\n");
640                 goto err_out_disable;
641         }
642
643         for (i = 0; i < MAX_SOCKETS; i++) {
644                 socket[i].io_base = pci_resource_start(dev, 0);
645                 socket[i].socket.features |= SS_CAP_PCCARD;
646                 socket[i].socket.map_size = 0x1000;
647                 socket[i].socket.irq_mask = 0;
648                 socket[i].socket.pci_irq  = dev->irq;
649                 socket[i].socket.owner = THIS_MODULE;
650
651                 socket[i].number = i;
652
653                 socket[i].socket.ops = &pd6729_operations;
654                 socket[i].socket.dev.dev = &dev->dev;
655                 socket[i].socket.driver_data = &socket[i];
656         }
657
658         pci_set_drvdata(dev, socket);
659
660         /* Register the interrupt handler */
661         if ((ret = request_irq(dev->irq, pd6729_interrupt, SA_SHIRQ, "pd6729", socket))) {
662                 printk(KERN_ERR "pd6729: Failed to register irq %d, aborting\n", dev->irq);
663                 goto err_out_free_res;
664         }
665
666         for (i = 0; i < MAX_SOCKETS; i++) {
667                 ret = pcmcia_register_socket(&socket[i].socket);
668                 if (ret) {
669                         printk(KERN_INFO "pd6729: pcmcia_register_socket failed.\n");
670                         for (j = 0; j < i ; j++)
671                                 pcmcia_unregister_socket(&socket[j].socket);
672                         goto err_out_free_res2;
673                 }
674         }
675
676         return 0;
677
678  err_out_free_res2:
679         free_irq(dev->irq, socket);
680  err_out_free_res:
681         pci_release_regions(dev);
682  err_out_disable:
683         pci_disable_device(dev);
684
685  err_out_free_mem:
686         kfree(socket);
687         return ret;
688 }
689
690 static void __devexit pd6729_pci_remove(struct pci_dev *dev)
691 {
692         int i;
693         struct pd6729_socket *socket = pci_get_drvdata(dev);
694
695         for (i = 0; i < MAX_SOCKETS; i++)
696                 pcmcia_unregister_socket(&socket[i].socket);
697
698         free_irq(dev->irq, socket);
699         pci_release_regions(dev);
700         pci_disable_device(dev);
701
702         kfree(socket);
703 }
704
705 static int pd6729_socket_suspend(struct pci_dev *dev, u32 state)
706 {
707         return pcmcia_socket_dev_suspend(&dev->dev, state);
708 }
709
710 static int pd6729_socket_resume(struct pci_dev *dev)
711 {
712         return pcmcia_socket_dev_resume(&dev->dev);
713 }
714
715 static struct pci_device_id pd6729_pci_ids[] = {
716         {
717                 .vendor         = PCI_VENDOR_ID_CIRRUS,
718                 .device         = PCI_DEVICE_ID_CIRRUS_6729,
719                 .subvendor      = PCI_ANY_ID,
720                 .subdevice      = PCI_ANY_ID,
721         },
722         { }
723 };
724 MODULE_DEVICE_TABLE(pci, pd6729_pci_ids);
725
726 static struct pci_driver pd6729_pci_drv = {
727         .name           = "pd6729",
728         .id_table       = pd6729_pci_ids,
729         .probe          = pd6729_pci_probe,
730         .remove         = __devexit_p(pd6729_pci_remove),
731         .suspend        = pd6729_socket_suspend,
732         .resume         = pd6729_socket_resume,
733 };
734
735 static int pd6729_module_init(void)
736 {
737         return pci_module_init(&pd6729_pci_drv);
738 }
739
740 static void pd6729_module_exit(void)
741 {
742         pci_unregister_driver(&pd6729_pci_drv);
743 }
744
745 module_init(pd6729_module_init);
746 module_exit(pd6729_module_exit);