diff options
Diffstat (limited to 'drivers/pcmcia/ti113x.h')
-rw-r--r-- | drivers/pcmcia/ti113x.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h index d319f2e7d053..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 |
@@ -624,6 +625,7 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
624 | int devfn; | 625 | int devfn; |
625 | unsigned int state; | 626 | unsigned int state; |
626 | int ret = 1; | 627 | int ret = 1; |
628 | u32 sysctl; | ||
627 | 629 | ||
628 | /* catch the two-slot controllers */ | 630 | /* catch the two-slot controllers */ |
629 | switch (socket->dev->device) { | 631 | switch (socket->dev->device) { |
@@ -646,6 +648,24 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
646 | */ | 648 | */ |
647 | break; | 649 | break; |
648 | 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 | |||
649 | /* single-slot controllers have the 2nd slot empty always :) */ | 669 | /* single-slot controllers have the 2nd slot empty always :) */ |
650 | default: | 670 | default: |
651 | return 1; | 671 | return 1; |
@@ -658,6 +678,15 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
658 | if (!func) | 678 | if (!func) |
659 | return 1; | 679 | return 1; |
660 | 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 | |||
661 | slot2 = pci_get_drvdata(func); | 690 | slot2 = pci_get_drvdata(func); |
662 | if (!slot2) | 691 | if (!slot2) |
663 | goto out; | 692 | goto out; |