Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Aug 2010 19:25:06 +0000 (12:25 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Aug 2010 19:25:06 +0000 (12:25 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6:
  pcmcia: avoid buffer overflow in pcmcia_setup_isa_irq
  pcmcia: do not request windows if you don't need to
  pcmcia: insert PCMCIA device resources into resource tree
  pcmcia: export resource information to sysfs
  pcmcia: use struct resource for PCMCIA devices, part 2
  pcmcia: remove memreq_t
  pcmcia: move local definitions out of include/pcmcia/cs.h
  pcmcia: do not use io_req_t when calling pcmcia_request_io()
  pcmcia: do not use io_req_t after call to pcmcia_request_io()
  pcmcia: use struct resource for PCMCIA devices
  pcmcia: clean up cs.h
  pcmcia: use pcmica_{read,write}_config_byte
  pcmcia: remove cs_types.h
  pcmcia: remove unused flag, simplify headers
  pcmcia: remove obsolete CS_EVENT_ definitions
  pcmcia: split up central event handler
  pcmcia: simplify event callback
  pcmcia: remove obsolete ioctl

Conflicts in:
 - drivers/staging/comedi/drivers/*
 - drivers/staging/wlags49_h2/wl_cs.c
due to dev_info_t and whitespace changes

97 files changed:
Documentation/feature-removal-schedule.txt
Documentation/pcmcia/driver-changes.txt
drivers/ata/pata_pcmcia.c
drivers/bluetooth/bluecard_cs.c
drivers/bluetooth/bt3c_cs.c
drivers/bluetooth/btuart_cs.c
drivers/bluetooth/dtl1_cs.c
drivers/char/pcmcia/cm4000_cs.c
drivers/char/pcmcia/cm4040_cs.c
drivers/char/pcmcia/ipwireless/main.c
drivers/char/pcmcia/ipwireless/main.h
drivers/char/pcmcia/ipwireless/tty.h
drivers/char/pcmcia/synclink_cs.c
drivers/ide/ide-cs.c
drivers/isdn/hardware/avm/avm_cs.c
drivers/isdn/hisax/avma1_cs.c
drivers/isdn/hisax/elsa_cs.c
drivers/isdn/hisax/sedlbauer_cs.c
drivers/isdn/hisax/teles_cs.c
drivers/mmc/host/sdricoh_cs.c
drivers/mtd/maps/pcmciamtd.c
drivers/net/pcmcia/3c574_cs.c
drivers/net/pcmcia/3c589_cs.c
drivers/net/pcmcia/axnet_cs.c
drivers/net/pcmcia/com20020_cs.c
drivers/net/pcmcia/fmvj18x_cs.c
drivers/net/pcmcia/ibmtr_cs.c
drivers/net/pcmcia/nmclan_cs.c
drivers/net/pcmcia/pcnet_cs.c
drivers/net/pcmcia/smc91c92_cs.c
drivers/net/pcmcia/xirc2ps_cs.c
drivers/net/wireless/airo_cs.c
drivers/net/wireless/atmel_cs.c
drivers/net/wireless/b43/pcmcia.c
drivers/net/wireless/hostap/hostap_cs.c
drivers/net/wireless/libertas/if_cs.c
drivers/net/wireless/orinoco/orinoco_cs.c
drivers/net/wireless/orinoco/spectrum_cs.c
drivers/net/wireless/ray_cs.c
drivers/net/wireless/wl3501_cs.c
drivers/parport/parport_cs.c
drivers/pcmcia/Makefile
drivers/pcmcia/au1000_generic.h
drivers/pcmcia/au1000_pb1x00.c
drivers/pcmcia/cistpl.c
drivers/pcmcia/cs.c
drivers/pcmcia/cs_internal.h
drivers/pcmcia/db1xxx_ss.c
drivers/pcmcia/ds.c
drivers/pcmcia/i82092.c
drivers/pcmcia/i82365.c
drivers/pcmcia/m32r_cfc.c
drivers/pcmcia/m32r_pcc.c
drivers/pcmcia/m8xx_pcmcia.c
drivers/pcmcia/pcmcia_cis.c
drivers/pcmcia/pcmcia_ioctl.c [deleted file]
drivers/pcmcia/pcmcia_resource.c
drivers/pcmcia/pd6729.c
drivers/pcmcia/pxa2xx_base.c
drivers/pcmcia/rsrc_iodyn.c
drivers/pcmcia/rsrc_mgr.c
drivers/pcmcia/rsrc_nonstatic.c
drivers/pcmcia/sa1100_generic.c
drivers/pcmcia/soc_common.h
drivers/pcmcia/socket_sysfs.c
drivers/pcmcia/tcic.c
drivers/pcmcia/xxs1500_ss.c
drivers/pcmcia/yenta_socket.c
drivers/scsi/pcmcia/aha152x_stub.c
drivers/scsi/pcmcia/fdomain_stub.c
drivers/scsi/pcmcia/nsp_cs.c
drivers/scsi/pcmcia/qlogic_stub.c
drivers/scsi/pcmcia/sym53c500_cs.c
drivers/serial/serial_cs.c
drivers/ssb/main.c
drivers/ssb/pcmcia.c
drivers/ssb/scan.c
drivers/staging/comedi/drivers/cb_das16_cs.c
drivers/staging/comedi/drivers/das08_cs.c
drivers/staging/comedi/drivers/ni_daq_700.c
drivers/staging/comedi/drivers/ni_daq_dio24.c
drivers/staging/comedi/drivers/ni_labpc_cs.c
drivers/staging/comedi/drivers/ni_mio_cs.c
drivers/staging/comedi/drivers/quatech_daqp_cs.c
drivers/staging/wlags49_h2/wl_cs.c
drivers/staging/wlags49_h2/wl_internal.h
drivers/telephony/ixj_pcmcia.c
drivers/usb/host/sl811_cs.c
include/pcmcia/cistpl.h
include/pcmcia/cs.h
include/pcmcia/cs_types.h [deleted file]
include/pcmcia/ds.h
include/pcmcia/ss.h
sound/pcmcia/pdaudiocf/pdaudiocf.c
sound/pcmcia/pdaudiocf/pdaudiocf.h
sound/pcmcia/vx/vxpocket.c
sound/pcmcia/vx/vxpocket.h

index be7030e..6fdb837 100644 (file)
@@ -116,29 +116,6 @@ Who:       Mauro Carvalho Chehab <mchehab@infradead.org>
 
 ---------------------------
 
-What:  PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
-When:  2.6.35/2.6.36
-Files: drivers/pcmcia/: pcmcia_ioctl.c
-Why:   With the 16-bit PCMCIA subsystem now behaving (almost) like a
-       normal hotpluggable bus, and with it using the default kernel
-       infrastructure (hotplug, driver core, sysfs) keeping the PCMCIA
-       control ioctl needed by cardmgr and cardctl from pcmcia-cs is
-       unnecessary and potentially harmful (it does not provide for
-       proper locking), and makes further cleanups and integration of the
-       PCMCIA subsystem into the Linux kernel device driver model more
-       difficult. The features provided by cardmgr and cardctl are either
-       handled by the kernel itself now or are available in the new
-       pcmciautils package available at
-       http://kernel.org/pub/linux/utils/kernel/pcmcia/
-
-       For all architectures except ARM, the associated config symbol
-       has been removed from kernel 2.6.34; for ARM, it will be likely
-       be removed from kernel 2.6.35. The actual code will then likely
-       be removed from kernel 2.6.36.
-Who:   Dominik Brodowski <linux@dominikbrodowski.net>
-
----------------------------
-
 What:  sys_sysctl
 When:  September 2010
 Option: CONFIG_SYSCTL_SYSCALL
index 61bc4e9..26c0f9c 100644 (file)
@@ -1,4 +1,16 @@
 This file details changes in 2.6 which affect PCMCIA card driver authors:
+* pcmcia_request_io changes (as of 2.6.36)
+   Instead of io_req_t, drivers are now requested to fill out
+   struct pcmcia_device *p_dev->resource[0,1] for up to two ioport
+   ranges. After a call to pcmcia_request_io(), the ports found there
+   are reserved, after calling pcmcia_request_configuration(), they may
+   be used.
+
+* No dev_info_t, no cs_types.h (as of 2.6.36)
+   dev_info_t and a few other typedefs are removed. No longer use them
+   in PCMCIA device drivers. Also, do not include pcmcia/cs_types.h, as
+   this file is gone.
+
 * No dev_node_t (as of 2.6.35)
    There is no more need to fill out a "dev_node_t" structure.
 
index 118c28e..e944aa0 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/ata.h>
 #include <linux/libata.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -201,23 +200,25 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
 
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               pdev->io.BasePort1 = io->win[0].base;
-               pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+               pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               pdev->resource[0]->start = io->win[0].base;
+               if (!(io->flags & CISTPL_IO_16BIT)) {
+                       pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+                       pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+               }
                if (io->nwin == 2) {
-                       pdev->io.NumPorts1 = 8;
-                       pdev->io.BasePort2 = io->win[1].base;
-                       pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1;
-                       if (pcmcia_request_io(pdev, &pdev->io) != 0)
+                       pdev->resource[0]->end = 8;
+                       pdev->resource[1]->start = io->win[1].base;
+                       pdev->resource[1]->end = (stk->is_kme) ? 2 : 1;
+                       if (pcmcia_request_io(pdev) != 0)
                                return -ENODEV;
-                       stk->ctl_base = pdev->io.BasePort2;
+                       stk->ctl_base = pdev->resource[1]->start;
                } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
-                       pdev->io.NumPorts1 = io->win[0].len;
-                       pdev->io.NumPorts2 = 0;
-                       if (pcmcia_request_io(pdev, &pdev->io) != 0)
+                       pdev->resource[0]->end = io->win[0].len;
+                       pdev->resource[1]->end = 0;
+                       if (pcmcia_request_io(pdev) != 0)
                                return -ENODEV;
-                       stk->ctl_base = pdev->io.BasePort1 + 0x0e;
+                       stk->ctl_base = pdev->resource[0]->start + 0x0e;
                } else
                        return -ENODEV;
                /* If we've got this far, we're done */
@@ -246,9 +247,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
        struct ata_port_operations *ops = &pcmcia_port_ops;
 
        /* Set up attributes in order to probe card and get resources */
-       pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       pdev->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
-       pdev->io.IOAddrLines = 3;
+       pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
+       pdev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
        pdev->conf.Attributes = CONF_ENABLE_IRQ;
        pdev->conf.IntType = INT_MEMORY_AND_IO;
 
@@ -271,7 +271,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
                if (pcmcia_loop_config(pdev, pcmcia_check_one_config, stk))
                        goto failed; /* No suitable config found */
        }
-       io_base = pdev->io.BasePort1;
+       io_base = pdev->resource[0]->start;
        ctl_base = stk->ctl_base;
        if (!pdev->irq)
                goto failed;
@@ -294,7 +294,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
 
        /* FIXME: Could be more ports at base + 0x10 but we only deal with
           one right now */
-       if (pdev->io.NumPorts1 >= 0x20)
+       if (resource_size(pdev->resource[0]) >= 0x20)
                n_ports = 2;
 
        if (pdev->manf_id == 0x0097 && pdev->card_id == 0x1620)
index 6d34f40..d52e90a 100644 (file)
@@ -39,7 +39,6 @@
 #include <linux/skbuff.h>
 #include <linux/io.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -160,7 +159,7 @@ static void bluecard_detach(struct pcmcia_device *p_dev);
 static void bluecard_activity_led_timeout(u_long arg)
 {
        bluecard_info_t *info = (bluecard_info_t *)arg;
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
 
        if (!test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
                return;
@@ -177,7 +176,7 @@ static void bluecard_activity_led_timeout(u_long arg)
 
 static void bluecard_enable_activity_led(bluecard_info_t *info)
 {
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
 
        if (!test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
                return;
@@ -233,7 +232,7 @@ static void bluecard_write_wakeup(bluecard_info_t *info)
        }
 
        do {
-               register unsigned int iobase = info->p_dev->io.BasePort1;
+               register unsigned int iobase = info->p_dev->resource[0]->start;
                register unsigned int offset;
                register unsigned char command;
                register unsigned long ready_bit;
@@ -380,7 +379,7 @@ static void bluecard_receive(bluecard_info_t *info, unsigned int offset)
                return;
        }
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        if (test_bit(XMIT_SENDING_READY, &(info->tx_state)))
                bluecard_enable_activity_led(info);
@@ -509,7 +508,7 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst)
        if (!test_bit(CARD_READY, &(info->hw_state)))
                return IRQ_HANDLED;
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        spin_lock(&(info->lock));
 
@@ -623,7 +622,7 @@ static int bluecard_hci_flush(struct hci_dev *hdev)
 static int bluecard_hci_open(struct hci_dev *hdev)
 {
        bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
 
        if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
                bluecard_hci_set_baud_rate(hdev, DEFAULT_BAUD_RATE);
@@ -643,7 +642,7 @@ static int bluecard_hci_open(struct hci_dev *hdev)
 static int bluecard_hci_close(struct hci_dev *hdev)
 {
        bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
 
        if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
                return 0;
@@ -710,7 +709,7 @@ static int bluecard_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned l
 
 static int bluecard_open(bluecard_info_t *info)
 {
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
        struct hci_dev *hdev;
        unsigned char id;
 
@@ -829,7 +828,7 @@ static int bluecard_open(bluecard_info_t *info)
 
 static int bluecard_close(bluecard_info_t *info)
 {
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
        struct hci_dev *hdev = info->hdev;
 
        if (!hdev)
@@ -866,9 +865,6 @@ static int bluecard_probe(struct pcmcia_device *link)
        info->p_dev = link;
        link->priv = info;
 
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->io.NumPorts1 = 8;
-
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
 
@@ -891,12 +887,14 @@ static int bluecard_config(struct pcmcia_device *link)
        int i, n;
 
        link->conf.ConfigIndex = 0x20;
-       link->io.NumPorts1 = 64;
-       link->io.IOAddrLines = 6;
+
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       link->resource[0]->end = 64;
+       link->io_lines = 6;
 
        for (n = 0; n < 0x400; n += 0x40) {
-               link->io.BasePort1 = n ^ 0x300;
-               i = pcmcia_request_io(link, &link->io);
+               link->resource[0]->start = n ^ 0x300;
+               i = pcmcia_request_io(link);
                if (i == 0)
                        break;
        }
index 21e05fd..7ab8f29 100644 (file)
@@ -45,7 +45,6 @@
 #include <linux/device.h>
 #include <linux/firmware.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -189,7 +188,7 @@ static void bt3c_write_wakeup(bt3c_info_t *info)
                return;
 
        do {
-               register unsigned int iobase = info->p_dev->io.BasePort1;
+               register unsigned int iobase = info->p_dev->resource[0]->start;
                register struct sk_buff *skb;
                register int len;
 
@@ -227,7 +226,7 @@ static void bt3c_receive(bt3c_info_t *info)
                return;
        }
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        avail = bt3c_read(iobase, 0x7006);
        //printk("bt3c_cs: receiving %d bytes\n", avail);
@@ -348,7 +347,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
                /* our irq handler is shared */
                return IRQ_NONE;
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        spin_lock(&(info->lock));
 
@@ -481,7 +480,7 @@ static int bt3c_load_firmware(bt3c_info_t *info, const unsigned char *firmware,
        unsigned int iobase, size, addr, fcs, tmp;
        int i, err = 0;
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        /* Reset */
        bt3c_io_write(iobase, 0x8040, 0x0404);
@@ -658,8 +657,8 @@ static int bt3c_probe(struct pcmcia_device *link)
        info->p_dev = link;
        link->priv = info;
 
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->io.NumPorts1 = 8;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       link->resource[0]->end = 8;
 
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
@@ -684,14 +683,14 @@ static int bt3c_check_config(struct pcmcia_device *p_dev,
 {
        unsigned long try = (unsigned long) priv_data;
 
+       p_dev->io_lines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
+
        if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
                p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
        if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) &&
            (cf->io.win[0].base != 0)) {
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               p_dev->io.IOAddrLines = (try == 0) ? 16 :
-                       cf->io.flags & CISTPL_IO_LINES_MASK;
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               p_dev->resource[0]->start = cf->io.win[0].base;
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        }
        return -ENODEV;
@@ -708,9 +707,9 @@ static int bt3c_check_config_notpicky(struct pcmcia_device *p_dev,
 
        if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
                for (j = 0; j < 5; j++) {
-                       p_dev->io.BasePort1 = base[j];
-                       p_dev->io.IOAddrLines = base[j] ? 16 : 3;
-                       if (!pcmcia_request_io(p_dev, &p_dev->io))
+                       p_dev->resource[0]->start = base[j];
+                       p_dev->io_lines = base[j] ? 16 : 3;
+                       if (!pcmcia_request_io(p_dev))
                                return 0;
                }
        }
index 4ed7288..1c4f5e8 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/system.h>
 #include <asm/io.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -143,7 +142,7 @@ static void btuart_write_wakeup(btuart_info_t *info)
        }
 
        do {
-               register unsigned int iobase = info->p_dev->io.BasePort1;
+               register unsigned int iobase = info->p_dev->resource[0]->start;
                register struct sk_buff *skb;
                register int len;
 
@@ -184,7 +183,7 @@ static void btuart_receive(btuart_info_t *info)
                return;
        }
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        do {
                info->hdev->stat.byte_rx++;
@@ -298,7 +297,7 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst)
                /* our irq handler is shared */
                return IRQ_NONE;
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        spin_lock(&(info->lock));
 
@@ -355,7 +354,7 @@ static void btuart_change_speed(btuart_info_t *info, unsigned int speed)
                return;
        }
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        spin_lock_irqsave(&(info->lock), flags);
 
@@ -479,7 +478,7 @@ static int btuart_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned lon
 static int btuart_open(btuart_info_t *info)
 {
        unsigned long flags;
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
        struct hci_dev *hdev;
 
        spin_lock_init(&(info->lock));
@@ -549,7 +548,7 @@ static int btuart_open(btuart_info_t *info)
 static int btuart_close(btuart_info_t *info)
 {
        unsigned long flags;
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
        struct hci_dev *hdev = info->hdev;
 
        if (!hdev)
@@ -587,8 +586,8 @@ static int btuart_probe(struct pcmcia_device *link)
        info->p_dev = link;
        link->priv = info;
 
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->io.NumPorts1 = 8;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       link->resource[0]->end = 8;
 
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
@@ -613,14 +612,14 @@ static int btuart_check_config(struct pcmcia_device *p_dev,
 {
        int *try = priv_data;
 
+       p_dev->io_lines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
+
        if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
                p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
        if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) &&
            (cf->io.win[0].base != 0)) {
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               p_dev->io.IOAddrLines = (*try == 0) ? 16 :
-                       cf->io.flags & CISTPL_IO_LINES_MASK;
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               p_dev->resource[0]->start = cf->io.win[0].base;
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        }
        return -ENODEV;
@@ -637,9 +636,9 @@ static int btuart_check_config_notpicky(struct pcmcia_device *p_dev,
 
        if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
                for (j = 0; j < 5; j++) {
-                       p_dev->io.BasePort1 = base[j];
-                       p_dev->io.IOAddrLines = base[j] ? 16 : 3;
-                       if (!pcmcia_request_io(p_dev, &p_dev->io))
+                       p_dev->resource[0]->start = base[j];
+                       p_dev->io_lines = base[j] ? 16 : 3;
+                       if (!pcmcia_request_io(p_dev))
                                return 0;
                }
        }
index cbe9e44..db7c8db 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/system.h>
 #include <asm/io.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -150,7 +149,7 @@ static void dtl1_write_wakeup(dtl1_info_t *info)
        }
 
        do {
-               register unsigned int iobase = info->p_dev->io.BasePort1;
+               register unsigned int iobase = info->p_dev->resource[0]->start;
                register struct sk_buff *skb;
                register int len;
 
@@ -215,7 +214,7 @@ static void dtl1_receive(dtl1_info_t *info)
                return;
        }
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        do {
                info->hdev->stat.byte_rx++;
@@ -302,7 +301,7 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst)
                /* our irq handler is shared */
                return IRQ_NONE;
 
-       iobase = info->p_dev->io.BasePort1;
+       iobase = info->p_dev->resource[0]->start;
 
        spin_lock(&(info->lock));
 
@@ -462,7 +461,7 @@ static int dtl1_hci_ioctl(struct hci_dev *hdev, unsigned int cmd,  unsigned long
 static int dtl1_open(dtl1_info_t *info)
 {
        unsigned long flags;
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
        struct hci_dev *hdev;
 
        spin_lock_init(&(info->lock));
@@ -509,7 +508,8 @@ static int dtl1_open(dtl1_info_t *info)
        outb(UART_LCR_WLEN8, iobase + UART_LCR);        /* Reset DLAB */
        outb((UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase + UART_MCR);
 
-       info->ri_latch = inb(info->p_dev->io.BasePort1 + UART_MSR) & UART_MSR_RI;
+       info->ri_latch = inb(info->p_dev->resource[0]->start + UART_MSR)
+                               & UART_MSR_RI;
 
        /* Turn on interrupts */
        outb(UART_IER_RLSI | UART_IER_RDI | UART_IER_THRI, iobase + UART_IER);
@@ -534,7 +534,7 @@ static int dtl1_open(dtl1_info_t *info)
 static int dtl1_close(dtl1_info_t *info)
 {
        unsigned long flags;
-       unsigned int iobase = info->p_dev->io.BasePort1;
+       unsigned int iobase = info->p_dev->resource[0]->start;
        struct hci_dev *hdev = info->hdev;
 
        if (!hdev)
@@ -572,8 +572,8 @@ static int dtl1_probe(struct pcmcia_device *link)
        info->p_dev = link;
        link->priv = info;
 
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->io.NumPorts1 = 8;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       link->resource[0]->end = 8;
 
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
@@ -597,14 +597,13 @@ static int dtl1_confcheck(struct pcmcia_device *p_dev,
                          unsigned int vcc,
                          void *priv_data)
 {
-       if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) {
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               p_dev->io.NumPorts1 = cf->io.win[0].len;        /*yo */
-               p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
-                       return 0;
-       }
-       return -ENODEV;
+       if ((cf->io.nwin != 1) || (cf->io.win[0].len <= 8))
+               return -ENODEV;
+
+       p_dev->resource[0]->start = cf->io.win[0].base;
+       p_dev->resource[0]->end = cf->io.win[0].len;    /*yo */
+       p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
+       return pcmcia_request_io(p_dev);
 }
 
 static int dtl1_config(struct pcmcia_device *link)
@@ -613,7 +612,7 @@ static int dtl1_config(struct pcmcia_device *link)
        int i;
 
        /* Look for a generic full-sized window */
-       link->io.NumPorts1 = 8;
+       link->resource[0]->end = 8;
        if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0)
                goto failed;
 
index e7956ac..ec73d9f 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/uaccess.h>
 #include <linux/io.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -422,7 +421,7 @@ static struct card_fixup card_fixups[] = {
 static void set_cardparameter(struct cm4000_dev *dev)
 {
        int i;
-       unsigned int iobase = dev->p_dev->io.BasePort1;
+       unsigned int iobase = dev->p_dev->resource[0]->start;
        u_int8_t stopbits = 0x02; /* ISO default */
 
        DEBUGP(3, dev, "-> set_cardparameter\n");
@@ -455,7 +454,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
        unsigned short num_bytes_read;
        unsigned char pts_reply[4];
        ssize_t rc;
-       unsigned int iobase = dev->p_dev->io.BasePort1;
+       unsigned int iobase = dev->p_dev->resource[0]->start;
 
        rc = 0;
 
@@ -664,7 +663,7 @@ static void terminate_monitor(struct cm4000_dev *dev)
 static void monitor_card(unsigned long p)
 {
        struct cm4000_dev *dev = (struct cm4000_dev *) p;
-       unsigned int iobase = dev->p_dev->io.BasePort1;
+       unsigned int iobase = dev->p_dev->resource[0]->start;
        unsigned short s;
        struct ptsreq ptsreq;
        int i, atrc;
@@ -925,7 +924,7 @@ static ssize_t cmm_read(struct file *filp, __user char *buf, size_t count,
                        loff_t *ppos)
 {
        struct cm4000_dev *dev = filp->private_data;
-       unsigned int iobase = dev->p_dev->io.BasePort1;
+       unsigned int iobase = dev->p_dev->resource[0]->start;
        ssize_t rc;
        int i, j, k;
 
@@ -1048,7 +1047,7 @@ static ssize_t cmm_write(struct file *filp, const char __user *buf,
                         size_t count, loff_t *ppos)
 {
        struct cm4000_dev *dev = filp->private_data;
-       unsigned int iobase = dev->p_dev->io.BasePort1;
+       unsigned int iobase = dev->p_dev->resource[0]->start;
        unsigned short s;
        unsigned char tmp;
        unsigned char infolen;
@@ -1401,7 +1400,7 @@ static void stop_monitor(struct cm4000_dev *dev)
 static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
        struct cm4000_dev *dev = filp->private_data;
-       unsigned int iobase = dev->p_dev->io.BasePort1;
+       unsigned int iobase = dev->p_dev->resource[0]->start;
        struct inode *inode = filp->f_path.dentry->d_inode;
        struct pcmcia_device *link;
        int size;
@@ -1752,17 +1751,12 @@ static int cm4000_config_check(struct pcmcia_device *p_dev,
        if (!cfg->io.nwin)
                return -ENODEV;
 
-       /* Get the IOaddr */
-       p_dev->io.BasePort1 = cfg->io.win[0].base;
-       p_dev->io.NumPorts1 = cfg->io.win[0].len;
-       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       if (!(cfg->io.flags & CISTPL_IO_8BIT))
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-       if (!(cfg->io.flags & CISTPL_IO_16BIT))
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
-
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
+       p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags);
+       p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
+
+       return pcmcia_request_io(p_dev);
 }
 
 static int cm4000_config(struct pcmcia_device * link, int devno)
index c0775c8..815cde1 100644 (file)
@@ -29,7 +29,6 @@
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -110,7 +109,7 @@ static inline unsigned char xinb(unsigned short port)
 static void cm4040_do_poll(unsigned long dummy)
 {
        struct reader_dev *dev = (struct reader_dev *) dummy;
-       unsigned int obs = xinb(dev->p_dev->io.BasePort1
+       unsigned int obs = xinb(dev->p_dev->resource[0]->start
                                + REG_OFFSET_BUFFER_STATUS);
 
        if ((obs & BSR_BULK_IN_FULL)) {
@@ -141,7 +140,7 @@ static void cm4040_stop_poll(struct reader_dev *dev)
 static int wait_for_bulk_out_ready(struct reader_dev *dev)
 {
        int i, rc;
-       int iobase = dev->p_dev->io.BasePort1;
+       int iobase = dev->p_dev->resource[0]->start;
 
        for (i = 0; i < POLL_LOOP_COUNT; i++) {
                if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
@@ -171,7 +170,7 @@ static int wait_for_bulk_out_ready(struct reader_dev *dev)
 /* Write to Sync Control Register */
 static int write_sync_reg(unsigned char val, struct reader_dev *dev)
 {
-       int iobase = dev->p_dev->io.BasePort1;
+       int iobase = dev->p_dev->resource[0]->start;
        int rc;
 
        rc = wait_for_bulk_out_ready(dev);
@@ -189,7 +188,7 @@ static int write_sync_reg(unsigned char val, struct reader_dev *dev)
 static int wait_for_bulk_in_ready(struct reader_dev *dev)
 {
        int i, rc;
-       int iobase = dev->p_dev->io.BasePort1;
+       int iobase = dev->p_dev->resource[0]->start;
 
        for (i = 0; i < POLL_LOOP_COUNT; i++) {
                if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
@@ -219,7 +218,7 @@ static ssize_t cm4040_read(struct file *filp, char __user *buf,
                        size_t count, loff_t *ppos)
 {
        struct reader_dev *dev = filp->private_data;
-       int iobase = dev->p_dev->io.BasePort1;
+       int iobase = dev->p_dev->resource[0]->start;
        size_t bytes_to_read;
        unsigned long i;
        size_t min_bytes_to_read;
@@ -321,7 +320,7 @@ static ssize_t cm4040_write(struct file *filp, const char __user *buf,
                         size_t count, loff_t *ppos)
 {
        struct reader_dev *dev = filp->private_data;
-       int iobase = dev->p_dev->io.BasePort1;
+       int iobase = dev->p_dev->resource[0]->start;
        ssize_t rc;
        int i;
        unsigned int bytes_to_write;
@@ -528,16 +527,12 @@ static int cm4040_config_check(struct pcmcia_device *p_dev,
                return -ENODEV;
 
        /* Get the IOaddr */
-       p_dev->io.BasePort1 = cfg->io.win[0].base;
-       p_dev->io.NumPorts1 = cfg->io.win[0].len;
-       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       if (!(cfg->io.flags & CISTPL_IO_8BIT))
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-       if (!(cfg->io.flags & CISTPL_IO_16BIT))
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
-
-       rc = pcmcia_request_io(p_dev, &p_dev->io);
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
+       p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags);
+       p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
+       rc = pcmcia_request_io(p_dev);
+
        dev_printk(KERN_INFO, &p_dev->dev,
                   "pcmcia_request_io returned 0x%x\n", rc);
        return rc;
@@ -549,10 +544,6 @@ static int reader_config(struct pcmcia_device *link, int devno)
        struct reader_dev *dev;
        int fail_rc;
 
-       link->io.BasePort2 = 0;
-       link->io.NumPorts2 = 0;
-       link->io.Attributes2 = 0;
-
        if (pcmcia_loop_config(link, cm4040_config_check, NULL))
                goto cs_release;
 
@@ -568,8 +559,8 @@ static int reader_config(struct pcmcia_device *link, int devno)
 
        dev = link->priv;
 
-       DEBUGP(2, dev, "device " DEVICE_NAME "%d at 0x%.4x-0x%.4x\n", devno,
-             link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1);
+       DEBUGP(2, dev, "device " DEVICE_NAME "%d at %pR\n", devno,
+             link->resource[0]);
        DEBUGP(2, dev, "<- reader_config (succ)\n");
 
        return 0;
index 63c32e3..67bdb05 100644 (file)
@@ -84,23 +84,22 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
 {
        struct ipw_dev *ipw = priv_data;
        struct resource *io_resource;
-       memreq_t memreq_attr_memory;
-       memreq_t memreq_common_memory;
        int ret;
 
-       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       p_dev->io.BasePort1 = cfg->io.win[0].base;
-       p_dev->io.NumPorts1 = cfg->io.win[0].len;
-       p_dev->io.IOAddrLines = 16;
+       p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
 
        /* 0x40 causes it to generate level mode interrupts. */
        /* 0x04 enables IREQ pin. */
        p_dev->conf.ConfigIndex = cfg->index | 0x44;
-       ret = pcmcia_request_io(p_dev, &p_dev->io);
+       p_dev->io_lines = 16;
+       ret = pcmcia_request_io(p_dev);
        if (ret)
                return ret;
 
-       io_resource = request_region(p_dev->io.BasePort1, p_dev->io.NumPorts1,
+       io_resource = request_region(p_dev->resource[0]->start,
+                               resource_size(p_dev->resource[0]),
                                IPWIRELESS_PCCARD_NAME);
 
        if (cfg->mem.nwin == 0)
@@ -120,11 +119,8 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
        if (ret != 0)
                goto exit1;
 
-       memreq_common_memory.CardOffset = cfg->mem.win[0].card_addr;
-       memreq_common_memory.Page = 0;
-
        ret = pcmcia_map_mem_page(p_dev, ipw->handle_common_memory,
-                               &memreq_common_memory);
+                               cfg->mem.win[0].card_addr);
 
        if (ret != 0)
                goto exit2;
@@ -149,12 +145,7 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
        if (ret != 0)
                goto exit2;
 
-       memreq_attr_memory.CardOffset = 0;
-       memreq_attr_memory.Page = 0;
-
-       ret = pcmcia_map_mem_page(p_dev, ipw->handle_attr_memory,
-                               &memreq_attr_memory);
-
+       ret = pcmcia_map_mem_page(p_dev, ipw->handle_attr_memory, 0);
        if (ret != 0)
                goto exit3;
 
@@ -166,15 +157,12 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
        return 0;
 
 exit3:
-       pcmcia_release_window(p_dev, ipw->handle_attr_memory);
 exit2:
        if (ipw->common_memory) {
                release_mem_region(ipw->request_common_memory.Base,
                                ipw->request_common_memory.Size);
                iounmap(ipw->common_memory);
-               pcmcia_release_window(p_dev, ipw->handle_common_memory);
-       } else
-               pcmcia_release_window(p_dev, ipw->handle_common_memory);
+       }
 exit1:
        release_resource(io_resource);
        pcmcia_disable_device(p_dev);
@@ -197,7 +185,7 @@ static int config_ipwireless(struct ipw_dev *ipw)
 
        INIT_WORK(&ipw->work_reboot, signalled_reboot_work);
 
-       ipwireless_init_hardware_v1(ipw->hardware, link->io.BasePort1,
+       ipwireless_init_hardware_v1(ipw->hardware, link->resource[0]->start,
                                    ipw->attr_memory, ipw->common_memory,
                                    ipw->is_v2_card, signalled_reboot_callback,
                                    ipw);
@@ -209,10 +197,7 @@ static int config_ipwireless(struct ipw_dev *ipw)
        printk(KERN_INFO IPWIRELESS_PCCARD_NAME ": Card type %s\n",
                        ipw->is_v2_card ? "V2/V3" : "V1");
        printk(KERN_INFO IPWIRELESS_PCCARD_NAME
-                       ": I/O ports 0x%04x-0x%04x, irq %d\n",
-                       (unsigned int) link->io.BasePort1,
-                       (unsigned int) (link->io.BasePort1 +
-                               link->io.NumPorts1 - 1),
+               ": I/O ports %pR, irq %d\n", link->resource[0],
                        (unsigned int) link->irq);
        if (ipw->attr_memory && ipw->common_memory)
                printk(KERN_INFO IPWIRELESS_PCCARD_NAME
@@ -250,13 +235,12 @@ exit:
                release_mem_region(ipw->request_attr_memory.Base,
                                ipw->request_attr_memory.Size);
                iounmap(ipw->attr_memory);
-               pcmcia_release_window(link, ipw->handle_attr_memory);
+
        }
        if (ipw->common_memory) {
                release_mem_region(ipw->request_common_memory.Base,
                                ipw->request_common_memory.Size);
                iounmap(ipw->common_memory);
-               pcmcia_release_window(link, ipw->handle_common_memory);
        }
        pcmcia_disable_device(link);
        return -1;
@@ -274,11 +258,6 @@ static void release_ipwireless(struct ipw_dev *ipw)
                                ipw->request_attr_memory.Size);
                iounmap(ipw->attr_memory);
        }
-       if (ipw->common_memory)
-               pcmcia_release_window(ipw->link, ipw->handle_common_memory);
-       if (ipw->attr_memory)
-               pcmcia_release_window(ipw->link, ipw->handle_attr_memory);
-
        pcmcia_disable_device(ipw->link);
 }
 
index 96d0ef3..c207be8 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/sched.h>
 #include <linux/types.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
index 4da6c20..3e163d4 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/types.h>
 #include <linux/sched.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
index 308903e..9ecd6be 100644 (file)
@@ -70,7 +70,6 @@
 #include <linux/workqueue.h>
 #include <linux/hdlc.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -572,18 +571,15 @@ static int mgslpc_ioprobe(struct pcmcia_device *p_dev,
                          unsigned int vcc,
                          void *priv_data)
 {
-       if (cfg->io.nwin > 0) {
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(cfg->io.flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(cfg->io.flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = cfg->io.win[0].base;
-               p_dev->io.NumPorts1 = cfg->io.win[0].len;
-               return pcmcia_request_io(p_dev, &p_dev->io);
-       }
-       return -ENODEV;
+       if (!cfg->io.nwin)
+               return -ENODEV;
+
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
+       p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags);
+       p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
+
+       return pcmcia_request_io(p_dev);
 }
 
 static int mgslpc_config(struct pcmcia_device *link)
@@ -610,16 +606,15 @@ static int mgslpc_config(struct pcmcia_device *link)
     if (ret)
            goto failed;
 
-    info->io_base = link->io.BasePort1;
+    info->io_base = link->resource[0]->start;
     info->irq_level = link->irq;
 
     dev_info(&link->dev, "index 0x%02x:",
            link->conf.ConfigIndex);
     if (link->conf.Attributes & CONF_ENABLE_IRQ)
            printk(", irq %d", link->irq);
-    if (link->io.NumPorts1)
-           printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                  link->io.BasePort1+link->io.NumPorts1-1);
+    if (link->resource[0])
+           printk(", io %pR", link->resource[0]);
     printk("\n");
     return 0;
 
index 0b7815d..2a4cb9c 100644 (file)
@@ -43,7 +43,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -98,9 +97,8 @@ static int ide_probe(struct pcmcia_device *link)
     info->p_dev = link;
     link->priv = info;
 
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-    link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
-    link->io.IOAddrLines = 3;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
+    link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
 
@@ -229,24 +227,27 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
 
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
+               pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+
                pdev->conf.ConfigIndex = cfg->index;
-               pdev->io.BasePort1 = io->win[0].base;
-               pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+               pdev->resource[0]->start = io->win[0].base;
+               if (!(io->flags & CISTPL_IO_16BIT)) {
+                       pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+                       pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+               }
                if (io->nwin == 2) {
-                       pdev->io.NumPorts1 = 8;
-                       pdev->io.BasePort2 = io->win[1].base;
-                       pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1;
-                       if (pcmcia_request_io(pdev, &pdev->io) != 0)
+                       pdev->resource[0]->end = 8;
+                       pdev->resource[1]->start = io->win[1].base;
+                       pdev->resource[1]->end = (stk->is_kme) ? 2 : 1;
+                       if (pcmcia_request_io(pdev) != 0)
                                return -ENODEV;
-                       stk->ctl_base = pdev->io.BasePort2;
+                       stk->ctl_base = pdev->resource[1]->start;
                } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
-                       pdev->io.NumPorts1 = io->win[0].len;
-                       pdev->io.NumPorts2 = 0;
-                       if (pcmcia_request_io(pdev, &pdev->io) != 0)
+                       pdev->resource[0]->end = io->win[0].len;
+                       pdev->resource[1]->end = 0;
+                       if (pcmcia_request_io(pdev) != 0)
                                return -ENODEV;
-                       stk->ctl_base = pdev->io.BasePort1 + 0x0e;
+                       stk->ctl_base = pdev->resource[0]->start + 0x0e;
                } else
                        return -ENODEV;
                /* If we've got this far, we're done */
@@ -280,7 +281,7 @@ static int ide_config(struct pcmcia_device *link)
            if (pcmcia_loop_config(link, pcmcia_check_one_config, stk))
                    goto failed; /* No suitable config found */
     }
-    io_base = link->io.BasePort1;
+    io_base = link->resource[0]->start;
     ctl_base = stk->ctl_base;
 
     if (!link->irq)
@@ -297,7 +298,7 @@ static int ide_config(struct pcmcia_device *link)
        outb(0x81, ctl_base+1);
 
      host = idecs_register(io_base, ctl_base, link->irq, link);
-     if (host == NULL && link->io.NumPorts1 == 0x20) {
+     if (host == NULL && resource_size(link->resource[0]) == 0x20) {
            outb(0x02, ctl_base + 0x10);
            host = idecs_register(io_base + 0x10, ctl_base + 0x10,
                                  link->irq, link);
index f410d0e..09b1795 100644 (file)
@@ -20,7 +20,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -76,9 +75,8 @@ static int avmcs_probe(struct pcmcia_device *p_dev)
 {
 
     /* The io structure describes IO port mapping */
-    p_dev->io.NumPorts1 = 16;
-    p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-    p_dev->io.NumPorts2 = 0;
+    p_dev->resource[0]->end = 16;
+    p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
 
     /* General socket configuration */
     p_dev->conf.Attributes = CONF_ENABLE_IRQ;
@@ -120,13 +118,9 @@ static int avmcs_configcheck(struct pcmcia_device *p_dev,
        if (cf->io.nwin <= 0)
                return -ENODEV;
 
-       p_dev->io.BasePort1 = cf->io.win[0].base;
-       p_dev->io.NumPorts1 = cf->io.win[0].len;
-       p_dev->io.NumPorts2 = 0;
-       printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n",
-              p_dev->io.BasePort1,
-              p_dev->io.BasePort1+p_dev->io.NumPorts1-1);
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       p_dev->resource[0]->start = cf->io.win[0].base;
+       p_dev->resource[0]->end = cf->io.win[0].len;
+       return pcmcia_request_io(p_dev);
 }
 
 static int avmcs_config(struct pcmcia_device *link)
@@ -192,9 +186,10 @@ static int avmcs_config(struct pcmcia_device *link)
        default:
         case AVM_CARDTYPE_B1: addcard = b1pcmcia_addcard_b1; break;
     }
-    if ((i = (*addcard)(link->io.BasePort1, link->irq)) < 0) {
-           dev_err(&link->dev, "avm_cs: failed to add AVM-Controller at i/o %#x, irq %d\n",
-                   link->io.BasePort1, link->irq);
+    if ((i = (*addcard)(link->resource[0]->start, link->irq)) < 0) {
+           dev_err(&link->dev,
+                   "avm_cs: failed to add AVM-Controller at i/o %#x, irq %d\n",
+                   (unsigned int) link->resource[0]->start, link->irq);
            avmcs_release(link);
            return -ENODEV;
     }
@@ -212,7 +207,7 @@ static int avmcs_config(struct pcmcia_device *link)
 
 static void avmcs_release(struct pcmcia_device *link)
 {
-       b1pcmcia_delcard(link->io.BasePort1, link->irq);
+       b1pcmcia_delcard(link->resource[0]->start, link->irq);
        pcmcia_disable_device(link);
 } /* avmcs_release */
 
index a80a761..94263c2 100644 (file)
@@ -20,7 +20,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -79,11 +78,10 @@ static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
     dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
 
     /* The io structure describes IO port mapping */
-    p_dev->io.NumPorts1 = 16;
-    p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-    p_dev->io.NumPorts2 = 16;
-    p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
-    p_dev->io.IOAddrLines = 5;
+    p_dev->resource[0]->end = 16;
+    p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+    p_dev->resource[1]->end = 16;
+    p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
 
     /* General socket configuration */
     p_dev->conf.Attributes = CONF_ENABLE_IRQ;
@@ -127,13 +125,10 @@ static int avma1cs_configcheck(struct pcmcia_device *p_dev,
        if (cf->io.nwin <= 0)
                return -ENODEV;
 
-       p_dev->io.BasePort1 = cf->io.win[0].base;
-       p_dev->io.NumPorts1 = cf->io.win[0].len;
-       p_dev->io.NumPorts2 = 0;
-       printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n",
-              p_dev->io.BasePort1,
-              p_dev->io.BasePort1+p_dev->io.NumPorts1-1);
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       p_dev->resource[0]->start = cf->io.win[0].base;
+       p_dev->resource[0]->end = cf->io.win[0].len;
+       p_dev->io_lines = 5;
+       return pcmcia_request_io(p_dev);
 }
 
 
@@ -181,16 +176,18 @@ static int __devinit avma1cs_config(struct pcmcia_device *link)
     }
 
     printk(KERN_NOTICE "avma1_cs: checking at i/o %#x, irq %d\n",
-                               link->io.BasePort1, link->irq);
+               (unsigned int) link->resource[0]->start, link->irq);
 
     icard.para[0] = link->irq;
-    icard.para[1] = link->io.BasePort1;
+    icard.para[1] = link->resource[0]->start;
     icard.protocol = isdnprot;
     icard.typ = ISDN_CTYPE_A1_PCMCIA;
     
     i = hisax_init_pcmcia(link, &busy, &icard);
     if (i < 0) {
-       printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 PCMCIA %d at i/o %#x\n", i, link->io.BasePort1);
+       printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 "
+                       "PCMCIA %d at i/o %#x\n", i,
+                       (unsigned int) link->resource[0]->start);
        avma1cs_release(link);
        return -ENODEV;
     }
index 218927e..b3c08aa 100644 (file)
@@ -46,7 +46,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -127,9 +126,8 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link)
       and attributes of IO windows) are fixed by the nature of the
       device, and can be hard-wired here.
     */
-    link->io.NumPorts1 = 8;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-    link->io.IOAddrLines = 3;
+    link->resource[0]->end = 8;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
 
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
@@ -174,16 +172,18 @@ static int elsa_cs_configcheck(struct pcmcia_device *p_dev,
 {
        int j;
 
+       p_dev->io_lines = 3;
+
        if ((cf->io.nwin > 0) && cf->io.win[0].base) {
                printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n");
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               p_dev->resource[0]->start = cf->io.win[0].base;
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        } else {
                printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n");
                for (j = 0x2f0; j > 0x100; j -= 0x10) {
-                       p_dev->io.BasePort1 = j;
-                       if (!pcmcia_request_io(p_dev, &p_dev->io))
+                       p_dev->resource[0]->start = j;
+                       if (!pcmcia_request_io(p_dev))
                                return 0;
                }
        }
@@ -215,23 +215,21 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link)
            link->conf.ConfigIndex);
     if (link->conf.Attributes & CONF_ENABLE_IRQ)
        printk(", irq %d", link->irq);
-    if (link->io.NumPorts1)
-        printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-               link->io.BasePort1+link->io.NumPorts1-1);
-    if (link->io.NumPorts2)
-        printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-               link->io.BasePort2+link->io.NumPorts2-1);
+    if (link->resource[0])
+       printk(" & %pR", link->resource[0]);
+    if (link->resource[1])
+       printk(" & %pR", link->resource[1]);
     printk("\n");
 
     icard.para[0] = link->irq;
-    icard.para[1] = link->io.BasePort1;
+    icard.para[1] = link->resource[0]->start;
     icard.protocol = protocol;
     icard.typ = ISDN_CTYPE_ELSA_PCMCIA;
     
     i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard);
     if (i < 0) {
-       printk(KERN_ERR "elsa_cs: failed to initialize Elsa PCMCIA %d at i/o %#x\n",
-               i, link->io.BasePort1);
+       printk(KERN_ERR "elsa_cs: failed to initialize Elsa "
+               "PCMCIA %d with %pR\n", i, link->resource[0]);
        elsa_cs_release(link);
     } else
        ((local_info_t*)link->priv)->cardnr = i;
index 1f4feaa..a024192 100644 (file)
@@ -46,7 +46,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -130,9 +129,8 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link)
     /* from old sedl_cs 
     */
     /* The io structure describes IO port mapping */
-    link->io.NumPorts1 = 8;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-    link->io.IOAddrLines = 3;
+    link->resource[0]->end = 8;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
 
     link->conf.Attributes = 0;
     link->conf.IntType = INT_MEMORY_AND_IO;
@@ -173,8 +171,6 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
                                  unsigned int vcc,
                                  void *priv_data)
 {
-       win_req_t *req = priv_data;
-
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -202,52 +198,25 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                                       pcmcia_io_cfg_data_width(io->flags);
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
                /* This reserves IO space but doesn't actually enable it */
-               if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+               p_dev->io_lines = 3;
+               if (pcmcia_request_io(p_dev) != 0)
                        return -ENODEV;
        }
 
-       /*
-         Now set up a common memory window, if needed.  There is room
-         in the struct pcmcia_device structure for one memory window handle,
-         but if the base addresses need to be saved, or if multiple
-         windows are needed, the info should go in the private data
-         structure for this device.
-
-         Note that the memory window base is a physical address, and
-         needs to be mapped to virtual space with ioremap() before it
-         is used.
-       */
-       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
-               cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
-               memreq_t map;
-               req->Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
-               req->Attributes |= WIN_ENABLE;
-               req->Base = mem->win[0].host_addr;
-               req->Size = mem->win[0].len;
-               req->AccessSpeed = 0;
-               if (pcmcia_request_window(p_dev, req, &p_dev->win) != 0)
-                       return -ENODEV;
-               map.Page = 0;
-               map.CardOffset = mem->win[0].card_addr;
-               if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
-                       return -ENODEV;
-       }
        return 0;
 }
 
@@ -255,16 +224,11 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
 
 static int __devinit sedlbauer_config(struct pcmcia_device *link)
 {
-    win_req_t *req;
     int ret;
     IsdnCard_t  icard;
 
     dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link);
 
-    req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
-    if (!req)
-           return -ENOMEM;
-
     /*
       In this loop, we scan the CIS for configuration table entries,
       each of which describes a valid card configuration, including
@@ -277,7 +241,7 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
       these things without consulting the CIS, and most client drivers
       will only use the CIS to fill in implementation-defined details.
     */
-    ret = pcmcia_loop_config(link, sedlbauer_config_check, req);
+    ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL);
     if (ret)
            goto failed;
 
@@ -297,27 +261,22 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
        printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
     if (link->conf.Attributes & CONF_ENABLE_IRQ)
        printk(", irq %d", link->irq);
-    if (link->io.NumPorts1)
-       printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-              link->io.BasePort1+link->io.NumPorts1-1);
-    if (link->io.NumPorts2)
-       printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-              link->io.BasePort2+link->io.NumPorts2-1);
-    if (link->win)
-       printk(", mem 0x%06lx-0x%06lx", req->Base,
-              req->Base+req->Size-1);
+    if (link->resource[0])
+       printk(" & %pR", link->resource[0]);
+    if (link->resource[1])
+       printk(" & %pR", link->resource[1]);
     printk("\n");
 
     icard.para[0] = link->irq;
-    icard.para[1] = link->io.BasePort1;
+    icard.para[1] = link->resource[0]->start;
     icard.protocol = protocol;
     icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA;
     
     ret = hisax_init_pcmcia(link, 
                            &(((local_info_t *)link->priv)->stop), &icard);
     if (ret < 0) {
-       printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d at i/o %#x\n",
-               ret, link->io.BasePort1);
+       printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d with %pR\n",
+               ret, link->resource[0]);
        sedlbauer_release(link);
        return -ENODEV;
     } else
index 5771955..7296102 100644 (file)
@@ -27,7 +27,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -107,9 +106,8 @@ static int __devinit teles_probe(struct pcmcia_device *link)
       and attributes of IO windows) are fixed by the nature of the
       device, and can be hard-wired here.
     */
