pcmcia: introduce autoconfiguration feature
authorDominik Brodowski <linux@dominikbrodowski.net>
Fri, 30 Jul 2010 07:51:52 +0000 (09:51 +0200)
committerDominik Brodowski <linux@dominikbrodowski.net>
Wed, 29 Sep 2010 15:20:23 +0000 (17:20 +0200)
Introduce an autoconfiguration feature to set certain values in
pcmcia_loop_config(), instead of copying the same code over and over
in each PCMCIA driver. At first, introduce the following options:

CONF_AUTO_CHECK_VCC check or matching Vcc entry
CONF_AUTO_SET_VPP set Vpp
CONF_AUTO_AUDIO enable the speaker line

CC: netdev@vger.kernel.org
CC: linux-wireless@vger.kernel.org
CC: linux-ide@vger.kernel.org
CC: linux-usb@vger.kernel.org
CC: laforge@gnumonks.org
CC: linux-mtd@lists.infradead.org
CC: alsa-devel@alsa-project.org
CC: linux-serial@vger.kernel.org
CC: Jiri Kosina <jkosina@suse.cz>
CC: linux-scsi@vger.kernel.org
Acked-by: Gustavo F. Padovan <padovan@profusion.mobi> (for drivers/bluetooth)
Tested-by: Wolfram Sang <w.sang@pengutronix.de>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
43 files changed:
drivers/ata/pata_pcmcia.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/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/net/pcmcia/axnet_cs.c
drivers/net/pcmcia/fmvj18x_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/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/parport/parport_cs.c
drivers/pcmcia/pcmcia_cis.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/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/telephony/ixj_pcmcia.c
drivers/usb/host/sl811_cs.c
include/pcmcia/ds.h

index 76da55d27e082e9861a53a4a7666eefff123ff0e..954f43c512f117af93b639c43754a50085344452 100644 (file)
@@ -169,34 +169,16 @@ static struct ata_port_operations pcmcia_8bit_port_ops = {
 
 struct pcmcia_config_check {
        unsigned long ctl_base;
-       int skip_vcc;
        int is_kme;
 };
 
 static int pcmcia_check_one_config(struct pcmcia_device *pdev,
                                   cistpl_cftable_entry_t *cfg,
                                   cistpl_cftable_entry_t *dflt,
-                                  unsigned int vcc,
                                   void *priv_data)
 {
        struct pcmcia_config_check *stk = priv_data;
 
-       /* Check for matching Vcc, unless we're desperate */
-       if (!stk->skip_vcc) {
-               if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               return -ENODEV;
-               } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               return -ENODEV;
-               }
-       }
-
-       if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
-               pdev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-       else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
-               pdev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-
        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;
@@ -249,6 +231,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
        pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
        pdev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
        pdev->config_flags |= CONF_ENABLE_IRQ;
+       pdev->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC;
 
        /* See if we have a manufacturer identifier. Use it to set is_kme for
           vendor quirks */
@@ -262,10 +245,10 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
        if (!stk)
                goto out1;
        stk->is_kme = is_kme;
-       stk->skip_vcc = io_base = ctl_base = 0;
+       io_base = ctl_base = 0;
 
        if (pcmcia_loop_config(pdev, pcmcia_check_one_config, stk)) {
-               stk->skip_vcc = 1;
+               pdev->config_flags &= ~CONF_AUTO_CHECK_VCC;
                if (pcmcia_loop_config(pdev, pcmcia_check_one_config, stk))
                        goto failed; /* No suitable config found */
        }
index 3db95887cfd714eed546032d05460a6dfbe3c02d..97338a3aae1abb4fe47e93b331d9f9f11f9f2c49 100644 (file)
@@ -659,7 +659,7 @@ static int bt3c_probe(struct pcmcia_device *link)
        link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
        link->resource[0]->end = 8;
 
-       link->config_flags |= CONF_ENABLE_IRQ;
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP;
 
        return bt3c_config(link);
 }
