* New release helper (as of 2.6.17)
    Instead of calling pcmcia_release_{configuration,io,irq,win}, all that's
    necessary now is calling pcmcia_disable_device. As there is no valid
-   reason left to call pcmcia_release_io and pcmcia_release_irq, they will
-   be removed soon.
+   reason left to call pcmcia_release_io and pcmcia_release_irq, the
+   exports for them were removed.
 
 * Unify detach and REMOVAL event code, as well as attach and INSERTION
   code (as of 2.6.16)
 
            cs_error(link->handle, RequestIO, i);
            break;
        }
-       
+
        /*
         * allocate an interrupt line
         */
        i = pcmcia_request_irq(link->handle, &link->irq);
        if (i != CS_SUCCESS) {
            cs_error(link->handle, RequestIRQ, i);
-           pcmcia_release_io(link->handle, &link->io);
+           /* undo */
+           pcmcia_disable_device(link->handle);
            break;
        }
-       
+
        /*
          * configure the PCMCIA socket
          */
        i = pcmcia_request_configuration(link->handle, &link->conf);
        if (i != CS_SUCCESS) {
            cs_error(link->handle, RequestConfiguration, i);
-           pcmcia_release_io(link->handle, &link->io);
-           pcmcia_release_irq(link->handle, &link->irq);
+           pcmcia_disable_device(link->handle);
            break;
        }
 
 
        i = pcmcia_request_irq(link->handle, &link->irq);
        if (i != CS_SUCCESS) {
            cs_error(link->handle, RequestIRQ, i);
-           pcmcia_release_io(link->handle, &link->io);
+           /* undo */
+           pcmcia_disable_device(link->handle);
            break;
        }
-       
+
        /*
         * configure the PCMCIA socket
         */
        i = pcmcia_request_configuration(link->handle, &link->conf);
        if (i != CS_SUCCESS) {
            cs_error(link->handle, RequestConfiguration, i);
-           pcmcia_release_io(link->handle, &link->io);
-           pcmcia_release_irq(link->handle, &link->irq);
+           pcmcia_disable_device(link->handle);
            break;
        }
 
 
        }
        /* If we got this far, we're cool! */
        break;
-       
+
     next_entry:
-/* new in dummy.cs 2001/01/28 MN 
-        if (link->io.NumPorts1)
-           pcmcia_release_io(link->handle, &link->io);
-*/
        CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
     }
-    
+
     /*
        Allocate an interrupt line.  Note that this does not assign a
        handler to the interrupt, unless the 'Handler' member of the
 
 #include <pcmcia/cisreg.h>
 #include <pcmcia/ciscode.h>
 #include <pcmcia/ds.h>
+#include <pcmcia/ss.h>
 
 #include <asm/io.h>
 #include <asm/system.h>
 
     if (width) {
        printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
+       /* call pcmcia_release_configuration() in _suspend */
        smc91c92_suspend(link->handle);
-       pcmcia_release_io(link->handle, &link->io);
+
        link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       pcmcia_request_io(link->handle, &link->io);
+       link->handle->socket->io[0].res->flags &= ~IO_DATA_PATH_WIDTH;
+       link->handle->socket->io[0].res->flags |= IO_DATA_PATH_WIDTH_8;
+
+       /* call pcmcia_request_configuration() in _resume, it handles the
+        * flag update */
        smc91c92_resume(link->handle);
        return check_sig(link);
     }
 
                break;
                
        next_entry:
-               if (link->io.NumPorts1)
-                       pcmcia_release_io(link->handle, &link->io);
+               pcmcia_disable_device(handle);
                last_ret = pcmcia_get_next_tuple(handle, &tuple);
                if (last_ret  == CS_NO_MORE_ITEMS) {
                        printk(KERN_ERR PFX "GetNextTuple(): No matching "
 
     DEBUG(1, "ray_release(0x%p)\n", link);
 
     del_timer(&local->timer);
-    link->state &= ~DEV_CONFIG;
 
     iounmap(local->sram);
     iounmap(local->rmem);
     iounmap(local->amem);
     /* Do bother checking to see if these succeed or not */
-    i = pcmcia_release_window(link->win);
-    if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(link->win) ret = %x\n",i);
     i = pcmcia_release_window(local->amem_handle);
     if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->amem) ret = %x\n",i);
     i = pcmcia_release_window(local->rmem_handle);
     if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->rmem) ret = %x\n",i);