-    link->io.NumPorts1 = 96;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-    link->io.IOAddrLines = 5;
+    link->resource[0]->end = 96;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
 
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
@@ -154,16 +152,18 @@ static int teles_cs_configcheck(struct pcmcia_device *p_dev,
 {
        int j;
 
+       p_dev->io_lines = 5;
+
        if ((cf->io.nwin > 0) && cf->io.win[0].base) {
                printk(KERN_INFO "(teles_cs: looks like the 96 model)\n");
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               p_dev->resource[0]->start = cf->io.win[0].base;
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        } else {
                printk(KERN_INFO "(teles_cs: looks like the 97 model)\n");
                for (j = 0x2f0; j > 0x100; j -= 0x10) {
-                       p_dev->io.BasePort1 = j;
-                       if (!pcmcia_request_io(p_dev, &p_dev->io))
+                       p_dev->resource[0]->start = j;
+                       if (!pcmcia_request_io(p_dev))
                                return 0;
                }
        }
@@ -195,23 +195,21 @@ static int __devinit teles_cs_config(struct pcmcia_device *link)
            link->conf.ConfigIndex);
     if (link->conf.Attributes & CONF_ENABLE_IRQ)
            printk(", irq %d", link->irq);
-    if (link->io.NumPorts1)
-        printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-               link->io.BasePort1+link->io.NumPorts1-1);
-    if (link->io.NumPorts2)
-        printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-               link->io.BasePort2+link->io.NumPorts2-1);
+    if (link->resource[0])
+       printk(" & %pR", link->resource[0]);
+    if (link->resource[1])
+       printk(" & %pR", link->resource[1]);
     printk("\n");
 
     icard.para[0] = link->irq;
-    icard.para[1] = link->io.BasePort1;
+    icard.para[1] = link->resource[0]->start;
     icard.protocol = protocol;
     icard.typ = ISDN_CTYPE_TELESPCMCIA;
     
     i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard);
     if (i < 0) {
        printk(KERN_ERR "teles_cs: failed to initialize Teles PCMCIA %d at i/o %#x\n",
-               i, link->io.BasePort1);
+                       i, (unsigned int) link->resource[0]->start);
        teles_cs_release(link);
        return -ENODEV;
     }
index e7507af..7aa65bb 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/ioport.h>
 #include <linux/scatterlist.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
index e699e6a..e9ca5ba 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -103,7 +102,7 @@ static caddr_t remap_window(struct map_info *map, unsigned long to)
 {
        struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;
        window_handle_t win = (window_handle_t)map->map_priv_2;
-       memreq_t mrq;
+       unsigned int offset;
        int ret;
 
        if (!pcmcia_dev_present(dev->p_dev)) {
@@ -111,15 +110,14 @@ static caddr_t remap_window(struct map_info *map, unsigned long to)
                return 0;
        }
 
-       mrq.CardOffset = to & ~(dev->win_size-1);
-       if(mrq.CardOffset != dev->offset) {
+       offset = to & ~(dev->win_size-1);
+       if (offset != dev->offset) {
                DEBUG(2, "Remapping window from 0x%8.8x to 0x%8.8x",
-                     dev->offset, mrq.CardOffset);
-               mrq.Page = 0;
-               ret = pcmcia_map_mem_page(dev->p_dev, win, &mrq);
+                     dev->offset, offset);
+               ret = pcmcia_map_mem_page(dev->p_dev, win, offset);
                if (ret != 0)
                        return NULL;
-               dev->offset = mrq.CardOffset;
+               dev->offset = offset;
        }
        return dev->win_base + (to & (dev->win_size-1));
 }
@@ -346,7 +344,6 @@ static void pcmciamtd_release(struct pcmcia_device *link)
                        iounmap(dev->win_base);
                        dev->win_base = NULL;
                }
-               pcmcia_release_window(link, link->win);
        }
        pcmcia_disable_device(link);
 }
index 10ee106..c683f77 100644 (file)
@@ -87,7 +87,6 @@ earlier 3Com products.
 #include <linux/bitops.h>
 #include <linux/mii.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -279,8 +278,8 @@ static int tc574_probe(struct pcmcia_device *link)
        lp->p_dev = link;
 
        spin_lock_init(&lp->window_lock);
-       link->io.NumPorts1 = 32;
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
+       link->resource[0]->end = 32;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
        link->conf.ConfigIndex = 1;
@@ -338,10 +337,11 @@ static int tc574_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "3c574_config()\n");
 
-       link->io.IOAddrLines = 16;
+       link->io_lines = 16;
+
        for (i = j = 0; j < 0x400; j += 0x20) {
-               link->io.BasePort1 = j ^ 0x300;
-               i = pcmcia_request_io(link, &link->io);
+               link->resource[0]->start = j ^ 0x300;
+               i = pcmcia_request_io(link);
                if (i == 0)
                        break;
        }
@@ -357,7 +357,7 @@ static int tc574_config(struct pcmcia_device *link)
                goto failed;
 
        dev->irq = link->irq;
-       dev->base_addr = link->io.BasePort1;
+       dev->base_addr = link->resource[0]->start;
 
        ioaddr = dev->base_addr;
 
index ce63c37..61f9cf2 100644 (file)
@@ -41,7 +41,6 @@
 #include <linux/bitops.h>
 #include <linux/jiffies.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -214,8 +213,8 @@ static int tc589_probe(struct pcmcia_device *link)
     lp->p_dev = link;
 
     spin_lock_init(&lp->lock);
-    link->io.NumPorts1 = 16;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
+    link->resource[0]->end = 16;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
 
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
@@ -278,12 +277,13 @@ static int tc589_config(struct pcmcia_device *link)
                   "3Com card??\n");
     multi = (link->card_id == PRODID_3COM_3C562);
 
+    link->io_lines = 16;
+
     /* For the 3c562, the base address must be xx00-xx7f */
-    link->io.IOAddrLines = 16;
     for (i = j = 0; j < 0x400; j += 0x10) {
        if (multi && (j & 0x80)) continue;
-       link->io.BasePort1 = j ^ 0x300;
-       i = pcmcia_request_io(link, &link->io);
+       link->resource[0]->start = j ^ 0x300;
+       i = pcmcia_request_io(link);
        if (i == 0)
                break;
     }
@@ -299,7 +299,7 @@ static int tc589_config(struct pcmcia_device *link)
            goto failed;
 
     dev->irq = link->irq;
-    dev->base_addr = link->io.BasePort1;
+    dev->base_addr = link->resource[0]->start;
     ioaddr = dev->base_addr;
     EL3WINDOW(0);
 