@@ -676,15 +676,11 @@ static void bt3c_detach(struct pcmcia_device *link)
 static int bt3c_check_config(struct pcmcia_device *p_dev,
                             cistpl_cftable_entry_t *cf,
                             cistpl_cftable_entry_t *dflt,
-                            unsigned int vcc,
                             void *priv_data)
 {
        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->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->resource[0]->start = cf->io.win[0].base;
@@ -697,7 +693,6 @@ static int bt3c_check_config(struct pcmcia_device *p_dev,
 static int bt3c_check_config_notpicky(struct pcmcia_device *p_dev,
                                      cistpl_cftable_entry_t *cf,
                                      cistpl_cftable_entry_t *dflt,
-                                     unsigned int vcc,
                                      void *priv_data)
 {
        static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
index c5c43594ae0ee0b2ca313da6b7dca2ddff59e77c..8a6864fc8c38c7d01cc6419e1ed458cac287647b 100644 (file)
@@ -588,7 +588,7 @@ static int btuart_probe(struct pcmcia_device *link)
        link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
        link->resource[0]->end = 8;
 
-       link->config_flags |= CONF_ENABLE_IRQ;
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP;
 
        return btuart_config(link);
 }
@@ -605,15 +605,11 @@ static void btuart_detach(struct pcmcia_device *link)
 static int btuart_check_config(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cf,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        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->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->resource[0]->start = cf->io.win[0].base;
@@ -626,7 +622,6 @@ static int btuart_check_config(struct pcmcia_device *p_dev,
 static int btuart_check_config_notpicky(struct pcmcia_device *p_dev,
                                        cistpl_cftable_entry_t *cf,
                                        cistpl_cftable_entry_t *dflt,
-                                       unsigned int vcc,
                                        void *priv_data)
 {
        static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
index 38206df7206b17ab4a494d03990ee7f3d4216cbb..4620cc39867604cb5e7007588d8c1dbaff696346 100644 (file)
@@ -592,7 +592,6 @@ static void dtl1_detach(struct pcmcia_device *link)
 static int dtl1_confcheck(struct pcmcia_device *p_dev,
                          cistpl_cftable_entry_t *cf,
                          cistpl_cftable_entry_t *dflt,
-                         unsigned int vcc,
                          void *priv_data)
 {
        if ((cf->io.nwin != 1) || (cf->io.win[0].len <= 8))
index 75caa8c1b484eb7915aaa028710a47c8a0c36e48..0b2f3b9d261af6d9ba9aedeabca0d0deab773942 100644 (file)
@@ -1744,7 +1744,6 @@ static void cmm_cm4000_release(struct pcmcia_device * link)
 static int cm4000_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        if (!cfg->io.nwin)
index 0c87b80bf64168d96ff810099aa7cc963e1a0783..acf88d5c72b2bf2168e6b770dceed8bd07bb9970 100644 (file)
@@ -518,7 +518,6 @@ static void cm4040_reader_release(struct pcmcia_device *link)
 static int cm4040_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        int rc;
index cd21b2bcdcd7818eb7ea6e80a21b659a0686502f..1b7f0920737ba7a95c779436265353a2c0851628 100644 (file)
@@ -78,7 +78,6 @@ static void signalled_reboot_callback(void *callback_data)
 static int ipwireless_probe(struct pcmcia_device *p_dev,
                            cistpl_cftable_entry_t *cfg,
                            cistpl_cftable_entry_t *dflt,
-                           unsigned int vcc,
                            void *priv_data)
 {
        struct ipw_dev *ipw = priv_data;
index 99feaedc53a1409bf4d4bc81c897f697fdf74f3e..c701434f76b70a02272012f0a6039670a0742550 100644 (file)
@@ -564,7 +564,6 @@ static int mgslpc_probe(struct pcmcia_device *link)
 static int mgslpc_ioprobe(struct pcmcia_device *p_dev,
                          cistpl_cftable_entry_t *cfg,
                          cistpl_cftable_entry_t *dflt,
-                         unsigned int vcc,
                          void *priv_data)
 {
        if (!cfg->io.nwin)
index 87ad04925a9f5ba4badcbd9bf7d49321ddc6b57a..25b8a105a98d0f64aea9dcb30bd0a45fba72d41f 100644 (file)
@@ -99,6 +99,7 @@ static int ide_probe(struct pcmcia_device *link)
     link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
     link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
     link->config_flags |= CONF_ENABLE_IRQ;
+    link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC;
 
     return ide_config(link);
 } /* ide_attach */
@@ -195,34 +196,16 @@ out_release:
 
 struct pcmcia_config_check {
        unsigned long ctl_base;
-       int skip_vcc;
        int is_kme;
 };
 
 static int pcmcia_check_one_config(struct pcmcia_device *pdev,
                                   cistpl_cftable_entry_t *cfg,
                                   cistpl_cftable_entry_t *dflt,
-                                  unsigned int vcc,
                                   void *priv_data)
 {
        struct pcmcia_config_check *stk = priv_data;
 
-       /* Check for matching Vcc, unless we're desperate */
-       if (!stk->skip_vcc) {
-               if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               return -ENODEV;
-               } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               return -ENODEV;
-               }
-       }
-
-       if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
-               pdev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-       else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
-               pdev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-
        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;
@@ -271,10 +254,10 @@ static int ide_config(struct pcmcia_device *link)
     if (!stk)
            goto err_mem;
     stk->is_kme = is_kme;
-    stk->skip_vcc = io_base = ctl_base = 0;
+    io_base = ctl_base = 0;
 
     if (pcmcia_loop_config(link, pcmcia_check_one_config, stk)) {
-           stk->skip_vcc = 1;
+           link->config_flags &= ~CONF_AUTO_CHECK_VCC;
            if (pcmcia_loop_config(link, pcmcia_check_one_config, stk))
                    goto failed; /* No suitable config found */
     }
index 6ea5cd28d3490e54c7d7361fc3f5e29be4453b97..9dbab9c99beabed2ca18f00a3886f6005d563a08 100644 (file)
@@ -110,7 +110,6 @@ static void avmcs_detach(struct pcmcia_device *link)
 static int avmcs_configcheck(struct pcmcia_device *p_dev,
                             cistpl_cftable_entry_t *cf,
                             cistpl_cftable_entry_t *dflt,
-                            unsigned int vcc,
                             void *priv_data)
 {
        if (cf->io.nwin <= 0)
index 5dd47ad6ecc9469c4852387acc26e520c001aed1..2f2b0005f07b79dd7a8c759a30a719f13e5093f3 100644 (file)
@@ -117,7 +117,6 @@ static void __devexit avma1cs_detach(struct pcmcia_device *link)
 static int avma1cs_configcheck(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cf,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        if (cf->io.nwin <= 0)
index 368c8a213f0b767dc7dcbefece4a0cc293dd0c56..0a65280be8d58f08af5b81d4ed134d160f99247d 100644 (file)
@@ -163,7 +163,6 @@ static void __devexit elsa_cs_detach(struct pcmcia_device *link)
 static int elsa_cs_configcheck(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cf,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        int j;
index 791e23a75f78a854f49ca045e840b9e194933f2e..b69eccfdbb05b5d4d128af0e514d8f92c3655751 100644 (file)
@@ -164,33 +164,11 @@ static void __devexit sedlbauer_detach(struct pcmcia_device *link)
 static int sedlbauer_config_check(struct pcmcia_device *p_dev,
                                  cistpl_cftable_entry_t *cfg,
                                  cistpl_cftable_entry_t *dflt,
-                                 unsigned int vcc,
                                  void *priv_data)
 {
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Use power settings for Vcc and Vpp if present */
-       /*  Note that the CIS values need to be rescaled */
-       if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
-               if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000)
-                       return -ENODEV;
-       } else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) {
-               if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM]/10000)
-                       return -ENODEV;
-       }
-
-       if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
-       else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
-
-       p_dev->config_flags |= CONF_ENABLE_IRQ;
-
        /* IO window settings */
        p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
@@ -223,6 +201,9 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
 
     dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link);
 
+    link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
+           CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO;
+
     /*
       In this loop, we scan the CIS for configuration table entries,
       each of which describes a valid card configuration, including
index 2ae71e3297ba70c78188ed64a59122532a527b2b..6605480aa37fbe44d1b3977d55ca9890b478fc38 100644 (file)
@@ -145,7 +145,6 @@ static void __devexit teles_detach(struct pcmcia_device *link)
 static int teles_cs_configcheck(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cf,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        int j;
index f361d2865e349195f8c1a7c994a5bdd74d35457c..17f1040e255ed931d54995076a72d7d89274a4e3 100644 (file)
@@ -287,7 +287,6 @@ static int try_io_port(struct pcmcia_device *link)
 static int axnet_configcheck(struct pcmcia_device *p_dev,
                             cistpl_cftable_entry_t *cfg,
                             cistpl_cftable_entry_t *dflt,
-                            unsigned int vcc,
                             void *priv_data)
 {
        int i;
index f6865adb126d64130d552d532c80ea8b406f6a14..c1479e3bfab4f15dd7b232144173acef0edb06e5 100644 (file)
@@ -322,7 +322,6 @@ static int ungermann_try_io_port(struct pcmcia_device *link)
 static int fmvj18x_ioprobe(struct pcmcia_device *p_dev,
                           cistpl_cftable_entry_t *cfg,
                           cistpl_cftable_entry_t *dflt,
-                          unsigned int vcc,
                           void *priv_data)
 {
        return 0; /* strange, but that's what the code did already before... */
index 4a3b6a43550f80215c688fc06e9d05f735db36de..12b028c6abc9b3778c7dd29d6db435cbd8a5d1eb 100644 (file)
@@ -503,7 +503,6 @@ static int try_io_port(struct pcmcia_device *link)
 static int pcnet_confcheck(struct pcmcia_device *p_dev,
                           cistpl_cftable_entry_t *cfg,
                           cistpl_cftable_entry_t *dflt,
-                          unsigned int vcc,
                           void *priv_data)
 {
        int *priv = priv_data;
index 8c16ba672012b7ceb01c1fc07334e487012a2c3b..e127d2b546dd4e6ab91d10f5192618300ee887fb 100644 (file)
@@ -420,7 +420,6 @@ static int mhz_3288_power(struct pcmcia_device *link)
 static int mhz_mfc_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cf,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        int k;
@@ -590,7 +589,6 @@ static int mot_setup(struct pcmcia_device *link)
 static int smc_configcheck(struct pcmcia_device *p_dev,
                           cistpl_cftable_entry_t *cf,
                           cistpl_cftable_entry_t *dflt,
-                          unsigned int vcc,
                           void *priv_data)
 {
        p_dev->resource[0]->start = cf->io.win[0].base;
index 7a4a99b73d177ce5cde4a17a54a2ffaed8a3cfa2..2bc2eb89c4cde7da912b17d2cf5424da1d64c4fb 100644 (file)
@@ -668,7 +668,6 @@ static int
 xirc2ps_config_modem(struct pcmcia_device *p_dev,
                     cistpl_cftable_entry_t *cf,
                     cistpl_cftable_entry_t *dflt,
-                    unsigned int vcc,
                     void *priv_data)
 {
        unsigned int ioaddr;
@@ -688,7 +687,6 @@ static int
 xirc2ps_config_check(struct pcmcia_device *p_dev,
                     cistpl_cftable_entry_t *cf,
                     cistpl_cftable_entry_t *dflt,
-                    unsigned int vcc,
                     void *priv_data)
 {
        int *pass = priv_data;
@@ -826,7 +824,8 @@ xirc2ps_config(struct pcmcia_device * link)
             * the Mako if (on the first pass) the COR bit 5 is set.
             */
            for (pass=0; pass < 2; pass++)
-                   if (!pcmcia_loop_config(link, xirc2ps_config_check, &pass))
+                   if (!pcmcia_loop_config(link, xirc2ps_config_check,
+                                                   &pass))
                            goto port_found;
            /* if special option:
             * try to configure as Ethernet only.
index 5939d0c7a5c801246b170eee2bacbb411b4cebf8..63bf662e9c7f6bff8366b41ec024b0ff867ac60c 100644 (file)
@@ -140,25 +140,11 @@ static void airo_detach(struct pcmcia_device *link)
 static int airo_cs_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Use power settings for Vcc and Vpp if present */
-       /*  Note that the CIS values need to be rescaled */
-       if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
-       else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
-
-       p_dev->config_flags |= CONF_ENABLE_IRQ;
-
        /* IO window settings */
        p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
@@ -193,6 +179,9 @@ static int airo_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "airo_config\n");
 
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP |
+               CONF_AUTO_AUDIO;
+
        /*
         * In this loop, we scan the CIS for configuration table
         * entries, each of which describes a valid card
index 080266eba9856e89e84671f2caa9e314154d5d0e..812decd3fbe9cbb7654290b3dfe0ac2eeea318e6 100644 (file)
@@ -157,25 +157,11 @@ static int card_present(void *arg)
 static int atmel_config_check(struct pcmcia_device *p_dev,
                              cistpl_cftable_entry_t *cfg,
                              cistpl_cftable_entry_t *dflt,
-                             unsigned int vcc,
                              void *priv_data)
 {
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Use power settings for Vcc and Vpp if present */
-       /*  Note that the CIS values need to be rescaled */
-       if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
-       else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
-
-       p_dev->config_flags |= CONF_ENABLE_IRQ;
-
        /* IO window settings */
        p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
@@ -207,6 +193,9 @@ static int atmel_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "atmel_config\n");
 
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP |
+               CONF_AUTO_AUDIO;
+
        /*
          In this loop, we scan the CIS for configuration table entries,
          each of which describes a valid card configuration, including
index 5b0b5828b3cf5403a349c22171c2aaa3a957278b..d4f19af1757f1722338f84cfe6c20fab1931aac1 100644 (file)
@@ -472,7 +472,6 @@ static void prism2_detach(struct pcmcia_device *link)
 static int prism2_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        if (cfg->index == 0)
@@ -481,28 +480,6 @@ static int prism2_config_check(struct pcmcia_device *p_dev,
        PDEBUG(DEBUG_EXTRA, "Checking CFTABLE_ENTRY 0x%02X "
               "(default 0x%02X)\n", cfg->index, dflt->index);
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Use power settings for Vcc and Vpp if present */
-       /*  Note that the CIS values need to be rescaled */
-       if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] /
-                   10000 && !ignore_cis_vcc) {
-                       PDEBUG(DEBUG_EXTRA, "  Vcc mismatch - skipping"
-                              " this entry\n");
-                       return -ENODEV;
-               }
-       } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] /
-                   10000 && !ignore_cis_vcc) {
-                       PDEBUG(DEBUG_EXTRA, "  Vcc (default) mismatch "
-                              "- skipping this entry\n");
-                       return -ENODEV;
-               }
-       }
-
        if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
                p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
        else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
