diff options
Diffstat (limited to 'drivers/pcmcia')
| -rw-r--r-- | drivers/pcmcia/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/cardbus.c | 5 | ||||
| -rw-r--r-- | drivers/pcmcia/omap_cf.c | 1 | ||||
| -rw-r--r-- | drivers/pcmcia/pcmcia_ioctl.c | 12 | ||||
| -rw-r--r-- | drivers/pcmcia/rsrc_nonstatic.c | 10 | ||||
| -rw-r--r-- | drivers/pcmcia/ti113x.h | 115 | ||||
| -rw-r--r-- | drivers/pcmcia/yenta_socket.c | 75 |
7 files changed, 169 insertions, 51 deletions
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index ddc741e6ecbf..36cc9a96a338 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig | |||
| @@ -146,7 +146,7 @@ config I82365 | |||
| 146 | 146 | ||
| 147 | config TCIC | 147 | config TCIC |
| 148 | tristate "Databook TCIC host bridge support" | 148 | tristate "Databook TCIC host bridge support" |
| 149 | depends on PCMCIA | 149 | depends on PCMCIA && ISA |
| 150 | select PCCARD_NONSTATIC | 150 | select PCCARD_NONSTATIC |
| 151 | help | 151 | help |
| 152 | Say Y here to include support for the Databook TCIC family of PCMCIA | 152 | Say Y here to include support for the Databook TCIC family of PCMCIA |
diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c index 1d755e20880c..3f6d51d11374 100644 --- a/drivers/pcmcia/cardbus.c +++ b/drivers/pcmcia/cardbus.c | |||
| @@ -228,6 +228,11 @@ int cb_alloc(struct pcmcia_socket * s) | |||
| 228 | pci_bus_size_bridges(bus); | 228 | pci_bus_size_bridges(bus); |
| 229 | pci_bus_assign_resources(bus); | 229 | pci_bus_assign_resources(bus); |
| 230 | cardbus_assign_irqs(bus, s->pci_irq); | 230 | cardbus_assign_irqs(bus, s->pci_irq); |
| 231 | |||
| 232 | /* socket specific tune function */ | ||
| 233 | if (s->tune_bridge) | ||
| 234 | s->tune_bridge(s, bus); | ||
| 235 | |||
| 231 | pci_enable_bridges(bus); | 236 | pci_enable_bridges(bus); |
| 232 | pci_bus_add_devices(bus); | 237 | pci_bus_add_devices(bus); |
| 233 | 238 | ||
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index 08d1c9288264..94be9e51654e 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | 22 | ||
| 23 | #include <asm/hardware.h> | 23 | #include <asm/hardware.h> |
| 24 | #include <asm/io.h> | 24 | #include <asm/io.h> |
| 25 | #include <asm/mach-types.h> | ||
| 26 | #include <asm/sizes.h> | 25 | #include <asm/sizes.h> |
| 27 | 26 | ||
| 28 | #include <asm/arch/mux.h> | 27 | #include <asm/arch/mux.h> |
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 39ba6406fd54..80969f7e7a0b 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
| @@ -376,6 +376,7 @@ static int ds_open(struct inode *inode, struct file *file) | |||
| 376 | socket_t i = iminor(inode); | 376 | socket_t i = iminor(inode); |
| 377 | struct pcmcia_socket *s; | 377 | struct pcmcia_socket *s; |
| 378 | user_info_t *user; | 378 | user_info_t *user; |
| 379 | static int warning_printed = 0; | ||
| 379 | 380 | ||
| 380 | ds_dbg(0, "ds_open(socket %d)\n", i); | 381 | ds_dbg(0, "ds_open(socket %d)\n", i); |
| 381 | 382 | ||
| @@ -407,6 +408,17 @@ static int ds_open(struct inode *inode, struct file *file) | |||
| 407 | s->user = user; | 408 | s->user = user; |
| 408 | file->private_data = user; | 409 | file->private_data = user; |
| 409 | 410 | ||
| 411 | if (!warning_printed) { | ||
| 412 | printk(KERN_INFO "pcmcia: Detected deprecated PCMCIA ioctl " | ||
| 413 | "usage.\n"); | ||
| 414 | printk(KERN_INFO "pcmcia: This interface will soon be removed from " | ||
| 415 | "the kernel; please expect breakage unless you upgrade " | ||
| 416 | "to new tools.\n"); | ||
| 417 | printk(KERN_INFO "pcmcia: see http://www.kernel.org/pub/linux/" | ||
| 418 | "utils/kernel/pcmcia/pcmcia.html for details.\n"); | ||
| 419 | warning_printed = 1; | ||
| 420 | } | ||
| 421 | |||
| 410 | if (s->pcmcia_state.present) | 422 | if (s->pcmcia_state.present) |
| 411 | queue_event(user, CS_EVENT_CARD_INSERTION); | 423 | queue_event(user, CS_EVENT_CARD_INSERTION); |
| 412 | return 0; | 424 | return 0; |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index c42455d20eb6..f9a5c70284b5 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
| @@ -691,7 +691,7 @@ static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned | |||
| 691 | unsigned long size = end - start + 1; | 691 | unsigned long size = end - start + 1; |
| 692 | int ret = 0; | 692 | int ret = 0; |
| 693 | 693 | ||
| 694 | if (end <= start) | 694 | if (end < start) |
| 695 | return -EINVAL; | 695 | return -EINVAL; |
| 696 | 696 | ||
| 697 | down(&rsrc_sem); | 697 | down(&rsrc_sem); |
| @@ -724,7 +724,7 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long | |||
| 724 | unsigned long size = end - start + 1; | 724 | unsigned long size = end - start + 1; |
| 725 | int ret = 0; | 725 | int ret = 0; |
| 726 | 726 | ||
| 727 | if (end <= start) | 727 | if (end < start) |
| 728 | return -EINVAL; | 728 | return -EINVAL; |
| 729 | 729 | ||
| 730 | if (end > IO_SPACE_LIMIT) | 730 | if (end > IO_SPACE_LIMIT) |
| @@ -817,7 +817,7 @@ static int nonstatic_autoadd_resources(struct pcmcia_socket *s) | |||
| 817 | 817 | ||
| 818 | /* if we got at least one of IO, and one of MEM, we can be glad and | 818 | /* if we got at least one of IO, and one of MEM, we can be glad and |
| 819 | * activate the PCMCIA subsystem */ | 819 | * activate the PCMCIA subsystem */ |
| 820 | if (done & (IORESOURCE_MEM | IORESOURCE_IO)) | 820 | if (done == (IORESOURCE_MEM | IORESOURCE_IO)) |
| 821 | s->resource_setup_done = 1; | 821 | s->resource_setup_done = 1; |
| 822 | 822 | ||
| 823 | return 0; | 823 | return 0; |
| @@ -925,7 +925,7 @@ static ssize_t store_io_db(struct class_device *class_dev, const char *buf, size | |||
| 925 | return -EINVAL; | 925 | return -EINVAL; |
| 926 | } | 926 | } |
| 927 | } | 927 | } |
| 928 | if (end_addr <= start_addr) | 928 | if (end_addr < start_addr) |
| 929 | return -EINVAL; | 929 | return -EINVAL; |
| 930 | 930 | ||
| 931 | ret = adjust_io(s, add, start_addr, end_addr); | 931 | ret = adjust_io(s, add, start_addr, end_addr); |
| @@ -977,7 +977,7 @@ static ssize_t store_mem_db(struct class_device *class_dev, const char *buf, siz | |||
| 977 | return -EINVAL; | 977 | return -EINVAL; |
| 978 | } | 978 | } |
| 979 | } | 979 | } |
| 980 | if (end_addr <= start_addr) | 980 | if (end_addr < start_addr) |
| 981 | return -EINVAL; | 981 | return -EINVAL; |
| 982 | 982 | ||
| 983 | ret = adjust_memory(s, add, start_addr, end_addr); | 983 | ret = adjust_memory(s, add, start_addr, end_addr); |
diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h index fbe233e19ceb..da0b404561c9 100644 --- a/drivers/pcmcia/ti113x.h +++ b/drivers/pcmcia/ti113x.h | |||
| @@ -59,6 +59,7 @@ | |||
| 59 | 59 | ||
| 60 | #define TI122X_SCR_SER_STEP 0xc0000000 | 60 | #define TI122X_SCR_SER_STEP 0xc0000000 |
| 61 | #define TI122X_SCR_INTRTIE 0x20000000 | 61 | #define TI122X_SCR_INTRTIE 0x20000000 |
| 62 | #define TIXX21_SCR_TIEALL 0x10000000 | ||
| 62 | #define TI122X_SCR_CBRSVD 0x00400000 | 63 | #define TI122X_SCR_CBRSVD 0x00400000 |
| 63 | #define TI122X_SCR_MRBURSTDN 0x00008000 | 64 | #define TI122X_SCR_MRBURSTDN 0x00008000 |
| 64 | #define TI122X_SCR_MRBURSTUP 0x00004000 | 65 | #define TI122X_SCR_MRBURSTUP 0x00004000 |
| @@ -153,6 +154,12 @@ | |||
| 153 | /* EnE test register */ | 154 | /* EnE test register */ |
| 154 | #define ENE_TEST_C9 0xc9 /* 8bit */ | 155 | #define ENE_TEST_C9 0xc9 /* 8bit */ |
| 155 | #define ENE_TEST_C9_TLTENABLE 0x02 | 156 | #define ENE_TEST_C9_TLTENABLE 0x02 |
| 157 | #define ENE_TEST_C9_PFENABLE_F0 0x04 | ||
| 158 | #define ENE_TEST_C9_PFENABLE_F1 0x08 | ||
| 159 | #define ENE_TEST_C9_PFENABLE (ENE_TEST_C9_PFENABLE_F0 | ENE_TEST_C9_PFENABLE_F0) | ||
| 160 | #define ENE_TEST_C9_WPDISALBLE_F0 0x40 | ||
| 161 | #define ENE_TEST_C9_WPDISALBLE_F1 0x80 | ||
| 162 | #define ENE_TEST_C9_WPDISALBLE (ENE_TEST_C9_WPDISALBLE_F0 | ENE_TEST_C9_WPDISALBLE_F1) | ||
| 156 | 163 | ||
| 157 | /* | 164 | /* |
| 158 | * Texas Instruments CardBus controller overrides. | 165 | * Texas Instruments CardBus controller overrides. |
| @@ -618,6 +625,7 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
| 618 | int devfn; | 625 | int devfn; |
| 619 | unsigned int state; | 626 | unsigned int state; |
| 620 | int ret = 1; | 627 | int ret = 1; |
| 628 | u32 sysctl; | ||
| 621 | 629 | ||
| 622 | /* catch the two-slot controllers */ | 630 | /* catch the two-slot controllers */ |
| 623 | switch (socket->dev->device) { | 631 | switch (socket->dev->device) { |
| @@ -640,6 +648,24 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
| 640 | */ | 648 | */ |
| 641 | break; | 649 | break; |
| 642 | 650 | ||
| 651 | case PCI_DEVICE_ID_TI_X515: | ||
| 652 | case PCI_DEVICE_ID_TI_X420: | ||
| 653 | case PCI_DEVICE_ID_TI_X620: | ||
| 654 | case PCI_DEVICE_ID_TI_XX21_XX11: | ||
| 655 | case PCI_DEVICE_ID_TI_7410: | ||
| 656 | case PCI_DEVICE_ID_TI_7610: | ||
| 657 | /* | ||
| 658 | * those are either single or dual slot CB with additional functions | ||
| 659 | * like 1394, smartcard reader, etc. check the TIEALL flag for them | ||
| 660 | * the TIEALL flag binds the IRQ of all functions toghether. | ||
| 661 | * we catch the single slot variants later. | ||
| 662 | */ | ||
| 663 | sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL); | ||
| 664 | if (sysctl & TIXX21_SCR_TIEALL) | ||
| 665 | return 0; | ||
| 666 | |||
| 667 | break; | ||
| 668 | |||
| 643 | /* single-slot controllers have the 2nd slot empty always :) */ | 669 | /* single-slot controllers have the 2nd slot empty always :) */ |
| 644 | default: | 670 | default: |
| 645 | return 1; | 671 | return 1; |
| @@ -652,6 +678,15 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
| 652 | if (!func) | 678 | if (!func) |
| 653 | return 1; | 679 | return 1; |
| 654 | 680 | ||
| 681 | /* | ||
| 682 | * check that the device id of both slots match. this is needed for the | ||
| 683 | * XX21 and the XX11 controller that share the same device id for single | ||
| 684 | * and dual slot controllers. return '2nd slot empty'. we already checked | ||
| 685 | * if the interrupt is tied to another function. | ||
| 686 | */ | ||
| 687 | if (socket->dev->device != func->device) | ||
| 688 | goto out; | ||
| 689 | |||
| 655 | slot2 = pci_get_drvdata(func); | 690 | slot2 = pci_get_drvdata(func); |
| 656 | if (!slot2) | 691 | if (!slot2) |
| 657 | goto out; | 692 | goto out; |
| @@ -791,16 +826,6 @@ static int ti12xx_override(struct yenta_socket *socket) | |||
| 791 | config_writel(socket, TI113X_SYSTEM_CONTROL, val); | 826 | config_writel(socket, TI113X_SYSTEM_CONTROL, val); |
| 792 | 827 | ||
| 793 | /* | 828 | /* |
| 794 | * for EnE bridges only: clear testbit TLTEnable. this makes the | ||
| 795 | * RME Hammerfall DSP sound card working. | ||
| 796 | */ | ||
| 797 | if (socket->dev->vendor == PCI_VENDOR_ID_ENE) { | ||
| 798 | u8 test_c9 = config_readb(socket, ENE_TEST_C9); | ||
| 799 | test_c9 &= ~ENE_TEST_C9_TLTENABLE; | ||
| 800 | config_writeb(socket, ENE_TEST_C9, test_c9); | ||
| 801 | } | ||
| 802 | |||
| 803 | /* | ||
| 804 | * Yenta expects controllers to use CSCINT to route | 829 | * Yenta expects controllers to use CSCINT to route |
| 805 | * CSC interrupts to PCI rather than INTVAL. | 830 | * CSC interrupts to PCI rather than INTVAL. |
| 806 | */ | 831 | */ |
| @@ -841,5 +866,75 @@ static int ti1250_override(struct yenta_socket *socket) | |||
| 841 | return ti12xx_override(socket); | 866 | return ti12xx_override(socket); |
| 842 | } | 867 | } |
| 843 | 868 | ||
| 869 | |||
| 870 | /** | ||
| 871 | * EnE specific part. EnE bridges are register compatible with TI bridges but | ||
| 872 | * have their own test registers and more important their own little problems. | ||
| 873 | * Some fixup code to make everybody happy (TM). | ||
| 874 | */ | ||
| 875 | |||
| 876 | /** | ||
| 877 | * set/clear various test bits: | ||
| 878 | * Defaults to clear the bit. | ||
| 879 | * - mask (u8) defines what bits to change | ||
| 880 | * - bits (u8) is the values to change them to | ||
| 881 | * -> it's | ||
| 882 | * current = (current & ~mask) | bits | ||
| 883 | */ | ||
| 884 | /* pci ids of devices that wants to have the bit set */ | ||
| 885 | #define DEVID(_vend,_dev,_subvend,_subdev,mask,bits) { \ | ||
| 886 | .vendor = _vend, \ | ||
| 887 | .device = _dev, \ | ||
| 888 | .subvendor = _subvend, \ | ||
| 889 | .subdevice = _subdev, \ | ||
| 890 | .driver_data = ((mask) << 8 | (bits)), \ | ||
| 891 | } | ||
| 892 | static struct pci_device_id ene_tune_tbl[] = { | ||
| 893 | /* Echo Audio products based on motorola DSP56301 and DSP56361 */ | ||
| 894 | DEVID(PCI_VENDOR_ID_MOTOROLA, 0x1801, 0xECC0, PCI_ANY_ID, | ||
| 895 | ENE_TEST_C9_TLTENABLE | ENE_TEST_C9_PFENABLE, ENE_TEST_C9_TLTENABLE), | ||
| 896 | DEVID(PCI_VENDOR_ID_MOTOROLA, 0x3410, 0xECC0, PCI_ANY_ID, | ||
| 897 | ENE_TEST_C9_TLTENABLE | ENE_TEST_C9_PFENABLE, ENE_TEST_C9_TLTENABLE), | ||
| 898 | |||
| 899 | {} | ||
| 900 | }; | ||
| 901 | |||
| 902 | static void ene_tune_bridge(struct pcmcia_socket *sock, struct pci_bus *bus) | ||
| 903 | { | ||
| 904 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); | ||
| 905 | struct pci_dev *dev; | ||
| 906 | struct pci_device_id *id = NULL; | ||
| 907 | u8 test_c9, old_c9, mask, bits; | ||
| 908 | |||
| 909 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
| 910 | id = (struct pci_device_id *) pci_match_id(ene_tune_tbl, dev); | ||
| 911 | if (id) | ||
| 912 | break; | ||
| 913 | } | ||
| 914 | |||
| 915 | test_c9 = old_c9 = config_readb(socket, ENE_TEST_C9); | ||
| 916 | if (id) { | ||
| 917 | mask = (id->driver_data >> 8) & 0xFF; | ||
| 918 | bits = id->driver_data & 0xFF; | ||
| 919 | |||
| 920 | test_c9 = (test_c9 & ~mask) | bits; | ||
| 921 | } | ||
| 922 | else | ||
| 923 | /* default to clear TLTEnable bit, old behaviour */ | ||
| 924 | test_c9 &= ~ENE_TEST_C9_TLTENABLE; | ||
| 925 | |||
| 926 | printk(KERN_INFO "yenta EnE: chaning testregister 0xC9, %02x -> %02x\n", old_c9, test_c9); | ||
| 927 | config_writeb(socket, ENE_TEST_C9, test_c9); | ||
| 928 | } | ||
| 929 | |||
| 930 | |||
| 931 | static int ene_override(struct yenta_socket *socket) | ||
| 932 | { | ||
| 933 | /* install tune_bridge() function */ | ||
| 934 | socket->socket.tune_bridge = ene_tune_bridge; | ||
| 935 | |||
| 936 | return ti1250_override(socket); | ||
| 937 | } | ||
| 938 | |||
| 844 | #endif /* _LINUX_TI113X_H */ | 939 | #endif /* _LINUX_TI113X_H */ |
| 845 | 940 | ||
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index f0997c36c9b7..db9f952f9e3c 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
| @@ -559,12 +559,6 @@ static void yenta_interrogate(struct yenta_socket *socket) | |||
| 559 | static int yenta_sock_init(struct pcmcia_socket *sock) | 559 | static int yenta_sock_init(struct pcmcia_socket *sock) |
| 560 | { | 560 | { |
| 561 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); | 561 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); |
| 562 | u16 bridge; | ||
| 563 | |||
| 564 | bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~CB_BRIDGE_INTR; | ||
| 565 | if (!socket->cb_irq) | ||
| 566 | bridge |= CB_BRIDGE_INTR; | ||
| 567 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); | ||
| 568 | 562 | ||
| 569 | exca_writeb(socket, I365_GBLCTL, 0x00); | 563 | exca_writeb(socket, I365_GBLCTL, 0x00); |
| 570 | exca_writeb(socket, I365_GENCTL, 0x00); | 564 | exca_writeb(socket, I365_GENCTL, 0x00); |
| @@ -819,6 +813,7 @@ enum { | |||
| 819 | CARDBUS_TYPE_TOPIC95, | 813 | CARDBUS_TYPE_TOPIC95, |
| 820 | CARDBUS_TYPE_TOPIC97, | 814 | CARDBUS_TYPE_TOPIC97, |
| 821 | CARDBUS_TYPE_O2MICRO, | 815 | CARDBUS_TYPE_O2MICRO, |
| 816 | CARDBUS_TYPE_ENE, | ||
| 822 | }; | 817 | }; |
| 823 | 818 | ||
| 824 | /* | 819 | /* |
| @@ -865,6 +860,12 @@ static struct cardbus_type cardbus_type[] = { | |||
| 865 | .override = o2micro_override, | 860 | .override = o2micro_override, |
| 866 | .restore_state = o2micro_restore_state, | 861 | .restore_state = o2micro_restore_state, |
| 867 | }, | 862 | }, |
| 863 | [CARDBUS_TYPE_ENE] = { | ||
| 864 | .override = ene_override, | ||
| 865 | .save_state = ti_save_state, | ||
| 866 | .restore_state = ti_restore_state, | ||
| 867 | .sock_init = ti_init, | ||
| 868 | }, | ||
| 868 | }; | 869 | }; |
| 869 | 870 | ||
| 870 | 871 | ||
| @@ -883,16 +884,8 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas | |||
| 883 | { | 884 | { |
| 884 | int i; | 885 | int i; |
| 885 | unsigned long val; | 886 | unsigned long val; |
| 886 | u16 bridge_ctrl; | ||
| 887 | u32 mask; | 887 | u32 mask; |
| 888 | 888 | ||
| 889 | /* Set up ISA irq routing to probe the ISA irqs.. */ | ||
| 890 | bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL); | ||
| 891 | if (!(bridge_ctrl & CB_BRIDGE_INTR)) { | ||
| 892 | bridge_ctrl |= CB_BRIDGE_INTR; | ||
| 893 | config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl); | ||
| 894 | } | ||
| 895 | |||
| 896 | /* | 889 | /* |
| 897 | * Probe for usable interrupts using the force | 890 | * Probe for usable interrupts using the force |
| 898 | * register to generate bogus card status events. | 891 | * register to generate bogus card status events. |
| @@ -914,9 +907,6 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas | |||
| 914 | 907 | ||
| 915 | mask = probe_irq_mask(val) & 0xffff; | 908 | mask = probe_irq_mask(val) & 0xffff; |
| 916 | 909 | ||
| 917 | bridge_ctrl &= ~CB_BRIDGE_INTR; | ||
| 918 | config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl); | ||
| 919 | |||
| 920 | return mask; | 910 | return mask; |
| 921 | } | 911 | } |
| 922 | 912 | ||
| @@ -944,18 +934,11 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id, struct pt_regs *re | |||
| 944 | /* probes the PCI interrupt, use only on override functions */ | 934 | /* probes the PCI interrupt, use only on override functions */ |
| 945 | static int yenta_probe_cb_irq(struct yenta_socket *socket) | 935 | static int yenta_probe_cb_irq(struct yenta_socket *socket) |
| 946 | { | 936 | { |
| 947 | u16 bridge_ctrl; | ||
| 948 | |||
| 949 | if (!socket->cb_irq) | 937 | if (!socket->cb_irq) |
| 950 | return -1; | 938 | return -1; |
| 951 | 939 | ||
| 952 | socket->probe_status = 0; | 940 | socket->probe_status = 0; |
| 953 | 941 | ||
| 954 | /* disable ISA interrupts */ | ||
| 955 | bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL); | ||
| 956 | bridge_ctrl &= ~CB_BRIDGE_INTR; | ||
| 957 | config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl); | ||
| 958 | |||
| 959 | if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) { | 942 | if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) { |
| 960 | printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); | 943 | printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); |
| 961 | return -1; | 944 | return -1; |
| @@ -966,7 +949,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) | |||
| 966 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 949 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
| 967 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); | 950 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); |
| 968 | cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); | 951 | cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); |
| 969 | 952 | ||
| 970 | msleep(100); | 953 | msleep(100); |
| 971 | 954 | ||
| 972 | /* disable interrupts */ | 955 | /* disable interrupts */ |
| @@ -1004,11 +987,12 @@ static void yenta_config_init(struct yenta_socket *socket) | |||
| 1004 | { | 987 | { |
| 1005 | u16 bridge; | 988 | u16 bridge; |
| 1006 | struct pci_dev *dev = socket->dev; | 989 | struct pci_dev *dev = socket->dev; |
| 990 | struct pci_bus_region region; | ||
| 1007 | 991 | ||
| 1008 | pci_set_power_state(socket->dev, 0); | 992 | pcibios_resource_to_bus(socket->dev, ®ion, &dev->resource[0]); |
| 1009 | 993 | ||
| 1010 | config_writel(socket, CB_LEGACY_MODE_BASE, 0); | 994 | config_writel(socket, CB_LEGACY_MODE_BASE, 0); |
| 1011 | config_writel(socket, PCI_BASE_ADDRESS_0, dev->resource[0].start); | 995 | config_writel(socket, PCI_BASE_ADDRESS_0, region.start); |
| 1012 | config_writew(socket, PCI_COMMAND, | 996 | config_writew(socket, PCI_COMMAND, |
| 1013 | PCI_COMMAND_IO | | 997 | PCI_COMMAND_IO | |
| 1014 | PCI_COMMAND_MEMORY | | 998 | PCI_COMMAND_MEMORY | |
| @@ -1031,8 +1015,8 @@ static void yenta_config_init(struct yenta_socket *socket) | |||
| 1031 | * - PCI interrupts enabled if a PCI interrupt exists.. | 1015 | * - PCI interrupts enabled if a PCI interrupt exists.. |
| 1032 | */ | 1016 | */ |
| 1033 | bridge = config_readw(socket, CB_BRIDGE_CONTROL); | 1017 | bridge = config_readw(socket, CB_BRIDGE_CONTROL); |
| 1034 | bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_INTR | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN); | 1018 | bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN); |
| 1035 | bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN | CB_BRIDGE_INTR; | 1019 | bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN; |
| 1036 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); | 1020 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); |
| 1037 | } | 1021 | } |
| 1038 | 1022 | ||
| @@ -1045,7 +1029,18 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
| 1045 | { | 1029 | { |
| 1046 | struct yenta_socket *socket; | 1030 | struct yenta_socket *socket; |
| 1047 | int ret; | 1031 | int ret; |
| 1048 | 1032 | ||
| 1033 | /* | ||
| 1034 | * If we failed to assign proper bus numbers for this cardbus | ||
| 1035 | * controller during PCI probe, its subordinate pci_bus is NULL. | ||
| 1036 | * Bail out if so. | ||
| 1037 | */ | ||
| 1038 | if (!dev->subordinate) { | ||
| 1039 | printk(KERN_ERR "Yenta: no bus associated with %s! " | ||
| 1040 | "(try 'pci=assign-busses')\n", pci_name(dev)); | ||
| 1041 | return -ENODEV; | ||
| 1042 | } | ||
| 1043 | |||
| 1049 | socket = kmalloc(sizeof(struct yenta_socket), GFP_KERNEL); | 1044 | socket = kmalloc(sizeof(struct yenta_socket), GFP_KERNEL); |
| 1050 | if (!socket) | 1045 | if (!socket) |
| 1051 | return -ENOMEM; | 1046 | return -ENOMEM; |
| @@ -1254,10 +1249,22 @@ static struct pci_device_id yenta_table [] = { | |||
| 1254 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1250, TI1250), | 1249 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1250, TI1250), |
| 1255 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1410, TI1250), | 1250 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1410, TI1250), |
| 1256 | 1251 | ||
| 1257 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1211, TI12XX), | 1252 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11, TI12XX), |
| 1258 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1225, TI12XX), | 1253 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X515, TI12XX), |
| 1259 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1410, TI1250), | 1254 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X420, TI12XX), |
| 1260 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1420, TI12XX), | 1255 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X620, TI12XX), |
| 1256 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7410, TI12XX), | ||
| 1257 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7510, TI12XX), | ||
| 1258 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7610, TI12XX), | ||
| 1259 | |||
| 1260 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_710, TI12XX), | ||
| 1261 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_712, TI12XX), | ||
| 1262 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_720, TI12XX), | ||
| 1263 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_722, TI12XX), | ||
| 1264 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1211, ENE), | ||
| 1265 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1225, ENE), | ||
| 1266 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1410, ENE), | ||
| 1267 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1420, ENE), | ||
| 1261 | 1268 | ||
| 1262 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C465, RICOH), | 1269 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C465, RICOH), |
| 1263 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C466, RICOH), | 1270 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C466, RICOH), |