index 33525bf..5f05ffb 100644 (file)
@@ -39,7 +39,6 @@
 #include <linux/mii.h>
 #include "../8390.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -260,28 +259,30 @@ static int get_prom(struct pcmcia_device *link)
 static int try_io_port(struct pcmcia_device *link)
 {
     int j, ret;
-    if (link->io.NumPorts1 == 32) {
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
+    link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+    link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
+    if (link->resource[0]->end == 32) {
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
        /* for master/slave multifunction cards */
-       if (link->io.NumPorts2 > 0)
-           link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
+       if (link->resource[1]->end > 0)
+           link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
     } else {
        /* This should be two 16-port windows */
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
     }
-    if (link->io.BasePort1 == 0) {
-       link->io.IOAddrLines = 16;
+    if (link->resource[0]->start == 0) {
        for (j = 0; j < 0x400; j += 0x20) {
-           link->io.BasePort1 = j ^ 0x300;
-           link->io.BasePort2 = (j ^ 0x300) + 0x10;
-           ret = pcmcia_request_io(link, &link->io);
+           link->resource[0]->start = j ^ 0x300;
+           link->resource[1]->start = (j ^ 0x300) + 0x10;
+           link->io_lines = 16;
+           ret = pcmcia_request_io(link);
            if (ret == 0)
                    return ret;
        }
        return ret;
     } else {
-       return pcmcia_request_io(link, &link->io);
+       return pcmcia_request_io(link);
     }
 }
 
@@ -302,15 +303,15 @@ static int axnet_configcheck(struct pcmcia_device *p_dev,
           network function with window 0, and serial with window 1 */
        if (io->nwin > 1) {
                i = (io->win[1].len > io->win[0].len);
-               p_dev->io.BasePort2 = io->win[1-i].base;
-               p_dev->io.NumPorts2 = io->win[1-i].len;
+               p_dev->resource[1]->start = io->win[1-i].base;
+               p_dev->resource[1]->end = io->win[1-i].len;
        } else {
-               i = p_dev->io.NumPorts2 = 0;
+               i = p_dev->resource[1]->end = 0;
        }
-       p_dev->io.BasePort1 = io->win[i].base;
-       p_dev->io.NumPorts1 = io->win[i].len;
-       p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-       if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32)
+       p_dev->resource[0]->start = io->win[i].base;
+       p_dev->resource[0]->end = io->win[i].len;
+       p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+       if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32)
                return try_io_port(p_dev);
 
        return -ENODEV;
@@ -333,7 +334,7 @@ static int axnet_config(struct pcmcia_device *link)
     if (!link->irq)
            goto failed;
     
-    if (link->io.NumPorts2 == 8) {
+    if (resource_size(link->resource[1]) == 8) {
        link->conf.Attributes |= CONF_ENABLE_SPKR;
        link->conf.Status = CCSR_AUDIO_ENA;
     }
@@ -343,7 +344,7 @@ static int axnet_config(struct pcmcia_device *link)
            goto failed;
 
     dev->irq = link->irq;
-    dev->base_addr = link->io.BasePort1;
+    dev->base_addr = link->resource[0]->start;
 
     if (!get_prom(link)) {
        printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
@@ -379,8 +380,7 @@ static int axnet_config(struct pcmcia_device *link)
     /* Maybe PHY is in power down mode. (PPD_SET = 1) 
        Bit 2 of CCSR is active low. */ 
     if (i == 32) {
-       conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 };
-       pcmcia_access_configuration_register(link, &reg);
+       pcmcia_write_config_byte(link, CISREG_CCSR, 0x04);
        for (i = 0; i < 32; i++) {
            j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
            j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
index 5643f94..3c400cf 100644 (file)
@@ -43,7 +43,6 @@
 #include <linux/arcdevice.h>
 #include <linux/com20020.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -159,9 +158,8 @@ static int com20020_probe(struct pcmcia_device *p_dev)
     /* fill in our module parameters as defaults */
     dev->dev_addr[0] = node;
 
-    p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-    p_dev->io.NumPorts1 = 16;
-    p_dev->io.IOAddrLines = 16;
+    p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+    p_dev->resource[0]->end = 16;
     p_dev->conf.Attributes = CONF_ENABLE_IRQ;
     p_dev->conf.IntType = INT_MEMORY_AND_IO;
 
@@ -246,20 +244,24 @@ static int com20020_config(struct pcmcia_device *link)
 
     dev_dbg(&link->dev, "com20020_config\n");
 
-    dev_dbg(&link->dev, "baseport1 is %Xh\n", link->io.BasePort1);
+    dev_dbg(&link->dev, "baseport1 is %Xh\n",
+           (unsigned int) link->resource[0]->start);
+
     i = -ENODEV;
-    if (!link->io.BasePort1)
+    link->io_lines = 16;
+
+    if (!link->resource[0]->start)
     {
        for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10)
        {
-           link->io.BasePort1 = ioaddr;
-           i = pcmcia_request_io(link, &link->io);
+           link->resource[0]->start = ioaddr;
+           i = pcmcia_request_io(link);
            if (i == 0)
                break;
        }
     }
     else
-       i = pcmcia_request_io(link, &link->io);
+       i = pcmcia_request_io(link);
     
     if (i != 0)
     {
@@ -267,7 +269,7 @@ static int com20020_config(struct pcmcia_device *link)
        goto failed;
     }
        
-    ioaddr = dev->base_addr = link->io.BasePort1;
+    ioaddr = dev->base_addr = link->resource[0]->start;
     dev_dbg(&link->dev, "got ioaddr %Xh\n", ioaddr);
 
     dev_dbg(&link->dev, "request IRQ %d\n",
index 7c27c50..98fffb0 100644 (file)
@@ -49,7 +49,6 @@
 #include <linux/ioport.h>
 #include <linux/crc32.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -249,9 +248,8 @@ static int fmvj18x_probe(struct pcmcia_device *link)
     lp->base = NULL;
 
     /* The io structure describes IO port mapping */
-    link->io.NumPorts1 = 32;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-    link->io.IOAddrLines = 5;
+    link->resource[0]->end = 32;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
 
     /* General socket configuration */
     link->conf.Attributes = CONF_ENABLE_IRQ;
@@ -289,13 +287,13 @@ static int mfc_try_io_port(struct pcmcia_device *link)
        { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
 
     for (i = 0; i < 5; i++) {
-       link->io.BasePort2 = serial_base[i];
-       link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
-       if (link->io.BasePort2 == 0) {
-           link->io.NumPorts2 = 0;
+       link->resource[1]->start = serial_base[i];
+       link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
+       if (link->resource[1]->start == 0) {
+           link->resource[1]->end = 0;
            printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
        }
-       ret = pcmcia_request_io(link, &link->io);
+       ret = pcmcia_request_io(link);
        if (ret == 0)
                return ret;
     }
@@ -311,12 +309,12 @@ static int ungermann_try_io_port(struct pcmcia_device *link)
        0x380,0x3c0 only for ioport.
     */
     for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
-       link->io.BasePort1 = ioaddr;
-       ret = pcmcia_request_io(link, &link->io);
+       link->resource[0]->start = ioaddr;
+       ret = pcmcia_request_io(link);
        if (ret == 0) {
            /* calculate ConfigIndex value */
            link->conf.ConfigIndex = 
-               ((link->io.BasePort1 & 0x0f0) >> 3) | 0x22;
+               ((link->resource[0]->start & 0x0f0) >> 3) | 0x22;
            return ret;
        }
     }
@@ -346,6 +344,8 @@ static int fmvj18x_config(struct pcmcia_device *link)
 
     dev_dbg(&link->dev, "fmvj18x_config\n");
 
+    link->io_lines = 5;
+
     len = pcmcia_get_tuple(link, CISTPL_FUNCE, &buf);
     kfree(buf);
 
@@ -364,20 +364,20 @@ static int fmvj18x_config(struct pcmcia_device *link)
                /* MultiFunction Card */
                link->conf.ConfigBase = 0x800;
                link->conf.ConfigIndex = 0x47;
-               link->io.NumPorts2 = 8;
+               link->resource[1]->end = 8;
            }
            break;
        case MANFID_NEC:
            cardtype = NEC; /* MultiFunction Card */
            link->conf.ConfigBase = 0x800;
            link->conf.ConfigIndex = 0x47;
-           link->io.NumPorts2 = 8;
+           link->resource[1]->end = 8;
            break;
        case MANFID_KME:
            cardtype = KME; /* MultiFunction Card */
            link->conf.ConfigBase = 0x800;
            link->conf.ConfigIndex = 0x47;
-           link->io.NumPorts2 = 8;
+           link->resource[1]->end = 8;
            break;
        case MANFID_CONTEC:
            cardtype = CONTEC;
@@ -418,14 +418,14 @@ static int fmvj18x_config(struct pcmcia_device *link)
        }
     }
 
-    if (link->io.NumPorts2 != 0) {
+    if (link->resource[1]->end != 0) {
        ret = mfc_try_io_port(link);
        if (ret != 0) goto failed;
     } else if (cardtype == UNGERMANN) {
        ret = ungermann_try_io_port(link);
        if (ret != 0) goto failed;
     } else { 
-           ret = pcmcia_request_io(link, &link->io);
+           ret = pcmcia_request_io(link);
            if (ret)
                    goto failed;
     }
@@ -437,9 +437,9 @@ static int fmvj18x_config(struct pcmcia_device *link)
            goto failed;
 
     dev->irq = link->irq;
-    dev->base_addr = link->io.BasePort1;
+    dev->base_addr = link->resource[0]->start;
 
-    if (link->io.BasePort2 != 0) {
+    if (resource_size(link->resource[1]) != 0) {
        ret = fmvj18x_setup_mfc(link);
        if (ret != 0) goto failed;
     }
@@ -545,7 +545,6 @@ failed:
 static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
 {
     win_req_t req;
-    memreq_t mem;
     u_char __iomem *base;
     int i, j;
 
@@ -558,9 +557,7 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
        return -1;
 
     base = ioremap(req.Base, req.Size);
-    mem.Page = 0;
-    mem.CardOffset = 0;
-    pcmcia_map_mem_page(link, link->win, &mem);
+    pcmcia_map_mem_page(link, link->win, 0);
 
     /*
      *  MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
@@ -594,7 +591,6 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
 static int fmvj18x_setup_mfc(struct pcmcia_device *link)
 {
     win_req_t req;
-    memreq_t mem;
     int i;
     struct net_device *dev = link->priv;
     unsigned int ioaddr;
@@ -614,9 +610,7 @@ static int fmvj18x_setup_mfc(struct pcmcia_device *link)
        return -1;
     }
 
-    mem.Page = 0;
-    mem.CardOffset = 0;
-    i = pcmcia_map_mem_page(link, link->win, &mem);
+    i = pcmcia_map_mem_page(link, link->win, 0);
     if (i != 0) {
        iounmap(lp->base);
        lp->base = NULL;
index 67ee985..b0d06a3 100644 (file)
@@ -57,7 +57,6 @@
 #include <linux/trdevice.h>
 #include <linux/ibmtr.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -152,9 +151,8 @@ static int __devinit ibmtr_attach(struct pcmcia_device *link)
     link->priv = info;
     info->ti = netdev_priv(dev);
 
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-    link->io.NumPorts1 = 4;
-    link->io.IOAddrLines = 16;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+    link->resource[0]->end = 4;
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
     link->conf.Present = PRESENT_OPTION;
@@ -213,26 +211,26 @@ static int __devinit ibmtr_config(struct pcmcia_device *link)
     struct net_device *dev = info->dev;
     struct tok_info *ti = netdev_priv(dev);
     win_req_t req;
-    memreq_t mem;
     int i, ret;
 
     dev_dbg(&link->dev, "ibmtr_config\n");
 
     link->conf.ConfigIndex = 0x61;
+    link->io_lines = 16;
 
     /* Determine if this is PRIMARY or ALTERNATE. */
 
     /* Try PRIMARY card at 0xA20-0xA23 */
-    link->io.BasePort1 = 0xA20;
-    i = pcmcia_request_io(link, &link->io);
+    link->resource[0]->start = 0xA20;
+    i = pcmcia_request_io(link);
     if (i != 0) {
        /* Couldn't get 0xA20-0xA23.  Try ALTERNATE at 0xA24-0xA27. */
-       link->io.BasePort1 = 0xA24;
-       ret = pcmcia_request_io(link, &link->io);
+       link->resource[0]->start = 0xA24;
+       ret = pcmcia_request_io(link);
        if (ret)
                goto failed;
     }
-    dev->base_addr = link->io.BasePort1;
+    dev->base_addr = link->resource[0]->start;
 
     ret = pcmcia_request_exclusive_irq(link, ibmtr_interrupt);
     if (ret)
@@ -251,9 +249,7 @@ static int __devinit ibmtr_config(struct pcmcia_device *link)
     if (ret)
            goto failed;
 
-    mem.CardOffset = mmiobase;
-    mem.Page = 0;
-    ret = pcmcia_map_mem_page(link, link->win, &mem);
+    ret = pcmcia_map_mem_page(link, link->win, mmiobase);
     if (ret)
            goto failed;
     ti->mmio = ioremap(req.Base, req.Size);
@@ -268,13 +264,11 @@ static int __devinit ibmtr_config(struct pcmcia_device *link)
     if (ret)
            goto failed;
 
-    mem.CardOffset = srambase;
-    mem.Page = 0;
-    ret = pcmcia_map_mem_page(link, info->sram_win_handle, &mem);
+    ret = pcmcia_map_mem_page(link, info->sram_win_handle, srambase);
     if (ret)
            goto failed;
 
-    ti->sram_base = mem.CardOffset >> 12;
+    ti->sram_base = srambase >> 12;
     ti->sram_virt = ioremap(req.Base, req.Size);
     ti->sram_phys = req.Base;
 
@@ -325,7 +319,6 @@ static void ibmtr_release(struct pcmcia_device *link)
        if (link->win) {
                struct tok_info *ti = netdev_priv(dev);
                iounmap(ti->mmio);
-               pcmcia_release_window(link, info->sram_win_handle);
        }
        pcmcia_disable_device(link);
 }
index 9b63dec..68f2dee 100644 (file)
@@ -146,7 +146,6 @@ Include Files
 #include <linux/ioport.h>
 #include <linux/bitops.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cisreg.h>
 #include <pcmcia/cistpl.h>
@@ -459,9 +458,8 @@ static int nmclan_probe(struct pcmcia_device *link)
     link->priv = dev;
     
     spin_lock_init(&lp->bank_lock);
-    link->io.NumPorts1 = 32;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-    link->io.IOAddrLines = 5;
+    link->resource[0]->end = 32;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
     link->conf.ConfigIndex = 1;
@@ -645,7 +643,8 @@ static int nmclan_config(struct pcmcia_device *link)
 
   dev_dbg(&link->dev, "nmclan_config\n");
 
-  ret = pcmcia_request_io(link, &link->io);
+  link->io_lines = 5;
+  ret = pcmcia_request_io(link);
   if (ret)
          goto failed;
   ret = pcmcia_request_exclusive_irq(link, mace_interrupt);
@@ -656,7 +655,7 @@ static int nmclan_config(struct pcmcia_device *link)
          goto failed;
 
   dev->irq = link->irq;
-  dev->base_addr = link->io.BasePort1;
+  dev->base_addr = link->resource[0]->start;
 
   ioaddr = dev->base_addr;
 
@@ -758,29 +757,20 @@ static void nmclan_reset(struct net_device *dev)
 
 #if RESET_XILINX
   struct pcmcia_device *link = &lp->link;
-  conf_reg_t reg;
-  u_long OrigCorValue; 
+  u8 OrigCorValue;
 
   /* Save original COR value */
-  reg.Function = 0;
-  reg.Action = CS_READ;
-  reg.Offset = CISREG_COR;
-  reg.Value = 0;
-  pcmcia_access_configuration_register(link, &reg);
-  OrigCorValue = reg.Value;
+  pcmcia_read_config_byte(link, CISREG_COR, &OrigCorValue);
 
   /* Reset Xilinx */
-  reg.Action = CS_WRITE;
-  reg.Offset = CISREG_COR;
-  dev_dbg(&link->dev, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n",
+  dev_dbg(&link->dev, "nmclan_reset: OrigCorValue=0x%x, resetting...\n",
        OrigCorValue);
-  reg.Value = COR_SOFT_RESET;
-  pcmcia_access_configuration_register(link, &reg);
+  pcmcia_write_config_byte(link, CISREG_COR, COR_SOFT_RESET);
   /* Need to wait for 20 ms for PCMCIA to finish reset. */
 
   /* Restore original COR configuration index */
-  reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK);
-  pcmcia_access_configuration_register(link, &reg);
+  pcmcia_write_config_byte(link, CISREG_COR,
+                         (COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK)));
   /* Xilinx is now completely reset along with the MACE chip. */
   lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
 
index bfdef72..c3edfe4 100644 (file)
@@ -42,7 +42,6 @@
 #include <linux/mii.h>
 #include "../8390.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -113,8 +112,6 @@ static int setup_dma_config(struct pcmcia_device *link, int start_pg,
 
 static void pcnet_detach(struct pcmcia_device *p_dev);
 
-static dev_info_t dev_info = "pcnet_cs";
-
 /*====================================================================*/
 
 typedef struct hw_info_t {
@@ -304,7 +301,6 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link)
 {
     struct net_device *dev = link->priv;
     win_req_t req;
-    memreq_t mem;
     u_char __iomem *base, *virt;
     int i, j;
 
@@ -317,10 +313,8 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link)
        return NULL;
 
     virt = ioremap(req.Base, req.Size);
-    mem.Page = 0;
     for (i = 0; i < NR_INFO; i++) {
-       mem.CardOffset = hw_info[i].offset & ~(req.Size-1);
-       pcmcia_map_mem_page(link, link->win, &mem);
+       pcmcia_map_mem_page(link, link->win, hw_info[i].offset & ~(req.Size-1));
        base = &virt[hw_info[i].offset & (req.Size-1)];
        if ((readb(base+0) == hw_info[i].a0) &&
            (readb(base+2) == hw_info[i].a1) &&
@@ -480,29 +474,31 @@ static hw_info_t *get_hwired(struct pcmcia_device *link)
 static int try_io_port(struct pcmcia_device *link)
 {
     int j, ret;
-    if (link->io.NumPorts1 == 32) {
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       if (link->io.NumPorts2 > 0) {
+    link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+    link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
+    if (link->resource[0]->end == 32) {
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
+       if (link->resource[1]->end > 0) {
            /* for master/slave multifunction cards */
-           link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
+           link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
        }
     } else {
        /* This should be two 16-port windows */
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
     }
-    if (link->io.BasePort1 == 0) {
-       link->io.IOAddrLines = 16;
+    if (link->resource[0]->start == 0) {
        for (j = 0; j < 0x400; j += 0x20) {
-           link->io.BasePort1 = j ^ 0x300;
-           link->io.BasePort2 = (j ^ 0x300) + 0x10;
-           ret = pcmcia_request_io(link, &link->io);
+           link->resource[0]->start = j ^ 0x300;
+           link->resource[1]->start = (j ^ 0x300) + 0x10;
+           link->io_lines = 16;
+           ret = pcmcia_request_io(link);
            if (ret == 0)
                    return ret;
        }
        return ret;
     } else {
-       return pcmcia_request_io(link, &link->io);
+       return pcmcia_request_io(link);
     }
 }
 
@@ -523,18 +519,18 @@ static int pcnet_confcheck(struct pcmcia_device *p_dev,
           network function with window 0, and serial with window 1 */
        if (io->nwin > 1) {
                i = (io->win[1].len > io->win[0].len);
-               p_dev->io.BasePort2 = io->win[1-i].base;
-               p_dev->io.NumPorts2 = io->win[1-i].len;
+               p_dev->resource[1]->start = io->win[1-i].base;
+               p_dev->resource[1]->end = io->win[1-i].len;
        } else {
-               i = p_dev->io.NumPorts2 = 0;
+               i = p_dev->resource[1]->end = 0;
        }
 
        *has_shmem = ((cfg->mem.nwin == 1) &&
                      (cfg->mem.win[0].len >= 0x4000));
-       p_dev->io.BasePort1 = io->win[i].base;
-       p_dev->io.NumPorts1 = io->win[i].len;
-       p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-       if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32)
+       p_dev->resource[0]->start = io->win[i].base;
+       p_dev->resource[0]->end = io->win[i].len;
+       p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+       if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32)
                return try_io_port(p_dev);
 
        return 0;
@@ -557,7 +553,7 @@ static int pcnet_config(struct pcmcia_device *link)
     if (!link->irq)
            goto failed;
 
-    if (link->io.NumPorts2 == 8) {
+    if (resource_size(link->resource[1]) == 8) {
        link->conf.Attributes |= CONF_ENABLE_SPKR;
        link->conf.Status = CCSR_AUDIO_ENA;
     }
@@ -569,7 +565,7 @@ static int pcnet_config(struct pcmcia_device *link)
     if (ret)
            goto failed;
     dev->irq = link->irq;
-    dev->base_addr = link->io.BasePort1;
+    dev->base_addr = link->resource[0]->start;
     if (info->flags & HAS_MISC_REG) {
        if ((if_port == 1) || (if_port == 2))
            dev->if_port = if_port;
@@ -956,7 +952,7 @@ static int pcnet_open(struct net_device *dev)
     set_misc_reg(dev);
 
     outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */
-    ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev);
+    ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev->name, dev);
     if (ret)
            return ret;
 
@@ -1464,7 +1460,6 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg,
     struct net_device *dev = link->priv;
     pcnet_dev_t *info = PRIV(dev);
     win_req_t req;
-    memreq_t mem;
     int i, window_size, offset, ret;
 
     window_size = (stop_pg - start_pg) << 8;
@@ -1483,11 +1478,9 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg,
     if (ret)
            goto failed;
 
-    mem.CardOffset = (start_pg << 8) + cm_offset;
-    offset = mem.CardOffset % window_size;
-    mem.CardOffset -= offset;
-    mem.Page = 0;
-    ret = pcmcia_map_mem_page(link, link->win, &mem);
+    offset = (start_pg << 8) + cm_offset;
+    offset -= offset % window_size;
+    ret = pcmcia_map_mem_page(link, link->win, offset);
     if (ret)
            goto failed;
 
index 307cd17..377367d 100644 (file)
@@ -44,7 +44,6 @@
 #include <linux/jiffies.h>
 #include <linux/firmware.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -325,9 +324,8 @@ static int smc91c92_probe(struct pcmcia_device *link)
     link->priv = dev;
 
     spin_lock_init(&smc->lock);
-    link->io.NumPorts1 = 16;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-    link->io.IOAddrLines = 4;
+    link->resource[0]->end = 16;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
 
@@ -428,12 +426,13 @@ static int mhz_mfc_config_check(struct pcmcia_device *p_dev,
                                void *priv_data)
 {
        int k;
-       p_dev->io.BasePort2 = cf->io.win[0].base;
+       p_dev->resource[1]->start = cf->io.win[0].base;
        for (k = 0; k < 0x400; k += 0x10) {
                if (k & 0x80)
                        continue;
-               p_dev->io.BasePort1 = k ^ 0x300;
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               p_dev->resource[0]->start = k ^ 0x300;
+               p_dev->io_lines = 16;
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        }
        return -ENODEV;
@@ -444,21 +443,20 @@ static int mhz_mfc_config(struct pcmcia_device *link)
     struct net_device *dev = link->priv;
     struct smc_private *smc = netdev_priv(dev);
     win_req_t req;
-    memreq_t mem;
+    unsigned int offset;
     int i;
 
     link->conf.Attributes |= CONF_ENABLE_SPKR;
     link->conf.Status = CCSR_AUDIO_ENA;
-    link->io.IOAddrLines = 16;
-    link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
-    link->io.NumPorts2 = 8;
+    link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
+    link->resource[1]->end = 8;
 
     /* The Megahertz combo cards have modem-like CIS entries, so
        we have to explicitly try a bunch of port combinations. */
     if (pcmcia_loop_config(link, mhz_mfc_config_check, NULL))
            return -ENODEV;
 
-    dev->base_addr = link->io.BasePort1;
+    dev->base_addr = link->resource[0]->start;
 
     /* Allocate a memory window, for accessing the ISR */
     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
@@ -469,11 +467,8 @@ static int mhz_mfc_config(struct pcmcia_device *link)
            return -ENODEV;
 
     smc->base = ioremap(req.Base, req.Size);
-    mem.CardOffset = mem.Page = 0;
-    if (smc->manfid == MANFID_MOTOROLA)
-       mem.CardOffset = link->conf.ConfigBase;
-    i = pcmcia_map_mem_page(link, link->win, &mem);
-
+    offset = (smc->manfid == MANFID_MOTOROLA) ? link->conf.ConfigBase : 0;
+    i = pcmcia_map_mem_page(link, link->win, offset);
     if ((i == 0) &&
        (smc->manfid == MANFID_MEGAHERTZ) &&
        (smc->cardid == PRODID_MEGAHERTZ_EM3288))
@@ -546,7 +541,7 @@ static void mot_config(struct pcmcia_device *link)
     struct net_device *dev = link->priv;
     struct smc_private *smc = netdev_priv(dev);
     unsigned int ioaddr = dev->base_addr;
-    unsigned int iouart = link->io.BasePort2;
+    unsigned int iouart = link->resource[1]->start;
 
     /* Set UART base address and force map with COR bit 1 */
     writeb(iouart & 0xff,        smc->base + MOT_UART + CISREG_IOBASE_0);
@@ -602,9 +597,9 @@ static int smc_configcheck(struct pcmcia_device *p_dev,
                           unsigned int vcc,
                           void *priv_data)
 {
-       p_dev->io.BasePort1 = cf->io.win[0].base;
-       p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       p_dev->resource[0]->start = cf->io.win[0].base;
+       p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
+       return pcmcia_request_io(p_dev);
 }
 
 static int smc_config(struct pcmcia_device *link)
@@ -612,10 +607,10 @@ static int smc_config(struct pcmcia_device *link)
     struct net_device *dev = link->priv;
     int i;
 
-    link->io.NumPorts1 = 16;
+    link->resource[0]->end = 16;
     i = pcmcia_loop_config(link, smc_configcheck, NULL);
     if (!i)
-           dev->base_addr = link->io.BasePort1;
+           dev->base_addr = link->resource[0]->start;
 
     return i;
 }
@@ -647,27 +642,27 @@ static int osi_config(struct pcmcia_device *link)
 
     link->conf.Attributes |= CONF_ENABLE_SPKR;
     link->conf.Status = CCSR_AUDIO_ENA;
-    link->io.NumPorts1 = 64;
-    link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
-    link->io.NumPorts2 = 8;
-    link->io.IOAddrLines = 16;
+    link->resource[0]->end = 64;
+    link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
+    link->resource[1]->end = 8;
 
     /* Enable Hard Decode, LAN, Modem */
     link->conf.ConfigIndex = 0x23;
+    link->io_lines = 16;
 
     for (i = j = 0; j < 4; j++) {
-       link->io.BasePort2 = com[j];
-       i = pcmcia_request_io(link, &link->io);
+       link->resource[1]->start = com[j];
+       i = pcmcia_request_io(link);
        if (i == 0)
                break;
     }
     if (i != 0) {
        /* Fallback: turn off hard decode */
        link->conf.ConfigIndex = 0x03;
-       link->io.NumPorts2 = 0;
-       i = pcmcia_request_io(link, &link->io);
+       link->resource[1]->end = 0;
+       i = pcmcia_request_io(link);
     }
-    dev->base_addr = link->io.BasePort1 + 0x10;
+    dev->base_addr = link->resource[0]->start + 0x10;
     return i;
 }
 
@@ -684,7 +679,7 @@ static int osi_load_firmware(struct pcmcia_device *link)
 
        /* Download the Seven of Diamonds firmware */
        for (i = 0; i < fw->size; i++) {
-           outb(fw->data[i], link->io.BasePort1 + 2);
+           outb(fw->data[i], link->resource[0]->start + 2);
            udelay(50);
        }
        release_firmware(fw);
@@ -726,12 +721,12 @@ static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid)
                return rc;
     } else if (manfid == MANFID_OSITECH) {
        /* Make sure both functions are powered up */
-       set_bits(0x300, link->io.BasePort1 + OSITECH_AUI_PWR);
+       set_bits(0x300, link->resource[0]->start + OSITECH_AUI_PWR);
        /* Now, turn on the interrupt for both card functions */
-       set_bits(0x300, link->io.BasePort1 + OSITECH_RESET_ISR);
+       set_bits(0x300, link->resource[0]->start + OSITECH_RESET_ISR);
        dev_dbg(&link->dev, "AUI/PWR: %4.4x RESET/ISR: %4.4x\n",
-             inw(link->io.BasePort1 + OSITECH_AUI_PWR),
-             inw(link->io.BasePort1 + OSITECH_RESET_ISR));
+             inw(link->resource[0]->start + OSITECH_AUI_PWR),
+             inw(link->resource[0]->start + OSITECH_RESET_ISR));
     }
     return 0;
 }
@@ -804,7 +799,7 @@ static int check_sig(struct pcmcia_device *link)
     }
 
     /* Try setting bus width */
-    width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO);
+    width = (link->resource[0]->flags == IO_DATA_PATH_WIDTH_AUTO);
     s = inb(ioaddr + CONFIG);
     if (width)
        s |= CFG_16BIT;
index b6c3644..4eb6f98 100644 (file)
@@ -82,7 +82,6 @@
 #include <linux/bitops.h>
 #include <linux/mii.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -678,9 +677,9 @@ xirc2ps_config_modem(struct pcmcia_device *p_dev,
 
        if (cf->io.nwin > 0  &&  (cf->io.win[0].base & 0xf) == 8) {
                for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
-                       p_dev->io.BasePort2 = cf->io.win[0].base;
-                       p_dev->io.BasePort1 = ioaddr;
-                       if (!pcmcia_request_io(p_dev, &p_dev->io))
+                       p_dev->resource[1]->start = cf->io.win[0].base;
+                       p_dev->resource[0]->start = ioaddr;
+                       if (!pcmcia_request_io(p_dev))
                                return 0;
                }
        }
@@ -697,11 +696,11 @@ xirc2ps_config_check(struct pcmcia_device *p_dev,
        int *pass = priv_data;
 
        if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) {
-               p_dev->io.BasePort2 = cf->io.win[0].base;
-               p_dev->io.BasePort1 = p_dev->io.BasePort2
+               p_dev->resource[1]->start = cf->io.win[0].base;
+               p_dev->resource[0]->start = p_dev->resource[1]->start
                        + (*pass ? (cf->index & 0x20 ? -24:8)
                           : (cf->index & 0x20 ?   8:-24));
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        }
        return -ENODEV;
@@ -808,8 +807,7 @@ xirc2ps_config(struct pcmcia_device * link)
        goto failure;
     }
 
-    link->io.IOAddrLines =10;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
     if (local->modem) {
        int pass;
 
@@ -817,16 +815,16 @@ xirc2ps_config(struct pcmcia_device * link)
            link->conf.Attributes |= CONF_ENABLE_SPKR;
            link->conf.Status |= CCSR_AUDIO_ENA;
        }
-       link->io.NumPorts2 = 8;
-       link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
+       link->resource[1]->end = 8;
+       link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
        if (local->dingo) {
            /* Take the Modem IO port from the CIS and scan for a free
             * Ethernet port */
-           link->io.NumPorts1 = 16; /* no Mako stuff anymore */
+           link->resource[0]->end = 16; /* no Mako stuff anymore */
            if (!pcmcia_loop_config(link, xirc2ps_config_modem, NULL))
                    goto port_found;
        } else {
-           link->io.NumPorts1 = 18;
+           link->resource[0]->end = 18;
            /* We do 2 passes here: The first one uses the regular mapping and
             * the second tries again, thereby considering that the 32 ports are
             * mirrored every 32 bytes. Actually we use a mirrored port for
@@ -841,14 +839,15 @@ xirc2ps_config(struct pcmcia_device * link)
        }
        printk(KNOT_XIRC "no ports available\n");
     } else {
-       link->io.NumPorts1 = 16;
+       link->io_lines = 10;
+       link->resource[0]->end = 16;
        for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
-           link->io.BasePort1 = ioaddr;
-           if (!(err=pcmcia_request_io(link, &link->io)))
+           link->resource[0]->start = ioaddr;
+           if (!(err = pcmcia_request_io(link)))
                goto port_found;
        }
-       link->io.BasePort1 = 0; /* let CS decide */
-       if ((err=pcmcia_request_io(link, &link->io)))
+       link->resource[0]->start = 0; /* let CS decide */
+       if ((err = pcmcia_request_io(link)))
            goto config_error;
     }
   port_found:
@@ -870,24 +869,21 @@ xirc2ps_config(struct pcmcia_device * link)
        goto config_error;
 
     if (local->dingo) {
-       conf_reg_t reg;
        win_req_t req;
-       memreq_t mem;
 
        /* Reset the modem's BAR to the correct value
         * This is necessary because in the RequestConfiguration call,
         * the base address of the ethernet port (BasePort1) is written
         * to the BAR registers of the modem.
         */
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_IOBASE_0;
-       reg.Value = link->io.BasePort2 & 0xff;
-       if ((err = pcmcia_access_configuration_register(link, &reg)))
+       err = pcmcia_write_config_byte(link, CISREG_IOBASE_0, (u8)
+                               link->resource[1]->start & 0xff);
+       if (err)
            goto config_error;
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_IOBASE_1;
-       reg.Value = (link->io.BasePort2 >> 8) & 0xff;
-       if ((err = pcmcia_access_configuration_register(link, &reg)))
+
+       err = pcmcia_write_config_byte(link, CISREG_IOBASE_1,
+                               (link->resource[1]->start >> 8) & 0xff);
+       if (err)
            goto config_error;
 
        /* There is no config entry for the Ethernet part which
@@ -901,16 +897,14 @@ xirc2ps_config(struct pcmcia_device * link)
            goto config_error;
 
        local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800;
-       mem.CardOffset = 0x0;
-       mem.Page = 0;
-       if ((err = pcmcia_map_mem_page(link, link->win, &mem)))
+       if ((err = pcmcia_map_mem_page(link, link->win, 0)))
            goto config_error;
 
        /* Setup the CCRs; there are no infos in the CIS about the Ethernet
         * part.
         */
        writeb(0x47, local->dingo_ccr + CISREG_COR);
-       ioaddr = link->io.BasePort1;
+       ioaddr = link->resource[0]->start;
        writeb(ioaddr & 0xff      , local->dingo_ccr + CISREG_IOBASE_0);
        writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1);
 
@@ -957,7 +951,7 @@ xirc2ps_config(struct pcmcia_device * link)
 
     /* we can now register the device with the net subsystem */
     dev->irq = link->irq;
-    dev->base_addr = link->io.BasePort1;
+    dev->base_addr = link->resource[0]->start;
 
     if (local->dingo)
        do_reset(dev, 1); /* a kludge to make the cem56 work */
index 33bdc6a..9a121a5 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/timer.h>
 #include <linux/netdevice.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -155,8 +154,6 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
                                unsigned int vcc,
                                void *priv_data)
 {
-       win_req_t *req = priv_data;
-
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -176,52 +173,25 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
        }
 
        /* This reserves IO space but doesn't actually enable it */
-       if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+       if (pcmcia_request_io(p_dev) != 0)
                return -ENODEV;
 
-       /*
-         Now set up a common memory window, if needed.  There is room
-         in the struct pcmcia_device structure for one memory window handle,
-         but if the base addresses need to be saved, or if multiple
-         windows are needed, the info should go in the private data
-         structure for this device.
-
-         Note that the memory window base is a physical address, and
-         needs to be mapped to virtual space with ioremap() before it
-         is used.
-       */
-       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
-               cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
-               memreq_t map;
-               req->Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
-               req->Base = mem->win[0].host_addr;
-               req->Size = mem->win[0].len;
-               req->AccessSpeed = 0;
-               if (pcmcia_request_window(p_dev, req, &p_dev->win) != 0)
-                       return -ENODEV;
-               map.Page = 0;
-               map.CardOffset = mem->win[0].card_addr;
-               if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
-                       return -ENODEV;
-       }
        /* If we got this far, we're cool! */
        return 0;
 }
@@ -230,17 +200,12 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
 static int airo_config(struct pcmcia_device *link)
 {
        local_info_t *dev;
-       win_req_t *req;
        int ret;
 
        dev = link->priv;
 
        dev_dbg(&link->dev, "airo_config\n");
 
-       req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
-       if (!req)
-               return -ENOMEM;
-
        /*
         * In this loop, we scan the CIS for configuration table
         * entries, each of which describes a valid card
@@ -255,7 +220,7 @@ static int airo_config(struct pcmcia_device *link)
         * and most client drivers will only use the CIS to fill in
         * implementation-defined details.
         */
-       ret = pcmcia_loop_config(link, airo_cs_config_check, req);
+       ret = pcmcia_loop_config(link, airo_cs_config_check, NULL);
        if (ret)
                goto failed;
 
@@ -272,7 +237,7 @@ static int airo_config(struct pcmcia_device *link)
                goto failed;
        ((local_info_t *)link->priv)->eth_dev =
                init_airo_card(link->irq,
-                              link->io.BasePort1, 1, &link->dev);
+                              link->resource[0]->start, 1, &link->dev);
        if (!((local_info_t *)link->priv)->eth_dev)
                goto failed;
 
@@ -282,22 +247,15 @@ static int airo_config(struct pcmcia_device *link)
        if (link->conf.Vpp)
                printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
        printk(", irq %d", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1+link->io.NumPorts1-1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2+link->io.NumPorts2-1);
-       if (link->win)
-               printk(", mem 0x%06lx-0x%06lx", req->Base,
-                      req->Base+req->Size-1);
+       if (link->resource[0])
+               printk(" & %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        printk("\n");
-       kfree(req);
        return 0;
 
  failed:
        airo_release(link);
-       kfree(req);
        return -ENODEV;
 } /* airo_config */
 
index c2746fc..3b63216 100644 (file)
@@ -42,7 +42,6 @@
 #include <linux/moduleparam.h>
 #include <linux/device.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -191,25 +190,23 @@ static int atmel_config_check(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
        }
 
        /* This reserves IO space but doesn't actually enable it */
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       return pcmcia_request_io(p_dev);
 }
 
 static int atmel_config(struct pcmcia_device *link)
@@ -254,7 +251,7 @@ static int atmel_config(struct pcmcia_device *link)
 
        ((local_info_t*)link->priv)->eth_dev =
                init_atmel_card(link->irq,
-                               link->io.BasePort1,
+                               link->resource[0]->start,
                                did ? did->driver_info : ATMEL_FW_TYPE_NONE,
                                &link->dev,
                                card_present,
index 0e99b63..dfbc41d 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/ssb/ssb.h>
 #include <linux/slab.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -65,7 +64,6 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
 {
        struct ssb_bus *ssb;
        win_req_t win;
-       memreq_t mem;
        int err = -ENOMEM;
        int res = 0;
 
@@ -78,12 +76,7 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
        dev->conf.Attributes = CONF_ENABLE_IRQ;
        dev->conf.IntType = INT_MEMORY_AND_IO;
 
-       dev->io.BasePort2 = 0;
-       dev->io.NumPorts2 = 0;
-       dev->io.Attributes2 = 0;
-
-       win.Attributes = WIN_ADDR_SPACE_MEM | WIN_MEMORY_TYPE_CM |
-                        WIN_ENABLE | WIN_DATA_WIDTH_16 |
+       win.Attributes =  WIN_ENABLE | WIN_DATA_WIDTH_16 |
                         WIN_USE_WAIT;
        win.Base = 0;
        win.Size = SSB_CORE_SIZE;
@@ -92,9 +85,7 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
        if (res != 0)
                goto err_kfree_ssb;
 
-       mem.CardOffset = 0;
-       mem.Page = 0;
-       res = pcmcia_map_mem_page(dev, dev->win, &mem);
+       res = pcmcia_map_mem_page(dev, dev->win, 0);
        if (res != 0)
                goto err_disable;
 
index 29b31a6..ba54d1b 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/wireless.h>
 #include <net/iw_handler.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -23,7 +22,7 @@
 #include "hostap_wlan.h"
 
 
-static dev_info_t dev_info = "hostap_cs";
+static char *dev_info = "hostap_cs";
 
 MODULE_AUTHOR("Jouni Malinen");
 MODULE_DESCRIPTION("Support for Intersil Prism2-based 802.11 wireless LAN "
@@ -225,27 +224,18 @@ static int prism2_pccard_card_present(local_info_t *local)
 static void sandisk_set_iobase(local_info_t *local)
 {
        int res;
-       conf_reg_t reg;
        struct hostap_cs_priv *hw_priv = local->hw_priv;
 
-       reg.Function = 0;
-       reg.Action = CS_WRITE;
-       reg.Offset = 0x10; /* 0x3f0 IO base 1 */
-       reg.Value = hw_priv->link->io.BasePort1 & 0x00ff;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_write_config_byte(hw_priv->link, 0x10,
+                               hw_priv->link->resource[0]->start & 0x00ff);
        if (res != 0) {
                printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 0 -"
                       " res=%d\n", res);
        }
        udelay(10);
 
-       reg.Function = 0;
-       reg.Action = CS_WRITE;
-       reg.Offset = 0x12; /* 0x3f2 IO base 2 */
-       reg.Value = (hw_priv->link->io.BasePort1 & 0xff00) >> 8;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_write_config_byte(hw_priv->link, 0x12,
+                               (hw_priv->link->resource[0]->start >> 8) & 0x00ff);
        if (res != 0) {
                printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 1 -"
                       " res=%d\n", res);
@@ -271,12 +261,11 @@ static void sandisk_write_hcr(local_info_t *local, int hcr)
 static int sandisk_enable_wireless(struct net_device *dev)
 {
        int res, ret = 0;
-       conf_reg_t reg;
        struct hostap_interface *iface = netdev_priv(dev);
        local_info_t *local = iface->local;
        struct hostap_cs_priv *hw_priv = local->hw_priv;
 
-       if (hw_priv->link->io.NumPorts1 < 0x42) {
+       if (resource_size(hw_priv->link->resource[0]) < 0x42) {
                /* Not enough ports to be SanDisk multi-function card */
                ret = -ENODEV;
                goto done;
@@ -298,12 +287,8 @@ static int sandisk_enable_wireless(struct net_device *dev)
               " - using vendor-specific initialization\n", dev->name);
        hw_priv->sandisk_connectplus = 1;
 
-       reg.Function = 0;
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_COR;
-       reg.Value = COR_SOFT_RESET;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
+                               COR_SOFT_RESET);
        if (res != 0) {
                printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
                       dev->name, res);
@@ -311,16 +296,13 @@ static int sandisk_enable_wireless(struct net_device *dev)
        }
        mdelay(5);
 
-       reg.Function = 0;
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_COR;
        /*
         * Do not enable interrupts here to avoid some bogus events. Interrupts
         * will be enabled during the first cor_sreset call.
         */
-       reg.Value = COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE | COR_FUNC_ENA;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
+                               (COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE |
+                                       COR_FUNC_ENA));
        if (res != 0) {
                printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
                       dev->name, res);
@@ -343,30 +325,23 @@ done:
 static void prism2_pccard_cor_sreset(local_info_t *local)
 {
        int res;
-       conf_reg_t reg;
+       u8 val;
        struct hostap_cs_priv *hw_priv = local->hw_priv;
 
        if (!prism2_pccard_card_present(local))
               return;
 
-       reg.Function = 0;
-       reg.Action = CS_READ;
-       reg.Offset = CISREG_COR;
-       reg.Value = 0;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &val);
        if (res != 0) {
                printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 1 (%d)\n",
                       res);
                return;
        }
        printk(KERN_DEBUG "prism2_pccard_cor_sreset: original COR %02x\n",
-              reg.Value);
+               val);
 
-       reg.Action = CS_WRITE;
-       reg.Value |= COR_SOFT_RESET;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       val |= COR_SOFT_RESET;
+       res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val);
        if (res != 0) {
                printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 2 (%d)\n",
                       res);
@@ -375,11 +350,10 @@ static void prism2_pccard_cor_sreset(local_info_t *local)
 
        mdelay(hw_priv->sandisk_connectplus ? 5 : 2);
 
-       reg.Value &= ~COR_SOFT_RESET;
+       val &= ~COR_SOFT_RESET;
        if (hw_priv->sandisk_connectplus)
-               reg.Value |= COR_IREQ_ENA;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+               val |= COR_IREQ_ENA;
+       res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val);
        if (res != 0) {
                printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 3 (%d)\n",
                       res);
@@ -396,8 +370,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local)
 static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
 {
        int res;
-       conf_reg_t reg;
-       int old_cor;
+       u8 old_cor;
        struct hostap_cs_priv *hw_priv = local->hw_priv;
 
        if (!prism2_pccard_card_present(local))
@@ -408,25 +381,17 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
                return;
        }
 
-       reg.Function = 0;
-       reg.Action = CS_READ;
-       reg.Offset = CISREG_COR;
-       reg.Value = 0;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &old_cor);
        if (res != 0) {
                printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 1 "
                       "(%d)\n", res);
                return;
        }
        printk(KERN_DEBUG "prism2_pccard_genesis_sreset: original COR %02x\n",
-              reg.Value);
-       old_cor = reg.Value;
+               old_cor);
 