@@ -553,6 +530,10 @@ static int prism2_config(struct pcmcia_device *link)
        }
 
        /* Look for an appropriate configuration table entry in the CIS */
+       link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO |
+               CONF_AUTO_CHECK_VCC;
+       if (ignore_cis_vcc)
+               link->config_flags &= ~CONF_AUTO_CHECK_VCC;
        ret = pcmcia_loop_config(link, prism2_config_check, NULL);
        if (ret) {
                if (!ignore_cis_vcc)
index 6020c19b1bdbb5b85fe5decad7f722d7f7a338cc..031f3e6da3c976ab2f458660fa7f952eb1a4fb7e 100644 (file)
@@ -797,7 +797,6 @@ static void if_cs_release(struct pcmcia_device *p_dev)
 static int if_cs_ioprobe(struct pcmcia_device *p_dev,
                         cistpl_cftable_entry_t *cfg,
                         cistpl_cftable_entry_t *dflt,
-                        unsigned int vcc,
                         void *priv_data)
 {
        p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
index 00316a1a1092eb3718f5690fe8f896f54bb8980e..b92173827b559461cd725a0f54b20b55015fce47 100644 (file)
@@ -145,39 +145,11 @@ static void orinoco_cs_detach(struct pcmcia_device *link)
 static int orinoco_cs_config_check(struct pcmcia_device *p_dev,
                                   cistpl_cftable_entry_t *cfg,
                                   cistpl_cftable_entry_t *dflt,
-                                  unsigned int vcc,
                                   void *priv_data)
 {
        if (cfg->index == 0)
                goto next_entry;
 
-       /* Use power settings for Vcc and Vpp if present */
-       /* Note that the CIS values need to be rescaled */
-       if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) {
-                       DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n",
-                             __func__, vcc,
-                             cfg->vcc.param[CISTPL_POWER_VNOM] / 10000);
-                       if (!ignore_cis_vcc)
-                               goto next_entry;
-               }
-       } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) {
-                       DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n",
-                             __func__, vcc,
-                             dflt->vcc.param[CISTPL_POWER_VNOM] / 10000);
-                       if (!ignore_cis_vcc)
-                               goto next_entry;
-               }
-       }
-
-       if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
-               p_dev->vpp =
-                       cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-       else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
-               p_dev->vpp =
-                       dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-
        /* Do we need to allocate an interrupt? */
        p_dev->config_flags |= CONF_ENABLE_IRQ;
 
