diff options
57 files changed, 527 insertions, 584 deletions
diff --git a/Documentation/pcmcia/driver-changes.txt b/Documentation/pcmcia/driver-changes.txt index ff5f0be2470a..26c0f9c00545 100644 --- a/Documentation/pcmcia/driver-changes.txt +++ b/Documentation/pcmcia/driver-changes.txt | |||
| @@ -1,4 +1,11 @@ | |||
| 1 | This file details changes in 2.6 which affect PCMCIA card driver authors: | 1 | This file details changes in 2.6 which affect PCMCIA card driver authors: |
| 2 | * pcmcia_request_io changes (as of 2.6.36) | ||
| 3 | Instead of io_req_t, drivers are now requested to fill out | ||
| 4 | struct pcmcia_device *p_dev->resource[0,1] for up to two ioport | ||
| 5 | ranges. After a call to pcmcia_request_io(), the ports found there | ||
| 6 | are reserved, after calling pcmcia_request_configuration(), they may | ||
| 7 | be used. | ||
| 8 | |||
| 2 | * No dev_info_t, no cs_types.h (as of 2.6.36) | 9 | * No dev_info_t, no cs_types.h (as of 2.6.36) |
| 3 | dev_info_t and a few other typedefs are removed. No longer use them | 10 | dev_info_t and a few other typedefs are removed. No longer use them |
| 4 | in PCMCIA device drivers. Also, do not include pcmcia/cs_types.h, as | 11 | in PCMCIA device drivers. Also, do not include pcmcia/cs_types.h, as |
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c index 1fcd0659b3f2..e944aa0c5517 100644 --- a/drivers/ata/pata_pcmcia.c +++ b/drivers/ata/pata_pcmcia.c | |||
| @@ -200,21 +200,23 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev, | |||
| 200 | 200 | ||
| 201 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 201 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 202 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 202 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 203 | pdev->io.BasePort1 = io->win[0].base; | 203 | pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 204 | pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 204 | pdev->resource[0]->start = io->win[0].base; |
| 205 | if (!(io->flags & CISTPL_IO_16BIT)) | 205 | if (!(io->flags & CISTPL_IO_16BIT)) { |
| 206 | pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 206 | pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 207 | pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | ||
| 208 | } | ||
| 207 | if (io->nwin == 2) { | 209 | if (io->nwin == 2) { |
| 208 | pdev->io.NumPorts1 = 8; | 210 | pdev->resource[0]->end = 8; |
| 209 | pdev->io.BasePort2 = io->win[1].base; | 211 | pdev->resource[1]->start = io->win[1].base; |
| 210 | pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1; | 212 | pdev->resource[1]->end = (stk->is_kme) ? 2 : 1; |
| 211 | if (pcmcia_request_io(pdev, &pdev->io) != 0) | 213 | if (pcmcia_request_io(pdev) != 0) |
| 212 | return -ENODEV; | 214 | return -ENODEV; |
| 213 | stk->ctl_base = pdev->resource[1]->start; | 215 | stk->ctl_base = pdev->resource[1]->start; |
| 214 | } else if ((io->nwin == 1) && (io->win[0].len >= 16)) { | 216 | } else if ((io->nwin == 1) && (io->win[0].len >= 16)) { |
| 215 | pdev->io.NumPorts1 = io->win[0].len; | 217 | pdev->resource[0]->end = io->win[0].len; |
| 216 | pdev->io.NumPorts2 = 0; | 218 | pdev->resource[1]->end = 0; |
| 217 | if (pcmcia_request_io(pdev, &pdev->io) != 0) | 219 | if (pcmcia_request_io(pdev) != 0) |
| 218 | return -ENODEV; | 220 | return -ENODEV; |
| 219 | stk->ctl_base = pdev->resource[0]->start + 0x0e; | 221 | stk->ctl_base = pdev->resource[0]->start + 0x0e; |
| 220 | } else | 222 | } else |
| @@ -245,9 +247,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev) | |||
| 245 | struct ata_port_operations *ops = &pcmcia_port_ops; | 247 | struct ata_port_operations *ops = &pcmcia_port_ops; |
| 246 | 248 | ||
| 247 | /* Set up attributes in order to probe card and get resources */ | 249 | /* Set up attributes in order to probe card and get resources */ |
| 248 | pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 250 | pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 249 | pdev->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 251 | pdev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 250 | pdev->io.IOAddrLines = 3; | ||
| 251 | pdev->conf.Attributes = CONF_ENABLE_IRQ; | 252 | pdev->conf.Attributes = CONF_ENABLE_IRQ; |
| 252 | pdev->conf.IntType = INT_MEMORY_AND_IO; | 253 | pdev->conf.IntType = INT_MEMORY_AND_IO; |
| 253 | 254 | ||
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index 24d2007139e8..d52e90a5a617 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c | |||
| @@ -865,9 +865,6 @@ static int bluecard_probe(struct pcmcia_device *link) | |||
| 865 | info->p_dev = link; | 865 | info->p_dev = link; |
| 866 | link->priv = info; | 866 | link->priv = info; |
| 867 | 867 | ||
| 868 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | ||
| 869 | link->io.NumPorts1 = 8; | ||
| 870 | |||
| 871 | link->conf.Attributes = CONF_ENABLE_IRQ; | 868 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 872 | link->conf.IntType = INT_MEMORY_AND_IO; | 869 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 873 | 870 | ||
| @@ -890,12 +887,14 @@ static int bluecard_config(struct pcmcia_device *link) | |||
| 890 | int i, n; | 887 | int i, n; |
| 891 | 888 | ||
| 892 | link->conf.ConfigIndex = 0x20; | 889 | link->conf.ConfigIndex = 0x20; |
| 893 | link->io.NumPorts1 = 64; | 890 | |
| 894 | link->io.IOAddrLines = 6; | 891 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 892 | link->resource[0]->end = 64; | ||
| 893 | link->io_lines = 6; | ||
| 895 | 894 | ||
| 896 | for (n = 0; n < 0x400; n += 0x40) { | 895 | for (n = 0; n < 0x400; n += 0x40) { |
| 897 | link->io.BasePort1 = n ^ 0x300; | 896 | link->resource[0]->start = n ^ 0x300; |
| 898 | i = pcmcia_request_io(link, &link->io); | 897 | i = pcmcia_request_io(link); |
| 899 | if (i == 0) | 898 | if (i == 0) |
| 900 | break; | 899 | break; |
| 901 | } | 900 | } |
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index 8ab494c0c17f..7ab8f29d5e0d 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c | |||
| @@ -657,8 +657,8 @@ static int bt3c_probe(struct pcmcia_device *link) | |||
| 657 | info->p_dev = link; | 657 | info->p_dev = link; |
| 658 | link->priv = info; | 658 | link->priv = info; |
| 659 | 659 | ||
| 660 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 660 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 661 | link->io.NumPorts1 = 8; | 661 | link->resource[0]->end = 8; |
| 662 | 662 | ||
| 663 | link->conf.Attributes = CONF_ENABLE_IRQ; | 663 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 664 | link->conf.IntType = INT_MEMORY_AND_IO; | 664 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -683,14 +683,14 @@ static int bt3c_check_config(struct pcmcia_device *p_dev, | |||
| 683 | { | 683 | { |
| 684 | unsigned long try = (unsigned long) priv_data; | 684 | unsigned long try = (unsigned long) priv_data; |
| 685 | 685 | ||
| 686 | p_dev->io_lines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK; | ||
| 687 | |||
| 686 | if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 688 | if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM)) |
| 687 | p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 689 | p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; |
| 688 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) && | 690 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) && |
| 689 | (cf->io.win[0].base != 0)) { | 691 | (cf->io.win[0].base != 0)) { |
| 690 | p_dev->io.BasePort1 = cf->io.win[0].base; | 692 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 691 | p_dev->io.IOAddrLines = (try == 0) ? 16 : | 693 | if (!pcmcia_request_io(p_dev)) |
| 692 | cf->io.flags & CISTPL_IO_LINES_MASK; | ||
| 693 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | ||
| 694 | return 0; | 694 | return 0; |
| 695 | } | 695 | } |
| 696 | return -ENODEV; | 696 | return -ENODEV; |
| @@ -707,9 +707,9 @@ static int bt3c_check_config_notpicky(struct pcmcia_device *p_dev, | |||
| 707 | 707 | ||
| 708 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { | 708 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { |
| 709 | for (j = 0; j < 5; j++) { | 709 | for (j = 0; j < 5; j++) { |
| 710 | p_dev->io.BasePort1 = base[j]; | 710 | p_dev->resource[0]->start = base[j]; |
| 711 | p_dev->io.IOAddrLines = base[j] ? 16 : 3; | 711 | p_dev->io_lines = base[j] ? 16 : 3; |
| 712 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 712 | if (!pcmcia_request_io(p_dev)) |
| 713 | return 0; | 713 | return 0; |
| 714 | } | 714 | } |
| 715 | } | 715 | } |
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index 7e770d40368d..1c4f5e863b03 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c | |||
| @@ -586,8 +586,8 @@ static int btuart_probe(struct pcmcia_device *link) | |||
| 586 | info->p_dev = link; | 586 | info->p_dev = link; |
| 587 | link->priv = info; | 587 | link->priv = info; |
| 588 | 588 | ||
| 589 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 589 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 590 | link->io.NumPorts1 = 8; | 590 | link->resource[0]->end = 8; |
| 591 | 591 | ||
| 592 | link->conf.Attributes = CONF_ENABLE_IRQ; | 592 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 593 | link->conf.IntType = INT_MEMORY_AND_IO; | 593 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -612,14 +612,14 @@ static int btuart_check_config(struct pcmcia_device *p_dev, | |||
| 612 | { | 612 | { |
| 613 | int *try = priv_data; | 613 | int *try = priv_data; |
| 614 | 614 | ||
| 615 | p_dev->io_lines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK; | ||
| 616 | |||
| 615 | if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 617 | if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM)) |
| 616 | p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 618 | p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; |
| 617 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) && | 619 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) && |
| 618 | (cf->io.win[0].base != 0)) { | 620 | (cf->io.win[0].base != 0)) { |
| 619 | p_dev->io.BasePort1 = cf->io.win[0].base; | 621 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 620 | p_dev->io.IOAddrLines = (*try == 0) ? 16 : | 622 | if (!pcmcia_request_io(p_dev)) |
| 621 | cf->io.flags & CISTPL_IO_LINES_MASK; | ||
| 622 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | ||
| 623 | return 0; | 623 | return 0; |
| 624 | } | 624 | } |
| 625 | return -ENODEV; | 625 | return -ENODEV; |
| @@ -636,9 +636,9 @@ static int btuart_check_config_notpicky(struct pcmcia_device *p_dev, | |||
| 636 | 636 | ||
| 637 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { | 637 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { |
| 638 | for (j = 0; j < 5; j++) { | 638 | for (j = 0; j < 5; j++) { |
| 639 | p_dev->io.BasePort1 = base[j]; | 639 | p_dev->resource[0]->start = base[j]; |
| 640 | p_dev->io.IOAddrLines = base[j] ? 16 : 3; | 640 | p_dev->io_lines = base[j] ? 16 : 3; |
| 641 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 641 | if (!pcmcia_request_io(p_dev)) |
| 642 | return 0; | 642 | return 0; |
| 643 | } | 643 | } |
| 644 | } | 644 | } |
diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index bfe9313516fb..18ecc5734e9f 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c | |||
| @@ -572,8 +572,8 @@ static int dtl1_probe(struct pcmcia_device *link) | |||
| 572 | info->p_dev = link; | 572 | info->p_dev = link; |
| 573 | link->priv = info; | 573 | link->priv = info; |
| 574 | 574 | ||
| 575 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 575 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 576 | link->io.NumPorts1 = 8; | 576 | link->resource[0]->end = 8; |
| 577 | 577 | ||
| 578 | link->conf.Attributes = CONF_ENABLE_IRQ; | 578 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 579 | link->conf.IntType = INT_MEMORY_AND_IO; | 579 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -597,14 +597,13 @@ static int dtl1_confcheck(struct pcmcia_device *p_dev, | |||
| 597 | unsigned int vcc, | 597 | unsigned int vcc, |
| 598 | void *priv_data) | 598 | void *priv_data) |
| 599 | { | 599 | { |
| 600 | if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) { | 600 | if ((cf->io.nwin != 1) || (cf->io.win[0].len <= 8)) |
| 601 | p_dev->io.BasePort1 = cf->io.win[0].base; | 601 | return -ENODEV; |
| 602 | p_dev->io.NumPorts1 = cf->io.win[0].len; /*yo */ | 602 | |
| 603 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; | 603 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 604 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 604 | p_dev->resource[0]->end = cf->io.win[0].len; /*yo */ |
| 605 | return 0; | 605 | p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK; |
| 606 | } | 606 | return pcmcia_request_io(p_dev); |
| 607 | return -ENODEV; | ||
| 608 | } | 607 | } |
| 609 | 608 | ||
| 610 | static int dtl1_config(struct pcmcia_device *link) | 609 | static int dtl1_config(struct pcmcia_device *link) |
| @@ -613,7 +612,7 @@ static int dtl1_config(struct pcmcia_device *link) | |||
| 613 | int i; | 612 | int i; |
| 614 | 613 | ||
| 615 | /* Look for a generic full-sized window */ | 614 | /* Look for a generic full-sized window */ |
| 616 | link->io.NumPorts1 = 8; | 615 | link->resource[0]->end = 8; |
| 617 | if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0) | 616 | if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0) |
| 618 | goto failed; | 617 | goto failed; |
| 619 | 618 | ||
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c index 18484edc1259..ec73d9f6d9ed 100644 --- a/drivers/char/pcmcia/cm4000_cs.c +++ b/drivers/char/pcmcia/cm4000_cs.c | |||
| @@ -1751,17 +1751,12 @@ static int cm4000_config_check(struct pcmcia_device *p_dev, | |||
| 1751 | if (!cfg->io.nwin) | 1751 | if (!cfg->io.nwin) |
| 1752 | return -ENODEV; | 1752 | return -ENODEV; |
| 1753 | 1753 | ||
| 1754 | /* Get the IOaddr */ | 1754 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 1755 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 1755 | p_dev->resource[0]->end = cfg->io.win[0].len; |
| 1756 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 1756 | p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags); |
| 1757 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 1757 | p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK; |
| 1758 | if (!(cfg->io.flags & CISTPL_IO_8BIT)) | 1758 | |
| 1759 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 1759 | return pcmcia_request_io(p_dev); |
| 1760 | if (!(cfg->io.flags & CISTPL_IO_16BIT)) | ||
| 1761 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | ||
| 1762 | p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK; | ||
| 1763 | |||
| 1764 | return pcmcia_request_io(p_dev, &p_dev->io); | ||
| 1765 | } | 1760 | } |
| 1766 | 1761 | ||
| 1767 | static int cm4000_config(struct pcmcia_device * link, int devno) | 1762 | static int cm4000_config(struct pcmcia_device * link, int devno) |
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c index a6bbf199dde9..815cde1d0570 100644 --- a/drivers/char/pcmcia/cm4040_cs.c +++ b/drivers/char/pcmcia/cm4040_cs.c | |||
| @@ -527,16 +527,12 @@ static int cm4040_config_check(struct pcmcia_device *p_dev, | |||
| 527 | return -ENODEV; | 527 | return -ENODEV; |
| 528 | 528 | ||
| 529 | /* Get the IOaddr */ | 529 | /* Get the IOaddr */ |
| 530 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 530 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 531 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 531 | p_dev->resource[0]->end = cfg->io.win[0].len; |
| 532 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 532 | p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags); |
| 533 | if (!(cfg->io.flags & CISTPL_IO_8BIT)) | 533 | p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK; |
| 534 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 534 | rc = pcmcia_request_io(p_dev); |
| 535 | if (!(cfg->io.flags & CISTPL_IO_16BIT)) | 535 | |
| 536 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | ||
| 537 | p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK; | ||
| 538 | |||
| 539 | rc = pcmcia_request_io(p_dev, &p_dev->io); | ||
| 540 | dev_printk(KERN_INFO, &p_dev->dev, | 536 | dev_printk(KERN_INFO, &p_dev->dev, |
| 541 | "pcmcia_request_io returned 0x%x\n", rc); | 537 | "pcmcia_request_io returned 0x%x\n", rc); |
| 542 | return rc; | 538 | return rc; |
| @@ -548,10 +544,6 @@ static int reader_config(struct pcmcia_device *link, int devno) | |||
| 548 | struct reader_dev *dev; | 544 | struct reader_dev *dev; |
| 549 | int fail_rc; | 545 | int fail_rc; |
| 550 | 546 | ||
| 551 | link->io.BasePort2 = 0; | ||
| 552 | link->io.NumPorts2 = 0; | ||
| 553 | link->io.Attributes2 = 0; | ||
| 554 | |||
| 555 | if (pcmcia_loop_config(link, cm4040_config_check, NULL)) | 547 | if (pcmcia_loop_config(link, cm4040_config_check, NULL)) |
| 556 | goto cs_release; | 548 | goto cs_release; |
| 557 | 549 | ||
diff --git a/drivers/char/pcmcia/ipwireless/main.c b/drivers/char/pcmcia/ipwireless/main.c index 9467994d556f..5f87b9f7b6d2 100644 --- a/drivers/char/pcmcia/ipwireless/main.c +++ b/drivers/char/pcmcia/ipwireless/main.c | |||
| @@ -88,15 +88,15 @@ static int ipwireless_probe(struct pcmcia_device *p_dev, | |||
| 88 | memreq_t memreq_common_memory; | 88 | memreq_t memreq_common_memory; |
| 89 | int ret; | 89 | int ret; |
| 90 | 90 | ||
| 91 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 91 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 92 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 92 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 93 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 93 | p_dev->resource[0]->end = cfg->io.win[0].len; |
| 94 | p_dev->io.IOAddrLines = 16; | ||
| 95 | 94 | ||
| 96 | /* 0x40 causes it to generate level mode interrupts. */ | 95 | /* 0x40 causes it to generate level mode interrupts. */ |
| 97 | /* 0x04 enables IREQ pin. */ | 96 | /* 0x04 enables IREQ pin. */ |
| 98 | p_dev->conf.ConfigIndex = cfg->index | 0x44; | 97 | p_dev->conf.ConfigIndex = cfg->index | 0x44; |
| 99 | ret = pcmcia_request_io(p_dev, &p_dev->io); | 98 | p_dev->io_lines = 16; |
| 99 | ret = pcmcia_request_io(p_dev); | ||
| 100 | if (ret) | 100 | if (ret) |
| 101 | return ret; | 101 | return ret; |
| 102 | 102 | ||
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 8ded9b02b9b9..9ecd6bef5d3b 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
| @@ -571,18 +571,15 @@ static int mgslpc_ioprobe(struct pcmcia_device *p_dev, | |||
| 571 | unsigned int vcc, | 571 | unsigned int vcc, |
| 572 | void *priv_data) | 572 | void *priv_data) |
| 573 | { | 573 | { |
| 574 | if (cfg->io.nwin > 0) { | 574 | if (!cfg->io.nwin) |
| 575 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 575 | return -ENODEV; |
| 576 | if (!(cfg->io.flags & CISTPL_IO_8BIT)) | 576 | |
| 577 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 577 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 578 | if (!(cfg->io.flags & CISTPL_IO_16BIT)) | 578 | p_dev->resource[0]->end = cfg->io.win[0].len; |
| 579 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 579 | p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags); |
| 580 | p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK; | 580 | p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK; |
| 581 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 581 | |
| 582 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 582 | return pcmcia_request_io(p_dev); |
| 583 | return pcmcia_request_io(p_dev, &p_dev->io); | ||
| 584 | } | ||
| 585 | return -ENODEV; | ||
| 586 | } | 583 | } |
| 587 | 584 | ||
| 588 | static int mgslpc_config(struct pcmcia_device *link) | 585 | static int mgslpc_config(struct pcmcia_device *link) |
diff --git a/drivers/ide/ide-cs.c b/drivers/ide/ide-cs.c index 6be0e5f108b5..2a4cb9c18f01 100644 --- a/drivers/ide/ide-cs.c +++ b/drivers/ide/ide-cs.c | |||
| @@ -97,9 +97,8 @@ static int ide_probe(struct pcmcia_device *link) | |||
| 97 | info->p_dev = link; | 97 | info->p_dev = link; |
| 98 | link->priv = info; | 98 | link->priv = info; |
| 99 | 99 | ||
| 100 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 100 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 101 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 101 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 102 | link->io.IOAddrLines = 3; | ||
| 103 | link->conf.Attributes = CONF_ENABLE_IRQ; | 102 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 104 | link->conf.IntType = INT_MEMORY_AND_IO; | 103 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 105 | 104 | ||
| @@ -228,22 +227,25 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev, | |||
| 228 | 227 | ||
| 229 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 228 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 230 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 229 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 230 | pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK; | ||
| 231 | |||
| 231 | pdev->conf.ConfigIndex = cfg->index; | 232 | pdev->conf.ConfigIndex = cfg->index; |
| 232 | pdev->io.BasePort1 = io->win[0].base; | 233 | pdev->resource[0]->start = io->win[0].base; |
| 233 | pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 234 | if (!(io->flags & CISTPL_IO_16BIT)) { |
| 234 | if (!(io->flags & CISTPL_IO_16BIT)) | 235 | pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 235 | pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 236 | pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 237 | } | ||
| 236 | if (io->nwin == 2) { | 238 | if (io->nwin == 2) { |
| 237 | pdev->io.NumPorts1 = 8; | 239 | pdev->resource[0]->end = 8; |
| 238 | pdev->io.BasePort2 = io->win[1].base; | 240 | pdev->resource[1]->start = io->win[1].base; |
| 239 | pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1; | 241 | pdev->resource[1]->end = (stk->is_kme) ? 2 : 1; |
| 240 | if (pcmcia_request_io(pdev, &pdev->io) != 0) | 242 | if (pcmcia_request_io(pdev) != 0) |
| 241 | return -ENODEV; | 243 | return -ENODEV; |
| 242 | stk->ctl_base = pdev->resource[1]->start; | 244 | stk->ctl_base = pdev->resource[1]->start; |
| 243 | } else if ((io->nwin == 1) && (io->win[0].len >= 16)) { | 245 | } else if ((io->nwin == 1) && (io->win[0].len >= 16)) { |
| 244 | pdev->io.NumPorts1 = io->win[0].len; | 246 | pdev->resource[0]->end = io->win[0].len; |
| 245 | pdev->io.NumPorts2 = 0; | 247 | pdev->resource[1]->end = 0; |
| 246 | if (pcmcia_request_io(pdev, &pdev->io) != 0) | 248 | if (pcmcia_request_io(pdev) != 0) |
| 247 | return -ENODEV; | 249 | return -ENODEV; |
| 248 | stk->ctl_base = pdev->resource[0]->start + 0x0e; | 250 | stk->ctl_base = pdev->resource[0]->start + 0x0e; |
| 249 | } else | 251 | } else |
diff --git a/drivers/isdn/hardware/avm/avm_cs.c b/drivers/isdn/hardware/avm/avm_cs.c index 7c8c51f22003..09b1795516f4 100644 --- a/drivers/isdn/hardware/avm/avm_cs.c +++ b/drivers/isdn/hardware/avm/avm_cs.c | |||
| @@ -75,9 +75,8 @@ static int avmcs_probe(struct pcmcia_device *p_dev) | |||
| 75 | { | 75 | { |
| 76 | 76 | ||
| 77 | /* The io structure describes IO port mapping */ | 77 | /* The io structure describes IO port mapping */ |
| 78 | p_dev->io.NumPorts1 = 16; | 78 | p_dev->resource[0]->end = 16; |
| 79 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 79 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 80 | p_dev->io.NumPorts2 = 0; | ||
| 81 | 80 | ||
| 82 | /* General socket configuration */ | 81 | /* General socket configuration */ |
| 83 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 82 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
| @@ -119,13 +118,9 @@ static int avmcs_configcheck(struct pcmcia_device *p_dev, | |||
| 119 | if (cf->io.nwin <= 0) | 118 | if (cf->io.nwin <= 0) |
| 120 | return -ENODEV; | 119 | return -ENODEV; |
| 121 | 120 | ||
| 122 | p_dev->io.BasePort1 = cf->io.win[0].base; | 121 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 123 | p_dev->io.NumPorts1 = cf->io.win[0].len; | 122 | p_dev->resource[0]->end = cf->io.win[0].len; |
| 124 | p_dev->io.NumPorts2 = 0; | 123 | return pcmcia_request_io(p_dev); |
| 125 | printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n", | ||
| 126 | p_dev->io.BasePort1, | ||
| 127 | p_dev->io.BasePort1+p_dev->io.NumPorts1-1); | ||
| 128 | return pcmcia_request_io(p_dev, &p_dev->io); | ||
| 129 | } | 124 | } |
| 130 | 125 | ||
| 131 | static int avmcs_config(struct pcmcia_device *link) | 126 | static int avmcs_config(struct pcmcia_device *link) |
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c index 88899638f835..94263c22b874 100644 --- a/drivers/isdn/hisax/avma1_cs.c +++ b/drivers/isdn/hisax/avma1_cs.c | |||
| @@ -78,11 +78,10 @@ static int __devinit avma1cs_probe(struct pcmcia_device *p_dev) | |||
| 78 | dev_dbg(&p_dev->dev, "avma1cs_attach()\n"); | 78 | dev_dbg(&p_dev->dev, "avma1cs_attach()\n"); |
| 79 | 79 | ||
| 80 | /* The io structure describes IO port mapping */ | 80 | /* The io structure describes IO port mapping */ |
| 81 | p_dev->io.NumPorts1 = 16; | 81 | p_dev->resource[0]->end = 16; |
| 82 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 82 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 83 | p_dev->io.NumPorts2 = 16; | 83 | p_dev->resource[1]->end = 16; |
| 84 | p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_16; | 84 | p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16; |
| 85 | p_dev->io.IOAddrLines = 5; | ||
| 86 | 85 | ||
| 87 | /* General socket configuration */ | 86 | /* General socket configuration */ |
| 88 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 87 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
| @@ -126,13 +125,10 @@ static int avma1cs_configcheck(struct pcmcia_device *p_dev, | |||
| 126 | if (cf->io.nwin <= 0) | 125 | if (cf->io.nwin <= 0) |
| 127 | return -ENODEV; | 126 | return -ENODEV; |
| 128 | 127 | ||
| 129 | p_dev->io.BasePort1 = cf->io.win[0].base; | 128 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 130 | p_dev->io.NumPorts1 = cf->io.win[0].len; | 129 | p_dev->resource[0]->end = cf->io.win[0].len; |
| 131 | p_dev->io.NumPorts2 = 0; | 130 | p_dev->io_lines = 5; |
| 132 | printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n", | 131 | return pcmcia_request_io(p_dev); |
| 133 | p_dev->io.BasePort1, | ||
| 134 | p_dev->io.BasePort1+p_dev->io.NumPorts1-1); | ||
| 135 | return pcmcia_request_io(p_dev, &p_dev->io); | ||
| 136 | } | 132 | } |
| 137 | 133 | ||
| 138 | 134 | ||
diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c index c10bfd3f4588..b3c08aaf41c4 100644 --- a/drivers/isdn/hisax/elsa_cs.c +++ b/drivers/isdn/hisax/elsa_cs.c | |||
| @@ -126,9 +126,8 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link) | |||
| 126 | and attributes of IO windows) are fixed by the nature of the | 126 | and attributes of IO windows) are fixed by the nature of the |
| 127 | device, and can be hard-wired here. | 127 | device, and can be hard-wired here. |
| 128 | */ | 128 | */ |
| 129 | link->io.NumPorts1 = 8; | 129 | link->resource[0]->end = 8; |
| 130 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 130 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 131 | link->io.IOAddrLines = 3; | ||
| 132 | 131 | ||
| 133 | link->conf.Attributes = CONF_ENABLE_IRQ; | 132 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 134 | link->conf.IntType = INT_MEMORY_AND_IO; | 133 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -173,16 +172,18 @@ static int elsa_cs_configcheck(struct pcmcia_device *p_dev, | |||
| 173 | { | 172 | { |
| 174 | int j; | 173 | int j; |
| 175 | 174 | ||
| 175 | p_dev->io_lines = 3; | ||
| 176 | |||
| 176 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { | 177 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { |
| 177 | printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n"); | 178 | printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n"); |
| 178 | p_dev->io.BasePort1 = cf->io.win[0].base; | 179 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 179 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 180 | if (!pcmcia_request_io(p_dev)) |
| 180 | return 0; | 181 | return 0; |
| 181 | } else { | 182 | } else { |
| 182 | printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n"); | 183 | printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n"); |
| 183 | for (j = 0x2f0; j > 0x100; j -= 0x10) { | 184 | for (j = 0x2f0; j > 0x100; j -= 0x10) { |
| 184 | p_dev->io.BasePort1 = j; | 185 | p_dev->resource[0]->start = j; |
| 185 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 186 | if (!pcmcia_request_io(p_dev)) |
| 186 | return 0; | 187 | return 0; |
| 187 | } | 188 | } |
| 188 | } | 189 | } |
diff --git a/drivers/isdn/hisax/sedlbauer_cs.c b/drivers/isdn/hisax/sedlbauer_cs.c index cecb35ab9d3d..4755eb440f7e 100644 --- a/drivers/isdn/hisax/sedlbauer_cs.c +++ b/drivers/isdn/hisax/sedlbauer_cs.c | |||
| @@ -129,9 +129,8 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link) | |||
| 129 | /* from old sedl_cs | 129 | /* from old sedl_cs |
| 130 | */ | 130 | */ |
| 131 | /* The io structure describes IO port mapping */ | 131 | /* The io structure describes IO port mapping */ |
| 132 | link->io.NumPorts1 = 8; | 132 | link->resource[0]->end = 8; |
| 133 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 133 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 134 | link->io.IOAddrLines = 3; | ||
| 135 | 134 | ||
| 136 | link->conf.Attributes = 0; | 135 | link->conf.Attributes = 0; |
| 137 | link->conf.IntType = INT_MEMORY_AND_IO; | 136 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -201,23 +200,22 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev, | |||
| 201 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 200 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 202 | 201 | ||
| 203 | /* IO window settings */ | 202 | /* IO window settings */ |
| 204 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 203 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 205 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 204 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 206 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 205 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 207 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 206 | p_dev->resource[0]->start = io->win[0].base; |
| 208 | if (!(io->flags & CISTPL_IO_8BIT)) | 207 | p_dev->resource[0]->end = io->win[0].len; |
| 209 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 208 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 210 | if (!(io->flags & CISTPL_IO_16BIT)) | 209 | p_dev->resource[0]->flags |= |
| 211 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 210 | pcmcia_io_cfg_data_width(io->flags); |
| 212 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 213 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 214 | if (io->nwin > 1) { | 211 | if (io->nwin > 1) { |
| 215 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 212 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 216 | p_dev->io.BasePort2 = io->win[1].base; | 213 | p_dev->resource[1]->start = io->win[1].base; |
| 217 | p_dev->io.NumPorts2 = io->win[1].len; | 214 | p_dev->resource[1]->end = io->win[1].len; |
| 218 | } | 215 | } |
| 219 | /* This reserves IO space but doesn't actually enable it */ | 216 | /* This reserves IO space but doesn't actually enable it */ |
| 220 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 217 | p_dev->io_lines = 3; |
| 218 | if (pcmcia_request_io(p_dev) != 0) | ||
| 221 | return -ENODEV; | 219 | return -ENODEV; |
| 222 | } | 220 | } |
| 223 | 221 | ||
diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c index 3787fc70cf8f..7296102ca255 100644 --- a/drivers/isdn/hisax/teles_cs.c +++ b/drivers/isdn/hisax/teles_cs.c | |||
| @@ -106,9 +106,8 @@ static int __devinit teles_probe(struct pcmcia_device *link) | |||
| 106 | and attributes of IO windows) are fixed by the nature of the | 106 | and attributes of IO windows) are fixed by the nature of the |
| 107 | device, and can be hard-wired here. | 107 | device, and can be hard-wired here. |
| 108 | */ | 108 | */ |
| 109 | link->io.NumPorts1 = 96; | 109 | link->resource[0]->end = 96; |
| 110 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 110 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 111 | link->io.IOAddrLines = 5; | ||
| 112 | 111 | ||
| 113 | link->conf.Attributes = CONF_ENABLE_IRQ; | 112 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 114 | link->conf.IntType = INT_MEMORY_AND_IO; | 113 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -153,16 +152,18 @@ static int teles_cs_configcheck(struct pcmcia_device *p_dev, | |||
| 153 | { | 152 | { |
| 154 | int j; | 153 | int j; |
| 155 | 154 | ||
| 155 | p_dev->io_lines = 5; | ||
| 156 | |||
| 156 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { | 157 | if ((cf->io.nwin > 0) && cf->io.win[0].base) { |
| 157 | printk(KERN_INFO "(teles_cs: looks like the 96 model)\n"); | 158 | printk(KERN_INFO "(teles_cs: looks like the 96 model)\n"); |
| 158 | p_dev->io.BasePort1 = cf->io.win[0].base; | 159 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 159 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 160 | if (!pcmcia_request_io(p_dev)) |
| 160 | return 0; | 161 | return 0; |
| 161 | } else { | 162 | } else { |
| 162 | printk(KERN_INFO "(teles_cs: looks like the 97 model)\n"); | 163 | printk(KERN_INFO "(teles_cs: looks like the 97 model)\n"); |
| 163 | for (j = 0x2f0; j > 0x100; j -= 0x10) { | 164 | for (j = 0x2f0; j > 0x100; j -= 0x10) { |
| 164 | p_dev->io.BasePort1 = j; | 165 | p_dev->resource[0]->start = j; |
| 165 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 166 | if (!pcmcia_request_io(p_dev)) |
| 166 | return 0; | 167 | return 0; |
| 167 | } | 168 | } |
| 168 | } | 169 | } |
diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c index b5ea9b8cfd76..c683f77c6f42 100644 --- a/drivers/net/pcmcia/3c574_cs.c +++ b/drivers/net/pcmcia/3c574_cs.c | |||
| @@ -278,8 +278,8 @@ static int tc574_probe(struct pcmcia_device *link) | |||
| 278 | lp->p_dev = link; | 278 | lp->p_dev = link; |
| 279 | 279 | ||
| 280 | spin_lock_init(&lp->window_lock); | 280 | spin_lock_init(&lp->window_lock); |
| 281 | link->io.NumPorts1 = 32; | 281 | link->resource[0]->end = 32; |
| 282 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 282 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; |
| 283 | link->conf.Attributes = CONF_ENABLE_IRQ; | 283 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 284 | link->conf.IntType = INT_MEMORY_AND_IO; | 284 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 285 | link->conf.ConfigIndex = 1; | 285 | link->conf.ConfigIndex = 1; |
| @@ -337,10 +337,11 @@ static int tc574_config(struct pcmcia_device *link) | |||
| 337 | 337 | ||
| 338 | dev_dbg(&link->dev, "3c574_config()\n"); | 338 | dev_dbg(&link->dev, "3c574_config()\n"); |
| 339 | 339 | ||
| 340 | link->io.IOAddrLines = 16; | 340 | link->io_lines = 16; |
| 341 | |||
| 341 | for (i = j = 0; j < 0x400; j += 0x20) { | 342 | for (i = j = 0; j < 0x400; j += 0x20) { |
| 342 | link->io.BasePort1 = j ^ 0x300; | 343 | link->resource[0]->start = j ^ 0x300; |
| 343 | i = pcmcia_request_io(link, &link->io); | 344 | i = pcmcia_request_io(link); |
| 344 | if (i == 0) | 345 | if (i == 0) |
| 345 | break; | 346 | break; |
| 346 | } | 347 | } |
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index 122ef4a9488c..61f9cf2100ff 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c | |||
| @@ -213,8 +213,8 @@ static int tc589_probe(struct pcmcia_device *link) | |||
| 213 | lp->p_dev = link; | 213 | lp->p_dev = link; |
| 214 | 214 | ||
| 215 | spin_lock_init(&lp->lock); | 215 | spin_lock_init(&lp->lock); |
| 216 | link->io.NumPorts1 = 16; | 216 | link->resource[0]->end = 16; |
| 217 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 217 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; |
| 218 | 218 | ||
| 219 | link->conf.Attributes = CONF_ENABLE_IRQ; | 219 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 220 | link->conf.IntType = INT_MEMORY_AND_IO; | 220 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -277,12 +277,13 @@ static int tc589_config(struct pcmcia_device *link) | |||
| 277 | "3Com card??\n"); | 277 | "3Com card??\n"); |
| 278 | multi = (link->card_id == PRODID_3COM_3C562); | 278 | multi = (link->card_id == PRODID_3COM_3C562); |
| 279 | 279 | ||
| 280 | link->io_lines = 16; | ||
| 281 | |||
| 280 | /* For the 3c562, the base address must be xx00-xx7f */ | 282 | /* For the 3c562, the base address must be xx00-xx7f */ |
| 281 | link->io.IOAddrLines = 16; | ||
| 282 | for (i = j = 0; j < 0x400; j += 0x10) { | 283 | for (i = j = 0; j < 0x400; j += 0x10) { |
| 283 | if (multi && (j & 0x80)) continue; | 284 | if (multi && (j & 0x80)) continue; |
| 284 | link->io.BasePort1 = j ^ 0x300; | 285 | link->resource[0]->start = j ^ 0x300; |
| 285 | i = pcmcia_request_io(link, &link->io); | 286 | i = pcmcia_request_io(link); |
| 286 | if (i == 0) | 287 | if (i == 0) |
| 287 | break; | 288 | break; |
| 288 | } | 289 | } |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index c52fdf31cbfe..5f05ffb240cc 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -259,28 +259,30 @@ static int get_prom(struct pcmcia_device *link) | |||
| 259 | static int try_io_port(struct pcmcia_device *link) | 259 | static int try_io_port(struct pcmcia_device *link) |
| 260 | { | 260 | { |
| 261 | int j, ret; | 261 | int j, ret; |
| 262 | if (link->io.NumPorts1 == 32) { | 262 | link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 263 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 263 | link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; |
| 264 | if (link->resource[0]->end == 32) { | ||
| 265 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | ||
| 264 | /* for master/slave multifunction cards */ | 266 | /* for master/slave multifunction cards */ |
| 265 | if (link->io.NumPorts2 > 0) | 267 | if (link->resource[1]->end > 0) |
| 266 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 268 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 267 | } else { | 269 | } else { |
| 268 | /* This should be two 16-port windows */ | 270 | /* This should be two 16-port windows */ |
| 269 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 271 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 270 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; | 272 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16; |
| 271 | } | 273 | } |
| 272 | if (link->io.BasePort1 == 0) { | 274 | if (link->resource[0]->start == 0) { |
| 273 | link->io.IOAddrLines = 16; | ||
| 274 | for (j = 0; j < 0x400; j += 0x20) { | 275 | for (j = 0; j < 0x400; j += 0x20) { |
| 275 | link->io.BasePort1 = j ^ 0x300; | 276 | link->resource[0]->start = j ^ 0x300; |
| 276 | link->io.BasePort2 = (j ^ 0x300) + 0x10; | 277 | link->resource[1]->start = (j ^ 0x300) + 0x10; |
| 277 | ret = pcmcia_request_io(link, &link->io); | 278 | link->io_lines = 16; |
| 279 | ret = pcmcia_request_io(link); | ||
| 278 | if (ret == 0) | 280 | if (ret == 0) |
| 279 | return ret; | 281 | return ret; |
| 280 | } | 282 | } |
| 281 | return ret; | 283 | return ret; |
| 282 | } else { | 284 | } else { |
| 283 | return pcmcia_request_io(link, &link->io); | 285 | return pcmcia_request_io(link); |
| 284 | } | 286 | } |
| 285 | } | 287 | } |
| 286 | 288 | ||
| @@ -301,15 +303,15 @@ static int axnet_configcheck(struct pcmcia_device *p_dev, | |||
| 301 | network function with window 0, and serial with window 1 */ | 303 | network function with window 0, and serial with window 1 */ |
| 302 | if (io->nwin > 1) { | 304 | if (io->nwin > 1) { |
| 303 | i = (io->win[1].len > io->win[0].len); | 305 | i = (io->win[1].len > io->win[0].len); |
| 304 | p_dev->io.BasePort2 = io->win[1-i].base; | 306 | p_dev->resource[1]->start = io->win[1-i].base; |
| 305 | p_dev->io.NumPorts2 = io->win[1-i].len; | 307 | p_dev->resource[1]->end = io->win[1-i].len; |
| 306 | } else { | 308 | } else { |
| 307 | i = p_dev->io.NumPorts2 = 0; | 309 | i = p_dev->resource[1]->end = 0; |
| 308 | } | 310 | } |
| 309 | p_dev->io.BasePort1 = io->win[i].base; | 311 | p_dev->resource[0]->start = io->win[i].base; |
| 310 | p_dev->io.NumPorts1 = io->win[i].len; | 312 | p_dev->resource[0]->end = io->win[i].len; |
| 311 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 313 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 312 | if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32) | 314 | if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32) |
| 313 | return try_io_port(p_dev); | 315 | return try_io_port(p_dev); |
| 314 | 316 | ||
| 315 | return -ENODEV; | 317 | return -ENODEV; |
diff --git a/drivers/net/pcmcia/com20020_cs.c b/drivers/net/pcmcia/com20020_cs.c index 3b53818e3eef..3c400cfa82ae 100644 --- a/drivers/net/pcmcia/com20020_cs.c +++ b/drivers/net/pcmcia/com20020_cs.c | |||
| @@ -158,9 +158,8 @@ static int com20020_probe(struct pcmcia_device *p_dev) | |||
| 158 | /* fill in our module parameters as defaults */ | 158 | /* fill in our module parameters as defaults */ |
| 159 | dev->dev_addr[0] = node; | 159 | dev->dev_addr[0] = node; |
| 160 | 160 | ||
| 161 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 161 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 162 | p_dev->io.NumPorts1 = 16; | 162 | p_dev->resource[0]->end = 16; |
| 163 | p_dev->io.IOAddrLines = 16; | ||
| 164 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 163 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
| 165 | p_dev->conf.IntType = INT_MEMORY_AND_IO; | 164 | p_dev->conf.IntType = INT_MEMORY_AND_IO; |
| 166 | 165 | ||
| @@ -245,20 +244,24 @@ static int com20020_config(struct pcmcia_device *link) | |||
| 245 | 244 | ||
| 246 | dev_dbg(&link->dev, "com20020_config\n"); | 245 | dev_dbg(&link->dev, "com20020_config\n"); |
| 247 | 246 | ||
| 248 | dev_dbg(&link->dev, "baseport1 is %Xh\n", link->io.BasePort1); | 247 | dev_dbg(&link->dev, "baseport1 is %Xh\n", |
| 248 | (unsigned int) link->resource[0]->start); | ||
| 249 | |||
| 249 | i = -ENODEV; | 250 | i = -ENODEV; |
| 250 | if (!link->io.BasePort1) | 251 | link->io_lines = 16; |
| 252 | |||
| 253 | if (!link->resource[0]->start) | ||
| 251 | { | 254 | { |
| 252 | for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) | 255 | for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10) |
| 253 | { | 256 | { |
| 254 | link->io.BasePort1 = ioaddr; | 257 | link->resource[0]->start = ioaddr; |
| 255 | i = pcmcia_request_io(link, &link->io); | 258 | i = pcmcia_request_io(link); |
| 256 | if (i == 0) | 259 | if (i == 0) |
| 257 | break; | 260 | break; |
| 258 | } | 261 | } |
| 259 | } | 262 | } |
| 260 | else | 263 | else |
| 261 | i = pcmcia_request_io(link, &link->io); | 264 | i = pcmcia_request_io(link); |
| 262 | 265 | ||
| 263 | if (i != 0) | 266 | if (i != 0) |
| 264 | { | 267 | { |
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index bba6369a028e..699304480aed 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c | |||
| @@ -248,9 +248,8 @@ static int fmvj18x_probe(struct pcmcia_device *link) | |||
| 248 | lp->base = NULL; | 248 | lp->base = NULL; |
| 249 | 249 | ||
| 250 | /* The io structure describes IO port mapping */ | 250 | /* The io structure describes IO port mapping */ |
| 251 | link->io.NumPorts1 = 32; | 251 | link->resource[0]->end = 32; |
| 252 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 252 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 253 | link->io.IOAddrLines = 5; | ||
| 254 | 253 | ||
| 255 | /* General socket configuration */ | 254 | /* General socket configuration */ |
| 256 | link->conf.Attributes = CONF_ENABLE_IRQ; | 255 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| @@ -288,13 +287,13 @@ static int mfc_try_io_port(struct pcmcia_device *link) | |||
| 288 | { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; | 287 | { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; |
| 289 | 288 | ||
| 290 | for (i = 0; i < 5; i++) { | 289 | for (i = 0; i < 5; i++) { |
| 291 | link->io.BasePort2 = serial_base[i]; | 290 | link->resource[1]->start = serial_base[i]; |
| 292 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 291 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 293 | if (link->io.BasePort2 == 0) { | 292 | if (link->resource[1]->start == 0) { |
| 294 | link->io.NumPorts2 = 0; | 293 | link->resource[1]->end = 0; |
| 295 | printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n"); | 294 | printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n"); |
| 296 | } | 295 | } |
| 297 | ret = pcmcia_request_io(link, &link->io); | 296 | ret = pcmcia_request_io(link); |
| 298 | if (ret == 0) | 297 | if (ret == 0) |
| 299 | return ret; | 298 | return ret; |
| 300 | } | 299 | } |
| @@ -310,8 +309,8 @@ static int ungermann_try_io_port(struct pcmcia_device *link) | |||
| 310 | 0x380,0x3c0 only for ioport. | 309 | 0x380,0x3c0 only for ioport. |
| 311 | */ | 310 | */ |
| 312 | for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) { | 311 | for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) { |
| 313 | link->io.BasePort1 = ioaddr; | 312 | link->resource[0]->start = ioaddr; |
| 314 | ret = pcmcia_request_io(link, &link->io); | 313 | ret = pcmcia_request_io(link); |
| 315 | if (ret == 0) { | 314 | if (ret == 0) { |
| 316 | /* calculate ConfigIndex value */ | 315 | /* calculate ConfigIndex value */ |
| 317 | link->conf.ConfigIndex = | 316 | link->conf.ConfigIndex = |
| @@ -345,6 +344,8 @@ static int fmvj18x_config(struct pcmcia_device *link) | |||
| 345 | 344 | ||
| 346 | dev_dbg(&link->dev, "fmvj18x_config\n"); | 345 | dev_dbg(&link->dev, "fmvj18x_config\n"); |
| 347 | 346 | ||
| 347 | link->io_lines = 5; | ||
| 348 | |||
| 348 | len = pcmcia_get_tuple(link, CISTPL_FUNCE, &buf); | 349 | len = pcmcia_get_tuple(link, CISTPL_FUNCE, &buf); |
| 349 | kfree(buf); | 350 | kfree(buf); |
| 350 | 351 | ||
| @@ -363,20 +364,20 @@ static int fmvj18x_config(struct pcmcia_device *link) | |||
| 363 | /* MultiFunction Card */ | 364 | /* MultiFunction Card */ |
| 364 | link->conf.ConfigBase = 0x800; | 365 | link->conf.ConfigBase = 0x800; |
| 365 | link->conf.ConfigIndex = 0x47; | 366 | link->conf.ConfigIndex = 0x47; |
| 366 | link->io.NumPorts2 = 8; | 367 | link->resource[1]->end = 8; |
| 367 | } | 368 | } |
| 368 | break; | 369 | break; |
| 369 | case MANFID_NEC: | 370 | case MANFID_NEC: |
| 370 | cardtype = NEC; /* MultiFunction Card */ | 371 | cardtype = NEC; /* MultiFunction Card */ |
| 371 | link->conf.ConfigBase = 0x800; | 372 | link->conf.ConfigBase = 0x800; |
| 372 | link->conf.ConfigIndex = 0x47; | 373 | link->conf.ConfigIndex = 0x47; |
| 373 | link->io.NumPorts2 = 8; | 374 | link->resource[1]->end = 8; |
| 374 | break; | 375 | break; |
| 375 | case MANFID_KME: | 376 | case MANFID_KME: |
| 376 | cardtype = KME; /* MultiFunction Card */ | 377 | cardtype = KME; /* MultiFunction Card */ |
| 377 | link->conf.ConfigBase = 0x800; | 378 | link->conf.ConfigBase = 0x800; |
| 378 | link->conf.ConfigIndex = 0x47; | 379 | link->conf.ConfigIndex = 0x47; |
| 379 | link->io.NumPorts2 = 8; | 380 | link->resource[1]->end = 8; |
| 380 | break; | 381 | break; |
| 381 | case MANFID_CONTEC: | 382 | case MANFID_CONTEC: |
| 382 | cardtype = CONTEC; | 383 | cardtype = CONTEC; |
| @@ -417,14 +418,14 @@ static int fmvj18x_config(struct pcmcia_device *link) | |||
| 417 | } | 418 | } |
| 418 | } | 419 | } |
| 419 | 420 | ||
| 420 | if (link->io.NumPorts2 != 0) { | 421 | if (link->resource[1]->end != 0) { |
| 421 | ret = mfc_try_io_port(link); | 422 | ret = mfc_try_io_port(link); |
| 422 | if (ret != 0) goto failed; | 423 | if (ret != 0) goto failed; |
| 423 | } else if (cardtype == UNGERMANN) { | 424 | } else if (cardtype == UNGERMANN) { |
| 424 | ret = ungermann_try_io_port(link); | 425 | ret = ungermann_try_io_port(link); |
| 425 | if (ret != 0) goto failed; | 426 | if (ret != 0) goto failed; |
| 426 | } else { | 427 | } else { |
| 427 | ret = pcmcia_request_io(link, &link->io); | 428 | ret = pcmcia_request_io(link); |
| 428 | if (ret) | 429 | if (ret) |
| 429 | goto failed; | 430 | goto failed; |
| 430 | } | 431 | } |
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index e99abaa92be5..3fd859570db3 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
| @@ -151,9 +151,8 @@ static int __devinit ibmtr_attach(struct pcmcia_device *link) | |||
| 151 | link->priv = info; | 151 | link->priv = info; |
| 152 | info->ti = netdev_priv(dev); | 152 | info->ti = netdev_priv(dev); |
| 153 | 153 | ||
| 154 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 154 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 155 | link->io.NumPorts1 = 4; | 155 | link->resource[0]->end = 4; |
| 156 | link->io.IOAddrLines = 16; | ||
| 157 | link->conf.Attributes = CONF_ENABLE_IRQ; | 156 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 158 | link->conf.IntType = INT_MEMORY_AND_IO; | 157 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 159 | link->conf.Present = PRESENT_OPTION; | 158 | link->conf.Present = PRESENT_OPTION; |
| @@ -218,16 +217,17 @@ static int __devinit ibmtr_config(struct pcmcia_device *link) | |||
| 218 | dev_dbg(&link->dev, "ibmtr_config\n"); | 217 | dev_dbg(&link->dev, "ibmtr_config\n"); |
| 219 | 218 | ||
| 220 | link->conf.ConfigIndex = 0x61; | 219 | link->conf.ConfigIndex = 0x61; |
| 220 | link->io_lines = 16; | ||
| 221 | 221 | ||
| 222 | /* Determine if this is PRIMARY or ALTERNATE. */ | 222 | /* Determine if this is PRIMARY or ALTERNATE. */ |
| 223 | 223 | ||
| 224 | /* Try PRIMARY card at 0xA20-0xA23 */ | 224 | /* Try PRIMARY card at 0xA20-0xA23 */ |
| 225 | link->io.BasePort1 = 0xA20; | 225 | link->resource[0]->start = 0xA20; |
| 226 | i = pcmcia_request_io(link, &link->io); | 226 | i = pcmcia_request_io(link); |
| 227 | if (i != 0) { | 227 | if (i != 0) { |
| 228 | /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */ | 228 | /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */ |
| 229 | link->io.BasePort1 = 0xA24; | 229 | link->resource[0]->start = 0xA24; |
| 230 | ret = pcmcia_request_io(link, &link->io); | 230 | ret = pcmcia_request_io(link); |
| 231 | if (ret) | 231 | if (ret) |
| 232 | goto failed; | 232 | goto failed; |
| 233 | } | 233 | } |
diff --git a/drivers/net/pcmcia/nmclan_cs.c b/drivers/net/pcmcia/nmclan_cs.c index 9980cbb81d34..68f2deeb3ade 100644 --- a/drivers/net/pcmcia/nmclan_cs.c +++ b/drivers/net/pcmcia/nmclan_cs.c | |||
| @@ -458,9 +458,8 @@ static int nmclan_probe(struct pcmcia_device *link) | |||
| 458 | link->priv = dev; | 458 | link->priv = dev; |
| 459 | 459 | ||
| 460 | spin_lock_init(&lp->bank_lock); | 460 | spin_lock_init(&lp->bank_lock); |
| 461 | link->io.NumPorts1 = 32; | 461 | link->resource[0]->end = 32; |
| 462 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 462 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 463 | link->io.IOAddrLines = 5; | ||
| 464 | link->conf.Attributes = CONF_ENABLE_IRQ; | 463 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 465 | link->conf.IntType = INT_MEMORY_AND_IO; | 464 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 466 | link->conf.ConfigIndex = 1; | 465 | link->conf.ConfigIndex = 1; |
| @@ -644,7 +643,8 @@ static int nmclan_config(struct pcmcia_device *link) | |||
| 644 | 643 | ||
| 645 | dev_dbg(&link->dev, "nmclan_config\n"); | 644 | dev_dbg(&link->dev, "nmclan_config\n"); |
| 646 | 645 | ||
| 647 | ret = pcmcia_request_io(link, &link->io); | 646 | link->io_lines = 5; |
| 647 | ret = pcmcia_request_io(link); | ||
| 648 | if (ret) | 648 | if (ret) |
| 649 | goto failed; | 649 | goto failed; |
| 650 | ret = pcmcia_request_exclusive_irq(link, mace_interrupt); | 650 | ret = pcmcia_request_exclusive_irq(link, mace_interrupt); |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index c9cd2377ef91..9c5fc9dfc55d 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -477,29 +477,31 @@ static hw_info_t *get_hwired(struct pcmcia_device *link) | |||
| 477 | static int try_io_port(struct pcmcia_device *link) | 477 | static int try_io_port(struct pcmcia_device *link) |
| 478 | { | 478 | { |
| 479 | int j, ret; | 479 | int j, ret; |
| 480 | if (link->io.NumPorts1 == 32) { | 480 | link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 481 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 481 | link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; |
| 482 | if (link->io.NumPorts2 > 0) { | 482 | if (link->resource[0]->end == 32) { |
| 483 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | ||
| 484 | if (link->resource[1]->end > 0) { | ||
| 483 | /* for master/slave multifunction cards */ | 485 | /* for master/slave multifunction cards */ |
| 484 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 486 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 485 | } | 487 | } |
| 486 | } else { | 488 | } else { |
| 487 | /* This should be two 16-port windows */ | 489 | /* This should be two 16-port windows */ |
| 488 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 490 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 489 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; | 491 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16; |
| 490 | } | 492 | } |
| 491 | if (link->io.BasePort1 == 0) { | 493 | if (link->resource[0]->start == 0) { |
| 492 | link->io.IOAddrLines = 16; | ||
| 493 | for (j = 0; j < 0x400; j += 0x20) { | 494 | for (j = 0; j < 0x400; j += 0x20) { |
| 494 | link->io.BasePort1 = j ^ 0x300; | 495 | link->resource[0]->start = j ^ 0x300; |
| 495 | link->io.BasePort2 = (j ^ 0x300) + 0x10; | 496 | link->resource[1]->start = (j ^ 0x300) + 0x10; |
| 496 | ret = pcmcia_request_io(link, &link->io); | 497 | link->io_lines = 16; |
| 498 | ret = pcmcia_request_io(link); | ||
| 497 | if (ret == 0) | 499 | if (ret == 0) |
| 498 | return ret; | 500 | return ret; |
| 499 | } | 501 | } |
| 500 | return ret; | 502 | return ret; |
| 501 | } else { | 503 | } else { |
| 502 | return pcmcia_request_io(link, &link->io); | 504 | return pcmcia_request_io(link); |
| 503 | } | 505 | } |
| 504 | } | 506 | } |
| 505 | 507 | ||
| @@ -520,18 +522,18 @@ static int pcnet_confcheck(struct pcmcia_device *p_dev, | |||
| 520 | network function with window 0, and serial with window 1 */ | 522 | network function with window 0, and serial with window 1 */ |
| 521 | if (io->nwin > 1) { | 523 | if (io->nwin > 1) { |
| 522 | i = (io->win[1].len > io->win[0].len); | 524 | i = (io->win[1].len > io->win[0].len); |
| 523 | p_dev->io.BasePort2 = io->win[1-i].base; | 525 | p_dev->resource[1]->start = io->win[1-i].base; |
| 524 | p_dev->io.NumPorts2 = io->win[1-i].len; | 526 | p_dev->resource[1]->end = io->win[1-i].len; |
| 525 | } else { | 527 | } else { |
| 526 | i = p_dev->io.NumPorts2 = 0; | 528 | i = p_dev->resource[1]->end = 0; |
| 527 | } | 529 | } |
| 528 | 530 | ||
| 529 | *has_shmem = ((cfg->mem.nwin == 1) && | 531 | *has_shmem = ((cfg->mem.nwin == 1) && |
| 530 | (cfg->mem.win[0].len >= 0x4000)); | 532 | (cfg->mem.win[0].len >= 0x4000)); |
| 531 | p_dev->io.BasePort1 = io->win[i].base; | 533 | p_dev->resource[0]->start = io->win[i].base; |
| 532 | p_dev->io.NumPorts1 = io->win[i].len; | 534 | p_dev->resource[0]->end = io->win[i].len; |
| 533 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 535 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 534 | if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32) | 536 | if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32) |
| 535 | return try_io_port(p_dev); | 537 | return try_io_port(p_dev); |
| 536 | 538 | ||
| 537 | return 0; | 539 | return 0; |
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 1b0b3230dd71..a5e47796f6ae 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
| @@ -324,9 +324,8 @@ static int smc91c92_probe(struct pcmcia_device *link) | |||
| 324 | link->priv = dev; | 324 | link->priv = dev; |
| 325 | 325 | ||
| 326 | spin_lock_init(&smc->lock); | 326 | spin_lock_init(&smc->lock); |
| 327 | link->io.NumPorts1 = 16; | 327 | link->resource[0]->end = 16; |
| 328 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 328 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 329 | link->io.IOAddrLines = 4; | ||
| 330 | link->conf.Attributes = CONF_ENABLE_IRQ; | 329 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 331 | link->conf.IntType = INT_MEMORY_AND_IO; | 330 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 332 | 331 | ||
| @@ -427,12 +426,13 @@ static int mhz_mfc_config_check(struct pcmcia_device *p_dev, | |||
| 427 | void *priv_data) | 426 | void *priv_data) |
| 428 | { | 427 | { |
| 429 | int k; | 428 | int k; |
| 430 | p_dev->io.BasePort2 = cf->io.win[0].base; | 429 | p_dev->resource[1]->start = cf->io.win[0].base; |
| 431 | for (k = 0; k < 0x400; k += 0x10) { | 430 | for (k = 0; k < 0x400; k += 0x10) { |
| 432 | if (k & 0x80) | 431 | if (k & 0x80) |
| 433 | continue; | 432 | continue; |
| 434 | p_dev->io.BasePort1 = k ^ 0x300; | 433 | p_dev->resource[0]->start = k ^ 0x300; |
| 435 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 434 | p_dev->io_lines = 16; |
| 435 | if (!pcmcia_request_io(p_dev)) | ||
| 436 | return 0; | 436 | return 0; |
| 437 | } | 437 | } |
| 438 | return -ENODEV; | 438 | return -ENODEV; |
| @@ -448,9 +448,8 @@ static int mhz_mfc_config(struct pcmcia_device *link) | |||
| 448 | 448 | ||
| 449 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 449 | link->conf.Attributes |= CONF_ENABLE_SPKR; |
| 450 | link->conf.Status = CCSR_AUDIO_ENA; | 450 | link->conf.Status = CCSR_AUDIO_ENA; |
| 451 | link->io.IOAddrLines = 16; | 451 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 452 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 452 | link->resource[1]->end = 8; |
| 453 | link->io.NumPorts2 = 8; | ||
| 454 | 453 | ||
| 455 | /* The Megahertz combo cards have modem-like CIS entries, so | 454 | /* The Megahertz combo cards have modem-like CIS entries, so |
| 456 | we have to explicitly try a bunch of port combinations. */ | 455 | we have to explicitly try a bunch of port combinations. */ |
| @@ -601,9 +600,9 @@ static int smc_configcheck(struct pcmcia_device *p_dev, | |||
| 601 | unsigned int vcc, | 600 | unsigned int vcc, |
| 602 | void *priv_data) | 601 | void *priv_data) |
| 603 | { | 602 | { |
| 604 | p_dev->io.BasePort1 = cf->io.win[0].base; | 603 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 605 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; | 604 | p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK; |
| 606 | return pcmcia_request_io(p_dev, &p_dev->io); | 605 | return pcmcia_request_io(p_dev); |
| 607 | } | 606 | } |
| 608 | 607 | ||
| 609 | static int smc_config(struct pcmcia_device *link) | 608 | static int smc_config(struct pcmcia_device *link) |
| @@ -611,7 +610,7 @@ static int smc_config(struct pcmcia_device *link) | |||
| 611 | struct net_device *dev = link->priv; | 610 | struct net_device *dev = link->priv; |
| 612 | int i; | 611 | int i; |
| 613 | 612 | ||
| 614 | link->io.NumPorts1 = 16; | 613 | link->resource[0]->end = 16; |
| 615 | i = pcmcia_loop_config(link, smc_configcheck, NULL); | 614 | i = pcmcia_loop_config(link, smc_configcheck, NULL); |
| 616 | if (!i) | 615 | if (!i) |
| 617 | dev->base_addr = link->resource[0]->start; | 616 | dev->base_addr = link->resource[0]->start; |
| @@ -646,25 +645,25 @@ static int osi_config(struct pcmcia_device *link) | |||
| 646 | 645 | ||
| 647 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 646 | link->conf.Attributes |= CONF_ENABLE_SPKR; |
| 648 | link->conf.Status = CCSR_AUDIO_ENA; | 647 | link->conf.Status = CCSR_AUDIO_ENA; |
| 649 | link->io.NumPorts1 = 64; | 648 | link->resource[0]->end = 64; |
| 650 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 649 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 651 | link->io.NumPorts2 = 8; | 650 | link->resource[1]->end = 8; |
| 652 | link->io.IOAddrLines = 16; | ||
| 653 | 651 | ||
| 654 | /* Enable Hard Decode, LAN, Modem */ | 652 | /* Enable Hard Decode, LAN, Modem */ |
| 655 | link->conf.ConfigIndex = 0x23; | 653 | link->conf.ConfigIndex = 0x23; |
| 654 | link->io_lines = 16; | ||
| 656 | 655 | ||
| 657 | for (i = j = 0; j < 4; j++) { | 656 | for (i = j = 0; j < 4; j++) { |
| 658 | link->io.BasePort2 = com[j]; | 657 | link->resource[1]->start = com[j]; |
| 659 | i = pcmcia_request_io(link, &link->io); | 658 | i = pcmcia_request_io(link); |
| 660 | if (i == 0) | 659 | if (i == 0) |
| 661 | break; | 660 | break; |
| 662 | } | 661 | } |
| 663 | if (i != 0) { | 662 | if (i != 0) { |
| 664 | /* Fallback: turn off hard decode */ | 663 | /* Fallback: turn off hard decode */ |
| 665 | link->conf.ConfigIndex = 0x03; | 664 | link->conf.ConfigIndex = 0x03; |
| 666 | link->io.NumPorts2 = 0; | 665 | link->resource[1]->end = 0; |
| 667 | i = pcmcia_request_io(link, &link->io); | 666 | i = pcmcia_request_io(link); |
| 668 | } | 667 | } |
| 669 | dev->base_addr = link->resource[0]->start + 0x10; | 668 | dev->base_addr = link->resource[0]->start + 0x10; |
| 670 | return i; | 669 | return i; |
| @@ -803,7 +802,7 @@ static int check_sig(struct pcmcia_device *link) | |||
| 803 | } | 802 | } |
| 804 | 803 | ||
| 805 | /* Try setting bus width */ | 804 | /* Try setting bus width */ |
| 806 | width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO); | 805 | width = (link->resource[0]->flags == IO_DATA_PATH_WIDTH_AUTO); |
| 807 | s = inb(ioaddr + CONFIG); | 806 | s = inb(ioaddr + CONFIG); |
| 808 | if (width) | 807 | if (width) |
| 809 | s |= CFG_16BIT; | 808 | s |= CFG_16BIT; |
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index 034920b459d1..8fb0eb1dc341 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c | |||
| @@ -677,9 +677,9 @@ xirc2ps_config_modem(struct pcmcia_device *p_dev, | |||
| 677 | 677 | ||
| 678 | if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) { | 678 | if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) { |
| 679 | for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) { | 679 | for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) { |
| 680 | p_dev->io.BasePort2 = cf->io.win[0].base; | 680 | p_dev->resource[1]->start = cf->io.win[0].base; |
| 681 | p_dev->io.BasePort1 = ioaddr; | 681 | p_dev->resource[0]->start = ioaddr; |
| 682 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 682 | if (!pcmcia_request_io(p_dev)) |
| 683 | return 0; | 683 | return 0; |
| 684 | } | 684 | } |
| 685 | } | 685 | } |
| @@ -696,11 +696,11 @@ xirc2ps_config_check(struct pcmcia_device *p_dev, | |||
| 696 | int *pass = priv_data; | 696 | int *pass = priv_data; |
| 697 | 697 | ||
| 698 | if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) { | 698 | if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) { |
| 699 | p_dev->io.BasePort2 = cf->io.win[0].base; | 699 | p_dev->resource[1]->start = cf->io.win[0].base; |
| 700 | p_dev->io.BasePort1 = p_dev->io.BasePort2 | 700 | p_dev->resource[0]->start = p_dev->resource[1]->start |
| 701 | + (*pass ? (cf->index & 0x20 ? -24:8) | 701 | + (*pass ? (cf->index & 0x20 ? -24:8) |
| 702 | : (cf->index & 0x20 ? 8:-24)); | 702 | : (cf->index & 0x20 ? 8:-24)); |
| 703 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 703 | if (!pcmcia_request_io(p_dev)) |
| 704 | return 0; | 704 | return 0; |
| 705 | } | 705 | } |
| 706 | return -ENODEV; | 706 | return -ENODEV; |
| @@ -807,8 +807,7 @@ xirc2ps_config(struct pcmcia_device * link) | |||
| 807 | goto failure; | 807 | goto failure; |
| 808 | } | 808 | } |
| 809 | 809 | ||
| 810 | link->io.IOAddrLines =10; | 810 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; |
| 811 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | ||
| 812 | if (local->modem) { | 811 | if (local->modem) { |
| 813 | int pass; | 812 | int pass; |
| 814 | 813 | ||
| @@ -816,16 +815,16 @@ xirc2ps_config(struct pcmcia_device * link) | |||
| 816 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 815 | link->conf.Attributes |= CONF_ENABLE_SPKR; |
| 817 | link->conf.Status |= CCSR_AUDIO_ENA; | 816 | link->conf.Status |= CCSR_AUDIO_ENA; |
| 818 | } | 817 | } |
| 819 | link->io.NumPorts2 = 8; | 818 | link->resource[1]->end = 8; |
| 820 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 819 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 821 | if (local->dingo) { | 820 | if (local->dingo) { |
| 822 | /* Take the Modem IO port from the CIS and scan for a free | 821 | /* Take the Modem IO port from the CIS and scan for a free |
| 823 | * Ethernet port */ | 822 | * Ethernet port */ |
| 824 | link->io.NumPorts1 = 16; /* no Mako stuff anymore */ | 823 | link->resource[0]->end = 16; /* no Mako stuff anymore */ |
| 825 | if (!pcmcia_loop_config(link, xirc2ps_config_modem, NULL)) | 824 | if (!pcmcia_loop_config(link, xirc2ps_config_modem, NULL)) |
| 826 | goto port_found; | 825 | goto port_found; |
| 827 | } else { | 826 | } else { |
| 828 | link->io.NumPorts1 = 18; | 827 | link->resource[0]->end = 18; |
| 829 | /* We do 2 passes here: The first one uses the regular mapping and | 828 | /* We do 2 passes here: The first one uses the regular mapping and |
| 830 | * the second tries again, thereby considering that the 32 ports are | 829 | * the second tries again, thereby considering that the 32 ports are |
| 831 | * mirrored every 32 bytes. Actually we use a mirrored port for | 830 | * mirrored every 32 bytes. Actually we use a mirrored port for |
| @@ -840,14 +839,15 @@ xirc2ps_config(struct pcmcia_device * link) | |||
| 840 | } | 839 | } |
| 841 | printk(KNOT_XIRC "no ports available\n"); | 840 | printk(KNOT_XIRC "no ports available\n"); |
| 842 | } else { | 841 | } else { |
| 843 | link->io.NumPorts1 = 16; | 842 | link->io_lines = 10; |
| 843 | link->resource[0]->end = 16; | ||
| 844 | for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) { | 844 | for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) { |
| 845 | link->io.BasePort1 = ioaddr; | 845 | link->resource[0]->start = ioaddr; |
| 846 | if (!(err=pcmcia_request_io(link, &link->io))) | 846 | if (!(err = pcmcia_request_io(link))) |
| 847 | goto port_found; | 847 | goto port_found; |
| 848 | } | 848 | } |
| 849 | link->io.BasePort1 = 0; /* let CS decide */ | 849 | link->resource[0]->start = 0; /* let CS decide */ |
| 850 | if ((err=pcmcia_request_io(link, &link->io))) | 850 | if ((err = pcmcia_request_io(link))) |
| 851 | goto config_error; | 851 | goto config_error; |
| 852 | } | 852 | } |
| 853 | port_found: | 853 | port_found: |
diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c index b7e7f5054e44..d241b4aed71e 100644 --- a/drivers/net/wireless/airo_cs.c +++ b/drivers/net/wireless/airo_cs.c | |||
| @@ -175,25 +175,23 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev, | |||
| 175 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 175 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 176 | 176 | ||
| 177 | /* IO window settings */ | 177 | /* IO window settings */ |
| 178 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 178 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 179 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 179 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 180 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 180 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 181 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 181 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 182 | if (!(io->flags & CISTPL_IO_8BIT)) | 182 | p_dev->resource[0]->flags |= |
| 183 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 183 | pcmcia_io_cfg_data_width(io->flags); |
| 184 | if (!(io->flags & CISTPL_IO_16BIT)) | 184 | p_dev->resource[0]->start = io->win[0].base; |
| 185 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 185 | p_dev->resource[0]->end = io->win[0].len; |
| 186 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 187 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 188 | if (io->nwin > 1) { | 186 | if (io->nwin > 1) { |
| 189 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 187 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 190 | p_dev->io.BasePort2 = io->win[1].base; | 188 | p_dev->resource[1]->start = io->win[1].base; |
| 191 | p_dev->io.NumPorts2 = io->win[1].len; | 189 | p_dev->resource[1]->end = io->win[1].len; |
| 192 | } | 190 | } |
| 193 | } | 191 | } |
| 194 | 192 | ||
| 195 | /* This reserves IO space but doesn't actually enable it */ | 193 | /* This reserves IO space but doesn't actually enable it */ |
| 196 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 194 | if (pcmcia_request_io(p_dev) != 0) |
| 197 | return -ENODEV; | 195 | return -ENODEV; |
| 198 | 196 | ||
| 199 | /* | 197 | /* |
diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c index 65b3aed49e58..3b632161c106 100644 --- a/drivers/net/wireless/atmel_cs.c +++ b/drivers/net/wireless/atmel_cs.c | |||
| @@ -190,25 +190,23 @@ static int atmel_config_check(struct pcmcia_device *p_dev, | |||
| 190 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 190 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 191 | 191 | ||
| 192 | /* IO window settings */ | 192 | /* IO window settings */ |
| 193 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 193 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 194 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 194 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 195 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 195 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 196 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 196 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 197 | if (!(io->flags & CISTPL_IO_8BIT)) | 197 | p_dev->resource[0]->flags |= |
| 198 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 198 | pcmcia_io_cfg_data_width(io->flags); |
| 199 | if (!(io->flags & CISTPL_IO_16BIT)) | 199 | p_dev->resource[0]->start = io->win[0].base; |
| 200 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 200 | p_dev->resource[0]->end = io->win[0].len; |
| 201 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 202 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 203 | if (io->nwin > 1) { | 201 | if (io->nwin > 1) { |
| 204 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 202 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 205 | p_dev->io.BasePort2 = io->win[1].base; | 203 | p_dev->resource[1]->start = io->win[1].base; |
| 206 | p_dev->io.NumPorts2 = io->win[1].len; | 204 | p_dev->resource[1]->end = io->win[1].len; |
| 207 | } | 205 | } |
| 208 | } | 206 | } |
| 209 | 207 | ||
| 210 | /* This reserves IO space but doesn't actually enable it */ | 208 | /* This reserves IO space but doesn't actually enable it */ |
| 211 | return pcmcia_request_io(p_dev, &p_dev->io); | 209 | return pcmcia_request_io(p_dev); |
| 212 | } | 210 | } |
| 213 | 211 | ||
| 214 | static int atmel_config(struct pcmcia_device *link) | 212 | static int atmel_config(struct pcmcia_device *link) |
diff --git a/drivers/net/wireless/b43/pcmcia.c b/drivers/net/wireless/b43/pcmcia.c index f71bc7821378..7c9af82fcf7e 100644 --- a/drivers/net/wireless/b43/pcmcia.c +++ b/drivers/net/wireless/b43/pcmcia.c | |||
| @@ -77,10 +77,6 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev) | |||
| 77 | dev->conf.Attributes = CONF_ENABLE_IRQ; | 77 | dev->conf.Attributes = CONF_ENABLE_IRQ; |
| 78 | dev->conf.IntType = INT_MEMORY_AND_IO; | 78 | dev->conf.IntType = INT_MEMORY_AND_IO; |
| 79 | 79 | ||
| 80 | dev->io.BasePort2 = 0; | ||
| 81 | dev->io.NumPorts2 = 0; | ||
| 82 | dev->io.Attributes2 = 0; | ||
| 83 | |||
| 84 | win.Attributes = WIN_ADDR_SPACE_MEM | WIN_MEMORY_TYPE_CM | | 80 | win.Attributes = WIN_ADDR_SPACE_MEM | WIN_MEMORY_TYPE_CM | |
| 85 | WIN_ENABLE | WIN_DATA_WIDTH_16 | | 81 | WIN_ENABLE | WIN_DATA_WIDTH_16 | |
| 86 | WIN_USE_WAIT; | 82 | WIN_USE_WAIT; |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 4e13cedb8235..ba54d1b04d22 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -519,30 +519,24 @@ static int prism2_config_check(struct pcmcia_device *p_dev, | |||
| 519 | PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d " | 519 | PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d " |
| 520 | "dflt->io.nwin=%d\n", | 520 | "dflt->io.nwin=%d\n", |
| 521 | cfg->io.nwin, dflt->io.nwin); | 521 | cfg->io.nwin, dflt->io.nwin); |
| 522 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 522 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 523 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 523 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 524 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 524 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 525 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 525 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 526 | PDEBUG(DEBUG_EXTRA, "io->flags = 0x%04X, " | 526 | p_dev->resource[0]->flags |= |
| 527 | "io.base=0x%04x, len=%d\n", io->flags, | 527 | pcmcia_io_cfg_data_width(io->flags); |
| 528 | io->win[0].base, io->win[0].len); | 528 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 529 | if (!(io->flags & CISTPL_IO_8BIT)) | 529 | p_dev->resource[0]->start = io->win[0].base; |
| 530 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 530 | p_dev->resource[0]->end = io->win[0].len; |
| 531 | if (!(io->flags & CISTPL_IO_16BIT)) | ||
| 532 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | ||
| 533 | p_dev->io.IOAddrLines = io->flags & | ||
| 534 | CISTPL_IO_LINES_MASK; | ||
| 535 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 536 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 537 | if (io->nwin > 1) { | 531 | if (io->nwin > 1) { |
| 538 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 532 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 539 | p_dev->io.BasePort2 = io->win[1].base; | 533 | p_dev->resource[1]->start = io->win[1].base; |
| 540 | p_dev->io.NumPorts2 = io->win[1].len; | 534 | p_dev->resource[1]->end = io->win[1].len; |
| 541 | } | 535 | } |
| 542 | } | 536 | } |
| 543 | 537 | ||
| 544 | /* This reserves IO space but doesn't actually enable it */ | 538 | /* This reserves IO space but doesn't actually enable it */ |
| 545 | return pcmcia_request_io(p_dev, &p_dev->io); | 539 | return pcmcia_request_io(p_dev); |
| 546 | } | 540 | } |
| 547 | 541 | ||
| 548 | static int prism2_config(struct pcmcia_device *link) | 542 | static int prism2_config(struct pcmcia_device *link) |
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index be4c47594b59..9c298396be50 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c | |||
| @@ -801,9 +801,9 @@ static int if_cs_ioprobe(struct pcmcia_device *p_dev, | |||
| 801 | unsigned int vcc, | 801 | unsigned int vcc, |
| 802 | void *priv_data) | 802 | void *priv_data) |
| 803 | { | 803 | { |
| 804 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 804 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 805 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 805 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 806 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 806 | p_dev->resource[0]->end = cfg->io.win[0].len; |
| 807 | 807 | ||
| 808 | /* Do we need to allocate an interrupt? */ | 808 | /* Do we need to allocate an interrupt? */ |
| 809 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 809 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| @@ -815,7 +815,7 @@ static int if_cs_ioprobe(struct pcmcia_device *p_dev, | |||
| 815 | } | 815 | } |
| 816 | 816 | ||
| 817 | /* This reserves IO space but doesn't actually enable it */ | 817 | /* This reserves IO space but doesn't actually enable it */ |
| 818 | return pcmcia_request_io(p_dev, &p_dev->io); | 818 | return pcmcia_request_io(p_dev); |
| 819 | } | 819 | } |
| 820 | 820 | ||
| 821 | static int if_cs_probe(struct pcmcia_device *p_dev) | 821 | static int if_cs_probe(struct pcmcia_device *p_dev) |
diff --git a/drivers/net/wireless/orinoco/orinoco_cs.c b/drivers/net/wireless/orinoco/orinoco_cs.c index 6d514b5462fd..ef46a2d88539 100644 --- a/drivers/net/wireless/orinoco/orinoco_cs.c +++ b/drivers/net/wireless/orinoco/orinoco_cs.c | |||
| @@ -191,25 +191,23 @@ static int orinoco_cs_config_check(struct pcmcia_device *p_dev, | |||
| 191 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 191 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 192 | 192 | ||
| 193 | /* IO window settings */ | 193 | /* IO window settings */ |
| 194 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 194 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 195 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 195 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 196 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 196 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 197 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 197 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 198 | if (!(io->flags & CISTPL_IO_8BIT)) | 198 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 199 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 199 | p_dev->resource[0]->flags |= |
| 200 | if (!(io->flags & CISTPL_IO_16BIT)) | 200 | pcmcia_io_cfg_data_width(io->flags); |
| 201 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 201 | p_dev->resource[0]->start = io->win[0].base; |
| 202 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 202 | p_dev->resource[0]->end = io->win[0].len; |
| 203 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 204 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 205 | if (io->nwin > 1) { | 203 | if (io->nwin > 1) { |
| 206 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 204 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 207 | p_dev->io.BasePort2 = io->win[1].base; | 205 | p_dev->resource[1]->start = io->win[1].base; |
| 208 | p_dev->io.NumPorts2 = io->win[1].len; | 206 | p_dev->resource[1]->end = io->win[1].len; |
| 209 | } | 207 | } |
| 210 | 208 | ||
| 211 | /* This reserves IO space but doesn't actually enable it */ | 209 | /* This reserves IO space but doesn't actually enable it */ |
| 212 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 210 | if (pcmcia_request_io(p_dev) != 0) |
| 213 | goto next_entry; | 211 | goto next_entry; |
| 214 | } | 212 | } |
| 215 | return 0; | 213 | return 0; |
diff --git a/drivers/net/wireless/orinoco/spectrum_cs.c b/drivers/net/wireless/orinoco/spectrum_cs.c index 4f8f55eab955..873877e17e1b 100644 --- a/drivers/net/wireless/orinoco/spectrum_cs.c +++ b/drivers/net/wireless/orinoco/spectrum_cs.c | |||
| @@ -253,25 +253,23 @@ static int spectrum_cs_config_check(struct pcmcia_device *p_dev, | |||
| 253 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 253 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 254 | 254 | ||
| 255 | /* IO window settings */ | 255 | /* IO window settings */ |
| 256 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 256 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 257 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 257 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 258 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 258 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 259 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 259 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 260 | if (!(io->flags & CISTPL_IO_8BIT)) | 260 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 261 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 261 | p_dev->resource[0]->flags |= |
| 262 | if (!(io->flags & CISTPL_IO_16BIT)) | 262 | pcmcia_io_cfg_data_width(io->flags); |
| 263 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 263 | p_dev->resource[0]->start = io->win[0].base; |
| 264 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 264 | p_dev->resource[0]->end = io->win[0].len; |
| 265 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 266 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 267 | if (io->nwin > 1) { | 265 | if (io->nwin > 1) { |
| 268 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 266 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 269 | p_dev->io.BasePort2 = io->win[1].base; | 267 | p_dev->resource[1]->start = io->win[1].base; |
| 270 | p_dev->io.NumPorts2 = io->win[1].len; | 268 | p_dev->resource[1]->end = io->win[1].len; |
| 271 | } | 269 | } |
| 272 | 270 | ||
| 273 | /* This reserves IO space but doesn't actually enable it */ | 271 | /* This reserves IO space but doesn't actually enable it */ |
| 274 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 272 | if (pcmcia_request_io(p_dev) != 0) |
| 275 | goto next_entry; | 273 | goto next_entry; |
| 276 | } | 274 | } |
| 277 | return 0; | 275 | return 0; |
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 165beb6af849..b83d5ef1dffe 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c | |||
| @@ -315,9 +315,8 @@ static int ray_probe(struct pcmcia_device *p_dev) | |||
| 315 | local->finder = p_dev; | 315 | local->finder = p_dev; |
| 316 | 316 | ||
| 317 | /* The io structure describes IO port mapping. None used here */ | 317 | /* The io structure describes IO port mapping. None used here */ |
| 318 | p_dev->io.NumPorts1 = 0; | 318 | p_dev->resource[0]->end = 0; |
| 319 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 319 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 320 | p_dev->io.IOAddrLines = 5; | ||
| 321 | 320 | ||
| 322 | /* General socket configuration */ | 321 | /* General socket configuration */ |
| 323 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 322 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c index a32f220648c0..a1cc2d498a1c 100644 --- a/drivers/net/wireless/wl3501_cs.c +++ b/drivers/net/wireless/wl3501_cs.c | |||
| @@ -1884,9 +1884,8 @@ static int wl3501_probe(struct pcmcia_device *p_dev) | |||
| 1884 | struct wl3501_card *this; | 1884 | struct wl3501_card *this; |
| 1885 | 1885 | ||
| 1886 | /* The io structure describes IO port mapping */ | 1886 | /* The io structure describes IO port mapping */ |
| 1887 | p_dev->io.NumPorts1 = 16; | 1887 | p_dev->resource[0]->end = 16; |
| 1888 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 1888 | p_dev->resource[0]->flags = IO_DATA_PATH_WIDTH_8; |
| 1889 | p_dev->io.IOAddrLines = 5; | ||
| 1890 | 1889 | ||
| 1891 | /* General socket configuration */ | 1890 | /* General socket configuration */ |
| 1892 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; | 1891 | p_dev->conf.Attributes = CONF_ENABLE_IRQ; |
| @@ -1932,13 +1931,14 @@ static int wl3501_config(struct pcmcia_device *link) | |||
| 1932 | /* Try allocating IO ports. This tries a few fixed addresses. If you | 1931 | /* Try allocating IO ports. This tries a few fixed addresses. If you |
| 1933 | * want, you can also read the card's config table to pick addresses -- | 1932 | * want, you can also read the card's config table to pick addresses -- |
| 1934 | * see the serial driver for an example. */ | 1933 | * see the serial driver for an example. */ |
| 1934 | link->io_lines = 5; | ||
| 1935 | 1935 | ||
| 1936 | for (j = 0x280; j < 0x400; j += 0x20) { | 1936 | for (j = 0x280; j < 0x400; j += 0x20) { |
| 1937 | /* The '^0x300' is so that we probe 0x300-0x3ff first, then | 1937 | /* The '^0x300' is so that we probe 0x300-0x3ff first, then |
| 1938 | * 0x200-0x2ff, and so on, because this seems safer */ | 1938 | * 0x200-0x2ff, and so on, because this seems safer */ |
| 1939 | link->io.BasePort1 = j; | 1939 | link->resource[0]->start = j; |
| 1940 | link->io.BasePort2 = link->io.BasePort1 + 0x10; | 1940 | link->resource[1]->start = link->resource[0]->start + 0x10; |
| 1941 | i = pcmcia_request_io(link, &link->io); | 1941 | i = pcmcia_request_io(link); |
| 1942 | if (i == 0) | 1942 | if (i == 0) |
| 1943 | break; | 1943 | break; |
| 1944 | } | 1944 | } |
diff --git a/drivers/parport/parport_cs.c b/drivers/parport/parport_cs.c index fc1639c5ada6..23e50f4a27c5 100644 --- a/drivers/parport/parport_cs.c +++ b/drivers/parport/parport_cs.c | |||
| @@ -101,8 +101,8 @@ static int parport_probe(struct pcmcia_device *link) | |||
| 101 | link->priv = info; | 101 | link->priv = info; |
| 102 | info->p_dev = link; | 102 | info->p_dev = link; |
| 103 | 103 | ||
| 104 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 104 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 105 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 105 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 106 | link->conf.Attributes = CONF_ENABLE_IRQ; | 106 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 107 | link->conf.IntType = INT_MEMORY_AND_IO; | 107 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 108 | 108 | ||
| @@ -143,16 +143,16 @@ static int parport_config_check(struct pcmcia_device *p_dev, | |||
| 143 | { | 143 | { |
| 144 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 144 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 145 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 145 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 146 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; | ||
| 146 | if (epp_mode) | 147 | if (epp_mode) |
| 147 | p_dev->conf.ConfigIndex |= FORCE_EPP_MODE; | 148 | p_dev->conf.ConfigIndex |= FORCE_EPP_MODE; |
| 148 | p_dev->io.BasePort1 = io->win[0].base; | 149 | p_dev->resource[0]->start = io->win[0].base; |
| 149 | p_dev->io.NumPorts1 = io->win[0].len; | 150 | p_dev->resource[0]->end = io->win[0].len; |
| 150 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | ||
| 151 | if (io->nwin == 2) { | 151 | if (io->nwin == 2) { |
| 152 | p_dev->io.BasePort2 = io->win[1].base; | 152 | p_dev->resource[1]->start = io->win[1].base; |
| 153 | p_dev->io.NumPorts2 = io->win[1].len; | 153 | p_dev->resource[1]->end = io->win[1].len; |
| 154 | } | 154 | } |
| 155 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 155 | if (pcmcia_request_io(p_dev) != 0) |
| 156 | return -ENODEV; | 156 | return -ENODEV; |
| 157 | return 0; | 157 | return 0; |
| 158 | } | 158 | } |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index fcd48dae79bc..a48d4a91d440 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
| @@ -70,7 +70,8 @@ static int alloc_io_space(struct pcmcia_socket *s, struct resource *res, | |||
| 70 | 70 | ||
| 71 | res->flags |= IORESOURCE_IO; | 71 | res->flags |= IORESOURCE_IO; |
| 72 | 72 | ||
| 73 | dev_dbg(&s->dev, "alloc_io_space request for %pR\n", res); | 73 | dev_dbg(&s->dev, "alloc_io_space request for %pR, %d lines\n", |
| 74 | res, lines); | ||
| 74 | 75 | ||
| 75 | align = base ? (lines ? 1<<lines : 0) : 1; | 76 | align = base ? (lines ? 1<<lines : 0) : 1; |
| 76 | if (align && (align < num)) { | 77 | if (align && (align < num)) { |
| @@ -541,38 +542,25 @@ EXPORT_SYMBOL(pcmcia_request_configuration); | |||
| 541 | * pcmcia_request_io() - attempt to reserve port ranges for PCMCIA devices | 542 | * pcmcia_request_io() - attempt to reserve port ranges for PCMCIA devices |
| 542 | * | 543 | * |
| 543 | * pcmcia_request_io() attepts to reserve the IO port ranges specified in | 544 | * pcmcia_request_io() attepts to reserve the IO port ranges specified in |
| 544 | * struct pcmcia_device *p_dev->resource[0] and *p_dev->resource[1]. The | 545 | * &struct pcmcia_device @p_dev->resource[0] and @p_dev->resource[1]. The |
| 545 | * "start" value is the requested start of the IO port resource; "end" | 546 | * "start" value is the requested start of the IO port resource; "end" |
| 546 | * relfects the number of ports requested. | 547 | * reflects the number of ports requested. The number of IO lines requested |
| 547 | * | 548 | * is specified in &struct pcmcia_device @p_dev->io_lines. |
| 548 | * If io_req_t is passed, those values are converted automatically. | ||
| 549 | */ | 549 | */ |
| 550 | int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req) | 550 | int pcmcia_request_io(struct pcmcia_device *p_dev) |
| 551 | { | 551 | { |
| 552 | struct pcmcia_socket *s = p_dev->socket; | 552 | struct pcmcia_socket *s = p_dev->socket; |
| 553 | config_t *c; | 553 | config_t *c = p_dev->function_config; |
| 554 | int ret = -EINVAL; | 554 | int ret = -EINVAL; |
| 555 | unsigned int lines = req->IOAddrLines; | ||
| 556 | 555 | ||
| 557 | mutex_lock(&s->ops_mutex); | 556 | mutex_lock(&s->ops_mutex); |
| 557 | dev_dbg(&s->dev, "pcmcia_request_io: %pR , %pR", &c->io[0], &c->io[1]); | ||
| 558 | 558 | ||
| 559 | if (!(s->state & SOCKET_PRESENT)) { | 559 | if (!(s->state & SOCKET_PRESENT)) { |
| 560 | dev_dbg(&s->dev, "pcmcia_request_io: No card present\n"); | 560 | dev_dbg(&s->dev, "pcmcia_request_io: No card present\n"); |
| 561 | goto out; | 561 | goto out; |
| 562 | } | 562 | } |
| 563 | 563 | ||
| 564 | c = p_dev->function_config; | ||
| 565 | if (req) { | ||
| 566 | c->io[0].start = req->BasePort1; | ||
| 567 | c->io[0].end = req->NumPorts1; | ||
| 568 | c->io[0].flags |= req->Attributes1; | ||
| 569 | c->io[1].start = req->BasePort2; | ||
| 570 | c->io[1].end = req->NumPorts2; | ||
| 571 | c->io[1].flags |= req->Attributes2; | ||
| 572 | } | ||
| 573 | |||
| 574 | dev_dbg(&s->dev, "pcmcia_request_io: %pR , %pR", &c->io[0], &c->io[1]); | ||
| 575 | |||
| 576 | if (c->state & CONFIG_LOCKED) { | 564 | if (c->state & CONFIG_LOCKED) { |
| 577 | dev_dbg(&s->dev, "Configuration is locked\n"); | 565 | dev_dbg(&s->dev, "Configuration is locked\n"); |
| 578 | goto out; | 566 | goto out; |
| @@ -582,12 +570,12 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req) | |||
| 582 | goto out; | 570 | goto out; |
| 583 | } | 571 | } |
| 584 | 572 | ||
| 585 | ret = alloc_io_space(s, &c->io[0], lines); | 573 | ret = alloc_io_space(s, &c->io[0], p_dev->io_lines); |
| 586 | if (ret) | 574 | if (ret) |
| 587 | goto out; | 575 | goto out; |
| 588 | 576 | ||
| 589 | if (c->io[1].end) { | 577 | if (c->io[1].end) { |
| 590 | ret = alloc_io_space(s, &c->io[1], lines); | 578 | ret = alloc_io_space(s, &c->io[1], p_dev->io_lines); |
| 591 | if (ret) { | 579 | if (ret) { |
| 592 | release_io_space(s, &c->io[0]); | 580 | release_io_space(s, &c->io[0]); |
| 593 | goto out; | 581 | goto out; |
| @@ -598,11 +586,6 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req) | |||
| 598 | c->state |= CONFIG_IO_REQ; | 586 | c->state |= CONFIG_IO_REQ; |
| 599 | p_dev->_io = 1; | 587 | p_dev->_io = 1; |
| 600 | 588 | ||
| 601 | if (!ret) { | ||
| 602 | req->BasePort1 = c->io[0].start; | ||
| 603 | req->BasePort2 = c->io[1].start; | ||
| 604 | } | ||
| 605 | |||
| 606 | dev_dbg(&s->dev, "pcmcia_request_io succeeded: %pR , %pR", | 589 | dev_dbg(&s->dev, "pcmcia_request_io succeeded: %pR , %pR", |
| 607 | &c->io[0], &c->io[1]); | 590 | &c->io[0], &c->io[1]); |
| 608 | out: | 591 | out: |
diff --git a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c index 3e040f503afa..61f49bdcc0c2 100644 --- a/drivers/scsi/pcmcia/aha152x_stub.c +++ b/drivers/scsi/pcmcia/aha152x_stub.c | |||
| @@ -100,9 +100,8 @@ static int aha152x_probe(struct pcmcia_device *link) | |||
| 100 | info->p_dev = link; | 100 | info->p_dev = link; |
| 101 | link->priv = info; | 101 | link->priv = info; |
| 102 | 102 | ||
| 103 | link->io.NumPorts1 = 0x20; | 103 | link->resource[0]->end = 0x20; |
| 104 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 104 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 105 | link->io.IOAddrLines = 10; | ||
| 106 | link->conf.Attributes = CONF_ENABLE_IRQ; | 105 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 107 | link->conf.IntType = INT_MEMORY_AND_IO; | 106 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 108 | link->conf.Present = PRESENT_OPTION; | 107 | link->conf.Present = PRESENT_OPTION; |
| @@ -130,15 +129,16 @@ static int aha152x_config_check(struct pcmcia_device *p_dev, | |||
| 130 | unsigned int vcc, | 129 | unsigned int vcc, |
| 131 | void *priv_data) | 130 | void *priv_data) |
| 132 | { | 131 | { |
| 132 | p_dev->io_lines = 10; | ||
| 133 | /* For New Media T&J, look for a SCSI window */ | 133 | /* For New Media T&J, look for a SCSI window */ |
| 134 | if (cfg->io.win[0].len >= 0x20) | 134 | if (cfg->io.win[0].len >= 0x20) |
| 135 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 135 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 136 | else if ((cfg->io.nwin > 1) && | 136 | else if ((cfg->io.nwin > 1) && |
| 137 | (cfg->io.win[1].len >= 0x20)) | 137 | (cfg->io.win[1].len >= 0x20)) |
| 138 | p_dev->io.BasePort1 = cfg->io.win[1].base; | 138 | p_dev->resource[0]->start = cfg->io.win[1].base; |
| 139 | if ((cfg->io.nwin > 0) && | 139 | if ((cfg->io.nwin > 0) && |
| 140 | (p_dev->io.BasePort1 < 0xffff)) { | 140 | (p_dev->resource[0]->start < 0xffff)) { |
| 141 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 141 | if (!pcmcia_request_io(p_dev)) |
| 142 | return 0; | 142 | return 0; |
| 143 | } | 143 | } |
| 144 | return -EINVAL; | 144 | return -EINVAL; |
diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c index 49a9a0a60c82..13dbe5c48492 100644 --- a/drivers/scsi/pcmcia/fdomain_stub.c +++ b/drivers/scsi/pcmcia/fdomain_stub.c | |||
| @@ -83,9 +83,8 @@ static int fdomain_probe(struct pcmcia_device *link) | |||
| 83 | 83 | ||
| 84 | info->p_dev = link; | 84 | info->p_dev = link; |
| 85 | link->priv = info; | 85 | link->priv = info; |
| 86 | link->io.NumPorts1 = 0x10; | 86 | link->resource[0]->end = 0x10; |
| 87 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 87 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 88 | link->io.IOAddrLines = 10; | ||
| 89 | link->conf.Attributes = CONF_ENABLE_IRQ; | 88 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 90 | link->conf.IntType = INT_MEMORY_AND_IO; | 89 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 91 | link->conf.Present = PRESENT_OPTION; | 90 | link->conf.Present = PRESENT_OPTION; |
| @@ -112,8 +111,9 @@ static int fdomain_config_check(struct pcmcia_device *p_dev, | |||
| 112 | unsigned int vcc, | 111 | unsigned int vcc, |
| 113 | void *priv_data) | 112 | void *priv_data) |
| 114 | { | 113 | { |
| 115 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 114 | p_dev->io_lines = 10; |
| 116 | return pcmcia_request_io(p_dev, &p_dev->io); | 115 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 116 | return pcmcia_request_io(p_dev); | ||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | 119 | ||
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index d929891809ab..8bb598bb440d 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c | |||
| @@ -1558,9 +1558,8 @@ static int nsp_cs_probe(struct pcmcia_device *link) | |||
| 1558 | nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info); | 1558 | nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info); |
| 1559 | 1559 | ||
| 1560 | /* The io structure describes IO port mapping */ | 1560 | /* The io structure describes IO port mapping */ |
| 1561 | link->io.NumPorts1 = 0x10; | 1561 | link->resource[0]->end = 0x10; |
| 1562 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 1562 | link->resource[0]->flags = IO_DATA_PATH_WIDTH_AUTO; |
| 1563 | link->io.IOAddrLines = 10; /* not used */ | ||
| 1564 | 1563 | ||
| 1565 | /* General socket configuration */ | 1564 | /* General socket configuration */ |
| 1566 | link->conf.Attributes = CONF_ENABLE_IRQ; | 1565 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| @@ -1641,24 +1640,23 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev, | |||
| 1641 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 1640 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 1642 | 1641 | ||
| 1643 | /* IO window settings */ | 1642 | /* IO window settings */ |
| 1644 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 1643 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 1645 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 1644 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 1646 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 1645 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 1647 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 1646 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 1648 | if (!(io->flags & CISTPL_IO_8BIT)) | 1647 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 1649 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 1648 | p_dev->resource[0]->flags |= |
| 1650 | if (!(io->flags & CISTPL_IO_16BIT)) | 1649 | pcmcia_io_cfg_data_width(io->flags); |
| 1651 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 1650 | p_dev->resource[0]->start = io->win[0].base; |
| 1652 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 1651 | p_dev->resource[0]->end = io->win[0].len; |
| 1653 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 1654 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 1655 | if (io->nwin > 1) { | 1652 | if (io->nwin > 1) { |
| 1656 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 1653 | p_dev->resource[1]->flags = |
| 1657 | p_dev->io.BasePort2 = io->win[1].base; | 1654 | p_dev->resource[0]->flags; |
| 1658 | p_dev->io.NumPorts2 = io->win[1].len; | 1655 | p_dev->resource[1]->start = io->win[1].base; |
| 1656 | p_dev->resource[1]->end = io->win[1].len; | ||
| 1659 | } | 1657 | } |
| 1660 | /* This reserves IO space but doesn't actually enable it */ | 1658 | /* This reserves IO space but doesn't actually enable it */ |
| 1661 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 1659 | if (pcmcia_request_io(p_dev) != 0) |
| 1662 | goto next_entry; | 1660 | goto next_entry; |
| 1663 | } | 1661 | } |
| 1664 | 1662 | ||
diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c index 4e2b83f26232..eb775f1a523c 100644 --- a/drivers/scsi/pcmcia/qlogic_stub.c +++ b/drivers/scsi/pcmcia/qlogic_stub.c | |||
| @@ -156,9 +156,8 @@ static int qlogic_probe(struct pcmcia_device *link) | |||
| 156 | return -ENOMEM; | 156 | return -ENOMEM; |
| 157 | info->p_dev = link; | 157 | info->p_dev = link; |
| 158 | link->priv = info; | 158 | link->priv = info; |
| 159 | link->io.NumPorts1 = 16; | 159 | link->resource[0]->end = 16; |
| 160 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 160 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 161 | link->io.IOAddrLines = 10; | ||
| 162 | link->conf.Attributes = CONF_ENABLE_IRQ; | 161 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 163 | link->conf.IntType = INT_MEMORY_AND_IO; | 162 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 164 | link->conf.Present = PRESENT_OPTION; | 163 | link->conf.Present = PRESENT_OPTION; |
| @@ -185,13 +184,14 @@ static int qlogic_config_check(struct pcmcia_device *p_dev, | |||
| 185 | unsigned int vcc, | 184 | unsigned int vcc, |
| 186 | void *priv_data) | 185 | void *priv_data) |
| 187 | { | 186 | { |
| 188 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 187 | p_dev->io_lines = 10; |
| 189 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 188 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 189 | p_dev->resource[0]->end = cfg->io.win[0].len; | ||
| 190 | 190 | ||
| 191 | if (p_dev->io.BasePort1 == 0) | 191 | if (p_dev->resource[0]->start == 0) |
| 192 | return -ENODEV; | 192 | return -ENODEV; |
| 193 | 193 | ||
| 194 | return pcmcia_request_io(p_dev, &p_dev->io); | 194 | return pcmcia_request_io(p_dev); |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | static int qlogic_config(struct pcmcia_device * link) | 197 | static int qlogic_config(struct pcmcia_device * link) |
diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index d99c0cbad2de..321e390c9120 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c | |||
| @@ -690,13 +690,14 @@ static int SYM53C500_config_check(struct pcmcia_device *p_dev, | |||
| 690 | unsigned int vcc, | 690 | unsigned int vcc, |
| 691 | void *priv_data) | 691 | void *priv_data) |
| 692 | { | 692 | { |
| 693 | p_dev->io.BasePort1 = cfg->io.win[0].base; | 693 | p_dev->io_lines = 10; |
| 694 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 694 | p_dev->resource[0]->start = cfg->io.win[0].base; |
| 695 | p_dev->resource[0]->end = cfg->io.win[0].len; | ||
| 695 | 696 | ||
| 696 | if (p_dev->io.BasePort1 == 0) | 697 | if (p_dev->resource[0]->start == 0) |
| 697 | return -ENODEV; | 698 | return -ENODEV; |
| 698 | 699 | ||
| 699 | return pcmcia_request_io(p_dev, &p_dev->io); | 700 | return pcmcia_request_io(p_dev); |
| 700 | } | 701 | } |
| 701 | 702 | ||
| 702 | static int | 703 | static int |
| @@ -858,9 +859,8 @@ SYM53C500_probe(struct pcmcia_device *link) | |||
| 858 | return -ENOMEM; | 859 | return -ENOMEM; |
| 859 | info->p_dev = link; | 860 | info->p_dev = link; |
| 860 | link->priv = info; | 861 | link->priv = info; |
| 861 | link->io.NumPorts1 = 16; | 862 | link->resource[0]->end = 16; |
| 862 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 863 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 863 | link->io.IOAddrLines = 10; | ||
| 864 | link->conf.Attributes = CONF_ENABLE_IRQ; | 864 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 865 | link->conf.IntType = INT_MEMORY_AND_IO; | 865 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 866 | 866 | ||
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index fe7adcdfde9e..141c69554bd4 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
| @@ -335,8 +335,8 @@ static int serial_probe(struct pcmcia_device *link) | |||
| 335 | info->p_dev = link; | 335 | info->p_dev = link; |
| 336 | link->priv = info; | 336 | link->priv = info; |
| 337 | 337 | ||
| 338 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 338 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 339 | link->io.NumPorts1 = 8; | 339 | link->resource[0]->end = 8; |
| 340 | link->conf.Attributes = CONF_ENABLE_IRQ; | 340 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 341 | if (do_sound) { | 341 | if (do_sound) { |
| 342 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 342 | link->conf.Attributes |= CONF_ENABLE_SPKR; |
| @@ -424,12 +424,13 @@ static int simple_config_check(struct pcmcia_device *p_dev, | |||
| 424 | p_dev->conf.Vpp = | 424 | p_dev->conf.Vpp = |
| 425 | cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 425 | cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; |
| 426 | 426 | ||
| 427 | p_dev->io_lines = ((*try & 0x1) == 0) ? | ||
| 428 | 16 : cf->io.flags & CISTPL_IO_LINES_MASK; | ||
| 429 | |||
| 427 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[(*try >> 1)]) | 430 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[(*try >> 1)]) |
| 428 | && (cf->io.win[0].base != 0)) { | 431 | && (cf->io.win[0].base != 0)) { |
| 429 | p_dev->io.BasePort1 = cf->io.win[0].base; | 432 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 430 | p_dev->io.IOAddrLines = ((*try & 0x1) == 0) ? | 433 | if (!pcmcia_request_io(p_dev)) |
| 431 | 16 : cf->io.flags & CISTPL_IO_LINES_MASK; | ||
| 432 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | ||
| 433 | return 0; | 434 | return 0; |
| 434 | } | 435 | } |
| 435 | return -EINVAL; | 436 | return -EINVAL; |
| @@ -446,9 +447,9 @@ static int simple_config_check_notpicky(struct pcmcia_device *p_dev, | |||
| 446 | 447 | ||
| 447 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { | 448 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { |
| 448 | for (j = 0; j < 5; j++) { | 449 | for (j = 0; j < 5; j++) { |
| 449 | p_dev->io.BasePort1 = base[j]; | 450 | p_dev->resource[0]->start = base[j]; |
| 450 | p_dev->io.IOAddrLines = base[j] ? 16 : 3; | 451 | p_dev->io_lines = base[j] ? 16 : 3; |
| 451 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 452 | if (!pcmcia_request_io(p_dev)) |
| 452 | return 0; | 453 | return 0; |
| 453 | } | 454 | } |
| 454 | } | 455 | } |
| @@ -521,9 +522,9 @@ static int multi_config_check(struct pcmcia_device *p_dev, | |||
| 521 | /* The quad port cards have bad CIS's, so just look for a | 522 | /* The quad port cards have bad CIS's, so just look for a |
| 522 | window larger than 8 ports and assume it will be right */ | 523 | window larger than 8 ports and assume it will be right */ |
| 523 | if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) { | 524 | if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) { |
| 524 | p_dev->io.BasePort1 = cf->io.win[0].base; | 525 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 525 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; | 526 | p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK; |
| 526 | if (!pcmcia_request_io(p_dev, &p_dev->io)) { | 527 | if (!pcmcia_request_io(p_dev)) { |
| 527 | *base2 = p_dev->resource[0]->start + 8; | 528 | *base2 = p_dev->resource[0]->start + 8; |
| 528 | return 0; | 529 | return 0; |
| 529 | } | 530 | } |
| @@ -540,10 +541,10 @@ static int multi_config_check_notpicky(struct pcmcia_device *p_dev, | |||
| 540 | int *base2 = priv_data; | 541 | int *base2 = priv_data; |
| 541 | 542 | ||
| 542 | if (cf->io.nwin == 2) { | 543 | if (cf->io.nwin == 2) { |
| 543 | p_dev->io.BasePort1 = cf->io.win[0].base; | 544 | p_dev->resource[0]->start = cf->io.win[0].base; |
| 544 | p_dev->io.BasePort2 = cf->io.win[1].base; | 545 | p_dev->resource[1]->start = cf->io.win[1].base; |
| 545 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; | 546 | p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK; |
| 546 | if (!pcmcia_request_io(p_dev, &p_dev->io)) { | 547 | if (!pcmcia_request_io(p_dev)) { |
| 547 | *base2 = p_dev->resource[1]->start; | 548 | *base2 = p_dev->resource[1]->start; |
| 548 | return 0; | 549 | return 0; |
| 549 | } | 550 | } |
| @@ -557,10 +558,10 @@ static int multi_config(struct pcmcia_device *link) | |||
| 557 | int i, base2 = 0; | 558 | int i, base2 = 0; |
| 558 | 559 | ||
| 559 | /* First, look for a generic full-sized window */ | 560 | /* First, look for a generic full-sized window */ |
| 560 | link->io.NumPorts1 = info->multi * 8; | 561 | link->resource[0]->end = info->multi * 8; |
| 561 | if (pcmcia_loop_config(link, multi_config_check, &base2)) { | 562 | if (pcmcia_loop_config(link, multi_config_check, &base2)) { |
| 562 | /* If that didn't work, look for two windows */ | 563 | /* If that didn't work, look for two windows */ |
| 563 | link->io.NumPorts1 = link->io.NumPorts2 = 8; | 564 | link->resource[0]->end = link->resource[1]->end = 8; |
| 564 | info->multi = 2; | 565 | info->multi = 2; |
| 565 | if (pcmcia_loop_config(link, multi_config_check_notpicky, | 566 | if (pcmcia_loop_config(link, multi_config_check_notpicky, |
| 566 | &base2)) { | 567 | &base2)) { |
diff --git a/drivers/staging/comedi/drivers/cb_das16_cs.c b/drivers/staging/comedi/drivers/cb_das16_cs.c index 208f1b7a1312..7cf0ccb5adef 100644 --- a/drivers/staging/comedi/drivers/cb_das16_cs.c +++ b/drivers/staging/comedi/drivers/cb_das16_cs.c | |||
| @@ -736,24 +736,22 @@ static int das16cs_pcmcia_config_loop(struct pcmcia_device *p_dev, | |||
| 736 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 736 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 737 | 737 | ||
| 738 | /* IO window settings */ | 738 | /* IO window settings */ |
| 739 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 739 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 740 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 740 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 741 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 741 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 742 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 742 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 743 | if (!(io->flags & CISTPL_IO_8BIT)) | 743 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 744 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 744 | p_dev->resource[0]->flags |= |
| 745 | if (!(io->flags & CISTPL_IO_16BIT)) | 745 | pcmcia_io_cfg_data_width(io->flags); |
| 746 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 746 | p_dev->resource[0]->start = io->win[0].base; |
| 747 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 747 | p_dev->resource[0]->end = io->win[0].len; |
| 748 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 749 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 750 | if (io->nwin > 1) { | 748 | if (io->nwin > 1) { |
| 751 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 749 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 752 | p_dev->io.BasePort2 = io->win[1].base; | 750 | p_dev->resource[1]->start = io->win[1].base; |
| 753 | p_dev->io.NumPorts2 = io->win[1].len; | 751 | p_dev->resource[1]->end = io->win[1].len; |
| 754 | } | 752 | } |
| 755 | /* This reserves IO space but doesn't actually enable it */ | 753 | /* This reserves IO space but doesn't actually enable it */ |
| 756 | return pcmcia_request_io(p_dev, &p_dev->io); | 754 | return pcmcia_request_io(p_dev); |
| 757 | } | 755 | } |
| 758 | 756 | ||
| 759 | return 0; | 757 | return 0; |
diff --git a/drivers/staging/comedi/drivers/das08_cs.c b/drivers/staging/comedi/drivers/das08_cs.c index c4cfcffc633e..9ee677f14b66 100644 --- a/drivers/staging/comedi/drivers/das08_cs.c +++ b/drivers/staging/comedi/drivers/das08_cs.c | |||
| @@ -224,24 +224,23 @@ static int das08_pcmcia_config_loop(struct pcmcia_device *p_dev, | |||
| 224 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 224 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 225 | 225 | ||
| 226 | /* IO window settings */ | 226 | /* IO window settings */ |
| 227 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 227 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 228 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 228 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 229 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 229 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 230 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 230 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 231 | if (!(io->flags & CISTPL_IO_8BIT)) | 231 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 232 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 232 | p_dev->resource[0]->flags |= |
| 233 | if (!(io->flags & CISTPL_IO_16BIT)) | 233 | pcmcia_io_cfg_data_width(io->flags); |
| 234 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | ||
| 235 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 234 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; |
| 236 | p_dev->io.BasePort1 = io->win[0].base; | 235 | p_dev->resource[0]->start = io->win[0].base; |
| 237 | p_dev->io.NumPorts1 = io->win[0].len; | 236 | p_dev->resource[0]->end = io->win[0].len; |
| 238 | if (io->nwin > 1) { | 237 | if (io->nwin > 1) { |
| 239 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 238 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 240 | p_dev->io.BasePort2 = io->win[1].base; | 239 | p_dev->resource[1]->start = io->win[1].base; |
| 241 | p_dev->io.NumPorts2 = io->win[1].len; | 240 | p_dev->resource[1]->end = io->win[1].len; |
| 242 | } | 241 | } |
| 243 | /* This reserves IO space but doesn't actually enable it */ | 242 | /* This reserves IO space but doesn't actually enable it */ |
| 244 | return pcmcia_request_io(p_dev, &p_dev->io); | 243 | return pcmcia_request_io(p_dev); |
| 245 | } | 244 | } |
| 246 | return 0; | 245 | return 0; |
| 247 | } | 246 | } |
diff --git a/drivers/staging/comedi/drivers/ni_daq_700.c b/drivers/staging/comedi/drivers/ni_daq_700.c index 6d569579d677..7e41ad93703d 100644 --- a/drivers/staging/comedi/drivers/ni_daq_700.c +++ b/drivers/staging/comedi/drivers/ni_daq_700.c | |||
| @@ -571,24 +571,22 @@ static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev, | |||
| 571 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 571 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 572 | 572 | ||
| 573 | /* IO window settings */ | 573 | /* IO window settings */ |
| 574 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 574 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 575 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 575 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 576 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 576 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 577 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 577 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 578 | if (!(io->flags & CISTPL_IO_8BIT)) | 578 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 579 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 579 | p_dev->resource[0]->flags |= |
| 580 | if (!(io->flags & CISTPL_IO_16BIT)) | 580 | pcmcia_io_cfg_data_width(io->flags); |
| 581 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 581 | p_dev->resource[0]->start = io->win[0].base; |
| 582 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 582 | p_dev->resource[0]->end = io->win[0].len; |
| 583 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 584 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 585 | if (io->nwin > 1) { | 583 | if (io->nwin > 1) { |
| 586 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 584 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 587 | p_dev->io.BasePort2 = io->win[1].base; | 585 | p_dev->resource[1]->start = io->win[1].base; |
| 588 | p_dev->io.NumPorts2 = io->win[1].len; | 586 | p_dev->resource[1]->end = io->win[1].len; |
| 589 | } | 587 | } |
| 590 | /* This reserves IO space but doesn't actually enable it */ | 588 | /* This reserves IO space but doesn't actually enable it */ |
| 591 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 589 | if (pcmcia_request_io(p_dev) != 0) |
| 592 | return -ENODEV; | 590 | return -ENODEV; |
| 593 | } | 591 | } |
| 594 | 592 | ||
diff --git a/drivers/staging/comedi/drivers/ni_daq_dio24.c b/drivers/staging/comedi/drivers/ni_daq_dio24.c index 29e1daf6a9e6..b2483f86c242 100644 --- a/drivers/staging/comedi/drivers/ni_daq_dio24.c +++ b/drivers/staging/comedi/drivers/ni_daq_dio24.c | |||
| @@ -323,24 +323,22 @@ static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev, | |||
| 323 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 323 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 324 | 324 | ||
| 325 | /* IO window settings */ | 325 | /* IO window settings */ |
| 326 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 326 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 327 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 327 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 328 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 328 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 329 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 329 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 330 | if (!(io->flags & CISTPL_IO_8BIT)) | 330 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 331 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 331 | p_dev->resource[0]->flags |= |
| 332 | if (!(io->flags & CISTPL_IO_16BIT)) | 332 | pcmcia_io_cfg_data_width(io->flags); |
| 333 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 333 | p_dev->resource[0]->start = io->win[0].base; |
| 334 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 334 | p_dev->resource[0]->end = io->win[0].len; |
| 335 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 336 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 337 | if (io->nwin > 1) { | 335 | if (io->nwin > 1) { |
| 338 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 336 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 339 | p_dev->io.BasePort2 = io->win[1].base; | 337 | p_dev->resource[1]->start = io->win[1].base; |
| 340 | p_dev->io.NumPorts2 = io->win[1].len; | 338 | p_dev->resource[1]->end = io->win[1].len; |
| 341 | } | 339 | } |
| 342 | /* This reserves IO space but doesn't actually enable it */ | 340 | /* This reserves IO space but doesn't actually enable it */ |
| 343 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 341 | if (pcmcia_request_io(p_dev) != 0) |
| 344 | return -ENODEV; | 342 | return -ENODEV; |
| 345 | } | 343 | } |
| 346 | 344 | ||
diff --git a/drivers/staging/comedi/drivers/ni_labpc_cs.c b/drivers/staging/comedi/drivers/ni_labpc_cs.c index fb10987a97b2..c1444b4a5b4c 100644 --- a/drivers/staging/comedi/drivers/ni_labpc_cs.c +++ b/drivers/staging/comedi/drivers/ni_labpc_cs.c | |||
| @@ -301,24 +301,22 @@ static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev, | |||
| 301 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; | 301 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; |
| 302 | 302 | ||
| 303 | /* IO window settings */ | 303 | /* IO window settings */ |
| 304 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 304 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 305 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 305 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 306 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 306 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 307 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 307 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 308 | if (!(io->flags & CISTPL_IO_8BIT)) | 308 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 309 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 309 | p_dev->resource[0]->flags |= |
| 310 | if (!(io->flags & CISTPL_IO_16BIT)) | 310 | pcmcia_io_cfg_data_width(io->flags); |
| 311 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 311 | p_dev->resource[0]->start = io->win[0].base; |
| 312 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 312 | p_dev->resource[0]->end = io->win[0].len; |
| 313 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 314 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 315 | if (io->nwin > 1) { | 313 | if (io->nwin > 1) { |
| 316 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 314 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 317 | p_dev->io.BasePort2 = io->win[1].base; | 315 | p_dev->resource[1]->start = io->win[1].base; |
| 318 | p_dev->io.NumPorts2 = io->win[1].len; | 316 | p_dev->resource[1]->end = io->win[1].len; |
| 319 | } | 317 | } |
| 320 | /* This reserves IO space but doesn't actually enable it */ | 318 | /* This reserves IO space but doesn't actually enable it */ |
| 321 | if (pcmcia_request_io(p_dev, &p_dev->io) != 0) | 319 | if (pcmcia_request_io(p_dev) != 0) |
| 322 | return -ENODEV; | 320 | return -ENODEV; |
| 323 | } | 321 | } |
| 324 | 322 | ||
diff --git a/drivers/staging/comedi/drivers/ni_mio_cs.c b/drivers/staging/comedi/drivers/ni_mio_cs.c index f37dc22b4dbc..d50b6c409fe7 100644 --- a/drivers/staging/comedi/drivers/ni_mio_cs.c +++ b/drivers/staging/comedi/drivers/ni_mio_cs.c | |||
| @@ -264,8 +264,8 @@ static const dev_info_t dev_info = "ni_mio_cs"; | |||
| 264 | 264 | ||
| 265 | static int cs_attach(struct pcmcia_device *link) | 265 | static int cs_attach(struct pcmcia_device *link) |
| 266 | { | 266 | { |
| 267 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 267 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; |
| 268 | link->io.NumPorts1 = 16; | 268 | link->resource[0]->end = 16; |
| 269 | link->conf.Attributes = CONF_ENABLE_IRQ; | 269 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 270 | link->conf.IntType = INT_MEMORY_AND_IO; | 270 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 271 | 271 | ||
| @@ -310,13 +310,12 @@ static int mio_pcmcia_config_loop(struct pcmcia_device *p_dev, | |||
| 310 | { | 310 | { |
| 311 | int base, ret; | 311 | int base, ret; |
| 312 | 312 | ||
| 313 | p_dev->io.NumPorts1 = cfg->io.win[0].len; | 313 | p_dev->resource[0]->end = cfg->io.win[0].len; |
| 314 | p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK; | 314 | p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK; |
| 315 | p_dev->io.NumPorts2 = 0; | ||
| 316 | 315 | ||
| 317 | for (base = 0x000; base < 0x400; base += 0x20) { | 316 | for (base = 0x000; base < 0x400; base += 0x20) { |
| 318 | p_dev->io.BasePort1 = base; | 317 | p_dev->resource[0]->start = base; |
| 319 | ret = pcmcia_request_io(p_dev, &p_dev->io); | 318 | ret = pcmcia_request_io(p_dev); |
| 320 | if (!ret) | 319 | if (!ret) |
| 321 | return 0; | 320 | return 0; |
| 322 | } | 321 | } |
diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c b/drivers/staging/comedi/drivers/quatech_daqp_cs.c index 80b8d57c6842..25f4e67e3e89 100644 --- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c +++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c | |||
| @@ -1102,26 +1102,24 @@ static int daqp_pcmcia_config_loop(struct pcmcia_device *p_dev, | |||
| 1102 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 1102 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 1103 | 1103 | ||
| 1104 | /* IO window settings */ | 1104 | /* IO window settings */ |
| 1105 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 1105 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 1106 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 1106 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 1107 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 1107 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 1108 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 1108 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; |
| 1109 | if (!(io->flags & CISTPL_IO_8BIT)) | 1109 | p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
| 1110 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 1110 | p_dev->resource[0]->flags |= |
| 1111 | if (!(io->flags & CISTPL_IO_16BIT)) | 1111 | pcmcia_io_cfg_data_width(io->flags); |
| 1112 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 1112 | p_dev->resource[0]->start = io->win[0].base; |
| 1113 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 1113 | p_dev->resource[0]->end = io->win[0].len; |
| 1114 | p_dev->io.BasePort1 = io->win[0].base; | ||
| 1115 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 1116 | if (io->nwin > 1) { | 1114 | if (io->nwin > 1) { |
| 1117 | p_dev->io.Attributes2 = p_dev->io.Attributes1; | 1115 | p_dev->resource[1]->flags = p_dev->resource[0]->flags; |
| 1118 | p_dev->io.BasePort2 = io->win[1].base; | 1116 | p_dev->resource[1]->start = io->win[1].base; |
| 1119 | p_dev->io.NumPorts2 = io->win[1].len; | 1117 | p_dev->resource[1]->end = io->win[1].len; |
| 1120 | } | 1118 | } |
| 1121 | } | 1119 | } |
| 1122 | 1120 | ||
| 1123 | /* This reserves IO space but doesn't actually enable it */ | 1121 | /* This reserves IO space but doesn't actually enable it */ |
| 1124 | return pcmcia_request_io(p_dev, &p_dev->io); | 1122 | return pcmcia_request_io(p_dev); |
| 1125 | } | 1123 | } |
| 1126 | 1124 | ||
| 1127 | static void daqp_cs_config(struct pcmcia_device *link) | 1125 | static void daqp_cs_config(struct pcmcia_device *link) |
diff --git a/drivers/staging/wlags49_h2/wl_cs.c b/drivers/staging/wlags49_h2/wl_cs.c index 23615378acf1..f15afd2050be 100644 --- a/drivers/staging/wlags49_h2/wl_cs.c +++ b/drivers/staging/wlags49_h2/wl_cs.c | |||
| @@ -145,9 +145,8 @@ static int wl_adapter_attach(struct pcmcia_device *link) | |||
| 145 | return -ENOMEM; | 145 | return -ENOMEM; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | link->io.NumPorts1 = HCF_NUM_IO_PORTS; | 148 | link->resource[0]->end = HCF_NUM_IO_PORTS; |
| 149 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; | 149 | link->resource[0]->flags = IO_DATA_PATH_WIDTH_16; |
| 150 | link->io.IOAddrLines = 6; | ||
| 151 | link->conf.Attributes = CONF_ENABLE_IRQ; | 150 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 152 | link->conf.IntType = INT_MEMORY_AND_IO; | 151 | link->conf.IntType = INT_MEMORY_AND_IO; |
| 153 | link->conf.ConfigIndex = 5; | 152 | link->conf.ConfigIndex = 5; |
| @@ -305,8 +304,9 @@ void wl_adapter_insert( struct pcmcia_device *link ) | |||
| 305 | 304 | ||
| 306 | /* Do we need to allocate an interrupt? */ | 305 | /* Do we need to allocate an interrupt? */ |
| 307 | link->conf.Attributes |= CONF_ENABLE_IRQ; | 306 | link->conf.Attributes |= CONF_ENABLE_IRQ; |
| 307 | link->io_lines = 6; | ||
| 308 | 308 | ||
| 309 | ret = pcmcia_request_io(link, &link->io); | 309 | ret = pcmcia_request_io(link); |
| 310 | if (ret != 0) | 310 | if (ret != 0) |
| 311 | goto failed; | 311 | goto failed; |
| 312 | 312 | ||
diff --git a/drivers/telephony/ixj_pcmcia.c b/drivers/telephony/ixj_pcmcia.c index a801036392cd..a1900e502518 100644 --- a/drivers/telephony/ixj_pcmcia.c +++ b/drivers/telephony/ixj_pcmcia.c | |||
| @@ -32,9 +32,8 @@ static int ixj_probe(struct pcmcia_device *p_dev) | |||
| 32 | { | 32 | { |
| 33 | dev_dbg(&p_dev->dev, "ixj_attach()\n"); | 33 | dev_dbg(&p_dev->dev, "ixj_attach()\n"); |
| 34 | /* Create new ixj device */ | 34 | /* Create new ixj device */ |
| 35 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 35 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 36 | p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 36 | p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
| 37 | p_dev->io.IOAddrLines = 3; | ||
| 38 | p_dev->conf.IntType = INT_MEMORY_AND_IO; | 37 | p_dev->conf.IntType = INT_MEMORY_AND_IO; |
| 39 | p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL); | 38 | p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL); |
| 40 | if (!p_dev->priv) { | 39 | if (!p_dev->priv) { |
| @@ -120,13 +119,14 @@ static int ixj_config_check(struct pcmcia_device *p_dev, | |||
| 120 | { | 119 | { |
| 121 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 120 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 122 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 121 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 123 | p_dev->io.BasePort1 = io->win[0].base; | 122 | p_dev->resource[0]->start = io->win[0].base; |
| 124 | p_dev->io.NumPorts1 = io->win[0].len; | 123 | p_dev->resource[0]->end = io->win[0].len; |
| 124 | p_dev->io_lines = 3; | ||
| 125 | if (io->nwin == 2) { | 125 | if (io->nwin == 2) { |
| 126 | p_dev->io.BasePort2 = io->win[1].base; | 126 | p_dev->resource[1]->start = io->win[1].base; |
| 127 | p_dev->io.NumPorts2 = io->win[1].len; | 127 | p_dev->resource[1]->end = io->win[1].len; |
| 128 | } | 128 | } |
| 129 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 129 | if (!pcmcia_request_io(p_dev)) |
| 130 | return 0; | 130 | return 0; |
| 131 | } | 131 | } |
| 132 | return -ENODEV; | 132 | return -ENODEV; |
diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c index 22e04f206304..0e13a00eb2ed 100644 --- a/drivers/usb/host/sl811_cs.c +++ b/drivers/usb/host/sl811_cs.c | |||
| @@ -162,16 +162,16 @@ static int sl811_cs_config_check(struct pcmcia_device *p_dev, | |||
| 162 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; | 162 | p_dev->conf.Attributes |= CONF_ENABLE_IRQ; |
| 163 | 163 | ||
| 164 | /* IO window settings */ | 164 | /* IO window settings */ |
| 165 | p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0; | 165 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
| 166 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 166 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
| 167 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 167 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; |
| 168 | p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK; | ||
| 168 | 169 | ||
| 169 | p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 170 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; |
| 170 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 171 | p_dev->resource[0]->start = io->win[0].base; |
| 171 | p_dev->io.BasePort1 = io->win[0].base; | 172 | p_dev->resource[0]->end = io->win[0].len; |
| 172 | p_dev->io.NumPorts1 = io->win[0].len; | ||
| 173 | 173 | ||
| 174 | return pcmcia_request_io(p_dev, &p_dev->io); | 174 | return pcmcia_request_io(p_dev); |
| 175 | } | 175 | } |
| 176 | pcmcia_disable_device(p_dev); | 176 | pcmcia_disable_device(p_dev); |
| 177 | return -ENODEV; | 177 | return -ENODEV; |
diff --git a/include/pcmcia/cs.h b/include/pcmcia/cs.h index 0cd8c70d8aaa..ad71bb5a8658 100644 --- a/include/pcmcia/cs.h +++ b/include/pcmcia/cs.h | |||
| @@ -56,23 +56,6 @@ typedef struct config_req_t { | |||
| 56 | #define INT_CARDBUS 0x04 | 56 | #define INT_CARDBUS 0x04 |
| 57 | #define INT_ZOOMED_VIDEO 0x08 | 57 | #define INT_ZOOMED_VIDEO 0x08 |
| 58 | 58 | ||
| 59 | /* For RequestIO and ReleaseIO */ | ||
| 60 | typedef struct io_req_t { | ||
| 61 | u_int BasePort1; | ||
| 62 | u_int NumPorts1; | ||
| 63 | u_int Attributes1; | ||
| 64 | u_int BasePort2; | ||
| 65 | u_int NumPorts2; | ||
| 66 | u_int Attributes2; | ||
| 67 | u_int IOAddrLines; | ||
| 68 | } io_req_t; | ||
| 69 | |||
| 70 | /* Attributes for RequestIO and ReleaseIO */ | ||
| 71 | #define IO_DATA_PATH_WIDTH 0x18 | ||
| 72 | #define IO_DATA_PATH_WIDTH_8 0x00 | ||
| 73 | #define IO_DATA_PATH_WIDTH_16 0x08 | ||
| 74 | #define IO_DATA_PATH_WIDTH_AUTO 0x10 | ||
| 75 | |||
| 76 | /* Bits in IRQInfo1 field */ | 59 | /* Bits in IRQInfo1 field */ |
| 77 | #define IRQ_NMI_ID 0x01 | 60 | #define IRQ_NMI_ID 0x01 |
| 78 | #define IRQ_IOCK_ID 0x02 | 61 | #define IRQ_IOCK_ID 0x02 |
diff --git a/include/pcmcia/ds.h b/include/pcmcia/ds.h index 3dafd7db34df..0748bec0a87a 100644 --- a/include/pcmcia/ds.h +++ b/include/pcmcia/ds.h | |||
| @@ -80,7 +80,6 @@ struct pcmcia_device { | |||
| 80 | struct list_head socket_device_list; | 80 | struct list_head socket_device_list; |
| 81 | 81 | ||
| 82 | /* deprecated, will be cleaned up soon */ | 82 | /* deprecated, will be cleaned up soon */ |
| 83 | io_req_t io; | ||
| 84 | config_req_t conf; | 83 | config_req_t conf; |
| 85 | window_handle_t win; | 84 | window_handle_t win; |
| 86 | 85 | ||
| @@ -88,6 +87,8 @@ struct pcmcia_device { | |||
| 88 | unsigned int irq; | 87 | unsigned int irq; |
| 89 | struct resource *resource[MAX_IO_WIN]; | 88 | struct resource *resource[MAX_IO_WIN]; |
| 90 | 89 | ||
| 90 | unsigned int io_lines; /* number of I/O lines */ | ||
| 91 | |||
| 91 | /* Is the device suspended? */ | 92 | /* Is the device suspended? */ |
| 92 | u16 suspended:1; | 93 | u16 suspended:1; |
| 93 | 94 | ||
| @@ -179,7 +180,7 @@ int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val); | |||
| 179 | int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val); | 180 | int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val); |
| 180 | 181 | ||
| 181 | /* device configuration */ | 182 | /* device configuration */ |
| 182 | int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req); | 183 | int pcmcia_request_io(struct pcmcia_device *p_dev); |
| 183 | 184 | ||
| 184 | int __must_check | 185 | int __must_check |
| 185 | __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, | 186 | __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, |
| @@ -206,6 +207,22 @@ int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t win, | |||
| 206 | int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); | 207 | int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); |
| 207 | void pcmcia_disable_device(struct pcmcia_device *p_dev); | 208 | void pcmcia_disable_device(struct pcmcia_device *p_dev); |
| 208 | 209 | ||
| 210 | /* IO ports */ | ||
| 211 | #define IO_DATA_PATH_WIDTH 0x18 | ||
| 212 | #define IO_DATA_PATH_WIDTH_8 0x00 | ||
| 213 | #define IO_DATA_PATH_WIDTH_16 0x08 | ||
| 214 | #define IO_DATA_PATH_WIDTH_AUTO 0x10 | ||
| 215 | |||
| 216 | /* convert flag found in cfgtable to data path width parameter */ | ||
| 217 | static inline int pcmcia_io_cfg_data_width(unsigned int flags) | ||
| 218 | { | ||
| 219 | if (!(flags & CISTPL_IO_8BIT)) | ||
| 220 | return IO_DATA_PATH_WIDTH_16; | ||
| 221 | if (!(flags & CISTPL_IO_16BIT)) | ||
| 222 | return IO_DATA_PATH_WIDTH_8; | ||
| 223 | return IO_DATA_PATH_WIDTH_AUTO; | ||
| 224 | } | ||
| 225 | |||
| 209 | #endif /* __KERNEL__ */ | 226 | #endif /* __KERNEL__ */ |
| 210 | 227 | ||
| 211 | #endif /* _LINUX_DS_H */ | 228 | #endif /* _LINUX_DS_H */ |
diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c index 9f897bca0615..7ab9174a8a84 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c | |||
| @@ -139,8 +139,8 @@ static int snd_pdacf_probe(struct pcmcia_device *link) | |||
| 139 | pdacf->p_dev = link; | 139 | pdacf->p_dev = link; |
| 140 | link->priv = pdacf; | 140 | link->priv = pdacf; |
| 141 | 141 | ||
| 142 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 142 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 143 | link->io.NumPorts1 = 16; | 143 | link->resource[0]->end = 16; |
| 144 | 144 | ||
| 145 | link->conf.Attributes = CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; | 145 | link->conf.Attributes = CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; |
| 146 | link->conf.IntType = INT_MEMORY_AND_IO; | 146 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -219,7 +219,7 @@ static int pdacf_config(struct pcmcia_device *link) | |||
| 219 | snd_printdd(KERN_DEBUG "pdacf_config called\n"); | 219 | snd_printdd(KERN_DEBUG "pdacf_config called\n"); |
| 220 | link->conf.ConfigIndex = 0x5; | 220 | link->conf.ConfigIndex = 0x5; |
| 221 | 221 | ||
| 222 | ret = pcmcia_request_io(link, &link->io); | 222 | ret = pcmcia_request_io(link); |
| 223 | if (ret) | 223 | if (ret) |
| 224 | goto failed; | 224 | goto failed; |
| 225 | 225 | ||
diff --git a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c index f23c235013a4..a6edfc3be29a 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c | |||
| @@ -159,8 +159,8 @@ static int snd_vxpocket_new(struct snd_card *card, int ibl, | |||
| 159 | vxp->p_dev = link; | 159 | vxp->p_dev = link; |
| 160 | link->priv = chip; | 160 | link->priv = chip; |
| 161 | 161 | ||
| 162 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 162 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
| 163 | link->io.NumPorts1 = 16; | 163 | link->resource[0]->end = 16; |
| 164 | 164 | ||
| 165 | link->conf.Attributes = CONF_ENABLE_IRQ; | 165 | link->conf.Attributes = CONF_ENABLE_IRQ; |
| 166 | link->conf.IntType = INT_MEMORY_AND_IO; | 166 | link->conf.IntType = INT_MEMORY_AND_IO; |
| @@ -226,7 +226,7 @@ static int vxpocket_config(struct pcmcia_device *link) | |||
| 226 | strcpy(chip->card->driver, vxp440_hw.name); | 226 | strcpy(chip->card->driver, vxp440_hw.name); |
| 227 | } | 227 | } |
| 228 | 228 | ||
| 229 | ret = pcmcia_request_io(link, &link->io); | 229 | ret = pcmcia_request_io(link); |
| 230 | if (ret) | 230 | if (ret) |
| 231 | goto failed; | 231 | goto failed; |
| 232 | 232 | ||