-       reg.Action = CS_WRITE;
-       reg.Value |= COR_SOFT_RESET;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
+                               old_cor | COR_SOFT_RESET);
        if (res != 0) {
                printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 2 "
                       "(%d)\n", res);
@@ -436,11 +401,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
        mdelay(10);
 
        /* Setup Genesis mode */
-       reg.Action = CS_WRITE;
-       reg.Value = hcr;
-       reg.Offset = CISREG_CCSR;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_write_config_byte(hw_priv->link, CISREG_CCSR, hcr);
        if (res != 0) {
                printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 3 "
                       "(%d)\n", res);
@@ -448,11 +409,8 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
        }
        mdelay(10);
 
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_COR;
-       reg.Value = old_cor & ~COR_SOFT_RESET;
-       res = pcmcia_access_configuration_register(hw_priv->link,
-                                                  &reg);
+       res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
+                               old_cor & ~COR_SOFT_RESET);
        if (res != 0) {
                printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 4 "
                       "(%d)\n", res);
@@ -561,30 +519,24 @@ static int prism2_config_check(struct pcmcia_device *p_dev,
        PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d "
               "dflt->io.nwin=%d\n",
               cfg->io.nwin, dflt->io.nwin);
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               PDEBUG(DEBUG_EXTRA, "io->flags = 0x%04X, "
-                      "io.base=0x%04x, len=%d\n", io->flags,
-                      io->win[0].base, io->win[0].len);
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags &
-                       CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
        }
 
        /* This reserves IO space but doesn't actually enable it */
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       return pcmcia_request_io(p_dev);
 }
 
 static int prism2_config(struct pcmcia_device *link)
@@ -646,7 +598,7 @@ static int prism2_config(struct pcmcia_device *link)
                goto failed_unlock;
 
        dev->irq = link->irq;
-       dev->base_addr = link->io.BasePort1;
+       dev->base_addr = link->resource[0]->start;
 
        spin_unlock_irqrestore(&local->irq_init_lock, flags);
 
@@ -658,12 +610,10 @@ static int prism2_config(struct pcmcia_device *link)
                       link->conf.Vpp % 10);
        if (link->conf.Attributes & CONF_ENABLE_IRQ)
                printk(", irq %d", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1+link->io.NumPorts1-1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2+link->io.NumPorts2-1);
+       if (link->resource[0])
+               printk(" & %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        printk("\n");
 
        local->shutdown = 0;
index 08e4e39..9c29839 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/firmware.h>
 #include <linux/netdevice.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -802,9 +801,9 @@ static int if_cs_ioprobe(struct pcmcia_device *p_dev,
                         unsigned int vcc,
                         void *priv_data)
 {
-       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       p_dev->io.BasePort1 = cfg->io.win[0].base;
-       p_dev->io.NumPorts1 = cfg->io.win[0].len;
+       p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
 
        /* Do we need to allocate an interrupt? */
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
@@ -816,7 +815,7 @@ static int if_cs_ioprobe(struct pcmcia_device *p_dev,
        }
 
        /* This reserves IO space but doesn't actually enable it */
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       return pcmcia_request_io(p_dev);
 }
 
 static int if_cs_probe(struct pcmcia_device *p_dev)
@@ -854,7 +853,8 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
                goto out1;
 
        /* Initialize io access */
-       card->iobase = ioport_map(p_dev->io.BasePort1, p_dev->io.NumPorts1);
+       card->iobase = ioport_map(p_dev->resource[0]->start,
+                               resource_size(p_dev->resource[0]));
        if (!card->iobase) {
                lbs_pr_err("error in ioport_map\n");
                ret = -EIO;
@@ -873,9 +873,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
        }
 
        /* Finally, report what we've done */
-       lbs_deb_cs("irq %d, io 0x%04x-0x%04x\n",
-              p_dev->irq, p_dev->io.BasePort1,
-              p_dev->io.BasePort1 + p_dev->io.NumPorts1 - 1);
+       lbs_deb_cs("irq %d, io %pR", p_dev->irq, p_dev->resource[0]);
 
        /*
         * Most of the libertas cards can do unaligned register access, but some
index b16d5db..ef46a2d 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/delay.h>
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -192,25 +191,23 @@ static int orinoco_cs_config_check(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
 
                /* This reserves IO space but doesn't actually enable it */
-               if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+               if (pcmcia_request_io(p_dev) != 0)
                        goto next_entry;
        }
        return 0;
@@ -258,7 +255,8 @@ orinoco_cs_config(struct pcmcia_device *link)
        /* We initialize the hermes structure before completing PCMCIA
         * configuration just in case the interrupt handler gets
         * called. */
-       mem = ioport_map(link->io.BasePort1, link->io.NumPorts1);
+       mem = ioport_map(link->resource[0]->start,
+                       resource_size(link->resource[0]));
        if (!mem)
                goto failed;
 
@@ -280,7 +278,7 @@ orinoco_cs_config(struct pcmcia_device *link)
        }
 
        /* Register an interface with the stack */
-       if (orinoco_if_add(priv, link->io.BasePort1,
+       if (orinoco_if_add(priv, link->resource[0]->start,
                           link->irq, NULL) != 0) {
                printk(KERN_ERR PFX "orinoco_if_add() failed\n");
                goto failed;
index b51a9ad..873877e 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/delay.h>
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -80,35 +79,27 @@ static int
 spectrum_reset(struct pcmcia_device *link, int idle)
 {
        int ret;
-       conf_reg_t reg;
-       u_int save_cor;
+       u8 save_cor;
+       u8 ccsr;
 
        /* Doing it if hardware is gone is guaranteed crash */
        if (!pcmcia_dev_present(link))
                return -ENODEV;
 
        /* Save original COR value */
-       reg.Function = 0;
-       reg.Action = CS_READ;
-       reg.Offset = CISREG_COR;
-       ret = pcmcia_access_configuration_register(link, &reg);
+       ret = pcmcia_read_config_byte(link, CISREG_COR, &save_cor);
        if (ret)
                goto failed;
-       save_cor = reg.Value;
 
        /* Soft-Reset card */
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_COR;
-       reg.Value = (save_cor | COR_SOFT_RESET);
-       ret = pcmcia_access_configuration_register(link, &reg);
+       ret = pcmcia_write_config_byte(link, CISREG_COR,
+                               (save_cor | COR_SOFT_RESET));
        if (ret)
                goto failed;
        udelay(1000);
 
        /* Read CCSR */
-       reg.Action = CS_READ;
-       reg.Offset = CISREG_CCSR;
-       ret = pcmcia_access_configuration_register(link, &reg);
+       ret = pcmcia_read_config_byte(link, CISREG_CCSR, &ccsr);
        if (ret)
                goto failed;
 
@@ -116,19 +107,15 @@ spectrum_reset(struct pcmcia_device *link, int idle)
         * Start or stop the firmware.  Memory width bit should be
         * preserved from the value we've just read.
         */
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_CCSR;
-       reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16);
-       ret = pcmcia_access_configuration_register(link, &reg);
+       ccsr = (idle ? HCR_IDLE : HCR_RUN) | (ccsr & HCR_MEM16);
+       ret = pcmcia_write_config_byte(link, CISREG_CCSR, ccsr);
        if (ret)
                goto failed;
        udelay(1000);
 
        /* Restore original COR configuration index */
-       reg.Action = CS_WRITE;
-       reg.Offset = CISREG_COR;
-       reg.Value = (save_cor & ~COR_SOFT_RESET);
-       ret = pcmcia_access_configuration_register(link, &reg);
+       ret = pcmcia_write_config_byte(link, CISREG_COR,
+                               (save_cor & ~COR_SOFT_RESET));
        if (ret)
                goto failed;
        udelay(1000);
@@ -266,25 +253,23 @@ static int spectrum_cs_config_check(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
 
                /* This reserves IO space but doesn't actually enable it */
-               if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+               if (pcmcia_request_io(p_dev) != 0)
                        goto next_entry;
        }
        return 0;
@@ -332,7 +317,8 @@ spectrum_cs_config(struct pcmcia_device *link)
        /* We initialize the hermes structure before completing PCMCIA
         * configuration just in case the interrupt handler gets
         * called. */
-       mem = ioport_map(link->io.BasePort1, link->io.NumPorts1);
+       mem = ioport_map(link->resource[0]->start,
+                       resource_size(link->resource[0]));
        if (!mem)
                goto failed;
 
@@ -359,7 +345,7 @@ spectrum_cs_config(struct pcmcia_device *link)
        }
 
        /* Register an interface with the stack */
-       if (orinoco_if_add(priv, link->io.BasePort1,
+       if (orinoco_if_add(priv, link->resource[0]->start,
                           link->irq, NULL) != 0) {
                printk(KERN_ERR PFX "orinoco_if_add() failed\n");
                goto failed;
index 9c38fc3..88560d0 100644 (file)
@@ -46,7 +46,6 @@
 #include <linux/ethtool.h>
 #include <linux/ieee80211.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -315,9 +314,8 @@ static int ray_probe(struct pcmcia_device *p_dev)
        local->finder = p_dev;
 
        /* The io structure describes IO port mapping. None used here */
-       p_dev->io.NumPorts1 = 0;
-       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       p_dev->io.IOAddrLines = 5;
+       p_dev->resource[0]->end = 0;
+       p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
 
        /* General socket configuration */
        p_dev->conf.Attributes = CONF_ENABLE_IRQ;
@@ -394,7 +392,6 @@ static int ray_config(struct pcmcia_device *link)
        int ret = 0;
        int i;
        win_req_t req;
-       memreq_t mem;
        struct net_device *dev = (struct net_device *)link->priv;
        ray_dev_t *local = netdev_priv(dev);
 
@@ -431,9 +428,7 @@ static int ray_config(struct pcmcia_device *link)
        ret = pcmcia_request_window(link, &req, &link->win);
        if (ret)
                goto failed;
-       mem.CardOffset = 0x0000;
-       mem.Page = 0;
-       ret = pcmcia_map_mem_page(link, link->win, &mem);
+       ret = pcmcia_map_mem_page(link, link->win, 0);
        if (ret)
                goto failed;
        local->sram = ioremap(req.Base, req.Size);
@@ -447,9 +442,7 @@ static int ray_config(struct pcmcia_device *link)
        ret = pcmcia_request_window(link, &req, &local->rmem_handle);
        if (ret)
                goto failed;
-       mem.CardOffset = 0x8000;
-       mem.Page = 0;
-       ret = pcmcia_map_mem_page(link, local->rmem_handle, &mem);
+       ret = pcmcia_map_mem_page(link, local->rmem_handle, 0x8000);
        if (ret)
                goto failed;
        local->rmem = ioremap(req.Base, req.Size);
@@ -463,9 +456,7 @@ static int ray_config(struct pcmcia_device *link)
        ret = pcmcia_request_window(link, &req, &local->amem_handle);
        if (ret)
                goto failed;
-       mem.CardOffset = 0x0000;
-       mem.Page = 0;
-       ret = pcmcia_map_mem_page(link, local->amem_handle, &mem);
+       ret = pcmcia_map_mem_page(link, local->amem_handle, 0);
        if (ret)
                goto failed;
        local->amem = ioremap(req.Base, req.Size);
@@ -793,7 +784,6 @@ static void ray_release(struct pcmcia_device *link)
 {
        struct net_device *dev = link->priv;
        ray_dev_t *local = netdev_priv(dev);
-       int i;
 
        dev_dbg(&link->dev, "ray_release\n");
 
@@ -802,13 +792,6 @@ static void ray_release(struct pcmcia_device *link)
        iounmap(local->sram);
        iounmap(local->rmem);
        iounmap(local->amem);
-       /* Do bother checking to see if these succeed or not */
-       i = pcmcia_release_window(link, local->amem_handle);
-       if (i != 0)
-               dev_dbg(&link->dev, "ReleaseWindow(local->amem) ret = %x\n", i);
-       i = pcmcia_release_window(link, local->rmem_handle);
-       if (i != 0)
-               dev_dbg(&link->dev, "ReleaseWindow(local->rmem) ret = %x\n", i);
        pcmcia_disable_device(link);
 
        dev_dbg(&link->dev, "ray_release ending\n");
index 376c6b9..a1cc2d4 100644 (file)
@@ -48,7 +48,6 @@
 
 #include <net/iw_handler.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
 static int wl3501_config(struct pcmcia_device *link);
 static void wl3501_release(struct pcmcia_device *link);
 
-/*
- * The dev_info variable is the "key" that is used to match up this
- * device driver with appropriate cards, through the card configuration
- * database.
- */
-static dev_info_t wl3501_dev_info = "wl3501_cs";
-
 static const struct {
        int reg_domain;
        int min, max, deflt;
@@ -1421,7 +1413,7 @@ static struct iw_statistics *wl3501_get_wireless_stats(struct net_device *dev)
 
 static void wl3501_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 {
-       strlcpy(info->driver, wl3501_dev_info, sizeof(info->driver));
+       strlcpy(info->driver, "wl3501_cs", sizeof(info->driver));
 }
 
 static const struct ethtool_ops ops = {
@@ -1892,9 +1884,8 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
        struct wl3501_card *this;
 
        /* The io structure describes IO port mapping */
-       p_dev->io.NumPorts1     = 16;
-       p_dev->io.Attributes1   = IO_DATA_PATH_WIDTH_8;
-       p_dev->io.IOAddrLines   = 5;
+       p_dev->resource[0]->end = 16;
+       p_dev->resource[0]->flags       = IO_DATA_PATH_WIDTH_8;
 
        /* General socket configuration */
        p_dev->conf.Attributes  = CONF_ENABLE_IRQ;
@@ -1940,13 +1931,14 @@ static int wl3501_config(struct pcmcia_device *link)
        /* Try allocating IO ports.  This tries a few fixed addresses.  If you
         * want, you can also read the card's config table to pick addresses --
         * see the serial driver for an example. */
+       link->io_lines = 5;
 
        for (j = 0x280; j < 0x400; j += 0x20) {
                /* The '^0x300' is so that we probe 0x300-0x3ff first, then
                 * 0x200-0x2ff, and so on, because this seems safer */
-               link->io.BasePort1 = j;
-               link->io.BasePort2 = link->io.BasePort1 + 0x10;
-               i = pcmcia_request_io(link, &link->io);
+               link->resource[0]->start = j;
+               link->resource[1]->start = link->resource[0]->start + 0x10;
+               i = pcmcia_request_io(link);
                if (i == 0)
                        break;
        }
@@ -1968,7 +1960,7 @@ static int wl3501_config(struct pcmcia_device *link)
                goto failed;
 
        dev->irq = link->irq;
-       dev->base_addr = link->io.BasePort1;
+       dev->base_addr = link->resource[0]->start;
        SET_NETDEV_DEV(dev, &link->dev);
        if (register_netdev(dev)) {
                printk(KERN_NOTICE "wl3501_cs: register_netdev() failed\n");
index fd8cfe9..23e50f4 100644 (file)
@@ -48,7 +48,6 @@
 #include <linux/parport.h>
 #include <linux/parport_pc.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -102,8 +101,8 @@ static int parport_probe(struct pcmcia_device *link)
     link->priv = info;
     info->p_dev = link;
 
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-    link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+    link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
 
@@ -144,16 +143,16 @@ static int parport_config_check(struct pcmcia_device *p_dev,
 {
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
                if (epp_mode)
                        p_dev->conf.ConfigIndex |= FORCE_EPP_MODE;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin == 2) {
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
-               if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+               if (pcmcia_request_io(p_dev) != 0)
                        return -ENODEV;
                return 0;
        }
@@ -178,12 +177,14 @@ static int parport_config(struct pcmcia_device *link)
     if (ret)
            goto failed;
 
-    p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2,
+    p = parport_pc_probe_port(link->resource[0]->start,
+                             link->resource[1]->start,
                              link->irq, PARPORT_DMA_NONE,
                              &link->dev, IRQF_SHARED);
     if (p == NULL) {
        printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at "
-              "0x%3x, irq %u failed\n", link->io.BasePort1,
+              "0x%3x, irq %u failed\n",
+              (unsigned int) link->resource[0]->start,
               link->irq);
        goto failed;
     }
index d006e8b..7a2b160 100644 (file)
@@ -7,7 +7,6 @@ pcmcia_core-$(CONFIG_CARDBUS)                   += cardbus.o
 obj-$(CONFIG_PCCARD)                           += pcmcia_core.o
 
 pcmcia-y                                       += ds.o pcmcia_resource.o cistpl.o pcmcia_cis.o
-pcmcia-$(CONFIG_PCMCIA_IOCTL)                  += pcmcia_ioctl.o
 obj-$(CONFIG_PCMCIA)                           += pcmcia.o
 
 pcmcia_rsrc-y                                  += rsrc_mgr.o
index a324d32..67530ce 100644 (file)
@@ -23,7 +23,6 @@
 
 /* include the world */
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cistpl.h>
index 5a979cb..807f2d7 100644 (file)
 #include <linux/proc_fs.h>
 #include <linux/types.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cistpl.h>
-#include <pcmcia/bus_ops.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
index 8844bc3..91414a0 100644 (file)
@@ -27,7 +27,6 @@
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cisreg.h>
@@ -54,6 +53,9 @@ static const u_int exponent[] = {
 /* Upper limit on reasonable # of tuples */
 #define MAX_TUPLES             200
 
+/* Bits in IRQInfo1 field */
+#define IRQ_INFO2_VALID                0x10
+
 /* 16-bit CIS? */
 static int cis_width;
 module_param(cis_width, int, 0444);
@@ -210,7 +212,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
  * Probably only useful for writing one-byte registers. Must be called
  * with ops_mutex held.
  */
-void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
+int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
                   u_int len, void *ptr)
 {
        void __iomem *sys, *end;
@@ -232,7 +234,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
                                ((cis_width) ? MAP_16BIT : 0));
                if (!sys) {
                        dev_dbg(&s->dev, "could not map memory\n");
-                       return; /* FIXME: Error */
+                       return -EINVAL;
                }
 
                writeb(flags, sys+CISREG_ICTRL0);
@@ -257,7 +259,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
                        sys = set_cis_map(s, card_offset, flags);
                        if (!sys) {
                                dev_dbg(&s->dev, "could not map memory\n");
-                               return; /* FIXME: error */
+                               return -EINVAL;
                        }
 
                        end = sys + s->map_size;
@@ -271,6 +273,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
                        addr = 0;
                }
        }
+       return 0;
 }
 
 
index 976d807..2ec8ac9 100644 (file)
@@ -32,7 +32,6 @@
 #include <asm/system.h>
 #include <asm/irq.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
@@ -252,38 +251,6 @@ struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr)
 }
 EXPORT_SYMBOL(pcmcia_get_socket_by_nr);
 
-/*
- * The central event handler.  Send_event() sends an event to the
- * 16-bit subsystem, which then calls the relevant device drivers.
- * Parse_events() interprets the event bits from
- * a card status change report.  Do_shutdown() handles the high
- * priority stuff associated with a card removal.
- */
-
-/* NOTE: send_event needs to be called with skt->sem held. */
-
-static int send_event(struct pcmcia_socket *s, event_t event, int priority)
-{
-       int ret;
-
-       if ((s->state & SOCKET_CARDBUS) && (event != CS_EVENT_CARD_REMOVAL))
-               return 0;
-
-       dev_dbg(&s->dev, "send_event(event %d, pri %d, callback 0x%p)\n",
-          event, priority, s->callback);
-
-       if (!s->callback)
-               return 0;
-       if (!try_module_get(s->callback->owner))
-               return 0;
-
-       ret = s->callback->event(s, event, priority);
-
-       module_put(s->callback->owner);
-
-       return ret;
-}
-
 static int socket_reset(struct pcmcia_socket *skt)
 {
        int status, i;
@@ -326,7 +293,8 @@ static void socket_shutdown(struct pcmcia_socket *s)
 
        dev_dbg(&s->dev, "shutdown\n");
 
-       send_event(s, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
+       if (s->callback)
+               s->callback->remove(s);
 
        mutex_lock(&s->ops_mutex);
        s->state &= SOCKET_INUSE | SOCKET_PRESENT;
@@ -477,7 +445,8 @@ static int socket_insert(struct pcmcia_socket *skt)
                dev_dbg(&skt->dev, "insert done\n");
                mutex_unlock(&skt->ops_mutex);
 
-               send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
+               if (!(skt->state & SOCKET_CARDBUS) && (skt->callback))
+                       skt->callback->add(skt);
        } else {
                mutex_unlock(&skt->ops_mutex);
                socket_shutdown(skt);
@@ -494,7 +463,6 @@ static int socket_suspend(struct pcmcia_socket *skt)
        mutex_lock(&skt->ops_mutex);
        skt->suspended_state = skt->state;
 
-       send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
        skt->socket = dead_socket;
        skt->ops->set_socket(skt, &skt->socket);
        if (skt->ops->suspend)
@@ -555,8 +523,8 @@ static int socket_late_resume(struct pcmcia_socket *skt)
                return 0;
        }
 #endif
-
-       send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
+       if (!(skt->state & SOCKET_CARDBUS) && (skt->callback))
+               skt->callback->early_resume(skt);
        return 0;
 }
 
@@ -654,16 +622,8 @@ static int pccardd(void *__skt)
                spin_unlock_irqrestore(&skt->thread_lock, flags);
 
                mutex_lock(&skt->skt_mutex);
-               if (events) {
-                       if (events & SS_DETECT)
-                               socket_detect_change(skt);
-                       if (events & SS_BATDEAD)
-                               send_event(skt, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
-                       if (events & SS_BATWARN)
-                               send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
-                       if (events & SS_READY)
-                               send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
-               }
+               if (events & SS_DETECT)
+                       socket_detect_change(skt);
 
                if (sysfs_events) {
                        if (sysfs_events & PCMCIA_UEVENT_EJECT)
@@ -783,7 +743,7 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
                s->callback = c;
 
                if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT)
-                       send_event(s, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
+                       s->callback->add(s);
        } else
                s->callback = NULL;
  err:
@@ -823,20 +783,13 @@ int pcmcia_reset_card(struct pcmcia_socket *skt)
                        break;
                }
 
-               ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
-               if (ret == 0) {
-                       send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
-                       if (skt->callback)
-                               skt->callback->suspend(skt);
-                       mutex_lock(&skt->ops_mutex);
-                       ret = socket_reset(skt);
-                       mutex_unlock(&skt->ops_mutex);
-                       if (ret == 0) {
-                               send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
-                               if (skt->callback)
-                                       skt->callback->resume(skt);
-                       }
-               }
+               if (skt->callback)
+                       skt->callback->suspend(skt);
+               mutex_lock(&skt->ops_mutex);
+               ret = socket_reset(skt);
+               mutex_unlock(&skt->ops_mutex);
+               if ((ret == 0) && (skt->callback))
+                       skt->callback->resume(skt);
 
                ret = 0;
        } while (0);
index 4126a75..da055dc 100644 (file)
@@ -10,7 +10,7 @@
  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
  *
  * (C) 1999            David A. Hinds
- * (C) 2003 - 2008     Dominik Brodowski
+ * (C) 2003 - 2010     Dominik Brodowski
  *
  *
  * This file contains definitions _only_ needed by the PCMCIA core modules.
@@ -26,6 +26,9 @@
 /* Flags in client state */
 #define CLIENT_WIN_REQ(i)      (0x1<<(i))
 
+/* Flag to access all functions */
+#define BIND_FN_ALL    0xff
+
 /* Each card function gets one of these guys */
 typedef struct config_t {
        struct kref     ref;
@@ -35,7 +38,10 @@ typedef struct config_t {
        unsigned int    ConfigBase;
        unsigned char   Status, Pin, Copy, Option, ExtStatus;
        unsigned int    CardValues;
-       io_req_t        io;
+
+       struct resource io[MAX_IO_WIN]; /* io ports */
+       struct resource mem[MAX_WIN];   /* mem areas */
+
        struct {
                u_int   Attributes;
        } irq;
@@ -56,18 +62,11 @@ struct pccard_resource_ops {
                                         unsigned int attr,
                                         unsigned int *base,
                                         unsigned int num,
-                                        unsigned int align);
+                                        unsigned int align,
+                                        struct resource **parent);
        struct resource* (*find_mem)    (unsigned long base, unsigned long num,
                                         unsigned long align, int low,
                                         struct pcmcia_socket *s);
-       int     (*add_io)               (struct pcmcia_socket *s,
-                                        unsigned int action,
-                                        unsigned long r_start,
-                                        unsigned long r_end);
-       int     (*add_mem)              (struct pcmcia_socket *s,
-                                        unsigned int action,
-                                        unsigned long r_start,
-                                        unsigned long r_end);
        int     (*init)                 (struct pcmcia_socket *s);
        void    (*exit)                 (struct pcmcia_socket *s);
 };
@@ -114,11 +113,12 @@ void cb_free(struct pcmcia_socket *s);
 
 struct pcmcia_callback{
        struct module   *owner;
-       int             (*event) (struct pcmcia_socket *s,
-                                 event_t event, int priority);
+       int             (*add) (struct pcmcia_socket *s);
+       int             (*remove) (struct pcmcia_socket *s);
        void            (*requery) (struct pcmcia_socket *s);
        int             (*validate) (struct pcmcia_socket *s, unsigned int *i);
        int             (*suspend) (struct pcmcia_socket *s);
+       int             (*early_resume) (struct pcmcia_socket *s);
        int             (*resume) (struct pcmcia_socket *s);
 };
 
@@ -146,6 +146,8 @@ void pcmcia_put_socket(struct pcmcia_socket *skt);
 /* ds.c */
 extern struct bus_type pcmcia_bus_type;
 
+struct pcmcia_device;
+
 /* pcmcia_resource.c */
 extern int pcmcia_release_configuration(struct pcmcia_device *p_dev);
 extern int pcmcia_validate_mem(struct pcmcia_socket *s);
@@ -163,8 +165,8 @@ extern struct bin_attribute pccard_cis_attr;
 
 int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr,
                        u_int addr, u_int len, void *ptr);
-void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr,
-                         u_int addr, u_int len, void *ptr);
+int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr,
+                       u_int addr, u_int len, void *ptr);
 void release_cis_mem(struct pcmcia_socket *s);
 void destroy_cis_cache(struct pcmcia_socket *s);
 int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function,
@@ -188,34 +190,4 @@ int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
 
 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
 
-
-#ifdef CONFIG_PCMCIA_IOCTL
-/* ds.c */
-extern struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev);
-extern void pcmcia_put_dev(struct pcmcia_device *p_dev);
-
-struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
-                                       unsigned int function);
-
-/* pcmcia_ioctl.c */
-extern void __init pcmcia_setup_ioctl(void);
-extern void __exit pcmcia_cleanup_ioctl(void);
-extern void handle_event(struct pcmcia_socket *s, event_t event);
-extern int handle_request(struct pcmcia_socket *s, event_t event);
-
-#else /* CONFIG_PCMCIA_IOCTL */
-
-static inline void __init pcmcia_setup_ioctl(void) { return; }
-static inline void __exit pcmcia_cleanup_ioctl(void) { return; }
-static inline void handle_event(struct pcmcia_socket *s, event_t event)
-{
-       return;
-}
-static inline int handle_request(struct pcmcia_socket *s, event_t event)
-{
-       return 0;
-}
-
-#endif /* CONFIG_PCMCIA_IOCTL */
-
 #endif /* _LINUX_CS_INTERNAL_H */
index 0f4cc3f..27575e6 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 
 #include <asm/mach-au1x00/au1000.h>
index eac9614..55570d9 100644 (file)
@@ -10,7 +10,7 @@
  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
  *
  * (C) 1999            David A. Hinds
- * (C) 2003 - 2006     Dominik Brodowski
+ * (C) 2003 - 2010     Dominik Brodowski
  */
 
 #include <linux/kernel.h>
@@ -26,7 +26,6 @@
 #include <linux/dma-mapping.h>
 #include <linux/slab.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -213,7 +212,7 @@ EXPORT_SYMBOL(pcmcia_unregister_driver);
 
 /* pcmcia_device handling */
 
-struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
+static struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
 {
        struct device *tmp_dev;
        tmp_dev = get_device(&p_dev->dev);
@@ -222,7 +221,7 @@ struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
        return to_pcmcia_dev(tmp_dev);
 }
 
-void pcmcia_put_dev(struct pcmcia_device *p_dev)
+static void pcmcia_put_dev(struct pcmcia_device *p_dev)
 {
        if (p_dev)
                put_device(&p_dev->dev);
@@ -294,7 +293,7 @@ static int pcmcia_device_probe(struct device *dev)
        }
 
        mutex_lock(&s->ops_mutex);