-    i = pcmcia_release_configuration(link->handle);
-    if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseConfiguration ret = %x\n",i);
-    i = pcmcia_release_irq(link->handle, &link->irq);
-    if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseIRQ ret = %x\n",i);
+    pcmcia_disable_device(link->handle);
 
     DEBUG(2,"ray_release ending\n");
 }
 
                break;
                
        next_entry:
-               if (link->io.NumPorts1)
-                       pcmcia_release_io(link->handle, &link->io);
+               pcmcia_disable_device(handle);
                last_ret = pcmcia_get_next_tuple(handle, &tuple);
                if (last_ret  == CS_NO_MORE_ITEMS) {
                        printk(KERN_ERR PFX "GetNextTuple(): No matching "
 
 
        return CS_SUCCESS;
 } /* pcmcia_release_io */
-EXPORT_SYMBOL(pcmcia_release_io);
 
 
 int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req)
 
        return CS_SUCCESS;
 } /* pcmcia_release_irq */
-EXPORT_SYMBOL(pcmcia_release_irq);
 
 
 int pcmcia_release_window(window_handle_t win)
                pcmcia_release_window(p_dev->instance->win);
 
        p_dev->instance->dev = NULL;
-       p_dev->instance->state &= ~DEV_CONFIG;
 }
 EXPORT_SYMBOL(pcmcia_disable_device);
 
 
        next_entry:
                nsp_dbg(NSP_DEBUG_INIT, "next");
-
-               if (link->io.NumPorts1) {
-                       pcmcia_release_io(link->handle, &link->io);
-               }
+               pcmcia_disable_device(handle);
                CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
        }
 
 
 
 cs_failed:
        cs_error(link->handle, last_fn, last_ret);
-       link->dev = NULL;
-
-       pcmcia_release_configuration(link->handle);
-       pcmcia_release_io(link->handle, &link->io);
-       pcmcia_release_irq(link->handle, &link->irq);
-       link->state &= ~DEV_CONFIG;
+       pcmcia_disable_device(link->handle);
        return;
 
 }                              /* qlogic_config */
 
        ixj_info_t *info = link->priv;
        DEBUG(0, "ixj_cs_release(0x%p)\n", link);
        info->ndev = 0;
-       link->dev = NULL;
-       pcmcia_release_configuration(link->handle);
-       pcmcia_release_io(link->handle, &link->io);
-       link->state &= ~DEV_CONFIG;
+       pcmcia_disable_device(link->handle);
 }
 
 static int ixj_suspend(struct pcmcia_device *dev)
 
 
 static void sl811_cs_release(dev_link_t * link)
 {
-
        DBG(0, "sl811_cs_release(0x%p)\n", link);
 
-       /* Unlink the device chain */
-       link->dev = NULL;
-
+       pcmcia_disable_device(link->handle);
        platform_device_unregister(&platform_dev);
-       pcmcia_release_configuration(link->handle);
-       if (link->io.NumPorts1)
-               pcmcia_release_io(link->handle, &link->io);
-       if (link->irq.AssignedIRQ)
-               pcmcia_release_irq(link->handle, &link->irq);
-       link->state &= ~DEV_CONFIG;
 }
 
 static void sl811_cs_config(dev_link_t *link)
                break;
 
 next_entry:
-               if (link->io.NumPorts1)
-                       pcmcia_release_io(link->handle, &link->io);
+               pcmcia_disable_device(handle);
                last_ret = pcmcia_get_next_tuple(handle, &tuple);
        }
 
 
 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
 int pcmcia_release_configuration(struct pcmcia_device *p_dev);
-int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req);
-int pcmcia_release_irq(struct pcmcia_device *p_dev, irq_req_t *req);
 int pcmcia_release_window(window_handle_t win);
 int pcmcia_request_configuration(struct pcmcia_device *p_dev, config_req_t *req);
 int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
 
 cs_failed:
        cs_error(link->handle, last_fn, last_ret);
 failed:
-       pcmcia_release_configuration(link->handle);
-       pcmcia_release_io(link->handle, &link->io);
-       pcmcia_release_irq(link->handle, &link->irq);
+       pcmcia_disable_device(link->handle);
 }
 
 #ifdef CONFIG_PM
 
 cs_failed:
        cs_error(link->handle, last_fn, last_ret);
 failed:
-       pcmcia_release_configuration(link->handle);
-       pcmcia_release_io(link->handle, &link->io);
-       pcmcia_release_irq(link->handle, &link->irq);
-       link->state &= ~DEV_CONFIG;
+       pcmcia_disable_device(link->handle);
        kfree(parse);
 }