@@ -230,6 +202,9 @@ orinoco_cs_config(struct pcmcia_device *link)
         * and most client drivers will only use the CIS to fill in
         * implementation-defined details.
         */
+       link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC;
+       if (ignore_cis_vcc)
+               link->config_flags &= ~CONF_AUTO_CHECK_VCC;
        ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL);
        if (ret) {
                if (!ignore_cis_vcc)
index ca2c6c0c5576f74b48f92fcbb285ba105a65e540..f462c78856e983e00594e5ee101dcde276c59540 100644 (file)
@@ -207,32 +207,11 @@ static void spectrum_cs_detach(struct pcmcia_device *link)
 static int spectrum_cs_config_check(struct pcmcia_device *p_dev,
                                    cistpl_cftable_entry_t *cfg,
                                    cistpl_cftable_entry_t *dflt,
-                                   unsigned int vcc,
                                    void *priv_data)
 {
        if (cfg->index == 0)
                goto next_entry;
 
-       /* Use power settings for Vcc and Vpp if present */
-       /* Note that the CIS values need to be rescaled */
-       if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) {
-                       DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n",
-                             __func__, vcc,
-                             cfg->vcc.param[CISTPL_POWER_VNOM] / 10000);
-                       if (!ignore_cis_vcc)
-                               goto next_entry;
-               }
-       } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) {
-                       DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n",
-                             __func__, vcc,
-                             dflt->vcc.param[CISTPL_POWER_VNOM] / 10000);
-                       if (!ignore_cis_vcc)
-                               goto next_entry;
-               }
-       }
-
        if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
                p_dev->vpp =
                        cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