-       if ((s->pcmcia_state.has_pfc) &&
+       if ((s->pcmcia_pfc) &&
            (p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
                pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
        mutex_unlock(&s->ops_mutex);
@@ -359,7 +358,7 @@ static int pcmcia_device_remove(struct device *dev)
         * pseudo multi-function card, we need to unbind
         * all devices
         */
-       if ((p_dev->socket->pcmcia_state.has_pfc) &&
+       if ((p_dev->socket->pcmcia_pfc) &&
            (p_dev->socket->device_count > 0) &&
            (p_dev->device_no == 0))
                pcmcia_card_remove(p_dev->socket, p_dev);
@@ -477,7 +476,8 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
 }
 
 
-struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s, unsigned int function)
+static struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
+                                              unsigned int function)
 {
        struct pcmcia_device *p_dev, *tmp_dev;
        int i;
@@ -531,7 +531,6 @@ struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s, unsigned int fu
        list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
                if (p_dev->func == tmp_dev->func) {
                        p_dev->function_config = tmp_dev->function_config;
-                       p_dev->io = tmp_dev->io;
                        p_dev->irq = tmp_dev->irq;
                        kref_get(&p_dev->function_config->ref);
                }
@@ -544,15 +543,29 @@ struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s, unsigned int fu
                        "IRQ setup failed -- device might not work\n");
 
        if (!p_dev->function_config) {
+               config_t *c;
                dev_dbg(&p_dev->dev, "creating config_t\n");
-               p_dev->function_config = kzalloc(sizeof(struct config_t),
-                                                GFP_KERNEL);
-               if (!p_dev->function_config) {
+               c = kzalloc(sizeof(struct config_t), GFP_KERNEL);
+               if (!c) {
                        mutex_unlock(&s->ops_mutex);
                        goto err_unreg;
                }
-               kref_init(&p_dev->function_config->ref);
+               p_dev->function_config = c;
+               kref_init(&c->ref);
+               for (i = 0; i < MAX_IO_WIN; i++) {
+                       c->io[i].name = p_dev->devname;
+                       c->io[i].flags = IORESOURCE_IO;
+               }
+               for (i = 0; i< MAX_WIN; i++) {
+                       c->mem[i].name = p_dev->devname;
+                       c->mem[i].flags = IORESOURCE_MEM;
+               }
        }
+       for (i = 0; i < MAX_IO_WIN; i++)
+               p_dev->resource[i] = &p_dev->function_config->io[i];
+       for (; i < (MAX_IO_WIN + MAX_WIN); i++)
+               p_dev->resource[i] = &p_dev->function_config->mem[i-MAX_IO_WIN];
+
        mutex_unlock(&s->ops_mutex);
 
        dev_printk(KERN_NOTICE, &p_dev->dev,
@@ -680,7 +693,7 @@ static void pcmcia_requery(struct pcmcia_socket *s)
         * call pcmcia_device_add() -- which will fail if both
         * devices are already registered. */
        mutex_lock(&s->ops_mutex);
-       has_pfc = s->pcmcia_state.has_pfc;
+       has_pfc = s->pcmcia_pfc;
        mutex_unlock(&s->ops_mutex);
        if (has_pfc)
                pcmcia_device_add(s, 0);
@@ -812,7 +825,7 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
                dev_dbg(&dev->dev, "this is a pseudo-multi-function device\n");
                mutex_lock(&dev->socket->ops_mutex);
-               dev->socket->pcmcia_state.has_pfc = 1;
+               dev->socket->pcmcia_pfc = 1;
                mutex_unlock(&dev->socket->ops_mutex);
                if (dev->device_no != did->device_no)
                        return 0;
@@ -826,7 +839,7 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
 
                /* if this is a pseudo-multi-function device,
                 * we need explicit matches */
-               if (dev->socket->pcmcia_state.has_pfc)
+               if (dev->socket->pcmcia_pfc)
                        return 0;
                if (dev->device_no)
                        return 0;
@@ -885,14 +898,6 @@ static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
        }
        mutex_unlock(&p_drv->dynids.lock);
 
-#ifdef CONFIG_PCMCIA_IOCTL
-       /* matching by cardmgr */
-       if (p_dev->cardmgr == p_drv) {
-               dev_dbg(dev, "cardmgr matched to %s\n", drv->name);
-               return 1;
-       }
-#endif
-
        while (did && did->match_flags) {
                dev_dbg(dev, "trying to match to %s\n", drv->name);
                if (pcmcia_devmatch(p_dev, did)) {
@@ -1006,6 +1011,18 @@ pcmcia_device_stringattr(prod_id2, prod_id[1]);
 pcmcia_device_stringattr(prod_id3, prod_id[2]);
 pcmcia_device_stringattr(prod_id4, prod_id[3]);
 
+static ssize_t pcmcia_show_resources(struct device *dev,
+                                    struct device_attribute *attr, char *buf)
+{
+       struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
+       char *str = buf;
+       int i;
+
+       for (i = 0; i < PCMCIA_NUM_RESOURCES; i++)
+               str += sprintf(str, "%pr\n", p_dev->resource[i]);
+
+       return str - buf;
+}
 
 static ssize_t pcmcia_show_pm_state(struct device *dev, struct device_attribute *attr, char *buf)
 {
@@ -1076,6 +1093,7 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev,
 static struct device_attribute pcmcia_dev_attrs[] = {
        __ATTR(function, 0444, func_show, NULL),
        __ATTR(pm_state, 0644, pcmcia_show_pm_state, pcmcia_store_pm_state),
+       __ATTR(resources, 0444, pcmcia_show_resources, NULL),
        __ATTR_RO(func_id),
        __ATTR_RO(manf_id),
        __ATTR_RO(card_id),
@@ -1215,86 +1233,57 @@ static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
        return 0;
 }
 
+static int pcmcia_bus_remove(struct pcmcia_socket *skt)
+{
+       atomic_set(&skt->present, 0);
+       pcmcia_card_remove(skt, NULL);
 
-/*======================================================================
+       mutex_lock(&skt->ops_mutex);
+       destroy_cis_cache(skt);
+       pcmcia_cleanup_irq(skt);
+       mutex_unlock(&skt->ops_mutex);
 
-    The card status event handler.
+       return 0;
+}
 
-======================================================================*/
+static int pcmcia_bus_add(struct pcmcia_socket *skt)
+{
+       atomic_set(&skt->present, 1);
 
-/* Normally, the event is passed to individual drivers after
- * informing userspace. Only for CS_EVENT_CARD_REMOVAL this
- * is inversed to maintain historic compatibility.
- */
+       mutex_lock(&skt->ops_mutex);
+       skt->pcmcia_pfc = 0;
+       destroy_cis_cache(skt); /* to be on the safe side... */
+       mutex_unlock(&skt->ops_mutex);
 
-static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
-{
-       struct pcmcia_socket *s = pcmcia_get_socket(skt);
+       pcmcia_card_add(skt);
 
-       if (!s) {
-               dev_printk(KERN_ERR, &skt->dev,
-                          "PCMCIA obtaining reference to socket "      \
-                          "failed, event 0x%x lost!\n", event);
-               return -ENODEV;
-       }
+       return 0;
+}
 
-       dev_dbg(&skt->dev, "ds_event(0x%06x, %d, 0x%p)\n",
-                  event, priority, skt);
+static int pcmcia_bus_early_resume(struct pcmcia_socket *skt)
+{
+       if (!verify_cis_cache(skt)) {
+               pcmcia_put_socket(skt);
+               return 0;
+       }
 
-       switch (event) {
-       case CS_EVENT_CARD_REMOVAL:
-               atomic_set(&skt->present, 0);
-               pcmcia_card_remove(skt, NULL);
-               handle_event(skt, event);
-               mutex_lock(&s->ops_mutex);
-               destroy_cis_cache(s);
-               pcmcia_cleanup_irq(s);
-               mutex_unlock(&s->ops_mutex);
-               break;
+       dev_dbg(&skt->dev, "cis mismatch - different card\n");
 
-       case CS_EVENT_CARD_INSERTION:
-               atomic_set(&skt->present, 1);
-               mutex_lock(&s->ops_mutex);
-               s->pcmcia_state.has_pfc = 0;
-               destroy_cis_cache(s); /* to be on the safe side... */
-               mutex_unlock(&s->ops_mutex);
-               pcmcia_card_add(skt);
-               handle_event(skt, event);
-               break;
-
-       case CS_EVENT_EJECTION_REQUEST:
-               break;
-
-       case CS_EVENT_PM_RESUME:
-               if (verify_cis_cache(skt) != 0) {
-                       dev_dbg(&skt->dev, "cis mismatch - different card\n");
-                       /* first, remove the card */
-                       ds_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
-                       mutex_lock(&s->ops_mutex);
-                       destroy_cis_cache(skt);
-                       kfree(skt->fake_cis);
-                       skt->fake_cis = NULL;
-                       s->functions = 0;
-                       mutex_unlock(&s->ops_mutex);
-                       /* now, add the new card */
-                       ds_event(skt, CS_EVENT_CARD_INSERTION,
-                                CS_EVENT_PRI_LOW);
-               }
-               handle_event(skt, event);
-               break;
+       /* first, remove the card */
+       pcmcia_bus_remove(skt);
 
-       case CS_EVENT_PM_SUSPEND:
-       case CS_EVENT_RESET_PHYSICAL:
-       case CS_EVENT_CARD_RESET:
-       default:
-               handle_event(skt, event);
-               break;
-    }
+       mutex_lock(&skt->ops_mutex);
+       destroy_cis_cache(skt);
+       kfree(skt->fake_cis);
+       skt->fake_cis = NULL;
+       skt->functions = 0;
+       mutex_unlock(&skt->ops_mutex);
 
-    pcmcia_put_socket(s);
+       /* now, add the new card */
+       pcmcia_bus_add(skt);
+       return 0;
+}
 
-    return 0;
-} /* ds_event */
 
 /*
  * NOTE: This is racy. There's no guarantee the card will still be
@@ -1323,10 +1312,12 @@ EXPORT_SYMBOL(pcmcia_dev_present);
 
 static struct pcmcia_callback pcmcia_bus_callback = {
        .owner = THIS_MODULE,
-       .event = ds_event,
+       .add = pcmcia_bus_add,
+       .remove = pcmcia_bus_remove,
        .requery = pcmcia_requery,
        .validate = pccard_validate_cis,
        .suspend = pcmcia_bus_suspend,
+       .early_resume = pcmcia_bus_early_resume,
        .resume = pcmcia_bus_resume,
 };
 
@@ -1350,11 +1341,8 @@ static int __devinit pcmcia_bus_add_socket(struct device *dev,
                return ret;
        }
 
-#ifdef CONFIG_PCMCIA_IOCTL
-       init_waitqueue_head(&socket->queue);
-#endif
        INIT_LIST_HEAD(&socket->devices_list);
-       memset(&socket->pcmcia_state, 0, sizeof(u8));
+       socket->pcmcia_pfc = 0;
        socket->device_count = 0;
        atomic_set(&socket->present, 0);
 
@@ -1429,8 +1417,6 @@ static int __init init_pcmcia_bus(void)
                return ret;
        }
 
-       pcmcia_setup_ioctl();
-
        return 0;
 }
 fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
@@ -1439,8 +1425,6 @@ fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
 
 static void __exit exit_pcmcia_bus(void)
 {
-       pcmcia_cleanup_ioctl();
-
        class_interface_unregister(&pcmcia_bus_interface);
 
        bus_unregister(&pcmcia_bus_type);
index 3003bb3..05d0879 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/interrupt.h>
 #include <linux/device.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 
index 9e2a156..61746bd 100644 (file)
@@ -50,7 +50,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 
index 7e16ed8..24de499 100644 (file)
@@ -26,7 +26,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 
index 6c5c3f9..8e47238 100644 (file)
@@ -27,7 +27,6 @@
 #include <asm/system.h>
 #include <asm/addrspace.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 
index 25e5e30..f2f90a7 100644 (file)
@@ -59,7 +59,6 @@
 #include <asm/irq.h>
 #include <asm/fs_pd.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/ss.h>
 
index 4a65eaf..0ac54da 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cisreg.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ss.h>
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c
deleted file mode 100644 (file)
index d007a2a..0000000
+++ /dev/null
@@ -1,1077 +0,0 @@
-/*
- * pcmcia_ioctl.c -- ioctl interface for cardmgr and cardctl
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * The initial developer of the original code is David A. Hinds
- * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
- * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
- *
- * (C) 1999            David A. Hinds
- * (C) 2003 - 2004     Dominik Brodowski
- */
-
-/*
- * This file will go away soon.
- */
-
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/major.h>
-#include <linux/errno.h>
-#include <linux/ioctl.h>
-#include <linux/proc_fs.h>
-#include <linux/poll.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/seq_file.h>
-#include <linux/smp_lock.h>
-#include <linux/workqueue.h>
-
-#include <pcmcia/cs_types.h>
-#include <pcmcia/cs.h>
-#include <pcmcia/cistpl.h>
-#include <pcmcia/cisreg.h>
-#include <pcmcia/ds.h>
-#include <pcmcia/ss.h>
-
-#include "cs_internal.h"
-
-static int major_dev = -1;
-
-
-/* Device user information */
-#define MAX_EVENTS     32
-#define USER_MAGIC     0x7ea4
-#define CHECK_USER(u) \
-    (((u) == NULL) || ((u)->user_magic != USER_MAGIC))
-
-typedef struct user_info_t {
-       u_int                   user_magic;
-       int                     event_head, event_tail;
-       event_t                 event[MAX_EVENTS];
-       struct user_info_t      *next;
-       struct pcmcia_socket    *socket;
-} user_info_t;
-
-
-static struct pcmcia_device *get_pcmcia_device(struct pcmcia_socket *s,
-                                               unsigned int function)
-{
-       struct pcmcia_device *p_dev = NULL;
-
-       mutex_lock(&s->ops_mutex);
-       list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
-               if (p_dev->func == function) {
-                       mutex_unlock(&s->ops_mutex);
-                       return pcmcia_get_dev(p_dev);
-               }
-       }
-       mutex_unlock(&s->ops_mutex);
-       return NULL;
-}
-
-/* backwards-compatible accessing of driver --- by name! */
-
-static struct pcmcia_driver *get_pcmcia_driver(dev_info_t *dev_info)
-{
-       struct device_driver *drv;
-       struct pcmcia_driver *p_drv;
-
-       drv = driver_find((char *) dev_info, &pcmcia_bus_type);
-       if (!drv)
-               return NULL;
-
-       p_drv = container_of(drv, struct pcmcia_driver, drv);
-
-       return p_drv;
-}
-
-
-#ifdef CONFIG_PROC_FS
-static struct proc_dir_entry *proc_pccard;
-
-static int proc_read_drivers_callback(struct device_driver *driver, void *_m)
-{
-       struct seq_file *m = _m;
-       struct pcmcia_driver *p_drv = container_of(driver,
-                                                  struct pcmcia_driver, drv);
-
-       seq_printf(m, "%-24.24s 1 %d\n", p_drv->drv.name,
-#ifdef CONFIG_MODULE_UNLOAD
-                     (p_drv->owner) ? module_refcount(p_drv->owner) : 1
-#else
-                     1
-#endif
-       );
-       return 0;
-}
-
-static int pccard_drivers_proc_show(struct seq_file *m, void *v)
-{
-       return bus_for_each_drv(&pcmcia_bus_type, NULL,
-                               m, proc_read_drivers_callback);
-}
-
-static int pccard_drivers_proc_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, pccard_drivers_proc_show, NULL);
-}
-
-static const struct file_operations pccard_drivers_proc_fops = {
-       .owner          = THIS_MODULE,
-       .open           = pccard_drivers_proc_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-#endif
-
-
-#ifdef CONFIG_PCMCIA_PROBE
-
-static int adjust_irq(struct pcmcia_socket *s, adjust_t *adj)
-{
-       int irq;
-       u32 mask;
-
-       irq = adj->resource.irq.IRQ;
-       if ((irq < 0) || (irq > 15))
-               return -EINVAL;
-
-       if (adj->Action != REMOVE_MANAGED_RESOURCE)
-               return 0;
-
-       mask = 1 << irq;
-
-       if (!(s->irq_mask & mask))
-               return 0;
-
-       s->irq_mask &= ~mask;
-
-       return 0;
-}
-
-#else
-
-static inline int adjust_irq(struct pcmcia_socket *s, adjust_t *adj)
-{
-       return 0;
-}
-
-#endif
-
-static int pcmcia_adjust_resource_info(adjust_t *adj)
-{
-       struct pcmcia_socket *s;
-       int ret = -ENOSYS;
-
-       down_read(&pcmcia_socket_list_rwsem);
-       list_for_each_entry(s, &pcmcia_socket_list, socket_list) {
-
-               if (adj->Resource == RES_IRQ)
-                       ret = adjust_irq(s, adj);
-
-               else if (s->resource_ops->add_io) {
-                       unsigned long begin, end;
-
-                       /* you can't use the old interface if the new
-                        * one was used before */
-                       mutex_lock(&s->ops_mutex);
-                       if ((s->resource_setup_new) &&
-                           !(s->resource_setup_old)) {
-                               mutex_unlock(&s->ops_mutex);
-                               continue;
-                       } else if (!(s->resource_setup_old))
-                               s->resource_setup_old = 1;
-
-                       switch (adj->Resource) {
-                       case RES_MEMORY_RANGE:
-                               begin = adj->resource.memory.Base;
-                               end = adj->resource.memory.Base + adj->resource.memory.Size - 1;
-                               if (s->resource_ops->add_mem)
-                                       ret = s->resource_ops->add_mem(s, adj->Action, begin, end);
-                       case RES_IO_RANGE:
-                               begin = adj->resource.io.BasePort;
-                               end = adj->resource.io.BasePort + adj->resource.io.NumPorts - 1;
-                               if (s->resource_ops->add_io)
-                                       ret = s->resource_ops->add_io(s, adj->Action, begin, end);
-                       }
-                       if (!ret) {
-                               /* as there's no way we know this is the
-                                * last call to adjust_resource_info, we
-                                * always need to assume this is the latest
-                                * one... */
-                               s->resource_setup_done = 1;
-                       }
-                       mutex_unlock(&s->ops_mutex);
-               }
-       }
-       up_read(&pcmcia_socket_list_rwsem);
-
-       return ret;
-}
-
-
-/** pcmcia_get_window
- */
-static int pcmcia_get_window(struct pcmcia_socket *s, window_handle_t *wh_out,
-                       window_handle_t wh, win_req_t *req)
-{
-       pccard_mem_map *win;
-       window_handle_t w;
-
-       wh--;
-       if (!s || !(s->state & SOCKET_PRESENT))
-               return -ENODEV;
-       if (wh >= MAX_WIN)
-               return -EINVAL;
-       for (w = wh; w < MAX_WIN; w++)
-               if (s->state & SOCKET_WIN_REQ(w))
-                       break;
-       if (w == MAX_WIN)
-               return -EINVAL;
-       win = &s->win[w];
-       req->Base = win->res->start;
-       req->Size = win->res->end - win->res->start + 1;
-       req->AccessSpeed = win->speed;
-       req->Attributes = 0;
-       if (win->flags & MAP_ATTRIB)
-               req->Attributes |= WIN_MEMORY_TYPE_AM;
-       if (win->flags & MAP_ACTIVE)
-               req->Attributes |= WIN_ENABLE;
-       if (win->flags & MAP_16BIT)
-               req->Attributes |= WIN_DATA_WIDTH_16;
-       if (win->flags & MAP_USE_WAIT)
-               req->Attributes |= WIN_USE_WAIT;
-
-       *wh_out = w + 1;
-       return 0;
-} /* pcmcia_get_window */
-
-
-/** pcmcia_get_mem_page
- *
- * Change the card address of an already open memory window.
- */
-static int pcmcia_get_mem_page(struct pcmcia_socket *skt, window_handle_t wh,
-                       memreq_t *req)
-{
-       wh--;
-       if (wh >= MAX_WIN)
-               return -EINVAL;
-
-       req->Page = 0;
-       req->CardOffset = skt->win[wh].card_start;
-       return 0;
-} /* pcmcia_get_mem_page */
-
-
-/** pccard_get_status
- *
- * Get the current socket state bits.  We don't support the latched
- * SocketState yet: I haven't seen any point for it.
- */
-
-static int pccard_get_status(struct pcmcia_socket *s,
-                            struct pcmcia_device *p_dev,
-                            cs_status_t *status)
-{
-       config_t *c;
-       int val;
-
-       s->ops->get_status(s, &val);
-       status->CardState = status->SocketState = 0;
-       status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0;
-       status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0;
-       status->CardState |= (val & SS_3VCARD) ? CS_EVENT_3VCARD : 0;
-       status->CardState |= (val & SS_XVCARD) ? CS_EVENT_XVCARD : 0;
-       if (s->state & SOCKET_SUSPEND)
-               status->CardState |= CS_EVENT_PM_SUSPEND;
-       if (!(s->state & SOCKET_PRESENT))
-               return -ENODEV;
-
-       c = (p_dev) ? p_dev->function_config : NULL;
-
-       if ((c != NULL) && (c->state & CONFIG_LOCKED) &&
-           (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) {
-               u_char reg;
-               if (c->CardValues & PRESENT_PIN_REPLACE) {
-                       mutex_lock(&s->ops_mutex);
-                       pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, &reg);
-                       mutex_unlock(&s->ops_mutex);
-                       status->CardState |=
-                               (reg & PRR_WP_STATUS) ? CS_EVENT_WRITE_PROTECT : 0;
-                       status->CardState |=
-                               (reg & PRR_READY_STATUS) ? CS_EVENT_READY_CHANGE : 0;
-                       status->CardState |=
-                               (reg & PRR_BVD2_STATUS) ? CS_EVENT_BATTERY_LOW : 0;
-                       status->CardState |=
-                               (reg & PRR_BVD1_STATUS) ? CS_EVENT_BATTERY_DEAD : 0;
-               } else {
-                       /* No PRR?  Then assume we're always ready */
-                       status->CardState |= CS_EVENT_READY_CHANGE;
-               }
-               if (c->CardValues & PRESENT_EXT_STATUS) {
-                       mutex_lock(&s->ops_mutex);
-                       pcmcia_read_cis_mem(s, 1, (c->ConfigBase+CISREG_ESR)>>1, 1, &reg);
-                       mutex_unlock(&s->ops_mutex);
-                       status->CardState |=
-                               (reg & ESR_REQ_ATTN) ? CS_EVENT_REQUEST_ATTENTION : 0;
-               }
-               return 0;
-       }
-       status->CardState |=
-               (val & SS_WRPROT) ? CS_EVENT_WRITE_PROTECT : 0;
-       status->CardState |=
-               (val & SS_BATDEAD) ? CS_EVENT_BATTERY_DEAD : 0;
-       status->CardState |=
-               (val & SS_BATWARN) ? CS_EVENT_BATTERY_LOW : 0;
-       status->CardState |=
-               (val & SS_READY) ? CS_EVENT_READY_CHANGE : 0;
-       return 0;
-} /* pccard_get_status */
-
-static int pccard_get_configuration_info(struct pcmcia_socket *s,
-                                 struct pcmcia_device *p_dev,
-                                 config_info_t *config)
-{
-       config_t *c;
-
-       if (!(s->state & SOCKET_PRESENT))
-               return -ENODEV;
-
-
-#ifdef CONFIG_CARDBUS
-       if (s->state & SOCKET_CARDBUS) {
-               memset(config, 0, sizeof(config_info_t));
-               config->Vcc = s->socket.Vcc;
-               config->Vpp1 = config->Vpp2 = s->socket.Vpp;
-               config->Option = s->cb_dev->subordinate->number;
-               if (s->state & SOCKET_CARDBUS_CONFIG) {
-                       config->Attributes = CONF_VALID_CLIENT;
-                       config->IntType = INT_CARDBUS;
-                       config->AssignedIRQ = s->pcmcia_irq;
-                       if (config->AssignedIRQ)
-                               config->Attributes |= CONF_ENABLE_IRQ;
-                       if (s->io[0].res) {
-                               config->BasePort1 = s->io[0].res->start;
-                               config->NumPorts1 = s->io[0].res->end -
-                                       config->BasePort1 + 1;
-                       }
-               }
-               return 0;
-       }
-#endif
-
-       if (p_dev) {
-               c = p_dev->function_config;
-               config->Function = p_dev->func;
-       } else {
-               c = NULL;
-               config->Function = 0;
-       }
-
-       if ((c == NULL) || !(c->state & CONFIG_LOCKED)) {
-               config->Attributes = 0;
-               config->Vcc = s->socket.Vcc;
-               config->Vpp1 = config->Vpp2 = s->socket.Vpp;
-               return 0;
-       }
-
-       config->Attributes = c->Attributes | CONF_VALID_CLIENT;
-       config->Vcc = s->socket.Vcc;
-       config->Vpp1 = config->Vpp2 = s->socket.Vpp;
-       config->IntType = c->IntType;
-       config->ConfigBase = c->ConfigBase;
-       config->Status = c->Status;
-       config->Pin = c->Pin;
-       config->Copy = c->Copy;
-       config->Option = c->Option;
-       config->ExtStatus = c->ExtStatus;
-       config->Present = config->CardValues = c->CardValues;
-       config->IRQAttributes = c->irq.Attributes;
-       config->AssignedIRQ = s->pcmcia_irq;
-       config->BasePort1 = c->io.BasePort1;
-       config->NumPorts1 = c->io.NumPorts1;
-       config->Attributes1 = c->io.Attributes1;
-       config->BasePort2 = c->io.BasePort2;
-       config->NumPorts2 = c->io.NumPorts2;
-       config->Attributes2 = c->io.Attributes2;
-       config->IOAddrLines = c->io.IOAddrLines;
-
-       return 0;
-} /* pccard_get_configuration_info */
-
-
-/*======================================================================
-
-    These manage a ring buffer of events pending for one user process
-
-======================================================================*/
-
-
-static int queue_empty(user_info_t *user)
-{
-    return (user->event_head == user->event_tail);
-}
-
-static event_t get_queued_event(user_info_t *user)
-{
-    user->event_tail = (user->event_tail+1) % MAX_EVENTS;
-    return user->event[user->event_tail];
-}
-
-static void queue_event(user_info_t *user, event_t event)
-{
-    user->event_head = (user->event_head+1) % MAX_EVENTS;
-    if (user->event_head == user->event_tail)
-       user->event_tail = (user->event_tail+1) % MAX_EVENTS;
-    user->event[user->event_head] = event;
-}
-
-void handle_event(struct pcmcia_socket *s, event_t event)
-{
-    user_info_t *user;
-    for (user = s->user; user; user = user->next)
-       queue_event(user, event);
-    wake_up_interruptible(&s->queue);
-}
-
-
-/*======================================================================
-
-    bind_request() and bind_device() are merged by now. Register_client()
-    is called right at the end of bind_request(), during the driver's
-    ->attach() call. Individual descriptions:
-
-    bind_request() connects a socket to a particular client driver.
-    It looks up the specified device ID in the list of registered
-    drivers, binds it to the socket, and tries to create an instance
-    of the device.  unbind_request() deletes a driver instance.
-
-    Bind_device() associates a device driver with a particular socket.
-    It is normally called by Driver Services after it has identified
-    a newly inserted card.  An instance of that driver will then be
-    eligible to register as a client of this socket.
-
-    Register_client() uses the dev_info_t handle to match the
-    caller with a socket.  The driver must have already been bound
-    to a socket with bind_device() -- in fact, bind_device()
-    allocates the client structure that will be used.
-
-======================================================================*/
-
-static int bind_request(struct pcmcia_socket *s, bind_info_t *bind_info)
-{
-       struct pcmcia_driver *p_drv;
-       struct pcmcia_device *p_dev;
-       int ret = 0;
-
-       s = pcmcia_get_socket(s);
-       if (!s)
-               return -EINVAL;
-
-       pr_debug("bind_request(%d, '%s')\n", s->sock,
-              (char *)bind_info->dev_info);
-
-       p_drv = get_pcmcia_driver(&bind_info->dev_info);
-       if (!p_drv) {
-               ret = -EINVAL;
-               goto err_put;
-       }
-
-       if (!try_module_get(p_drv->owner)) {
-               ret = -EINVAL;
-               goto err_put_driver;
-       }
-
-       mutex_lock(&s->ops_mutex);
-       list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
-               if (p_dev->func == bind_info->function) {
-                       if ((p_dev->dev.driver == &p_drv->drv)) {
-                               if (p_dev->cardmgr) {
-                                       /* if there's already a device
-                                        * registered, and it was registered
-                                        * by userspace before, we need to
-                                        * return the "instance". */
-                                       mutex_unlock(&s->ops_mutex);
-                                       bind_info->instance = p_dev;
-                                       ret = -EBUSY;
-                                       goto err_put_module;
-                               } else {
-                                       /* the correct driver managed to bind
-                                        * itself magically to the correct
-                                        * device. */
-                                       mutex_unlock(&s->ops_mutex);
-                                       p_dev->cardmgr = p_drv;
-                                       ret = 0;
-                                       goto err_put_module;
-                               }
-                       } else if (!p_dev->dev.driver) {
-                               /* there's already a device available where
-                                * no device has been bound to yet. So we don't
-                                * need to register a device! */
-                               mutex_unlock(&s->ops_mutex);
-                               goto rescan;
-                       }
-               }
-       }
-       mutex_unlock(&s->ops_mutex);
-
-       p_dev = pcmcia_device_add(s, bind_info->function);
-       if (!p_dev) {
-               ret = -EIO;
-               goto err_put_module;
-       }
-
-rescan:
-       p_dev->cardmgr = p_drv;
-
-       /* if a driver is already running, we can abort */
-       if (p_dev->dev.driver)
-               goto err_put_module;
-
-       /*
-        * Prevent this racing with a card insertion.
-        */
-       mutex_lock(&s->skt_mutex);
-       ret = bus_rescan_devices(&pcmcia_bus_type);
-       mutex_unlock(&s->skt_mutex);
-       if (ret)
-               goto err_put_module;
-
-       /* check whether the driver indeed matched. I don't care if this
-        * is racy or not, because it can only happen on cardmgr access
-        * paths...
-        */
-       if (!(p_dev->dev.driver == &p_drv->drv))
-               p_dev->cardmgr = NULL;
-
- err_put_module:
-       module_put(p_drv->owner);
- err_put_driver:
-       put_driver(&p_drv->drv);
- err_put:
-       pcmcia_put_socket(s);
-
-       return ret;
-} /* bind_request */
-
-#ifdef CONFIG_CARDBUS
-
-static struct pci_bus *pcmcia_lookup_bus(struct pcmcia_socket *s)
-{
-       if (!s || !(s->state & SOCKET_CARDBUS))
-               return NULL;
-
-       return s->cb_dev->subordinate;
-}
-#endif
-
-static int get_device_info(struct pcmcia_socket *s, bind_info_t *bind_info, int first)
-{
-       struct pcmcia_device *p_dev;
-       struct pcmcia_driver *p_drv;
-       int ret = 0;
-
-#ifdef CONFIG_CARDBUS
-       /*
-        * Some unbelievably ugly code to associate the PCI cardbus
-        * device and its driver with the PCMCIA "bind" information.
-        */
-       {
-               struct pci_bus *bus;
-
-               bus = pcmcia_lookup_bus(s);
-               if (bus) {
-                       struct list_head *list;
-                       struct pci_dev *dev = NULL;
-
-                       list = bus->devices.next;
-                       while (list != &bus->devices) {
-                               struct pci_dev *pdev = pci_dev_b(list);
-                               list = list->next;
-
-                               if (first) {
-                                       dev = pdev;
-                                       break;
-                               }
-
-                               /* Try to handle "next" here some way? */
-                       }
-                       if (dev && dev->driver) {
-                               strlcpy(bind_info->name, dev->driver->name, DEV_NAME_LEN);
-                               bind_info->major = 0;
-                               bind_info->minor = 0;
-                               bind_info->next = NULL;
-                               return 0;
-                       }
-               }
-       }
-#endif
-
-       mutex_lock(&s->ops_mutex);
-       list_for_each_entry(p_dev, &s->devices_list, socket_device_list) {
-               if (p_dev->func == bind_info->function) {
-                       p_dev = pcmcia_get_dev(p_dev);
-                       if (!p_dev)
-                               continue;
-                       goto found;
-               }
-       }
-       mutex_unlock(&s->ops_mutex);
-       return -ENODEV;
-
- found:
-       mutex_unlock(&s->ops_mutex);
-
-       p_drv = to_pcmcia_drv(p_dev->dev.driver);
-       if (p_drv && !p_dev->_locked) {
-               ret = -EAGAIN;
-               goto err_put;
-       }
-
-       if (!first) {
-               ret = -ENODEV;
-               goto err_put;
-       }
-
-       strlcpy(bind_info->name, dev_name(&p_dev->dev), DEV_NAME_LEN);
-       bind_info->next = NULL;
-
- err_put:
-       pcmcia_put_dev(p_dev);
-       return ret;
-} /* get_device_info */
-
-
-static int ds_open(struct inode *inode, struct file *file)
-{
-    socket_t i = iminor(inode);
-    struct pcmcia_socket *s;
-    user_info_t *user;
-    static int warning_printed;
-    int ret = 0;
-
-    pr_debug("ds_open(socket %d)\n", i);
-
-    lock_kernel();
-    s = pcmcia_get_socket_by_nr(i);
-    if (!s) {
-           ret = -ENODEV;
-           goto out;
-    }
-    s = pcmcia_get_socket(s);
-    if (!s) {
-           ret = -ENODEV;
-           goto out;
-    }
-
-    if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
-           if (s->pcmcia_state.busy) {
-                   pcmcia_put_socket(s);
-                   ret = -EBUSY;
-                   goto out;
-           }
-       else
-           s->pcmcia_state.busy = 1;
-    }
-
-    user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
-    if (!user) {
-           pcmcia_put_socket(s);
-           ret = -ENOMEM;
-           goto out;
-    }
-    user->event_tail = user->event_head = 0;
-    user->next = s->user;
-    user->user_magic = USER_MAGIC;
-    user->socket = s;
-    s->user = user;
-    file->private_data = user;
-
-    if (!warning_printed) {
-           printk(KERN_INFO "pcmcia: Detected deprecated PCMCIA ioctl "
-                       "usage from process: %s.\n", current->comm);
-           printk(KERN_INFO "pcmcia: This interface will soon be removed from "
-                       "the kernel; please expect breakage unless you upgrade "
-                       "to new tools.\n");
-           printk(KERN_INFO "pcmcia: see http://www.kernel.org/pub/linux/"
-                       "utils/kernel/pcmcia/pcmcia.html for details.\n");
-           warning_printed = 1;
-    }
-
-    if (atomic_read(&s->present))
-       queue_event(user, CS_EVENT_CARD_INSERTION);
-out:
-    unlock_kernel();
-    return ret;
-} /* ds_open */
-
-/*====================================================================*/
-
-static int ds_release(struct inode *inode, struct file *file)
-{
-    struct pcmcia_socket *s;
-    user_info_t *user, **link;
-
-    pr_debug("ds_release(socket %d)\n", iminor(inode));
-
-    user = file->private_data;
-    if (CHECK_USER(user))
-       goto out;
-
-    s = user->socket;
-
-    /* Unlink user data structure */
-    if ((file->f_flags & O_ACCMODE) != O_RDONLY)
-       s->pcmcia_state.busy = 0;
-
-    file->private_data = NULL;
-    for (link = &s->user; *link; link = &(*link)->next)
-       if (*link == user)
-               break;
-    if (link == NULL)
-       goto out;
-    *link = user->next;
-    user->user_magic = 0;
-    kfree(user);
-    pcmcia_put_socket(s);
-out:
-    return 0;
-} /* ds_release */
-
-/*====================================================================*/
-
-static ssize_t ds_read(struct file *file, char __user *buf,
-                      size_t count, loff_t *ppos)
-{
-    struct pcmcia_socket *s;
-    user_info_t *user;
-    int ret;
-
-    pr_debug("ds_read(socket %d)\n", iminor(file->f_path.dentry->d_inode));
-
-    if (count < 4)
-       return -EINVAL;
-
-    user = file->private_data;
-    if (CHECK_USER(user))
-       return -EIO;
-
-    s = user->socket;
-    ret = wait_event_interruptible(s->queue, !queue_empty(user));
-    if (ret == 0)
-       ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4;
-
-    return ret;
-} /* ds_read */
-
-/*====================================================================*/
-
-static ssize_t ds_write(struct file *file, const char __user *buf,
-                       size_t count, loff_t *ppos)
-{
-    pr_debug("ds_write(socket %d)\n", iminor(file->f_path.dentry->d_inode));
-
-    if (count != 4)
-       return -EINVAL;
-    if ((file->f_flags & O_ACCMODE) == O_RDONLY)
-       return -EBADF;
-
-    return -EIO;
-} /* ds_write */
-
-/*====================================================================*/
-
-/* No kernel lock - fine */
-static u_int ds_poll(struct file *file, poll_table *wait)
-{
-    struct pcmcia_socket *s;
-    user_info_t *user;
-
-    pr_debug("ds_poll(socket %d)\n", iminor(file->f_path.dentry->d_inode));
-
-    user = file->private_data;
-    if (CHECK_USER(user))
-       return POLLERR;
-    s = user->socket;
-    /*
-     * We don't check for a dead socket here since that
-     * will send cardmgr into an endless spin.
-     */
-    poll_wait(file, &s->queue, wait);
-    if (!queue_empty(user))
-       return POLLIN | POLLRDNORM;
-    return 0;
-} /* ds_poll */
-
-/*====================================================================*/
-
-static int ds_ioctl(struct file *file, u_int cmd, u_long arg)
-{
-    struct pcmcia_socket *s;
-    void __user *uarg = (char __user *)arg;
-    u_int size;
-    int ret, err;
-    ds_ioctl_arg_t *buf;
-    user_info_t *user;
-
-    pr_debug("ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
-
-    user = file->private_data;
-    if (CHECK_USER(user))
-       return -EIO;
-
-    s = user->socket;
-
-    size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
-    if (size > sizeof(ds_ioctl_arg_t))
-       return -EINVAL;
-
-    /* Permission check */
-    if (!(cmd & IOC_OUT) && !capable(CAP_SYS_ADMIN))
-       return -EPERM;
-
-    if (cmd & IOC_IN) {
-       if (!access_ok(VERIFY_READ, uarg, size)) {
-           pr_debug("ds_ioctl(): verify_read = %d\n", -EFAULT);
-           return -EFAULT;
-       }
-    }
-    if (cmd & IOC_OUT) {
-       if (!access_ok(VERIFY_WRITE, uarg, size)) {
-           pr_debug("ds_ioctl(): verify_write = %d\n", -EFAULT);
-           return -EFAULT;
-       }
-    }
-    buf = kmalloc(sizeof(ds_ioctl_arg_t), GFP_KERNEL);
-    if (!buf)
-       return -ENOMEM;
-
-    err = ret = 0;
-
-    if (cmd & IOC_IN) {
-       if (__copy_from_user((char *)buf, uarg, size)) {
-           err = -EFAULT;
-           goto free_out;
-       }
-    }
-
-    switch (cmd) {
-    case DS_ADJUST_RESOURCE_INFO:
-       ret = pcmcia_adjust_resource_info(&buf->adjust);
-       break;
-    case DS_GET_CONFIGURATION_INFO:
-       if (buf->config.Function &&
-          (buf->config.Function >= s->functions))
-           ret = -EINVAL;
-       else {
-           struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function);
-           ret = pccard_get_configuration_info(s, p_dev, &buf->config);
-           pcmcia_put_dev(p_dev);
-       }
-       break;
-    case DS_GET_FIRST_TUPLE:
-       mutex_lock(&s->skt_mutex);
-       pcmcia_validate_mem(s);
-       mutex_unlock(&s->skt_mutex);
-       ret = pccard_get_first_tuple(s, BIND_FN_ALL, &buf->tuple);
-       break;
-    case DS_GET_NEXT_TUPLE:
-       ret = pccard_get_next_tuple(s, BIND_FN_ALL, &buf->tuple);
-       break;
-    case DS_GET_TUPLE_DATA:
-       buf->tuple.TupleData = buf->tuple_parse.data;
-       buf->tuple.TupleDataMax = sizeof(buf->tuple_parse.data);
-       ret = pccard_get_tuple_data(s, &buf->tuple);
-       break;
-    case DS_PARSE_TUPLE:
-       buf->tuple.TupleData = buf->tuple_parse.data;
-       ret = pcmcia_parse_tuple(&buf->tuple, &buf->tuple_parse.parse);
-       break;
-    case DS_RESET_CARD:
-       ret = pcmcia_reset_card(s);
-       break;
-    case DS_GET_STATUS:
-           if (buf->status.Function &&
-               (buf->status.Function >= s->functions))
-                   ret = -EINVAL;
-           else {
-                   struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function);
-                   ret = pccard_get_status(s, p_dev, &buf->status);
-                   pcmcia_put_dev(p_dev);
-           }
-           break;
-    case DS_VALIDATE_CIS:
-       mutex_lock(&s->skt_mutex);
-       pcmcia_validate_mem(s);
-       mutex_unlock(&s->skt_mutex);
-       ret = pccard_validate_cis(s, &buf->cisinfo.Chains);
-       break;
-    case DS_SUSPEND_CARD:
-       pcmcia_parse_uevents(s, PCMCIA_UEVENT_SUSPEND);
-       break;
-    case DS_RESUME_CARD:
-       pcmcia_parse_uevents(s, PCMCIA_UEVENT_RESUME);
-       break;
-    case DS_EJECT_CARD:
-       pcmcia_parse_uevents(s, PCMCIA_UEVENT_EJECT);
-       break;
-    case DS_INSERT_CARD:
-       pcmcia_parse_uevents(s, PCMCIA_UEVENT_INSERT);
-       break;
-    case DS_ACCESS_CONFIGURATION_REGISTER:
-       if ((buf->conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN)) {
-           err = -EPERM;
-           goto free_out;
-       }
-
-       ret = -EINVAL;
-
-       if (!(buf->conf_reg.Function &&
-            (buf->conf_reg.Function >= s->functions))) {
-               struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->conf_reg.Function);
-               if (p_dev) {
-                       ret = pcmcia_access_configuration_register(p_dev, &buf->conf_reg);
-                       pcmcia_put_dev(p_dev);
-               }
-       }
-       break;
-    case DS_GET_FIRST_REGION:
-    case DS_GET_NEXT_REGION:
-    case DS_BIND_MTD:
-       if (!capable(CAP_SYS_ADMIN)) {
-               err = -EPERM;
-               goto free_out;
-       } else {
-                       printk_once(KERN_WARNING
-                               "2.6. kernels use pcmciamtd instead of memory_cs.c and do not require special\n");
-                       printk_once(KERN_WARNING "MTD handling any more.\n");
-       }
-       err = -EINVAL;
-       goto free_out;
-       break;
-    case DS_GET_FIRST_WINDOW:
-       ret = pcmcia_get_window(s, &buf->win_info.handle, 1,
-                       &buf->win_info.window);
-       break;
-    case DS_GET_NEXT_WINDOW:
-       ret = pcmcia_get_window(s, &buf->win_info.handle,
-                       buf->win_info.handle + 1, &buf->win_info.window);
-       break;
-    case DS_GET_MEM_PAGE:
-       ret = pcmcia_get_mem_page(s, buf->win_info.handle,
-                          &buf->win_info.map);
-       break;
-    case DS_REPLACE_CIS:
-       ret = pcmcia_replace_cis(s, buf->cisdump.Data, buf->cisdump.Length);
-       break;
-    case DS_BIND_REQUEST:
-       if (!capable(CAP_SYS_ADMIN)) {
-               err = -EPERM;
-               goto free_out;
-       }
-       err = bind_request(s, &buf->bind_info);
-       break;
-    case DS_GET_DEVICE_INFO:
-       err = get_device_info(s, &buf->bind_info, 1);
-       break;
-    case DS_GET_NEXT_DEVICE:
-       err = get_device_info(s, &buf->bind_info, 0);
-       break;
-    case DS_UNBIND_REQUEST:
-       err = 0;
-       break;
-    default:
-       err = -EINVAL;
-    }
-
-    if ((err == 0) && (ret != 0)) {
-       pr_debug("ds_ioctl: ret = %d\n", ret);
-       switch (ret) {
-       case -ENODEV:
-       case -EINVAL:
-       case -EBUSY:
-       case -ENOSYS:
-           err = ret;
-           break;
-       case -ENOMEM:
-           err = -ENOSPC; break;
-       case -ENOSPC:
-           err = -ENODATA; break;
-       default:
-           err = -EIO; break;
-       }
-    }
-
-    if (cmd & IOC_OUT) {
-       if (__copy_to_user(uarg, (char *)buf, size))
-               err = -EFAULT;
-    }
-
-free_out:
-    kfree(buf);
-    return err;
-} /* ds_ioctl */
-
-static long ds_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-       int ret;
-
-       lock_kernel();
-       ret = ds_ioctl(file, cmd, arg);
-       unlock_kernel();
-
-       return ret;
-}
-
-
-/*====================================================================*/
-
-static const struct file_operations ds_fops = {
-       .owner          = THIS_MODULE,
-       .open           = ds_open,
-       .release        = ds_release,
-       .unlocked_ioctl = ds_unlocked_ioctl,
-       .read           = ds_read,
-       .write          = ds_write,
-       .poll           = ds_poll,
-};
-
-void __init pcmcia_setup_ioctl(void)
-{
-       int i;
-
-       /* Set up character device for user mode clients */
-       i = register_chrdev(0, "pcmcia", &ds_fops);
-       if (i < 0)
-               printk(KERN_NOTICE "unable to find a free device # for "
-                      "Driver Services (error=%d)\n", i);
-       else
-               major_dev = i;
-
-#ifdef CONFIG_PROC_FS
-       proc_pccard = proc_mkdir("bus/pccard", NULL);
-       if (proc_pccard)
-               proc_create("drivers", 0, proc_pccard, &pccard_drivers_proc_fops);
-#endif
-}
-
-
-void __exit pcmcia_cleanup_ioctl(void)
-{
-#ifdef CONFIG_PROC_FS
-       if (proc_pccard) {
-               remove_proc_entry("drivers", proc_pccard);
-               remove_proc_entry("bus/pccard", NULL);
-       }
-#endif
-       if (major_dev != -1)
-               unregister_chrdev(major_dev, "pcmcia");
-}
index a4cd9ad..54aa1c2 100644 (file)
@@ -25,7 +25,6 @@
 
 #include <asm/irq.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
