vserver 1.9.3
[linux-2.6.git] / drivers / pcmcia / i82365.c
index e98adb1..561974e 100644 (file)
@@ -65,7 +65,6 @@
 #include "cirrus.h"
 #include "vg468.h"
 #include "ricoh.h"
-#include "o2micro.h"
 
 #ifdef DEBUG
 static const char version[] =
@@ -514,8 +513,7 @@ static u_int __init test_irq(u_short sock, int irq)
     if (request_irq(irq, i365_count_irq, 0, "scan", i365_count_irq) != 0)
        return 1;
     irq_hits = 0; irq_sock = sock;
-    __set_current_state(TASK_UNINTERRUPTIBLE);
-    schedule_timeout(HZ/100);
+    msleep(10);
     if (irq_hits) {
        free_irq(irq, i365_count_irq);
        debug(2, "    spurious hit!\n");
@@ -1160,13 +1158,13 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
     
     debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#5.5lx-%#5.5"
          "lx, %#5.5x)\n", sock, mem->map, mem->flags, mem->speed,
-         mem->sys_start, mem->sys_stop, mem->card_start);
+         mem->res->start, mem->res->end, mem->card_start);
 
     map = mem->map;
     if ((map > 4) || (mem->card_start > 0x3ffffff) ||
-       (mem->sys_start > mem->sys_stop) || (mem->speed > 1000))
+       (mem->res->start > mem->res->end) || (mem->speed > 1000))
        return -EINVAL;
-    if ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff))
+    if ((mem->res->start > 0xffffff) || (mem->res->end > 0xffffff))
        return -EINVAL;
        
     /* Turn off the window before changing anything */
@@ -1174,12 +1172,12 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
        i365_bclr(sock, I365_ADDRWIN, I365_ENA_MEM(map));
     
     base = I365_MEM(map);
-    i = (mem->sys_start >> 12) & 0x0fff;
+    i = (mem->res->start >> 12) & 0x0fff;
     if (mem->flags & MAP_16BIT) i |= I365_MEM_16BIT;
     if (mem->flags & MAP_0WS) i |= I365_MEM_0WS;
     i365_set_pair(sock, base+I365_W_START, i);
     
-    i = (mem->sys_stop >> 12) & 0x0fff;
+    i = (mem->res->end >> 12) & 0x0fff;
     switch (to_cycles(mem->speed)) {
     case 0:    break;
     case 1:    i |= I365_MEM_WS0; break;
@@ -1188,7 +1186,7 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
     }
     i365_set_pair(sock, base+I365_W_STOP, i);
     
-    i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff;
+    i = ((mem->card_start - mem->res->start) >> 12) & 0x3fff;
     if (mem->flags & MAP_WRPROT) i |= I365_MEM_WRPROT;
     if (mem->flags & MAP_ATTRIB) i |= I365_MEM_REG;
     i365_set_pair(sock, base+I365_W_OFF, i);
@@ -1308,10 +1306,10 @@ static int pcic_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
 static int pcic_init(struct pcmcia_socket *s)
 {
        int i;
+       struct resource res = { .start = 0, .end = 0x1000 };
        pccard_io_map io = { 0, 0, 0, 0, 1 };
-       pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 };
+       pccard_mem_map mem = { .res = &res, };
 
-       mem.sys_stop = 0x1000;
        for (i = 0; i < 2; i++) {
                io.map = i;
                pcic_set_io_map(s, &io);
@@ -1372,8 +1370,15 @@ static int __init init_i82365(void)
 {
     int i, ret;
 
-    if (driver_register(&i82365_driver))
-       return -1;
+    ret = driver_register(&i82365_driver);
+    if (ret)
+       return ret;
+
+    ret = platform_device_register(&i82365_device);
+    if (ret) {
+       driver_unregister(&i82365_driver);
+       return ret;
+    }
 
     printk(KERN_INFO "Intel ISA PCIC probe: ");
     sockets = 0;
@@ -1382,12 +1387,11 @@ static int __init init_i82365(void)
 
     if (sockets == 0) {
        printk("not found.\n");
+       platform_device_unregister(&i82365_device);
        driver_unregister(&i82365_driver);
        return -ENODEV;
     }
 
-    platform_device_register(&i82365_device);
-
     /* Set up interrupt handler(s) */
     if (grab_irq != 0)
        request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);