@@ -292,6 +271,9 @@ spectrum_cs_config(struct pcmcia_device *link)
         * and most client drivers will only use the CIS to fill in
         * implementation-defined details.
         */
+       link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC;
+       if (ignore_cis_vcc)
+               link->config_flags &= ~CONF_AUTO_CHECK_VCC;
        ret = pcmcia_loop_config(link, spectrum_cs_config_check, NULL);
        if (ret) {
                if (!ignore_cis_vcc)
index 63b3d3c18c34a087213ccfc87ae69c4aa3dc4011..8c2a4733bc1938709d71db375d790fa390fb9338 100644 (file)
@@ -136,7 +136,6 @@ static void parport_detach(struct pcmcia_device *link)
 static int parport_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
index ce8b94a3b675add5757b397f07deb2b9f60755fa..160da0697335b59d928c28d51c80c952fd96f577 100644 (file)
@@ -131,7 +131,6 @@ struct pcmcia_cfg_mem {
        int (*conf_check) (struct pcmcia_device *p_dev,
                           cistpl_cftable_entry_t *cfg,
                           cistpl_cftable_entry_t *dflt,
-                          unsigned int vcc,
                           void *priv_data);
        cisparse_t parse;
        cistpl_cftable_entry_t dflt;
@@ -146,16 +145,46 @@ struct pcmcia_cfg_mem {
  */
 static int pcmcia_do_loop_config(tuple_t *tuple, cisparse_t *parse, void *priv)
 {
-       cistpl_cftable_entry_t *cfg = &parse->cftable_entry;
        struct pcmcia_cfg_mem *cfg_mem = priv;
+       struct pcmcia_device *p_dev = cfg_mem->p_dev;
+       cistpl_cftable_entry_t *cfg = &parse->cftable_entry;
+       cistpl_cftable_entry_t *dflt = &cfg_mem->dflt;
+       unsigned int flags = p_dev->config_flags;
+       unsigned int vcc = p_dev->socket->socket.Vcc;
+
+       dev_dbg(&p_dev->dev, "testing configuration %x, autoconf %x\n",
+               cfg->index, flags);
 
        /* default values */
        cfg_mem->p_dev->config_index = cfg->index;
        if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
                cfg_mem->dflt = *cfg;
 
+       /* check for matching Vcc? */
+       if (flags & CONF_AUTO_CHECK_VCC) {
+               if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
+                       if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
+                               return -ENODEV;
+               } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
+                       if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000)
+                               return -ENODEV;
+               }
+       }
+
+       /* set Vpp? */
+       if (flags & CONF_AUTO_SET_VPP) {
+               if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
+                       p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
+               else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
+                       p_dev->vpp =
+                               dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
+       }
+
+       /* enable audio? */
+       if ((flags & CONF_AUTO_AUDIO) && (cfg->flags & CISTPL_CFTABLE_AUDIO))
+               p_dev->config_flags |= CONF_ENABLE_SPKR;
+
        return cfg_mem->conf_check(cfg_mem->p_dev, cfg, &cfg_mem->dflt,
-                                  cfg_mem->p_dev->socket->socket.Vcc,
                                   cfg_mem->priv_data);
 }
 