@@ -57,77 +56,107 @@ struct resource *pcmcia_find_mem_region(u_long base, u_long num, u_long align,
 }
 
 
+static void release_io_space(struct pcmcia_socket *s, struct resource *res)
+{
+       resource_size_t num = resource_size(res);
+       int i;
+
+       dev_dbg(&s->dev, "release_io_space for %pR\n", res);
+
+       for (i = 0; i < MAX_IO_WIN; i++) {
+               if (!s->io[i].res)
+                       continue;
+               if ((s->io[i].res->start <= res->start) &&
+                   (s->io[i].res->end >= res->end)) {
+                       s->io[i].InUse -= num;
+                       if (res->parent)
+                               release_resource(res);
+                       res->start = res->end = 0;
+                       res->flags = IORESOURCE_IO;
+                       /* Free the window if no one else is using it */
+                       if (s->io[i].InUse == 0) {
+                               release_resource(s->io[i].res);
+                               kfree(s->io[i].res);
+                               s->io[i].res = NULL;
+                       }
+               }
+       }
+} /* release_io_space */
+
 /** alloc_io_space
  *
  * Special stuff for managing IO windows, because they are scarce
  */
-
-static int alloc_io_space(struct pcmcia_socket *s, u_int attr,
-                         unsigned int *base, unsigned int num, u_int lines)
+static int alloc_io_space(struct pcmcia_socket *s, struct resource *res,
+                       unsigned int lines)
 {
        unsigned int align;
+       unsigned int base = res->start;
+       unsigned int num = res->end;
+       int ret;
 
-       align = (*base) ? (lines ? 1<<lines : 0) : 1;
+       res->flags |= IORESOURCE_IO;
+
+       dev_dbg(&s->dev, "alloc_io_space request for %pR, %d lines\n",
+               res, lines);
+
+       align = base ? (lines ? 1<<lines : 0) : 1;
        if (align && (align < num)) {
-               if (*base) {
-                       dev_dbg(&s->dev, "odd IO request: num %#x align %#x\n",
-                              num, align);
+               if (base) {
+                       dev_dbg(&s->dev, "odd IO request\n");
                        align = 0;
                } else
                        while (align && (align < num))
                                align <<= 1;
        }
-       if (*base & ~(align-1)) {
-               dev_dbg(&s->dev, "odd IO request: base %#x align %#x\n",
-                      *base, align);
+       if (base & ~(align-1)) {
+               dev_dbg(&s->dev, "odd IO request\n");
                align = 0;
        }
 
-       return s->resource_ops->find_io(s, attr, base, num, align);
-} /* alloc_io_space */
-
+       ret = s->resource_ops->find_io(s, res->flags, &base, num, align,
+                               &res->parent);
+       if (ret) {
+               dev_dbg(&s->dev, "alloc_io_space request failed (%d)\n", ret);
+               return -EINVAL;
+       }
 
-static void release_io_space(struct pcmcia_socket *s, unsigned int base,
-                            unsigned int num)
-{
-       int i;
+       res->start = base;
+       res->end = res->start + num - 1;
 
-       for (i = 0; i < MAX_IO_WIN; i++) {
-               if (!s->io[i].res)
-                       continue;
-               if ((s->io[i].res->start <= base) &&
-                   (s->io[i].res->end >= base+num-1)) {
-                       s->io[i].InUse -= num;
-                       /* Free the window if no one else is using it */
-                       if (s->io[i].InUse == 0) {
-                               release_resource(s->io[i].res);
-                               kfree(s->io[i].res);
-                               s->io[i].res = NULL;
-                       }
+       if (res->parent) {
+               ret = request_resource(res->parent, res);
+               if (ret) {
+                       dev_warn(&s->dev,
+                               "request_resource %pR failed: %d\n", res, ret);
+                       res->parent = NULL;
+                       release_io_space(s, res);
                }
        }
-} /* release_io_space */
+       dev_dbg(&s->dev, "alloc_io_space request result %d: %pR\n", ret, res);
+       return ret;
+} /* alloc_io_space */
 
 
-/** pccard_access_configuration_register
+/**
+ * pcmcia_access_config() - read or write card configuration registers
  *
- * Access_configuration_register() reads and writes configuration
- * registers in attribute memory.  Memory window 0 is reserved for
- * this and the tuple reading services.
+ * pcmcia_access_config() reads and writes configuration registers in
+ * attribute memory.  Memory window 0 is reserved for this and the tuple
+ * reading services. Drivers must use pcmcia_read_config_byte() or
+ * pcmcia_write_config_byte().
  */
-
-int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
-                                        conf_reg_t *reg)
+static int pcmcia_access_config(struct pcmcia_device *p_dev,
+                               off_t where, u8 *val,
+                               int (*accessf) (struct pcmcia_socket *s,
+                                               int attr, unsigned int addr,
+                                               unsigned int len, void *ptr))
 {
        struct pcmcia_socket *s;
        config_t *c;
        int addr;
-       u_char val;
        int ret = 0;
 
-       if (!p_dev || !p_dev->function_config)
-               return -EINVAL;
-
        s = p_dev->socket;
 
        mutex_lock(&s->ops_mutex);
@@ -139,44 +168,57 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
                return -EACCES;
        }
 
-       addr = (c->ConfigBase + reg->Offset) >> 1;
+       addr = (c->ConfigBase + where) >> 1;
+
+       ret = accessf(s, 1, addr, 1, val);
 
-       switch (reg->Action) {
-       case CS_READ:
-               ret = pcmcia_read_cis_mem(s, 1, addr, 1, &val);
-               reg->Value = val;
-               break;
-       case CS_WRITE:
-               val = reg->Value;
-               pcmcia_write_cis_mem(s, 1, addr, 1, &val);
-               break;
-       default:
-               dev_dbg(&s->dev, "Invalid conf register request\n");
-               ret = -EINVAL;
-               break;
-       }
        mutex_unlock(&s->ops_mutex);
+
        return ret;
-} /* pcmcia_access_configuration_register */
-EXPORT_SYMBOL(pcmcia_access_configuration_register);
+} /* pcmcia_access_config */
+
+
+/**
+ * pcmcia_read_config_byte() - read a byte from a card configuration register
+ *
+ * pcmcia_read_config_byte() reads a byte from a configuration register in
+ * attribute memory.
+ */
+int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val)
+{
+       return pcmcia_access_config(p_dev, where, val, pcmcia_read_cis_mem);
+}
+EXPORT_SYMBOL(pcmcia_read_config_byte);
+
+
+/**
+ * pcmcia_write_config_byte() - write a byte to a card configuration register
+ *
+ * pcmcia_write_config_byte() writes a byte to a configuration register in
+ * attribute memory.
+ */
+int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val)
+{
+       return pcmcia_access_config(p_dev, where, &val, pcmcia_write_cis_mem);
+}
+EXPORT_SYMBOL(pcmcia_write_config_byte);
 
 
 int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t wh,
-                       memreq_t *req)
+                       unsigned int offset)
 {
        struct pcmcia_socket *s = p_dev->socket;
+       struct resource *res = wh;
+       unsigned int w;
        int ret;
 
-       wh--;
-       if (wh >= MAX_WIN)
+       w = ((res->flags & IORESOURCE_BITS & WIN_FLAGS_REQ) >> 2) - 1;
+       if (w >= MAX_WIN)
                return -EINVAL;
-       if (req->Page != 0) {
-               dev_dbg(&s->dev, "failure: requested page is zero\n");
-               return -EINVAL;
-       }
+
        mutex_lock(&s->ops_mutex);
-       s->win[wh].card_start = req->CardOffset;
-       ret = s->ops->set_mem_map(s, &s->win[wh]);
+       s->win[w].card_start = offset;
+       ret = s->ops->set_mem_map(s, &s->win[w]);
        if (ret)
                dev_warn(&s->dev, "failed to set_mem_map\n");
        mutex_unlock(&s->ops_mutex);
@@ -316,31 +358,25 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev)
  * don't bother checking the port ranges against the current socket
  * values.
  */
-static int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req)
+static int pcmcia_release_io(struct pcmcia_device *p_dev)
 {
        struct pcmcia_socket *s = p_dev->socket;
        int ret = -EINVAL;
        config_t *c;
 
        mutex_lock(&s->ops_mutex);
-       c = p_dev->function_config;
-
        if (!p_dev->_io)
                goto out;
 
-       p_dev->_io = 0;
+       c = p_dev->function_config;
 
-       if ((c->io.BasePort1 != req->BasePort1) ||
-           (c->io.NumPorts1 != req->NumPorts1) ||
-           (c->io.BasePort2 != req->BasePort2) ||
-           (c->io.NumPorts2 != req->NumPorts2))
-               goto out;
+       release_io_space(s, &c->io[0]);
 
-       c->state &= ~CONFIG_IO_REQ;
+       if (c->io[1].end)
+               release_io_space(s, &c->io[1]);
 
-       release_io_space(s, req->BasePort1, req->NumPorts1);
-       if (req->NumPorts2)
-               release_io_space(s, req->BasePort2, req->NumPorts2);
+       p_dev->_io = 0;
+       c->state &= ~CONFIG_IO_REQ;
 
 out:
        mutex_unlock(&s->ops_mutex);
@@ -349,19 +385,22 @@ out:
 } /* pcmcia_release_io */
 
 
-int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t wh)
+int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res)
 {
        struct pcmcia_socket *s = p_dev->socket;
        pccard_mem_map *win;
+       unsigned int w;
+
+       dev_dbg(&p_dev->dev, "releasing window %pR\n", res);
 
-       wh--;
-       if (wh >= MAX_WIN)
+       w = ((res->flags & IORESOURCE_BITS & WIN_FLAGS_REQ) >> 2) - 1;
+       if (w >= MAX_WIN)
                return -EINVAL;
 
        mutex_lock(&s->ops_mutex);
-       win = &s->win[wh];
+       win = &s->win[w];
 
-       if (!(p_dev->_win & CLIENT_WIN_REQ(wh))) {
+       if (!(p_dev->_win & CLIENT_WIN_REQ(w))) {
                dev_dbg(&s->dev, "not releasing unknown window\n");
                mutex_unlock(&s->ops_mutex);
                return -EINVAL;
@@ -370,15 +409,16 @@ int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t wh)
        /* Shut down memory window */
        win->flags &= ~MAP_ACTIVE;
        s->ops->set_mem_map(s, win);
-       s->state &= ~SOCKET_WIN_REQ(wh);
+       s->state &= ~SOCKET_WIN_REQ(w);
 
        /* Release system memory */
        if (win->res) {
+               release_resource(res);
                release_resource(win->res);
                kfree(win->res);
                win->res = NULL;
        }
-       p_dev->_win &= ~CLIENT_WIN_REQ(wh);
+       p_dev->_win &= ~CLIENT_WIN_REQ(w);
        mutex_unlock(&s->ops_mutex);
 
        return 0;
@@ -473,13 +513,13 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
                pcmcia_write_cis_mem(s, 1, (base + CISREG_ESR)>>1, 1, &c->ExtStatus);
        }
        if (req->Present & PRESENT_IOBASE_0) {
-               u_char b = c->io.BasePort1 & 0xff;
+               u8 b = c->io[0].start & 0xff;
                pcmcia_write_cis_mem(s, 1, (base + CISREG_IOBASE_0)>>1, 1, &b);
-               b = (c->io.BasePort1 >> 8) & 0xff;
+               b = (c->io[0].start >> 8) & 0xff;
                pcmcia_write_cis_mem(s, 1, (base + CISREG_IOBASE_1)>>1, 1, &b);
        }
        if (req->Present & PRESENT_IOSIZE) {
-               u_char b = c->io.NumPorts1 + c->io.NumPorts2 - 1;
+               u8 b = resource_size(&c->io[0]) + resource_size(&c->io[1]) - 1;
                pcmcia_write_cis_mem(s, 1, (base + CISREG_IOSIZE)>>1, 1, &b);
        }
 
@@ -513,28 +553,29 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
 EXPORT_SYMBOL(pcmcia_request_configuration);
 
 
-/** pcmcia_request_io
+/**
+ * pcmcia_request_io() - attempt to reserve port ranges for PCMCIA devices
  *
- * Request_io() reserves ranges of port addresses for a socket.
- * I have not implemented range sharing or alias addressing.
+ * pcmcia_request_io() attepts to reserve the IO port ranges specified in
+ * &struct pcmcia_device @p_dev->resource[0] and @p_dev->resource[1]. The
+ * "start" value is the requested start of the IO port resource; "end"
+ * reflects the number of ports requested. The number of IO lines requested
+ * is specified in &struct pcmcia_device @p_dev->io_lines.
  */
-int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req)
+int pcmcia_request_io(struct pcmcia_device *p_dev)
 {
        struct pcmcia_socket *s = p_dev->socket;
-       config_t *c;
+       config_t *c = p_dev->function_config;
        int ret = -EINVAL;
 
        mutex_lock(&s->ops_mutex);
+       dev_dbg(&s->dev, "pcmcia_request_io: %pR , %pR", &c->io[0], &c->io[1]);
 
        if (!(s->state & SOCKET_PRESENT)) {
-               dev_dbg(&s->dev, "No card present\n");
+               dev_dbg(&s->dev, "pcmcia_request_io: No card present\n");
                goto out;
        }
 
-       if (!req)
-               goto out;
-
-       c = p_dev->function_config;
        if (c->state & CONFIG_LOCKED) {
                dev_dbg(&s->dev, "Configuration is locked\n");
                goto out;
@@ -543,40 +584,25 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req)
                dev_dbg(&s->dev, "IO already configured\n");
                goto out;
        }
-       if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)) {
-               dev_dbg(&s->dev, "bad attribute setting for IO region 1\n");
-               goto out;
-       }
-       if ((req->NumPorts2 > 0) &&
-           (req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))) {
-               dev_dbg(&s->dev, "bad attribute setting for IO region 2\n");
-               goto out;
-       }
 
-       dev_dbg(&s->dev, "trying to allocate resource 1\n");
-       ret = alloc_io_space(s, req->Attributes1, &req->BasePort1,
-                            req->NumPorts1, req->IOAddrLines);
-       if (ret) {
-               dev_dbg(&s->dev, "allocation of resource 1 failed\n");
+       ret = alloc_io_space(s, &c->io[0], p_dev->io_lines);
+       if (ret)
                goto out;
-       }
 
-       if (req->NumPorts2) {
-               dev_dbg(&s->dev, "trying to allocate resource 2\n");
-               ret = alloc_io_space(s, req->Attributes2, &req->BasePort2,
-                                    req->NumPorts2, req->IOAddrLines);
+       if (c->io[1].end) {
+               ret = alloc_io_space(s, &c->io[1], p_dev->io_lines);
                if (ret) {
-                       dev_dbg(&s->dev, "allocation of resource 2 failed\n");
-                       release_io_space(s, req->BasePort1, req->NumPorts1);
+                       release_io_space(s, &c->io[0]);
                        goto out;
                }
-       }
+       } else
+               c->io[1].start = 0;
 
-       c->io = *req;
        c->state |= CONFIG_IO_REQ;
        p_dev->_io = 1;
-       dev_dbg(&s->dev, "allocating resources succeeded: %d\n", ret);
 
+       dev_dbg(&s->dev, "pcmcia_request_io succeeded: %pR , %pR",
+               &c->io[0], &c->io[1]);
 out:
        mutex_unlock(&s->ops_mutex);
 
@@ -651,7 +677,7 @@ EXPORT_SYMBOL(__pcmcia_request_exclusive_irq);
 #ifdef CONFIG_PCMCIA_PROBE
 
 /* mask of IRQs already reserved by other cards, we should avoid using them */
-static u8 pcmcia_used_irq[NR_IRQS];
+static u8 pcmcia_used_irq[32];
 
 static irqreturn_t test_action(int cpl, void *dev_id)
 {
@@ -674,6 +700,9 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type)
        for (try = 0; try < 64; try++) {
                irq = try % 32;
 
+               if (irq > NR_IRQS)
+                       continue;
+
                /* marked as available by driver, not blocked by userspace? */
                if (!((mask >> irq) & 1))
                        continue;
@@ -767,23 +796,18 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
        struct pcmcia_socket *s = p_dev->socket;
        pccard_mem_map *win;
        u_long align;
+       struct resource *res;
        int w;
 
        if (!(s->state & SOCKET_PRESENT)) {
                dev_dbg(&s->dev, "No card present\n");
                return -ENODEV;
        }
-       if (req->Attributes & (WIN_PAGED | WIN_SHARED)) {
-               dev_dbg(&s->dev, "bad attribute setting for iomem region\n");
-               return -EINVAL;
-       }
 
        /* Window size defaults to smallest available */
        if (req->Size == 0)
                req->Size = s->map_size;
-       align = (((s->features & SS_CAP_MEM_ALIGN) ||
-                 (req->Attributes & WIN_STRICT_ALIGN)) ?
-                req->Size : s->map_size);
+       align = (s->features & SS_CAP_MEM_ALIGN) ? req->Size : s->map_size;
        if (req->Size & (s->map_size-1)) {
                dev_dbg(&s->dev, "invalid map size\n");
                return -EINVAL;
@@ -797,20 +821,21 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
                align = 0;
 
        /* Allocate system memory window */
+       mutex_lock(&s->ops_mutex);
        for (w = 0; w < MAX_WIN; w++)
                if (!(s->state & SOCKET_WIN_REQ(w)))
                        break;
        if (w == MAX_WIN) {
                dev_dbg(&s->dev, "all windows are used already\n");
+               mutex_unlock(&s->ops_mutex);
                return -EINVAL;
        }
 
-       mutex_lock(&s->ops_mutex);
        win = &s->win[w];
 
        if (!(s->features & SS_CAP_STATIC_MAP)) {
                win->res = pcmcia_find_mem_region(req->Base, req->Size, align,
-                                                     (req->Attributes & WIN_MAP_BELOW_1MB), s);
+                                               0, s);
                if (!win->res) {
                        dev_dbg(&s->dev, "allocating mem region failed\n");
                        mutex_unlock(&s->ops_mutex);
@@ -821,16 +846,8 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
 
        /* Configure the socket controller */
        win->map = w+1;
-       win->flags = 0;
+       win->flags = req->Attributes;
        win->speed = req->AccessSpeed;
-       if (req->Attributes & WIN_MEMORY_TYPE)
-               win->flags |= MAP_ATTRIB;
-       if (req->Attributes & WIN_ENABLE)
-               win->flags |= MAP_ACTIVE;
-       if (req->Attributes & WIN_DATA_WIDTH_16)
-               win->flags |= MAP_16BIT;
-       if (req->Attributes & WIN_USE_WAIT)
-               win->flags |= MAP_USE_WAIT;
        win->card_start = 0;
 
        if (s->ops->set_mem_map(s, win) != 0) {
@@ -846,8 +863,21 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
        else
                req->Base = win->res->start;
 
+       /* convert to new-style resources */
+       res = p_dev->resource[w + MAX_IO_WIN];
+       res->start = req->Base;
+       res->end = req->Base + req->Size - 1;
+       res->flags &= ~IORESOURCE_BITS;
+       res->flags |= (req->Attributes & WIN_FLAGS_MAP) | (win->map << 2);
+       res->flags |= IORESOURCE_MEM;
+       res->parent = win->res;
+       if (win->res)
+               request_resource(&iomem_resource, res);
+
+       dev_dbg(&s->dev, "request_window results in %pR\n", res);
+
        mutex_unlock(&s->ops_mutex);
-       *wh = w + 1;
+       *wh = res;
 
        return 0;
 } /* pcmcia_request_window */
@@ -855,13 +885,18 @@ EXPORT_SYMBOL(pcmcia_request_window);
 
 void pcmcia_disable_device(struct pcmcia_device *p_dev)
 {
+       int i;
+       for (i = 0; i < MAX_WIN; i++) {
+               struct resource *res = p_dev->resource[MAX_IO_WIN + i];
+               if (res->flags & WIN_FLAGS_REQ)
+                       pcmcia_release_window(p_dev, res);
+       }
+
        pcmcia_release_configuration(p_dev);
-       pcmcia_release_io(p_dev, &p_dev->io);
+       pcmcia_release_io(p_dev);
        if (p_dev->_irq) {
                free_irq(p_dev->irq, p_dev->priv);
                p_dev->_irq = 0;
        }
-       if (p_dev->win)
-               pcmcia_release_window(p_dev, p_dev->win);
 }
 EXPORT_SYMBOL(pcmcia_disable_device);
index b61a136..b8a869a 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/device.h>
 #include <linux/io.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 
index f370476..ae07b4d 100644 (file)
@@ -32,7 +32,6 @@
 #include <mach/pxa2xx-regs.h>
 #include <asm/mach-types.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cistpl.h>
 
index d0bf350..8510c35 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
@@ -88,7 +87,7 @@ static struct resource *__iodyn_find_io_region(struct pcmcia_socket *s,
 
 static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
                        unsigned int *base, unsigned int num,
-                       unsigned int align)
+                       unsigned int align, struct resource **parent)
 {
        int i, ret = 0;
 
@@ -129,6 +128,7 @@ static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
                                ((res->flags & ~IORESOURCE_BITS) |
                                        (attr & IORESOURCE_BITS));
                        s->io[i].InUse = num;
+                       *parent = res;
                        return 0;
                }
 
@@ -140,6 +140,7 @@ static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
                                continue;
                        *base = try;
                        s->io[i].InUse += num;
+                       *parent = res;
                        return 0;
                }
 
@@ -152,6 +153,7 @@ static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
                                continue;
                        *base = try;
                        s->io[i].InUse += num;
+                       *parent = res;
                        return 0;
                }
        }
@@ -164,8 +166,6 @@ struct pccard_resource_ops pccard_iodyn_ops = {
        .validate_mem = NULL,
        .find_io = iodyn_find_io,
        .find_mem = NULL,
-       .add_io = NULL,
-       .add_mem = NULL,
        .init = static_init,
        .exit = NULL,
 };
index 142efac..4e80421 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
@@ -48,11 +47,12 @@ struct resource *pcmcia_make_resource(unsigned long start, unsigned long end,
 
 static int static_find_io(struct pcmcia_socket *s, unsigned int attr,
                        unsigned int *base, unsigned int num,
-                       unsigned int align)
+                       unsigned int align, struct resource **parent)
 {
        if (!s->io_offset)
                return -EINVAL;
        *base = s->io_offset | (*base & 0x0fff);
+       *parent = NULL;
 
        return 0;
 }
@@ -62,8 +62,6 @@ struct pccard_resource_ops pccard_static_ops = {
        .validate_mem = NULL,
        .find_io = static_find_io,
        .find_mem = NULL,
-       .add_io = NULL,
-       .add_mem = NULL,
        .init = static_init,
        .exit = NULL,
 };
index dcd1a4a..96f348b 100644 (file)
@@ -28,7 +28,6 @@
 
 #include <asm/irq.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