@@ -176,7 +205,6 @@ int pcmcia_loop_config(struct pcmcia_device *p_dev,
                       int      (*conf_check)   (struct pcmcia_device *p_dev,
                                                 cistpl_cftable_entry_t *cfg,
                                                 cistpl_cftable_entry_t *dflt,
-                                                unsigned int vcc,
                                                 void *priv_data),
                       void *priv_data)
 {
index e1f74851713512387543c607593910661a4923b4..0b5fc2fa05898e884126fb51fb98c42c5b09767e 100644 (file)
@@ -124,7 +124,6 @@ static void aha152x_detach(struct pcmcia_device *link)
 static int aha152x_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        p_dev->io_lines = 10;
index ae263b17bfa5372370723f8a89c09f8f1d18b123..3b9f311cb035d22887e27f434fb532ef130b2a46 100644 (file)
@@ -106,7 +106,6 @@ static void fdomain_detach(struct pcmcia_device *link)
 static int fdomain_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        p_dev->io_lines = 10;
index d0546c03f57cb3ae000568ef5bf7a07e8639871b..344d49900b4c4e6eddefa2c15c1cf988606d9229 100644 (file)
@@ -1597,7 +1597,6 @@ static void nsp_cs_detach(struct pcmcia_device *link)
 static int nsp_cs_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        nsp_hw_data             *data = priv_data;
@@ -1605,77 +1604,49 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev,
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Use power settings for Vcc and Vpp if present */
-       /*  Note that the CIS values need to be rescaled */
-       if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
-               if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000)
-                       return -ENODEV;
-               else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) {
-                       if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM]/10000)
-                               return -ENODEV;
-               }
-
-               if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
-                       p_dev->vpp =
-                               cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-               } else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM)) {
-                       p_dev->vpp =
-                               dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-               }
-
-               /* Do we need to allocate an interrupt? */
-               p_dev->config_flags |= CONF_ENABLE_IRQ;
-
-               /* IO window settings */
-               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->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->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) != 0)
-                               goto next_entry;
+       /* IO window settings */
+       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->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->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) != 0)
+                       goto next_entry;
+       }
 