@@ -64,6 +63,9 @@ struct socket_data {
 #define MEM_PROBE_LOW  (1 << 0)
 #define MEM_PROBE_HIGH (1 << 1)
 
+/* Action field */
+#define REMOVE_MANAGED_RESOURCE                1
+#define ADD_MANAGED_RESOURCE           2
 
 /*======================================================================
 
@@ -716,7 +718,7 @@ static struct resource *__nonstatic_find_io_region(struct pcmcia_socket *s,
 
 static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
                        unsigned int *base, unsigned int num,
-                       unsigned int align)
+                       unsigned int align, struct resource **parent)
 {
        int i, ret = 0;
 
@@ -758,6 +760,7 @@ static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
                                ((res->flags & ~IORESOURCE_BITS) |
                                        (attr & IORESOURCE_BITS));
                        s->io[i].InUse = num;
+                       *parent = res;
                        return 0;
                }
 
@@ -773,6 +776,7 @@ static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
                                        continue;
                                *base = try;
                                s->io[i].InUse += num;
+                               *parent = res;
                                return 0;
                        }
                }
@@ -791,6 +795,7 @@ static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
                                        continue;
                                *base = try;
                                s->io[i].InUse += num;
+                               *parent = res;
                                return 0;
                        }
                }
@@ -1055,8 +1060,6 @@ struct pccard_resource_ops pccard_nonstatic_ops = {
        .validate_mem = pcmcia_nonstatic_validate_mem,
        .find_io = nonstatic_find_io,
        .find_mem = nonstatic_find_mem_region,
-       .add_io = adjust_io,
-       .add_mem = adjust_memory,
        .init = nonstatic_init,
        .exit = nonstatic_release_resource_db,
 };
@@ -1115,8 +1118,6 @@ static ssize_t store_io_db(struct device *dev,
 
        mutex_lock(&s->ops_mutex);
        ret = adjust_io(s, add, start_addr, end_addr);
-       if (!ret)
-               s->resource_setup_new = 1;
        mutex_unlock(&s->ops_mutex);
 
        return ret ? ret : count;
@@ -1183,8 +1184,6 @@ static ssize_t store_mem_db(struct device *dev,
 
        mutex_lock(&s->ops_mutex);
        ret = adjust_memory(s, add, start_addr, end_addr);
-       if (!ret)
-               s->resource_setup_new = 1;
        mutex_unlock(&s->ops_mutex);
 
        return ret ? ret : count;
index edbd8c4..e098514 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/slab.h>
 #include <linux/platform_device.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/ss.h>
 
index e40824c..3fba3a6 100644 (file)
@@ -11,7 +11,6 @@
 
 /* include the world */
 #include <linux/cpufreq.h>
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cistpl.h>
index 80e36bc..cb0d3ac 100644 (file)
@@ -26,7 +26,6 @@
 #include <asm/system.h>
 #include <asm/irq.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
index 56004a1..be0d841 100644 (file)
@@ -49,7 +49,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/ss.h>
 #include "tcic.h"
index 201ccfa..fa88c36 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cistpl.h>
index f1d4137..414d9a6 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/io.h>
 #include <linux/slab.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/ss.h>
 #include <pcmcia/cs.h>
 
index 9d70aef..61f49bd 100644 (file)
@@ -49,7 +49,6 @@
 #include <scsi/scsi_host.h>
 #include "aha152x.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -101,9 +100,8 @@ static int aha152x_probe(struct pcmcia_device *link)
     info->p_dev = link;
     link->priv = info;
 
-    link->io.NumPorts1 = 0x20;
-    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-    link->io.IOAddrLines = 10;
+    link->resource[0]->end = 0x20;
+    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
     link->conf.Attributes = CONF_ENABLE_IRQ;
     link->conf.IntType = INT_MEMORY_AND_IO;
     link->conf.Present = PRESENT_OPTION;
@@ -131,15 +129,16 @@ static int aha152x_config_check(struct pcmcia_device *p_dev,
                                unsigned int vcc,
                                void *priv_data)
 {
+       p_dev->io_lines = 10;
        /* For New Media T&J, look for a SCSI window */
        if (cfg->io.win[0].len >= 0x20)
-               p_dev->io.BasePort1 = cfg->io.win[0].base;
+               p_dev->resource[0]->start = cfg->io.win[0].base;
        else if ((cfg->io.nwin > 1) &&
                 (cfg->io.win[1].len >= 0x20))
-               p_dev->io.BasePort1 = cfg->io.win[1].base;
+               p_dev->resource[0]->start = cfg->io.win[1].base;
        if ((cfg->io.nwin > 0) &&
-           (p_dev->io.BasePort1 < 0xffff)) {
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+           (p_dev->resource[0]->start < 0xffff)) {
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        }
        return -EINVAL;
@@ -168,7 +167,7 @@ static int aha152x_config_cs(struct pcmcia_device *link)
     /* Set configuration options for the aha152x driver */
     memset(&s, 0, sizeof(s));
     s.conf        = "PCMCIA setup";
-    s.io_port     = link->io.BasePort1;
+    s.io_port     = link->resource[0]->start;
     s.irq         = link->irq;
     s.scsiid      = host_id;
     s.reconnect   = reconnect;
index 21b1411..13dbe5c 100644 (file)
@@ -46,7 +46,6 @@
 #include <scsi/scsi_host.h>
 #include "fdomain.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -84,9 +83,8 @@ static int fdomain_probe(struct pcmcia_device *link)
 
        info->p_dev = link;
        link->priv = info;
-       link->io.NumPorts1 = 0x10;
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       link->io.IOAddrLines = 10;
+       link->resource[0]->end = 0x10;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
        link->conf.Present = PRESENT_OPTION;
@@ -113,8 +111,9 @@ static int fdomain_config_check(struct pcmcia_device *p_dev,
                                unsigned int vcc,
                                void *priv_data)
 {
-       p_dev->io.BasePort1 = cfg->io.win[0].base;
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       p_dev->io_lines = 10;
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       return pcmcia_request_io(p_dev);
 }
 
 
@@ -138,10 +137,10 @@ static int fdomain_config(struct pcmcia_device *link)
            goto failed;
 
     /* A bad hack... */
-    release_region(link->io.BasePort1, link->io.NumPorts1);
+    release_region(link->resource[0]->start, resource_size(link->resource[0]));
 
     /* Set configuration options for the fdomain driver */
-    sprintf(str, "%d,%d", link->io.BasePort1, link->irq);
+    sprintf(str, "%d,%d", (unsigned int) link->resource[0]->start, link->irq);
     fdomain_setup(str);
 
     host = __fdomain_16x0_detect(&fdomain_driver_template);
index 0f0e112..dd9b403 100644 (file)
@@ -47,7 +47,6 @@
 #include <scsi/scsi.h>
 #include <scsi/scsi_ioctl.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -1559,9 +1558,8 @@ static int nsp_cs_probe(struct pcmcia_device *link)
        nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
 
        /* The io structure describes IO port mapping */
-       link->io.NumPorts1       = 0x10;
-       link->io.Attributes1     = IO_DATA_PATH_WIDTH_AUTO;
-       link->io.IOAddrLines     = 10;  /* not used */
+       link->resource[0]->end   = 0x10;
+       link->resource[0]->flags = IO_DATA_PATH_WIDTH_AUTO;
 
        /* General socket configuration */
        link->conf.Attributes    = CONF_ENABLE_IRQ;
@@ -1642,29 +1640,27 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev,
                p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
                /* IO window settings */
-               p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+               p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
                if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                        cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-                       if (!(io->flags & CISTPL_IO_8BIT))
-                               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-                       if (!(io->flags & CISTPL_IO_16BIT))
-                               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-                       p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-                       p_dev->io.BasePort1 = io->win[0].base;
-                       p_dev->io.NumPorts1 = io->win[0].len;
+                       p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+                       p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+                       p_dev->resource[0]->flags |=
+                               pcmcia_io_cfg_data_width(io->flags);
+                       p_dev->resource[0]->start = io->win[0].base;
+                       p_dev->resource[0]->end = io->win[0].len;
                        if (io->nwin > 1) {
-                               p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                               p_dev->io.BasePort2 = io->win[1].base;
-                               p_dev->io.NumPorts2 = io->win[1].len;
+                               p_dev->resource[1]->flags =
+                                       p_dev->resource[0]->flags;
+                               p_dev->resource[1]->start = io->win[1].base;
+                               p_dev->resource[1]->end = io->win[1].len;
                        }
                        /* This reserves IO space but doesn't actually enable it */
-                       if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+                       if (pcmcia_request_io(p_dev) != 0)
                                goto next_entry;
                }
 
                if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
-                       memreq_t        map;
                        cistpl_mem_t    *mem =
                                (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
                        cfg_mem->req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
@@ -1676,8 +1672,8 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev,
                        cfg_mem->req.AccessSpeed = 0;
                        if (pcmcia_request_window(p_dev, &cfg_mem->req, &p_dev->win) != 0)
                                goto next_entry;
-                       map.Page = 0; map.CardOffset = mem->win[0].card_addr;
-                       if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
+                       if (pcmcia_map_mem_page(p_dev, p_dev->win,
+                                       mem->win[0].card_addr) != 0)
                                goto next_entry;
 
                        cfg_mem->data->MmioAddress = (unsigned long) ioremap_nocache(cfg_mem->req.Base, cfg_mem->req.Size);
@@ -1720,17 +1716,19 @@ static int nsp_cs_config(struct pcmcia_device *link)
                goto cs_failed;
 
        if (free_ports) {
-               if (link->io.BasePort1) {
-                       release_region(link->io.BasePort1, link->io.NumPorts1);
+               if (link->resource[0]) {
+                       release_region(link->resource[0]->start,
+                                       resource_size(link->resource[0]));
                }
-               if (link->io.BasePort2) {
-                       release_region(link->io.BasePort2, link->io.NumPorts2);
+               if (link->resource[1]) {
+                       release_region(link->resource[1]->start,
+                                       resource_size(link->resource[1]));
                }
        }
 
        /* Set port and IRQ */
-       data->BaseAddress = link->io.BasePort1;
-       data->NumAddress  = link->io.NumPorts1;
+       data->BaseAddress = link->resource[0]->start;
+       data->NumAddress  = resource_size(link->resource[0]);
        data->IrqNumber   = link->irq;
 
        nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
@@ -1765,13 +1763,10 @@ static int nsp_cs_config(struct pcmcia_device *link)
        if (link->conf.Attributes & CONF_ENABLE_IRQ) {
                printk(", irq %d", link->irq);
        }
-       if (link->io.NumPorts1) {
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1+link->io.NumPorts1-1);
-       }
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2+link->io.NumPorts2-1);
+       if (link->resource[0])
+               printk(", io %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        if (link->win)
                printk(", mem 0x%06lx-0x%06lx", cfg_mem->req.Base,
                       cfg_mem->req.Base+cfg_mem->req.Size-1);
index f0fc6ba..eb775f1 100644 (file)
@@ -48,7 +48,6 @@
 #include <scsi/scsi_host.h>
 #include "../qlogicfas408.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -157,9 +156,8 @@ static int qlogic_probe(struct pcmcia_device *link)
                return -ENOMEM;
        info->p_dev = link;
        link->priv = info;
-       link->io.NumPorts1 = 16;
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       link->io.IOAddrLines = 10;
+       link->resource[0]->end = 16;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
        link->conf.Present = PRESENT_OPTION;
@@ -186,13 +184,14 @@ static int qlogic_config_check(struct pcmcia_device *p_dev,
                               unsigned int vcc,
                               void *priv_data)
 {
-       p_dev->io.BasePort1 = cfg->io.win[0].base;
-       p_dev->io.NumPorts1 = cfg->io.win[0].len;
+       p_dev->io_lines = 10;
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
 
-       if (p_dev->io.BasePort1 == 0)
+       if (p_dev->resource[0]->start == 0)
                return -ENODEV;
 
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       return pcmcia_request_io(p_dev);
 }
 
 static int qlogic_config(struct pcmcia_device * link)
@@ -216,18 +215,18 @@ static int qlogic_config(struct pcmcia_device * link)
 
        if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {
                /* set ATAcmd */
-               outb(0xb4, link->io.BasePort1 + 0xd);
-               outb(0x24, link->io.BasePort1 + 0x9);
-               outb(0x04, link->io.BasePort1 + 0xd);
+               outb(0xb4, link->resource[0]->start + 0xd);
+               outb(0x24, link->resource[0]->start + 0x9);
+               outb(0x04, link->resource[0]->start + 0xd);
        }
 
        /* The KXL-810AN has a bigger IO port window */
-       if (link->io.NumPorts1 == 32)
+       if (resource_size(link->resource[0]) == 32)
                host = qlogic_detect(&qlogicfas_driver_template, link,
-                       link->io.BasePort1 + 16, link->irq);
+                       link->resource[0]->start + 16, link->irq);
        else
                host = qlogic_detect(&qlogicfas_driver_template, link,
-                       link->io.BasePort1, link->irq);
+                       link->resource[0]->start, link->irq);
        
        if (!host) {
                printk(KERN_INFO "%s: no SCSI devices found\n", qlogic_name);
@@ -269,9 +268,9 @@ static int qlogic_resume(struct pcmcia_device *link)
        if ((info->manf_id == MANFID_MACNICA) ||
            (info->manf_id == MANFID_PIONEER) ||
            (info->manf_id == 0x0098)) {
-               outb(0x80, link->io.BasePort1 + 0xd);
-               outb(0x24, link->io.BasePort1 + 0x9);
-               outb(0x04, link->io.BasePort1 + 0xd);
+               outb(0x80, link->resource[0]->start + 0xd);
+               outb(0x24, link->resource[0]->start + 0x9);
+               outb(0x04, link->resource[0]->start + 0xd);
        }
        /* Ugggglllyyyy!!! */
        qlogicfas408_bus_reset(NULL);
index a511641..321e390 100644 (file)
@@ -71,7 +71,6 @@
 #include <scsi/scsi.h>
 #include <scsi/scsi_host.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -691,13 +690,14 @@ static int SYM53C500_config_check(struct pcmcia_device *p_dev,
                                  unsigned int vcc,
                                  void *priv_data)
 {
-       p_dev->io.BasePort1 = cfg->io.win[0].base;
-       p_dev->io.NumPorts1 = cfg->io.win[0].len;
+       p_dev->io_lines = 10;
+       p_dev->resource[0]->start = cfg->io.win[0].base;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
 
-       if (p_dev->io.BasePort1 == 0)
+       if (p_dev->resource[0]->start == 0)
                return -ENODEV;
 
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       return pcmcia_request_io(p_dev);
 }
 
 static int
@@ -734,9 +734,9 @@ SYM53C500_config(struct pcmcia_device *link)
            (info->manf_id == MANFID_PIONEER) ||
            (info->manf_id == 0x0098)) {
                /* set ATAcmd */
-               outb(0xb4, link->io.BasePort1 + 0xd);
-               outb(0x24, link->io.BasePort1 + 0x9);
-               outb(0x04, link->io.BasePort1 + 0xd);
+               outb(0xb4, link->resource[0]->start + 0xd);
+               outb(0x24, link->resource[0]->start + 0x9);
+               outb(0x04, link->resource[0]->start + 0xd);
        }
 
        /*
@@ -749,7 +749,7 @@ SYM53C500_config(struct pcmcia_device *link)
        *       0x130, 0x230, 0x280, 0x290,
        *       0x320, 0x330, 0x340, 0x350
        */
-       port_base = link->io.BasePort1;
+       port_base = link->resource[0]->start;
        irq_level = link->irq;
 
        DEB(printk("SYM53C500: port_base=0x%x, irq=%d, fast_pio=%d\n",
@@ -822,15 +822,15 @@ static int sym53c500_resume(struct pcmcia_device *link)
        if ((info->manf_id == MANFID_MACNICA) ||
            (info->manf_id == MANFID_PIONEER) ||
            (info->manf_id == 0x0098)) {
-               outb(0x80, link->io.BasePort1 + 0xd);
-               outb(0x24, link->io.BasePort1 + 0x9);
-               outb(0x04, link->io.BasePort1 + 0xd);
+               outb(0x80, link->resource[0]->start + 0xd);
+               outb(0x24, link->resource[0]->start + 0x9);
+               outb(0x04, link->resource[0]->start + 0xd);
        }
        /*
         *  If things don't work after a "resume",
         *  this is a good place to start looking.
         */
-       SYM53C500_int_host_reset(link->io.BasePort1);
+       SYM53C500_int_host_reset(link->resource[0]->start);
 
        return 0;
 }
@@ -859,9 +859,8 @@ SYM53C500_probe(struct pcmcia_device *link)
                return -ENOMEM;
        info->p_dev = link;
        link->priv = info;
-       link->io.NumPorts1 = 16;
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       link->io.IOAddrLines = 10;
+       link->resource[0]->end = 16;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
 
index ab17c08..141c695 100644 (file)
@@ -45,7 +45,6 @@
 #include <asm/io.h>
 #include <asm/system.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
@@ -115,16 +114,14 @@ static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_
 
 static int quirk_post_ibm(struct pcmcia_device *link)
 {
-       conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
+       u8 val;
        int ret;
 
-       ret = pcmcia_access_configuration_register(link, &reg);
+       ret = pcmcia_read_config_byte(link, 0x800, &val);
        if (ret)
                goto failed;
 
-       reg.Action = CS_WRITE;
-       reg.Value = reg.Value | 1;
-       ret = pcmcia_access_configuration_register(link, &reg);
+       ret = pcmcia_write_config_byte(link, 0x800, val | 1);
        if (ret)
                goto failed;
        return 0;
@@ -338,8 +335,8 @@ static int serial_probe(struct pcmcia_device *link)
        info->p_dev = link;
        link->priv = info;
 
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->io.NumPorts1 = 8;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       link->resource[0]->end = 8;
        link->conf.Attributes = CONF_ENABLE_IRQ;
        if (do_sound) {
                link->conf.Attributes |= CONF_ENABLE_SPKR;
@@ -427,12 +424,13 @@ static int simple_config_check(struct pcmcia_device *p_dev,
                p_dev->conf.Vpp =
                        cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
 
+       p_dev->io_lines = ((*try & 0x1) == 0) ?
+                       16 : cf->io.flags & CISTPL_IO_LINES_MASK;
+
        if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[(*try >> 1)])
            && (cf->io.win[0].base != 0)) {
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               p_dev->io.IOAddrLines = ((*try & 0x1) == 0) ?
-                       16 : cf->io.flags & CISTPL_IO_LINES_MASK;
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               p_dev->resource[0]->start = cf->io.win[0].base;
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        }
        return -EINVAL;
@@ -449,9 +447,9 @@ static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
 
        if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
                for (j = 0; j < 5; j++) {
-                       p_dev->io.BasePort1 = base[j];
-                       p_dev->io.IOAddrLines = base[j] ? 16 : 3;
-                       if (!pcmcia_request_io(p_dev, &p_dev->io))
+                       p_dev->resource[0]->start = base[j];
+                       p_dev->io_lines = base[j] ? 16 : 3;
+                       if (!pcmcia_request_io(p_dev))
                                return 0;
                }
        }
@@ -466,13 +464,13 @@ static int simple_config(struct pcmcia_device *link)
        /* If the card is already configured, look up the port and irq */
        if (link->function_config) {
                unsigned int port = 0;
-               if ((link->io.BasePort2 != 0) &&
-                   (link->io.NumPorts2 == 8)) {
-                       port = link->io.BasePort2;
+               if ((link->resource[1]->end != 0) &&
+                       (resource_size(link->resource[1]) == 8)) {
+                       port = link->resource[1]->end;
                        info->slave = 1;
                } else if ((info->manfid == MANFID_OSITECH) &&
-                          (link->io.NumPorts1 == 0x40)) {
-                       port = link->io.BasePort1 + 0x28;
+                       (resource_size(link->resource[0]) == 0x40)) {
+                       port = link->resource[0]->start + 0x28;
                        info->slave = 1;
                }
                if (info->slave) {
@@ -510,7 +508,7 @@ found_port:
        i = pcmcia_request_configuration(link, &link->conf);
        if (i != 0)
                return -1;
-       return setup_serial(link, info, link->io.BasePort1, link->irq);
+       return setup_serial(link, info, link->resource[0]->start, link->irq);
 }
 
 static int multi_config_check(struct pcmcia_device *p_dev,
@@ -524,10 +522,10 @@ static int multi_config_check(struct pcmcia_device *p_dev,
        /* The quad port cards have bad CIS's, so just look for a
           window larger than 8 ports and assume it will be right */
        if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) {
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
-               if (!pcmcia_request_io(p_dev, &p_dev->io)) {
-                       *base2 = p_dev->io.BasePort1 + 8;
+               p_dev->resource[0]->start = cf->io.win[0].base;
+               p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
+               if (!pcmcia_request_io(p_dev)) {
+                       *base2 = p_dev->resource[0]->start + 8;
                        return 0;
                }
        }
@@ -543,11 +541,11 @@ static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
        int *base2 = priv_data;
 
        if (cf->io.nwin == 2) {
-               p_dev->io.BasePort1 = cf->io.win[0].base;
-               p_dev->io.BasePort2 = cf->io.win[1].base;
-               p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
-               if (!pcmcia_request_io(p_dev, &p_dev->io)) {
-                       *base2 = p_dev->io.BasePort2;
+               p_dev->resource[0]->start = cf->io.win[0].base;
+               p_dev->resource[1]->start = cf->io.win[1].base;
+               p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
+               if (!pcmcia_request_io(p_dev)) {
+                       *base2 = p_dev->resource[1]->start;
                        return 0;
                }
        }
@@ -560,10 +558,10 @@ static int multi_config(struct pcmcia_device *link)
        int i, base2 = 0;
 
        /* First, look for a generic full-sized window */
-       link->io.NumPorts1 = info->multi * 8;
+       link->resource[0]->end = info->multi * 8;
        if (pcmcia_loop_config(link, multi_config_check, &base2)) {
                /* If that didn't work, look for two windows */
-               link->io.NumPorts1 = link->io.NumPorts2 = 8;
+               link->resource[0]->end = link->resource[1]->end = 8;
                info->multi = 2;
                if (pcmcia_loop_config(link, multi_config_check_notpicky,
                                       &base2)) {
@@ -599,9 +597,9 @@ static int multi_config(struct pcmcia_device *link)
                    link->conf.ConfigIndex == 3) {
                        err = setup_serial(link, info, base2,
                                        link->irq);
-                       base2 = link->io.BasePort1;
+                       base2 = link->resource[0]->start;;
                } else {
-                       err = setup_serial(link, info, link->io.BasePort1,
+                       err = setup_serial(link, info, link->resource[0]->start,
                                        link->irq);
                }
                info->c950ctrl = base2;
@@ -616,7 +614,7 @@ static int multi_config(struct pcmcia_device *link)
                return 0;
        }
 
-       setup_serial(link, info, link->io.BasePort1, link->irq);
+       setup_serial(link, info, link->resource[0]->start, link->irq);
        for (i = 0; i < info->multi - 1; i++)
                setup_serial(link, info, base2 + (8 * i),
                                link->irq);
index 7cee7f4..7892ac1 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/mmc/sdio_func.h>
 #include <linux/slab.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
index e72f404..526682d 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/io.h>
 #include <linux/etherdevice.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ciscode.h>
 /* Write to a PCMCIA configuration register. */
 static int ssb_pcmcia_cfg_write(struct ssb_bus *bus, u8 offset, u8 value)
 {
-       conf_reg_t reg;
        int res;
 
-       memset(&reg, 0, sizeof(reg));
-       reg.Offset = offset;
-       reg.Action = CS_WRITE;
-       reg.Value = value;
-       res = pcmcia_access_configuration_register(bus->host_pcmcia, &reg);
+       res = pcmcia_write_config_byte(bus->host_pcmcia, offset, value);
        if (unlikely(res != 0))
                return -EBUSY;
 
@@ -89,16 +83,11 @@ static int ssb_pcmcia_cfg_write(struct ssb_bus *bus, u8 offset, u8 value)
 /* Read from a PCMCIA configuration register. */
 static int ssb_pcmcia_cfg_read(struct ssb_bus *bus, u8 offset, u8 *value)
 {
-       conf_reg_t reg;
        int res;
 
-       memset(&reg, 0, sizeof(reg));
-       reg.Offset = offset;
-       reg.Action = CS_READ;
-       res = pcmcia_access_configuration_register(bus->host_pcmcia, &reg);
+       res = pcmcia_read_config_byte(bus->host_pcmcia, offset, value);
        if (unlikely(res != 0))
                return -EBUSY;
-       *value = reg.Value;
 
        return 0;
 }
index 0d6c028..9738cad 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/pci.h>
 #include <linux/io.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
index 6d893c6..f8ede11 100644 (file)
@@ -37,7 +37,6 @@ Status: experimental
 #include <linux/delay.h>
 #include <linux/pci.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -171,7 +170,7 @@ static int das16cs_attach(struct comedi_device *dev,
        if (!link)
                return -EIO;
 
-       dev->iobase = link->io.BasePort1;
+       dev->iobase = link->resource[0]->start;;
        printk("I/O base=0x%04lx ", dev->iobase);
 
        printk("fingerprint:\n");
@@ -662,14 +661,6 @@ static void das16cs_pcmcia_detach(struct pcmcia_device *);
    less on other parts of the kernel.
 */
 
-/*
-   The dev_info variable is the "key" that is used to match up this
-   device driver with appropriate cards, through the card configuration
-   database.
-*/
-
-static dev_info_t dev_info = "cb_das16_cs";
-
 struct local_info_t {
        struct pcmcia_device *link;
        int stop;
@@ -736,24 +727,22 @@ static int das16cs_pcmcia_config_loop(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
                /* This reserves IO space but doesn't actually enable it */
-               return pcmcia_request_io(p_dev, &p_dev->io);
+               return pcmcia_request_io(p_dev);
        }
 
        return 0;
@@ -787,12 +776,10 @@ static void das16cs_pcmcia_config(struct pcmcia_device *link)
        dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
        if (link->conf.Attributes & CONF_ENABLE_IRQ)
                printk(", irq %u", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1 + link->io.NumPorts1 - 1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2 + link->io.NumPorts2 - 1);
+       if (link->resource[0])
+               printk(", io %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(", io %pR", link->resource[1]);
        printk("\n");
 
        return;
@@ -846,7 +833,7 @@ struct pcmcia_driver das16cs_driver = {
        .id_table = das16cs_id_table,
        .owner = THIS_MODULE,
        .drv = {
-               .name = dev_info,
+               .name = "cb_das16_cs",
                },
 };
 
index fb561ab..c6aa52f 100644 (file)
@@ -48,7 +48,6 @@ Command support does not exist, but could be added for this board.
 #include "das08.h"
 
 /* pcmcia includes */
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -89,7 +88,7 @@ static int das08_cs_attach(struct comedi_device *dev,
                        printk(" no pcmcia cards found\n");
                        return -EIO;
                }
-               iobase = link->io.BasePort1;
+               iobase = link->resource[0]->start;
        } else {
                printk(" bug! board does not have PCMCIA bustype\n");
                return -EINVAL;
@@ -132,14 +131,6 @@ static void das08_pcmcia_detach(struct pcmcia_device *);
    less on other parts of the kernel.
 */
 
-/*
-   The dev_info variable is the "key" that is used to match up this
-   device driver with appropriate cards, through the card configuration
-   database.
-*/
-
-static const dev_info_t dev_info = "pcm-das08";
-
 struct local_info_t {
        struct pcmcia_device *link;
        int stop;
@@ -224,24 +215,23 @@ static int das08_pcmcia_config_loop(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
                p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
                /* This reserves IO space but doesn't actually enable it */
-               return pcmcia_request_io(p_dev, &p_dev->io);
+               return pcmcia_request_io(p_dev);
        }
        return 0;
 }
@@ -283,12 +273,10 @@ static void das08_pcmcia_config(struct pcmcia_device *link)
        dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
        if (link->conf.Attributes & CONF_ENABLE_IRQ)
                printk(", irq %u", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1 + link->io.NumPorts1 - 1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2 + link->io.NumPorts2 - 1);
+       if (link->resource[0])
+               printk(", io %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        printk("\n");
 
        return;
@@ -362,7 +350,7 @@ struct pcmcia_driver das08_cs_driver = {
        .id_table = das08_cs_id_table,
        .owner = THIS_MODULE,
        .drv = {
-               .name = dev_info,
+               .name = "pcm-das08",
                },
 };
 
index 701abd9..cc15666 100644 (file)
@@ -47,7 +47,6 @@ IRQ is assigned but not used.
 
 #include <linux/ioport.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -377,7 +376,7 @@ static int dio700_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                link = pcmcia_cur_dev;  /* XXX hack */
                if (!link)
                        return -EIO;
-               iobase = link->io.BasePort1;
+               iobase = link->resource[0]->start;
 #ifdef incomplete
                irq = link->irq;
 #endif
@@ -459,14 +458,6 @@ static void dio700_cs_detach(struct pcmcia_device *);
    less on other parts of the kernel.
 */
 
-/*
-   The dev_info variable is the "key" that is used to match up this
-   device driver with appropriate cards, through the card configuration
-   database.
-*/
-
-static const dev_info_t dev_info = "ni_daq_700";
-
 struct local_info_t {
        struct pcmcia_device *link;
        int stop;
@@ -555,9 +546,6 @@ static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                unsigned int vcc,
                                void *priv_data)
 {
-       win_req_t *req = priv_data;
-       memreq_t map;
-
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -571,44 +559,25 @@ static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
                /* This reserves IO space but doesn't actually enable it */
-               if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+               if (pcmcia_request_io(p_dev) != 0)
                        return -ENODEV;
        }
 
-       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
-               cistpl_mem_t *mem =
-                       (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
-               req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
-               req->Attributes |= WIN_ENABLE;
-               req->Base = mem->win[0].host_addr;
-               req->Size = mem->win[0].len;
-               if (req->Size < 0x1000)
-                       req->Size = 0x1000;
-               req->AccessSpeed = 0;
-               if (pcmcia_request_window(p_dev, req, &p_dev->win))
-                       return -ENODEV;
-               map.Page = 0;
-               map.CardOffset = mem->win[0].card_addr;
-               if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
-                       return -ENODEV;
-       }
        /* If we got this far, we're cool! */
        return 0;
 }
@@ -622,7 +591,7 @@ static void dio700_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "dio700_config\n");
 
-       ret = pcmcia_loop_config(link, dio700_pcmcia_config_loop, &req);
+       ret = pcmcia_loop_config(link, dio700_pcmcia_config_loop, NULL);
        if (ret) {
                dev_warn(&link->dev, "no configuration found\n");
                goto failed;
@@ -644,15 +613,10 @@ static void dio700_config(struct pcmcia_device *link)
        dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
        if (link->conf.Attributes & CONF_ENABLE_IRQ)
                printk(", irq %d", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1 + link->io.NumPorts1 - 1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2 + link->io.NumPorts2 - 1);
-       if (link->win)
-               printk(", mem 0x%06lx-0x%06lx", req.Base,
-                      req.Base + req.Size - 1);
+       if (link->resource[0])
+               printk(", io %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        printk("\n");
 
        return;
@@ -722,7 +686,7 @@ struct pcmcia_driver dio700_cs_driver = {
        .id_table = dio700_cs_ids,
        .owner = THIS_MODULE,
        .drv = {
-               .name = dev_info,
+               .name = "ni_daq_700",
                },
 };
 
index 0b65f24..773ae20 100644 (file)
@@ -48,7 +48,6 @@ the PCMCIA interface.
 
 #include "8255.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -129,7 +128,7 @@ static int dio24_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                link = pcmcia_cur_dev;  /* XXX hack */
                if (!link)
                        return -EIO;
-               iobase = link->io.BasePort1;
+               iobase = link->resource[0]->start;
 #ifdef incomplete
                irq = link->irq;
 #endif
@@ -211,14 +210,6 @@ static void dio24_cs_detach(struct pcmcia_device *);
    less on other parts of the kernel.
 */
 
-/*
-   The dev_info variable is the "key" that is used to match up this
-   device driver with appropriate cards, through the card configuration
-   database.
-*/
-
-static const dev_info_t dev_info = "ni_daq_dio24";
-
 struct local_info_t {
        struct pcmcia_device *link;
        int stop;
@@ -307,9 +298,6 @@ static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                unsigned int vcc,
                                void *priv_data)
 {
-       win_req_t *req = priv_data;
-       memreq_t map;
-
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -323,44 +311,25 @@ static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
                /* This reserves IO space but doesn't actually enable it */
-               if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+               if (pcmcia_request_io(p_dev) != 0)
                        return -ENODEV;
        }
 
-       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
-               cistpl_mem_t *mem =
-                       (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
-               req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
-               req->Attributes |= WIN_ENABLE;
-               req->Base = mem->win[0].host_addr;
-               req->Size = mem->win[0].len;
-               if (req->Size < 0x1000)
-                       req->Size = 0x1000;
-               req->AccessSpeed = 0;
-               if (pcmcia_request_window(p_dev, req, &p_dev->win))
-                       return -ENODEV;
-               map.Page = 0;
-               map.CardOffset = mem->win[0].card_addr;
-               if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
-                       return -ENODEV;
-       }
        /* If we got this far, we're cool! */
        return 0;
 }
@@ -368,13 +337,12 @@ static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
 static void dio24_config(struct pcmcia_device *link)
 {
        int ret;
-       win_req_t req;
 
        printk(KERN_INFO "ni_daq_dio24: HOLA SOY YO! - config\n");
 
        dev_dbg(&link->dev, "dio24_config\n");
 
-       ret = pcmcia_loop_config(link, dio24_pcmcia_config_loop, &req);
+       ret = pcmcia_loop_config(link, dio24_pcmcia_config_loop, NULL);
        if (ret) {
                dev_warn(&link->dev, "no configuration found\n");
                goto failed;
@@ -396,15 +364,10 @@ static void dio24_config(struct pcmcia_device *link)
        dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
        if (link->conf.Attributes & CONF_ENABLE_IRQ)
                printk(", irq %d", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1 + link->io.NumPorts1 - 1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2 + link->io.NumPorts2 - 1);
-       if (link->win)
-               printk(", mem 0x%06lx-0x%06lx", req.Base,
-                      req.Base + req.Size - 1);
+       if (link->resource[0])
+               printk(" & %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        printk("\n");
 
        return;
@@ -473,7 +436,7 @@ struct pcmcia_driver dio24_cs_driver = {
        .id_table = dio24_cs_ids,
        .owner = THIS_MODULE,
        .drv = {
-               .name = dev_info,
+               .name = "ni_daq_dio24",
                },
 };
 
index 163245e..68c4ecb 100644 (file)
@@ -71,7 +71,6 @@ NI manuals:
 #include "comedi_fc.h"
 #include "ni_labpc.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -143,7 +142,7 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                link = pcmcia_cur_dev;  /* XXX hack */
                if (!link)
                        return -EIO;
-               iobase = link->io.BasePort1;
+               iobase = link->resource[0]->start;
                irq = link->irq;
                break;
        default:
@@ -189,14 +188,6 @@ static void labpc_cs_detach(struct pcmcia_device *);
    less on other parts of the kernel.
 */
 
-/*
-   The dev_info variable is the "key" that is used to match up this
-   device driver with appropriate cards, through the card configuration
-   database.
-*/
-
-static const dev_info_t dev_info = "daqcard-1200";
-
 struct local_info_t {
        struct pcmcia_device *link;
        int stop;
@@ -286,9 +277,6 @@ static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                unsigned int vcc,
                                void *priv_data)
 {
-       win_req_t *req = priv_data;
-       memreq_t map;
-
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -302,44 +290,25 @@ static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
                /* This reserves IO space but doesn't actually enable it */
-               if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
+               if (pcmcia_request_io(p_dev) != 0)
                        return -ENODEV;
        }
 
-       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
-               cistpl_mem_t *mem =
-                       (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
-               req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
-               req->Attributes |= WIN_ENABLE;
-               req->Base = mem->win[0].host_addr;
-               req->Size = mem->win[0].len;
-               if (req->Size < 0x1000)
-                       req->Size = 0x1000;
-               req->AccessSpeed = 0;
-               if (pcmcia_request_window(p_dev, req, &p_dev->win))
-                       return -ENODEV;
-               map.Page = 0;
-               map.CardOffset = mem->win[0].card_addr;
-               if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
-                       return -ENODEV;
-       }
        /* If we got this far, we're cool! */
        return 0;
 }
@@ -348,11 +317,10 @@ static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
 static void labpc_config(struct pcmcia_device *link)
 {
        int ret;
-       win_req_t req;
 
        dev_dbg(&link->dev, "labpc_config\n");
 
-       ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, &req);
+       ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL);
        if (ret) {
                dev_warn(&link->dev, "no configuration found\n");
                goto failed;
@@ -374,15 +342,10 @@ static void labpc_config(struct pcmcia_device *link)
        dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
        if (link->conf.Attributes & CONF_ENABLE_IRQ)
                printk(", irq %d", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1 + link->io.NumPorts1 - 1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2 + link->io.NumPorts2 - 1);
-       if (link->win)
-               printk(", mem 0x%06lx-0x%06lx", req.Base,
-                      req.Base + req.Size - 1);
+       if (link->resource[0])
+               printk(" & %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        printk("\n");
 
        return;
@@ -449,7 +412,7 @@ struct pcmcia_driver labpc_cs_driver = {
        .id_table = labpc_cs_ids,
        .owner = THIS_MODULE,
        .drv = {
-               .name = dev_info,
+               .name = "daqcard-1200",
                },
 };
 
index 3a46f0c..1f24263 100644 (file)
@@ -48,7 +48,6 @@ See the notes in the ni_atmio.o driver.
 #include "ni_stc.h"
 #include "8255.h"
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -261,12 +260,11 @@ static void cs_release(struct pcmcia_device *link);
 static void cs_detach(struct pcmcia_device *);
 
 static struct pcmcia_device *cur_dev = NULL;
-static const dev_info_t dev_info = "ni_mio_cs";
 
 static int cs_attach(struct pcmcia_device *link)
 {
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-       link->io.NumPorts1 = 16;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
+       link->resource[0]->end = 16;
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
 
@@ -311,13 +309,12 @@ static int mio_pcmcia_config_loop(struct pcmcia_device *p_dev,
 {
        int base, ret;
 
-       p_dev->io.NumPorts1 = cfg->io.win[0].len;
-       p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
-       p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = cfg->io.win[0].len;
+       p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
 
        for (base = 0x000; base < 0x400; base += 0x20) {
-               p_dev->io.BasePort1 = base;
-               ret = pcmcia_request_io(p_dev, &p_dev->io);
+               p_dev->resource[0]->start = base;
+               ret = pcmcia_request_io(p_dev);
                if (!ret)
                        return 0;
        }
@@ -356,7 +353,7 @@ static int mio_cs_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                return -EIO;
 
        dev->driver = &driver_ni_mio_cs;
-       dev->iobase = link->io.BasePort1;
+       dev->iobase = link->resource[0]->start;
 
        irq = link->irq;
 
@@ -450,7 +447,7 @@ struct pcmcia_driver ni_mio_cs_driver = {
        .id_table = ni_mio_cs_ids,
        .owner = THIS_MODULE,
        .drv = {
-               .name = dev_info,
+               .name = "ni_mio_cs",
                },
 };
 
index 8b49cb1..bf489d7 100644 (file)
@@ -50,7 +50,6 @@ Devices: [Quatech] DAQP-208 (daqp), DAQP-308
 #include "../comedidev.h"
 #include <linux/semaphore.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -871,7 +870,7 @@ static int daqp_attach(struct comedi_device *dev, struct comedi_devconfig *it)
                }
        }
 
-       dev->iobase = local->link->io.BasePort1;
+       dev->iobase = local->link->resource[0]->start;
 
        ret = alloc_subdevices(dev, 4);
        if (ret < 0)
@@ -995,14 +994,6 @@ static int daqp_cs_resume(struct pcmcia_device *p_dev);
 static int daqp_cs_attach(struct pcmcia_device *);
 static void daqp_cs_detach(struct pcmcia_device *);
 
-/*
-   The dev_info variable is the "key" that is used to match up this
-   device driver with appropriate cards, through the card configuration
-   database.
-*/
-
-static const dev_info_t dev_info = "quatech_daqp_cs";
-
 /*======================================================================
 
     daqp_cs_attach() creates an "instance" of the driver, allocating
@@ -1101,26 +1092,24 @@ static int daqp_pcmcia_config_loop(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-               if (!(io->flags & CISTPL_IO_8BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
-               if (!(io->flags & CISTPL_IO_16BIT))
-                       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
+               p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
+               p_dev->resource[0]->flags |=
+                       pcmcia_io_cfg_data_width(io->flags);
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
                if (io->nwin > 1) {
-                       p_dev->io.Attributes2 = p_dev->io.Attributes1;
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->flags = p_dev->resource[0]->flags;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
        }
 
        /* This reserves IO space but doesn't actually enable it */
-       return pcmcia_request_io(p_dev, &p_dev->io);
+       return pcmcia_request_io(p_dev);
 }
 
 static void daqp_cs_config(struct pcmcia_device *link)
@@ -1151,13 +1140,11 @@ static void daqp_cs_config(struct pcmcia_device *link)
        /* Finally, report what we've done */
        dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
        if (link->conf.Attributes & CONF_ENABLE_IRQ)
-               printk(KERN_INFO ", irq %u", link->irq);
-       if (link->io.NumPorts1)
-               printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-                      link->io.BasePort1 + link->io.NumPorts1 - 1);
-       if (link->io.NumPorts2)
-               printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-                      link->io.BasePort2 + link->io.NumPorts2 - 1);
+               printk(", irq %u", link->irq);
+       if (link->resource[0])
+               printk(" & %pR", link->resource[0]);
+       if (link->resource[1])
+               printk(" & %pR", link->resource[1]);
        printk("\n");
 
        return;
@@ -1226,7 +1213,7 @@ static struct pcmcia_driver daqp_cs_driver = {
        .id_table = daqp_cs_id_table,
        .owner = THIS_MODULE,
        .drv = {
-               .name = dev_info,
+               .name = "quatech_daqp_cs",
                },
 };
 
index 464b067..19c3354 100644 (file)
@@ -83,7 +83,6 @@
 #include <linux/if_arp.h>
 #include <linux/ioport.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -146,9 +145,8 @@ static int wl_adapter_attach(struct pcmcia_device *link)
                return -ENOMEM;
        }
 
-       link->io.NumPorts1      = HCF_NUM_IO_PORTS;
-       link->io.Attributes1    = IO_DATA_PATH_WIDTH_16;
-       link->io.IOAddrLines    = 6;
+       link->resource[0]->end  = HCF_NUM_IO_PORTS;
+       link->resource[0]->flags= IO_DATA_PATH_WIDTH_16;
        link->conf.Attributes   = CONF_ENABLE_IRQ;
        link->conf.IntType      = INT_MEMORY_AND_IO;
        link->conf.ConfigIndex  = 5;
@@ -305,8 +303,9 @@ void wl_adapter_insert(struct pcmcia_device *link)
 
        /* Do we need to allocate an interrupt? */
        link->conf.Attributes |= CONF_ENABLE_IRQ;
+       link->io_lines = 6;
 
-       ret = pcmcia_request_io(link, &link->io);
+       ret = pcmcia_request_io(link);
        if (ret != 0)
                goto failed;
 
@@ -319,7 +318,7 @@ void wl_adapter_insert(struct pcmcia_device *link)
                goto failed;
 
        dev->irq        = link->irq;
-       dev->base_addr  = link->io.BasePort1;
+       dev->base_addr  = link->resource[0]->start;
 
        SET_NETDEV_DEV(dev, &link->dev);
        if (register_netdev(dev) != 0) {
index d9a0ad0..02f0a20 100644 (file)
@@ -69,7 +69,6 @@
  ******************************************************************************/
 #include <linux/version.h>
 #ifdef BUS_PCMCIA
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
index 99cb224..a1900e5 100644 (file)
@@ -8,7 +8,6 @@
 #include <linux/errno.h>       /* error codes */
 #include <linux/slab.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
@@ -33,9 +32,8 @@ static int ixj_probe(struct pcmcia_device *p_dev)
 {
        dev_dbg(&p_dev->dev, "ixj_attach()\n");
        /* Create new ixj device */
-       p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
-       p_dev->io.IOAddrLines = 3;
+       p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+       p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
        p_dev->conf.IntType = INT_MEMORY_AND_IO;
        p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL);
        if (!p_dev->priv) {
@@ -121,13 +119,14 @@ static int ixj_config_check(struct pcmcia_device *p_dev,
 {
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
+               p_dev->io_lines = 3;
                if (io->nwin == 2) {
-                       p_dev->io.BasePort2 = io->win[1].base;
-                       p_dev->io.NumPorts2 = io->win[1].len;
+                       p_dev->resource[1]->start = io->win[1].base;
+                       p_dev->resource[1]->end = io->win[1].len;
                }
-               if (!pcmcia_request_io(p_dev, &p_dev->io))
+               if (!pcmcia_request_io(p_dev))
                        return 0;
        }
        return -ENODEV;
@@ -151,7 +150,8 @@ static int ixj_config(struct pcmcia_device * link)
        /*
         *      Register the card with the core.
         */
-       j = ixj_pcmcia_probe(link->io.BasePort1, link->io.BasePort1 + 0x10);
+       j = ixj_pcmcia_probe(link->resource[0]->start,
+                            link->resource[0]->start + 0x10);
 
        info->ndev = 1;
        ixj_get_serial(link, j);
index 58cb73c..0e13a00 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/ioport.h>
 #include <linux/platform_device.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/cisreg.h>
@@ -43,8 +42,6 @@ MODULE_LICENSE("GPL");
 /* VARIABLES                                                          */
 /*====================================================================*/
 
-static const char driver_name[DEV_NAME_LEN]  = "sl811_cs";
-
 typedef struct local_info_t {
        struct pcmcia_device    *p_dev;
 } local_info_t;
@@ -165,16 +162,16 @@ static int sl811_cs_config_check(struct pcmcia_device *p_dev,
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
-       p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
+       p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
+               p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
 
-               p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-               p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
-               p_dev->io.BasePort1 = io->win[0].base;
-               p_dev->io.NumPorts1 = io->win[0].len;
+               p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
+               p_dev->resource[0]->start = io->win[0].base;
+               p_dev->resource[0]->end = io->win[0].len;
 
-               return pcmcia_request_io(p_dev, &p_dev->io);
+               return pcmcia_request_io(p_dev);
        }
        pcmcia_disable_device(p_dev);
        return -ENODEV;
@@ -192,7 +189,7 @@ static int sl811_cs_config(struct pcmcia_device *link)
                goto failed;
 
        /* require an IRQ and two registers */
-       if (!link->io.NumPorts1 || link->io.NumPorts1 < 2)
+       if (resource_size(link->resource[0]) < 2)
                goto failed;
 
        if (!link->irq)
@@ -207,11 +204,10 @@ static int sl811_cs_config(struct pcmcia_device *link)
        if (link->conf.Vpp)
                printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
        printk(", irq %d", link->irq);
-       printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-              link->io.BasePort1+link->io.NumPorts1-1);
+       printk(", io %pR", link->resource[0]);
        printk("\n");
 
-       if (sl811_hc_init(parent, link->io.BasePort1, link->irq)
+       if (sl811_hc_init(parent, link->resource[0]->start, link->irq)
                        < 0) {
 failed:
                printk(KERN_WARNING "sl811_cs_config failed\n");
@@ -246,7 +242,7 @@ MODULE_DEVICE_TABLE(pcmcia, sl811_ids);
 static struct pcmcia_driver sl811_cs_driver = {
        .owner          = THIS_MODULE,
        .drv            = {
-               .name   = (char *)driver_name,
+               .name   = "sl811_cs",
        },
        .probe          = sl811_cs_probe,
        .remove         = sl811_cs_detach,
index cfdd5af..1c5088c 100644 (file)
@@ -15,6 +15,8 @@
 #ifndef _LINUX_CISTPL_H
 #define _LINUX_CISTPL_H
 
+typedef unsigned char cisdata_t;
+
 #define CISTPL_NULL            0x00
 #define CISTPL_DEVICE          0x01
 #define CISTPL_LONGLINK_CB     0x02
index 57d8d03..68d8bde 100644 (file)
 #include <linux/interrupt.h>
 #endif
 
-/* For AccessConfigurationRegister */
-typedef struct conf_reg_t {
-    u_char     Function;
-    u_int      Action;
-    off_t      Offset;
-    u_int      Value;
-} conf_reg_t;
-
-/* Actions */
-#define CS_READ                1
-#define CS_WRITE       2
-
-/* for AdjustResourceInfo */
-/* Action field */
-#define REMOVE_MANAGED_RESOURCE                1
-#define ADD_MANAGED_RESOURCE           2
-
-
-typedef struct event_callback_args_t {
-       struct pcmcia_device    *client_handle;
-       void                    *client_data;
-} event_callback_args_t;
-
-/* For CardValues field */
-#define CV_OPTION_VALUE                0x01
-#define CV_STATUS_VALUE                0x02
-#define CV_PIN_REPLACEMENT     0x04
-#define CV_COPY_VALUE          0x08
-#define CV_EXT_STATUS          0x10
-
-/* For GetFirst/NextClient */
-typedef struct client_req_t {
-    socket_t   Socket;
-    u_int      Attributes;
-} client_req_t;
-
-#define CLIENT_THIS_SOCKET     0x01
-
 /* ModifyConfiguration */
 typedef struct modconf_t {
     u_int      Attributes;
@@ -94,43 +56,6 @@ typedef struct config_req_t {
 #define INT_CARDBUS            0x04
 #define INT_ZOOMED_VIDEO       0x08
 
-/* For RequestIO and ReleaseIO */
-typedef struct io_req_t {
-    u_int      BasePort1;
-    u_int      NumPorts1;
-    u_int      Attributes1;
-    u_int      BasePort2;
-    u_int      NumPorts2;
-    u_int      Attributes2;
-    u_int      IOAddrLines;
-} io_req_t;
-
-/* Attributes for RequestIO and ReleaseIO */
-#define IO_SHARED              0x01
-#define IO_FIRST_SHARED                0x02
-#define IO_FORCE_ALIAS_ACCESS  0x04
-#define IO_DATA_PATH_WIDTH     0x18
-#define IO_DATA_PATH_WIDTH_8   0x00
-#define IO_DATA_PATH_WIDTH_16  0x08
-#define IO_DATA_PATH_WIDTH_AUTO        0x10
-
-/* Bits in IRQInfo1 field */
-#define IRQ_NMI_ID             0x01
-#define IRQ_IOCK_ID            0x02
-#define IRQ_BERR_ID            0x04
-#define IRQ_VEND_ID            0x08
-#define IRQ_INFO2_VALID                0x10
-#define IRQ_LEVEL_ID           0x20
-#define IRQ_PULSE_ID           0x40
-#define IRQ_SHARE_ID           0x80
-
-typedef struct eventmask_t {
-    u_int      Attributes;
-    u_int      EventMask;
-} eventmask_t;
-
-#define CONF_EVENT_MASK_VALID  0x01
-
 /* Configuration registers present */
 #define PRESENT_OPTION         0x001
 #define PRESENT_STATUS         0x002
@@ -143,18 +68,6 @@ typedef struct eventmask_t {
 #define PRESENT_IOBASE_3       0x100
 #define PRESENT_IOSIZE         0x200
 
-/* For GetMemPage, MapMemPage */
-typedef struct memreq_t {
-    u_int      CardOffset;
-    page_t     Page;
-} memreq_t;
-
-/* For ModifyWindow */
-typedef struct modwin_t {
-    u_int      Attributes;
-    u_int      AccessSpeed;
-} modwin_t;
-
 /* For RequestWindow */
 typedef struct win_req_t {
     u_int      Attributes;
@@ -164,61 +77,19 @@ typedef struct win_req_t {
 } win_req_t;
 
 /* Attributes for RequestWindow */
-#define WIN_ADDR_SPACE         0x0001
-#define WIN_ADDR_SPACE_MEM     0x0000
-#define WIN_ADDR_SPACE_IO      0x0001
-#define WIN_MEMORY_TYPE                0x0002
-#define WIN_MEMORY_TYPE_CM     0x0000
-#define WIN_MEMORY_TYPE_AM     0x0002
-#define WIN_ENABLE             0x0004
-#define WIN_DATA_WIDTH         0x0018
-#define WIN_DATA_WIDTH_8       0x0000
-#define WIN_DATA_WIDTH_16      0x0008
-#define WIN_DATA_WIDTH_32      0x0010
-#define WIN_PAGED              0x0020
-#define WIN_SHARED             0x0040
-#define WIN_FIRST_SHARED       0x0080
-#define WIN_USE_WAIT           0x0100
-#define WIN_STRICT_ALIGN       0x0200
-#define WIN_MAP_BELOW_1MB      0x0400
-#define WIN_PREFETCH           0x0800
-#define WIN_CACHEABLE          0x1000
-#define WIN_BAR_MASK           0xe000
-#define WIN_BAR_SHIFT          13
-
-typedef struct error_info_t {
-    int                func;
-    int                retcode;
-} error_info_t;
-
-/* Flag to bind to all functions */
-#define BIND_FN_ALL    0xff
-
-/* Events */
-#define CS_EVENT_PRI_LOW               0
-#define CS_EVENT_PRI_HIGH              1
-
-#define CS_EVENT_WRITE_PROTECT         0x000001
-#define CS_EVENT_CARD_LOCK             0x000002
-#define CS_EVENT_CARD_INSERTION                0x000004
-#define CS_EVENT_CARD_REMOVAL          0x000008
-#define CS_EVENT_BATTERY_DEAD          0x000010
-#define CS_EVENT_BATTERY_LOW           0x000020
-#define CS_EVENT_READY_CHANGE          0x000040
-#define CS_EVENT_CARD_DETECT           0x000080
-#define CS_EVENT_RESET_REQUEST         0x000100
-#define CS_EVENT_RESET_PHYSICAL                0x000200
-#define CS_EVENT_CARD_RESET            0x000400
-#define CS_EVENT_REGISTRATION_COMPLETE 0x000800
-#define CS_EVENT_PM_SUSPEND            0x002000
-#define CS_EVENT_PM_RESUME             0x004000
-#define CS_EVENT_INSERTION_REQUEST     0x008000
-#define CS_EVENT_EJECTION_REQUEST      0x010000
-#define CS_EVENT_MTD_REQUEST           0x020000
-#define CS_EVENT_ERASE_COMPLETE                0x040000
-#define CS_EVENT_REQUEST_ATTENTION     0x080000
-#define CS_EVENT_CB_DETECT             0x100000
-#define CS_EVENT_3VCARD                        0x200000
-#define CS_EVENT_XVCARD                        0x400000
+#define WIN_MEMORY_TYPE_CM     0x00 /* default */
+#define WIN_MEMORY_TYPE_AM     0x20 /* MAP_ATTRIB */
+#define WIN_DATA_WIDTH_8       0x00 /* default */
+#define WIN_DATA_WIDTH_16      0x02 /* MAP_16BIT */
+#define WIN_ENABLE             0x01 /* MAP_ACTIVE */
+#define WIN_USE_WAIT           0x40 /* MAP_USE_WAIT */
+
+#define WIN_FLAGS_MAP          0x63 /* MAP_ATTRIB | MAP_16BIT | MAP_ACTIVE |
+                                       MAP_USE_WAIT */
+#define WIN_FLAGS_REQ          0x1c /* mapping to socket->win[i]:
+                                       0x04 -> 0
+                                       0x08 -> 1
+                                       0x0c -> 2
+                                       0x10 -> 3 */
 
 #endif /* _LINUX_CS_H */
diff --git a/include/pcmcia/cs_types.h b/include/pcmcia/cs_types.h
deleted file mode 100644 (file)
index f5e3b83..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * cs_types.h
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * The initial developer of the original code is David A. Hinds
- * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
- * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
- *
- * (C) 1999             David A. Hinds
- */
-
-#ifndef _LINUX_CS_TYPES_H
-#define _LINUX_CS_TYPES_H
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <sys/types.h>
-#endif
-
-typedef u_short        socket_t;
-typedef u_int  event_t;
-typedef u_char cisdata_t;
-typedef u_short        page_t;
-
-typedef unsigned long window_handle_t;
-
-struct region_t;
-typedef struct region_t *memory_handle_t;
-
-#ifndef DEV_NAME_LEN
-#define DEV_NAME_LEN 32
-#endif
-
-typedef char dev_info_t[DEV_NAME_LEN];
-
-#endif /* _LINUX_CS_TYPES_H */
index c180165..70c58ed 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/mod_devicetable.h>
 #endif
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/device_id.h>
 
 #ifdef __KERNEL__
@@ -37,6 +36,8 @@ struct pcmcia_device;
 struct config_t;
 struct net_device;
 
+typedef struct resource *window_handle_t;
+
 /* dynamic device IDs for PCMCIA device drivers. See
  * Documentation/pcmcia/driver.txt for details.
 */
@@ -62,6 +63,17 @@ struct pcmcia_driver {
 int pcmcia_register_driver(struct pcmcia_driver *driver);
 void pcmcia_unregister_driver(struct pcmcia_driver *driver);
 
+/* for struct resource * array embedded in struct pcmcia_device */
+enum {
+       PCMCIA_IOPORT_0,
+       PCMCIA_IOPORT_1,
+       PCMCIA_IOMEM_0,
+       PCMCIA_IOMEM_1,
+       PCMCIA_IOMEM_2,
+       PCMCIA_IOMEM_3,
+       PCMCIA_NUM_RESOURCES,
+};
+
 struct pcmcia_device {
        /* the socket and the device_no [for multifunction devices]
           uniquely define a pcmcia_device */
@@ -79,13 +91,14 @@ struct pcmcia_device {
        struct list_head        socket_device_list;
 
        /* deprecated, will be cleaned up soon */
-       u_int                   open;
-       io_req_t                io;
        config_req_t            conf;
        window_handle_t         win;
 
        /* device setup */
        unsigned int            irq;
+       struct resource         *resource[PCMCIA_NUM_RESOURCES];
+
+       unsigned int            io_lines; /* number of I/O lines */
 
        /* Is the device suspended? */
        u16                     suspended:1;
@@ -117,13 +130,9 @@ struct pcmcia_device {
        u64                     dma_mask;
        struct device           dev;
 
-#ifdef CONFIG_PCMCIA_IOCTL
-       /* device driver wanted by cardmgr */
-       struct pcmcia_driver    *cardmgr;
-#endif
-
        /* data private to drivers */
        void                    *priv;
+       unsigned int            open;
 };
 
 #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
@@ -178,11 +187,11 @@ struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
 int pcmcia_reset_card(struct pcmcia_socket *skt);
 
 /* CIS config */
-int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
-                                        conf_reg_t *reg);
+int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val);
+int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val);
 
 /* device configuration */
-int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
+int pcmcia_request_io(struct pcmcia_device *p_dev);
 
 int __must_check
 __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev,
@@ -204,215 +213,27 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req,
                          window_handle_t *wh);
 int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t win);
 int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t win,
-                       memreq_t *req);
+                       unsigned int offset);
 
 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
 void pcmcia_disable_device(struct pcmcia_device *p_dev);
 
-#endif /* __KERNEL__ */
-
-
+/* IO ports */
+#define IO_DATA_PATH_WIDTH     0x18
+#define IO_DATA_PATH_WIDTH_8   0x00
+#define IO_DATA_PATH_WIDTH_16  0x08
+#define IO_DATA_PATH_WIDTH_AUTO        0x10
 
-/* Below, there are only definitions which are used by
- * - the PCMCIA ioctl
- * - deprecated PCMCIA userspace tools only
- *
- * here be dragons ... here be dragons ... here be dragons ... here be drag
- */
-
-#if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
-
-#if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
-       defined(__bfin__)
-/* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
-typedef u_int   ioaddr_t;
-#else
-typedef u_short        ioaddr_t;
-#endif
+/* convert flag found in cfgtable to data path width parameter */
+static inline int pcmcia_io_cfg_data_width(unsigned int flags)
+{
+       if (!(flags & CISTPL_IO_8BIT))
+               return IO_DATA_PATH_WIDTH_16;
+       if (!(flags & CISTPL_IO_16BIT))
+               return IO_DATA_PATH_WIDTH_8;
+       return IO_DATA_PATH_WIDTH_AUTO;
+}
 
-/* for AdjustResourceInfo */
-typedef struct adjust_t {
-       u_int                   Action;
-       u_int                   Resource;
-       u_int                   Attributes;
-       union {
-               struct memory {
-                       u_long          Base;
-                       u_long          Size;
-               } memory;
-               struct io {
-                       ioaddr_t        BasePort;
-                       ioaddr_t        NumPorts;
-                       u_int           IOAddrLines;
-               } io;
-               struct irq {
-                       u_int           IRQ;
-               } irq;
-       } resource;
-} adjust_t;
-
-/* Action field */
-#define REMOVE_MANAGED_RESOURCE                1
-#define ADD_MANAGED_RESOURCE           2
-#define GET_FIRST_MANAGED_RESOURCE     3
-#define GET_NEXT_MANAGED_RESOURCE      4
-/* Resource field */
-#define RES_MEMORY_RANGE               1
-#define RES_IO_RANGE                   2
-#define RES_IRQ                                3
-/* Attribute field */
-#define RES_IRQ_TYPE                   0x03
-#define RES_IRQ_TYPE_EXCLUSIVE         0
-#define RES_IRQ_TYPE_TIME              1
-#define RES_IRQ_TYPE_DYNAMIC           2
-#define RES_IRQ_CSC                    0x04
-#define RES_SHARED                     0x08
-#define RES_RESERVED                   0x10
-#define RES_ALLOCATED                  0x20
-#define RES_REMOVED                    0x40
-
-
-typedef struct tuple_parse_t {
-       tuple_t                 tuple;
-       cisdata_t               data[255];
-       cisparse_t              parse;
-} tuple_parse_t;
-
-typedef struct win_info_t {
-       window_handle_t         handle;
-       win_req_t               window;
-       memreq_t                map;
-} win_info_t;
-
-typedef struct bind_info_t {
-       dev_info_t              dev_info;
-       u_char                  function;
-       struct pcmcia_device    *instance;
-       char                    name[DEV_NAME_LEN];
-       u_short                 major, minor;
-       void                    *next;
-} bind_info_t;
-
-typedef struct mtd_info_t {
-       dev_info_t              dev_info;
-       u_int                   Attributes;
-       u_int                   CardOffset;
-} mtd_info_t;
-
-typedef struct region_info_t {
-       u_int                   Attributes;
-       u_int                   CardOffset;
-       u_int                   RegionSize;
-       u_int                   AccessSpeed;
-       u_int                   BlockSize;
-       u_int                   PartMultiple;
-       u_char                  JedecMfr, JedecInfo;
-       memory_handle_t         next;
-} region_info_t;
-
-#define REGION_TYPE            0x0001
-#define REGION_TYPE_CM         0x0000
-#define REGION_TYPE_AM         0x0001
-#define REGION_PREFETCH                0x0008
-#define REGION_CACHEABLE       0x0010
-#define REGION_BAR_MASK                0xe000
-#define REGION_BAR_SHIFT       13
-
-/* For ReplaceCIS */
-typedef struct cisdump_t {
-       u_int                   Length;
-       cisdata_t               Data[CISTPL_MAX_CIS_SIZE];
-} cisdump_t;
-
-/* for GetConfigurationInfo */
-typedef struct config_info_t {
-       u_char                  Function;
-       u_int                   Attributes;
-       u_int                   Vcc, Vpp1, Vpp2;
-       u_int                   IntType;
-       u_int                   ConfigBase;
-       u_char                  Status, Pin, Copy, Option, ExtStatus;
-       u_int                   Present;
-       u_int                   CardValues;
-       u_int                   AssignedIRQ;
-       u_int                   IRQAttributes;
-       ioaddr_t                BasePort1;
-       ioaddr_t                NumPorts1;
-       u_int                   Attributes1;
-       ioaddr_t                BasePort2;
-       ioaddr_t                NumPorts2;
-       u_int                   Attributes2;
-       u_int                   IOAddrLines;
-} config_info_t;
-
-/* For ValidateCIS */
-typedef struct cisinfo_t {
-       u_int                   Chains;
-} cisinfo_t;
-
-typedef struct cs_status_t {
-       u_char                  Function;
-       event_t                 CardState;
-       event_t                 SocketState;
-} cs_status_t;
-
-typedef union ds_ioctl_arg_t {
-       adjust_t                adjust;
-       config_info_t           config;
-       tuple_t                 tuple;
-       tuple_parse_t           tuple_parse;
-       client_req_t            client_req;
-       cs_status_t             status;
-       conf_reg_t              conf_reg;
-       cisinfo_t               cisinfo;
-       region_info_t           region;
-       bind_info_t             bind_info;
-       mtd_info_t              mtd_info;
-       win_info_t              win_info;
-       cisdump_t               cisdump;
-} ds_ioctl_arg_t;
-
-#define DS_ADJUST_RESOURCE_INFO                        _IOWR('d',  2, adjust_t)
-#define DS_GET_CONFIGURATION_INFO              _IOWR('d',  3, config_info_t)
-#define DS_GET_FIRST_TUPLE                     _IOWR('d',  4, tuple_t)
-#define DS_GET_NEXT_TUPLE                      _IOWR('d',  5, tuple_t)
-#define DS_GET_TUPLE_DATA                      _IOWR('d',  6, tuple_parse_t)
-#define DS_PARSE_TUPLE                         _IOWR('d',  7, tuple_parse_t)
-#define DS_RESET_CARD                          _IO  ('d',  8)
-#define DS_GET_STATUS                          _IOWR('d',  9, cs_status_t)
-#define DS_ACCESS_CONFIGURATION_REGISTER       _IOWR('d', 10, conf_reg_t)
-#define DS_VALIDATE_CIS                                _IOR ('d', 11, cisinfo_t)
-#define DS_SUSPEND_CARD                                _IO  ('d', 12)
-#define DS_RESUME_CARD                         _IO  ('d', 13)
-#define DS_EJECT_CARD                          _IO  ('d', 14)
-#define DS_INSERT_CARD                         _IO  ('d', 15)
-#define DS_GET_FIRST_REGION                    _IOWR('d', 16, region_info_t)
-#define DS_GET_NEXT_REGION                     _IOWR('d', 17, region_info_t)
-#define DS_REPLACE_CIS                         _IOWR('d', 18, cisdump_t)
-#define DS_GET_FIRST_WINDOW                    _IOR ('d', 19, win_info_t)
-#define DS_GET_NEXT_WINDOW                     _IOWR('d', 20, win_info_t)
-#define DS_GET_MEM_PAGE                                _IOWR('d', 21, win_info_t)
-
-#define DS_BIND_REQUEST                                _IOWR('d', 60, bind_info_t)
-#define DS_GET_DEVICE_INFO                     _IOWR('d', 61, bind_info_t)
-#define DS_GET_NEXT_DEVICE                     _IOWR('d', 62, bind_info_t)
-#define DS_UNBIND_REQUEST                      _IOW ('d', 63, bind_info_t)
-#define DS_BIND_MTD                            _IOWR('d', 64, mtd_info_t)
-
-
-/* used in userspace only */
-#define CS_IN_USE                      0x1e
-
-#define INFO_MASTER_CLIENT     0x01
-#define INFO_IO_CLIENT         0x02
-#define INFO_MTD_CLIENT                0x04
-#define INFO_MEM_CLIENT                0x08
-#define MAX_NUM_CLIENTS                3
-
-#define INFO_CARD_SHARE                0x10
-#define INFO_CARD_EXCL         0x20
-
-
-#endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
+#endif /* __KERNEL__ */
 
 #endif /* _LINUX_DS_H */
index 764281b..626b63c 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/sched.h>       /* task_struct, completion */
 #include <linux/mutex.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #ifdef CONFIG_CARDBUS
 #include <linux/pci.h>
@@ -162,17 +161,10 @@ struct pcmcia_socket {
        u_int                           pci_irq;
        struct pci_dev                  *cb_dev;
 
-
        /* socket setup is done so resources should be able to be allocated.
         * Only if set to 1, calls to find_{io,mem}_region are handled, and
         * insertio events are actually managed by the PCMCIA layer.*/
-       u8                              resource_setup_done:1;
-
-       /* It's old if resource setup is done using adjust_resource_info() */
-       u8                              resource_setup_old:1;
-       u8                              resource_setup_new:1;
-
-       u8                              reserved:5;
+       u8                              resource_setup_done;
 
        /* socket operations */
        struct pccard_operations        *ops;
@@ -218,15 +210,8 @@ struct pcmcia_socket {
         * incorrectness and change */
        u8                              device_count;
 
-       /* 16-bit state: */
-       struct {
-               /* "master" ioctl is used */
-               u8                      busy:1;
-               /* the PCMCIA card consists of two pseudo devices */
-               u8                      has_pfc:1;
-
-               u8                      reserved:6;
-       } pcmcia_state;
+       /* does the PCMCIA card consist of two pseudo devices? */
+       u8                              pcmcia_pfc;
 
        /* non-zero if PCMCIA card is present */
        atomic_t                        present;
@@ -234,10 +219,6 @@ struct pcmcia_socket {
        /* IRQ to be used by PCMCIA devices. May not be IRQ 0. */
        unsigned int                    pcmcia_irq;
 
-#ifdef CONFIG_PCMCIA_IOCTL
-       struct user_info_t              *user;
-       wait_queue_head_t               queue;
-#endif /* CONFIG_PCMCIA_IOCTL */
 #endif /* CONFIG_PCMCIA */
 
        /* socket device */
index df110df..7ab9174 100644 (file)
@@ -139,8 +139,8 @@ static int snd_pdacf_probe(struct pcmcia_device *link)
        pdacf->p_dev = link;
        link->priv = pdacf;
 
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       link->io.NumPorts1 = 16;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
+       link->resource[0]->end = 16;
 
        link->conf.Attributes = CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
@@ -219,7 +219,7 @@ static int pdacf_config(struct pcmcia_device *link)
        snd_printdd(KERN_DEBUG "pdacf_config called\n");
        link->conf.ConfigIndex = 0x5;
 
-       ret = pcmcia_request_io(link, &link->io);
+       ret = pcmcia_request_io(link);
        if (ret)
                goto failed;
 
@@ -231,7 +231,8 @@ static int pdacf_config(struct pcmcia_device *link)
        if (ret)
                goto failed;
 
-       if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq) < 0)
+       if (snd_pdacf_assign_resources(pdacf, link->resource[0]->start,
+                                       link->irq) < 0)
                goto failed;
 
        return 0;
index a0a7ec6..5cc3e45 100644 (file)
@@ -24,7 +24,6 @@
 #include <sound/pcm.h>
 #include <asm/io.h>
 #include <linux/interrupt.h>
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>
index 624b47a..a6edfc3 100644 (file)
@@ -159,8 +159,8 @@ static int snd_vxpocket_new(struct snd_card *card, int ibl,
        vxp->p_dev = link;
        link->priv = chip;
 
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
-       link->io.NumPorts1 = 16;
+       link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
+       link->resource[0]->end = 16;
 
        link->conf.Attributes = CONF_ENABLE_IRQ;
        link->conf.IntType = INT_MEMORY_AND_IO;
@@ -226,7 +226,7 @@ static int vxpocket_config(struct pcmcia_device *link)
                strcpy(chip->card->driver, vxp440_hw.name);
        }
 
-       ret = pcmcia_request_io(link, &link->io);
+       ret = pcmcia_request_io(link);
        if (ret)
                goto failed;
 
@@ -241,7 +241,8 @@ static int vxpocket_config(struct pcmcia_device *link)
        chip->dev = &link->dev;
        snd_card_set_dev(chip->card, chip->dev);
 
-       if (snd_vxpocket_assign_resources(chip, link->io.BasePort1, link->irq) < 0)
+       if (snd_vxpocket_assign_resources(chip, link->resource[0]->start,
+                                               link->irq) < 0)
                goto failed;
 
        return 0;
index ea4df16..d911066 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <sound/vx_core.h>
 
-#include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
 #include <pcmcia/cistpl.h>
 #include <pcmcia/ds.h>