-               if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
-                       cistpl_mem_t    *mem =
-                               (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
-                       p_dev->resource[2]->flags |= (WIN_DATA_WIDTH_16 |
-                                               WIN_MEMORY_TYPE_CM |
-                                               WIN_ENABLE);
-                       p_dev->resource[2]->start = mem->win[0].host_addr;
-                       p_dev->resource[2]->end = mem->win[0].len;
-                       if (p_dev->resource[2]->end < 0x1000)
-                               p_dev->resource[2]->end = 0x1000;
-                       if (pcmcia_request_window(p_dev, p_dev->resource[2],
-                                                       0) != 0)
-                               goto next_entry;
-                       if (pcmcia_map_mem_page(p_dev, p_dev->resource[2],
-                                       mem->win[0].card_addr) != 0)
-                               goto next_entry;
-
-                       data->MmioAddress = (unsigned long)
-                               ioremap_nocache(p_dev->resource[2]->start,
+       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
+               cistpl_mem_t    *mem =
+                       (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
+               p_dev->resource[2]->flags |= (WIN_DATA_WIDTH_16 |
+                                       WIN_MEMORY_TYPE_CM |
+                                       WIN_ENABLE);
+               p_dev->resource[2]->start = mem->win[0].host_addr;
+               p_dev->resource[2]->end = mem->win[0].len;
+               if (p_dev->resource[2]->end < 0x1000)
+                       p_dev->resource[2]->end = 0x1000;
+               if (pcmcia_request_window(p_dev, p_dev->resource[2], 0) != 0)
+                       goto next_entry;
+               if (pcmcia_map_mem_page(p_dev, p_dev->resource[2],
+                                               mem->win[0].card_addr) != 0)
+                       goto next_entry;
+
+               data->MmioAddress = (unsigned long)
+                       ioremap_nocache(p_dev->resource[2]->start,
                                        resource_size(p_dev->resource[2]));
-                       data->MmioLength  = resource_size(p_dev->resource[2]);
-               }
-               /* If we got this far, we're cool! */
-               return 0;
+               data->MmioLength  = resource_size(p_dev->resource[2]);
        }
+       /* If we got this far, we're cool! */
+       return 0;
 
 next_entry:
        nsp_dbg(NSP_DEBUG_INIT, "next");
@@ -1692,6 +1663,9 @@ static int nsp_cs_config(struct pcmcia_device *link)
 
        nsp_dbg(NSP_DEBUG_INIT, "in");
 
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC |
+               CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO;
+
        ret = pcmcia_loop_config(link, nsp_cs_config_check, data);
        if (ret)
                goto cs_failed;
index 7d3f49c431fd952cb782f8db1a4bb574ab6a714f..468fd12fe98ddc63ea027edb221f9f24b2fcc9a7 100644 (file)
@@ -179,7 +179,6 @@ static void qlogic_detach(struct pcmcia_device *link)
 static int qlogic_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        p_dev->io_lines = 10;
index 600630eb70349e370e76a5c51cfcf1b6a2d1b744..7a0bb9aea042fa9e75fb3a21670846fa417f3136 100644 (file)
@@ -686,7 +686,6 @@ static struct scsi_host_template sym53c500_driver_template = {
 static int SYM53C500_config_check(struct pcmcia_device *p_dev,
                                  cistpl_cftable_entry_t *cfg,
                                  cistpl_cftable_entry_t *dflt,
-                                 unsigned int vcc,
                                  void *priv_data)
 {
        p_dev->io_lines = 10;
index 47b1869026e7e8ccb1d948bceb36de8d20f0be2b..a796a93fe39c6c2141d3d6aa5905c9a4fa2063cc 100644 (file)
@@ -427,16 +427,11 @@ static int pfc_config(struct pcmcia_device *p_dev)
 static int simple_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cf,
                               cistpl_cftable_entry_t *dflt,
-                              unsigned int vcc,
                               void *priv_data)
 {
        static const int size_table[2] = { 8, 16 };
        int *try = priv_data;
 
-       if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
-               p_dev->vpp =
-                       cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-
        p_dev->io_lines = ((*try & 0x1) == 0) ?
                        16 : cf->io.flags & CISTPL_IO_LINES_MASK;
 
@@ -452,7 +447,6 @@ static int simple_config_check(struct pcmcia_device *p_dev,
 static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
                                        cistpl_cftable_entry_t *cf,
                                        cistpl_cftable_entry_t *dflt,
-                                       unsigned int vcc,
                                        void *priv_data)
 {
        static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
@@ -479,6 +473,7 @@ static int simple_config(struct pcmcia_device *link)
 
        /* First pass: look for a config entry that looks normal.
         * Two tries: without IO aliases, then with aliases */
+       link->config_flags |= CONF_AUTO_SET_VPP;
        for (try = 0; try < 4; try++)
                if (!pcmcia_loop_config(link, simple_config_check, &try))
                        goto found_port;
@@ -511,7 +506,6 @@ found_port:
 static int multi_config_check(struct pcmcia_device *p_dev,
                              cistpl_cftable_entry_t *cf,
                              cistpl_cftable_entry_t *dflt,
-                             unsigned int vcc,
                              void *priv_data)
 {
        int *base2 = priv_data;
@@ -532,7 +526,6 @@ static int multi_config_check(struct pcmcia_device *p_dev,
 static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
                                       cistpl_cftable_entry_t *cf,
                                       cistpl_cftable_entry_t *dflt,
-                                      unsigned int vcc,
                                       void *priv_data)
 {
        int *base2 = priv_data;
@@ -621,7 +614,6 @@ static int multi_config(struct pcmcia_device *link)
 static int serial_check_for_multi(struct pcmcia_device *p_dev,
                                  cistpl_cftable_entry_t *cf,
                                  cistpl_cftable_entry_t *dflt,
-                                 unsigned int vcc,
                                  void *priv_data)
 {
        struct serial_info *info = p_dev->priv;
index ee91c89511ed1e66f35761847cb175a34cc221ad..678fbf67d7a89b05a3f39401e7e861f1a891c23e 100644 (file)
@@ -712,7 +712,6 @@ static void das16cs_pcmcia_detach(struct pcmcia_device *link)
 static int das16cs_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if (cfg->index == 0)
index f8f3de57b413aa4619596f5094961530b4f1ff66..12a96b7a43adfdb26712505192a6d3140f02c089 100644 (file)
@@ -194,7 +194,6 @@ static void das08_pcmcia_detach(struct pcmcia_device *link)
 static int das08_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if (cfg->index == 0)
index 803683b8354329cffe627ccc7e67e683127ee57e..f22dc0f2a8d661d4f50b6cf877fb75e54c43ea5e 100644 (file)
@@ -532,19 +532,11 @@ static void dio700_cs_detach(struct pcmcia_device *link)
 static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Do we need to allocate an interrupt? */
-       p_dev->config_flags |= CONF_ENABLE_IRQ;
-
        /* IO window settings */
        p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
@@ -578,6 +570,8 @@ static void dio700_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "dio700_config\n");
 
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_AUDIO;
+
        ret = pcmcia_loop_config(link, dio700_pcmcia_config_loop, NULL);
        if (ret) {
                dev_warn(&link->dev, "no configuration found\n");
index 6512f7a283cecdaf536a5a645859d88d95135dd4..6dc2b06064cd7f15a3fa7a957d2b4f09972b4140 100644 (file)
@@ -284,19 +284,11 @@ static void dio24_cs_detach(struct pcmcia_device *link)
 static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Do we need to allocate an interrupt? */
-       p_dev->config_flags |= CONF_ENABLE_IRQ;
-
        /* IO window settings */
        p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
@@ -329,6 +321,8 @@ static void dio24_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "dio24_config\n");
 
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_AUDIO;
+
        ret = pcmcia_loop_config(link, dio24_pcmcia_config_loop, NULL);
        if (ret) {
                dev_warn(&link->dev, "no configuration found\n");
index 255cf40c5fd1417017982a9b0886fd188928cb2d..6eacbd70e2e9277b003dbd235996b06168bb89f7 100644 (file)
@@ -263,19 +263,11 @@ static void labpc_cs_detach(struct pcmcia_device *link)
 static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Does this card need audio output? */
-       if (cfg->flags & CISTPL_CFTABLE_AUDIO)
-               p_dev->config_flags |= CONF_ENABLE_SPKR;
-
-       /* Do we need to allocate an interrupt? */
-       p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ;
-
        /* IO window settings */
        p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
@@ -307,6 +299,9 @@ static void labpc_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "labpc_config\n");
 
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ |
+               CONF_AUTO_AUDIO;
+
        ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL);
        if (ret) {
                dev_warn(&link->dev, "no configuration found\n");
index b88f52dd08d0cc9c595a06a69a138ef6df6deee2..da4e2a21b19a346be37fac46fd8e6cf52017383f 100644 (file)
@@ -302,7 +302,6 @@ static int mio_cs_resume(struct pcmcia_device *link)
 static int mio_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        int base, ret;
index b8940d7f41559769c7a9c9fa7bddbed713f97a71..03a72d7ac676c2756848f0afc6cfa4adaf6ead96 100644 (file)
@@ -1071,7 +1071,6 @@ static void daqp_cs_detach(struct pcmcia_device *link)
 static int daqp_pcmcia_config_loop(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
                                cistpl_cftable_entry_t *dflt,
-                               unsigned int vcc,
                                void *priv_data)
 {
        if (cfg->index == 0)
index e23270d1b4d15ec591e4e4c6e0bf763022ebb486..670a76bf5164c1dab1dbea8c4bef0769173f06fc 100644 (file)
@@ -112,7 +112,6 @@ failed:
 static int ixj_config_check(struct pcmcia_device *p_dev,
                            cistpl_cftable_entry_t *cfg,
                            cistpl_cftable_entry_t *dflt,
-                           unsigned int vcc,
                            void *priv_data)
 {
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
index 744c2cd809f196143f13ee185527448f9eedf72d..d9606293c1af8ef51096b1fdba39a7aa48c07707 100644 (file)
@@ -134,32 +134,11 @@ static void sl811_cs_release(struct pcmcia_device * link)
 static int sl811_cs_config_check(struct pcmcia_device *p_dev,
                                 cistpl_cftable_entry_t *cfg,
                                 cistpl_cftable_entry_t *dflt,
-                                unsigned int vcc,
                                 void *priv_data)
 {
        if (cfg->index == 0)
                return -ENODEV;
 
-       /* Use power settings for Vcc and Vpp if present */
-       /*  Note that the CIS values need to be rescaled */
-       if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
-               if (cfg->vcc.param[CISTPL_POWER_VNOM]/10000 != vcc)
-                       return -ENODEV;
-       } else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) {
-               if (dflt->vcc.param[CISTPL_POWER_VNOM]/10000 != vcc)
-                       return -ENODEV;
-               }
-
-       if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp =
-                       cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
-       else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
-               p_dev->vpp =
-                       dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
-
-       /* we need an interrupt */
-       p_dev->config_flags |= CONF_ENABLE_IRQ;
-
        /* IO window settings */
        p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
@@ -184,6 +163,9 @@ static int sl811_cs_config(struct pcmcia_device *link)
 
        dev_dbg(&link->dev, "sl811_cs_config\n");
 
+       link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP |
+               CONF_AUTO_CHECK_VCC;
+
        if (pcmcia_loop_config(link, sl811_cs_config_check, NULL))
                goto failed;
 
index 50b03fd67fd6b499f584fed46de1f25d04da98a4..0577e5f10304bc80fe171ab3d92913003b8616b8 100644 (file)
@@ -177,7 +177,6 @@ int pcmcia_loop_config(struct pcmcia_device *p_dev,
                       int      (*conf_check)   (struct pcmcia_device *p_dev,
                                                 cistpl_cftable_entry_t *cf,
                                                 cistpl_cftable_entry_t *dflt,
-                                                unsigned int vcc,
                                                 void *priv_data),
                       void *priv_data);
 
@@ -270,6 +269,12 @@ static inline int pcmcia_io_cfg_data_width(unsigned int flags)
 #define CONF_ENABLE_PULSE_IRQ   0x04
 #define CONF_ENABLE_ESR         0x08
 
+/* flags used by pcmcia_loop_config() autoconfiguration */
+#define CONF_AUTO_CHECK_VCC    0x10 /* check for matching Vcc? */
+#define CONF_AUTO_SET_VPP      0x20 /* set Vpp? */
+#define CONF_AUTO_AUDIO                0x40 /* enable audio line? */
+
+
 #endif /* __KERNEL__ */
 
 #endif /* _LINUX_DS_H */