aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ssb/main.c2
-rw-r--r--drivers/ssb/pcmcia.c36
2 files changed, 23 insertions, 15 deletions
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c
index e12371916444..2fcfd73b3b6e 100644
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
@@ -1064,9 +1064,9 @@ u32 ssb_dma_translation(struct ssb_device *dev)
1064{ 1064{
1065 switch (dev->bus->bustype) { 1065 switch (dev->bus->bustype) {
1066 case SSB_BUSTYPE_SSB: 1066 case SSB_BUSTYPE_SSB:
1067 case SSB_BUSTYPE_PCMCIA:
1067 return 0; 1068 return 0;
1068 case SSB_BUSTYPE_PCI: 1069 case SSB_BUSTYPE_PCI:
1069 case SSB_BUSTYPE_PCMCIA:
1070 return SSB_PCI_DMA; 1070 return SSB_PCI_DMA;
1071 } 1071 }
1072 return 0; 1072 return 0;
diff --git a/drivers/ssb/pcmcia.c b/drivers/ssb/pcmcia.c
index cd49f7c65531..d674cef7210d 100644
--- a/drivers/ssb/pcmcia.c
+++ b/drivers/ssb/pcmcia.c
@@ -28,11 +28,6 @@
28 28
29 29
30/* PCMCIA configuration registers */ 30/* PCMCIA configuration registers */
31#define SSB_PCMCIA_CORECTL 0x00
32#define SSB_PCMCIA_CORECTL_RESET 0x80 /* Core reset */
33#define SSB_PCMCIA_CORECTL_IRQEN 0x04 /* IRQ enable */
34#define SSB_PCMCIA_CORECTL_FUNCEN 0x01 /* Function enable */
35#define SSB_PCMCIA_CORECTL2 0x80
36#define SSB_PCMCIA_ADDRESS0 0x2E 31#define SSB_PCMCIA_ADDRESS0 0x2E
37#define SSB_PCMCIA_ADDRESS1 0x30 32#define SSB_PCMCIA_ADDRESS1 0x30
38#define SSB_PCMCIA_ADDRESS2 0x32 33#define SSB_PCMCIA_ADDRESS2 0x32
@@ -671,6 +666,24 @@ static DEVICE_ATTR(ssb_sprom, 0600,
671 ssb_pcmcia_attr_sprom_show, 666 ssb_pcmcia_attr_sprom_show,
672 ssb_pcmcia_attr_sprom_store); 667 ssb_pcmcia_attr_sprom_store);
673 668
669static int ssb_pcmcia_cor_setup(struct ssb_bus *bus, u8 cor)
670{
671 u8 val;
672 int err;
673
674 err = ssb_pcmcia_cfg_read(bus, cor, &val);
675 if (err)
676 return err;
677 val &= ~COR_SOFT_RESET;
678 val |= COR_FUNC_ENA | COR_IREQ_ENA | COR_LEVEL_REQ;
679 err = ssb_pcmcia_cfg_write(bus, cor, val);
680 if (err)
681 return err;
682 msleep(40);
683
684 return 0;
685}
686
674void ssb_pcmcia_exit(struct ssb_bus *bus) 687void ssb_pcmcia_exit(struct ssb_bus *bus)
675{ 688{
676 if (bus->bustype != SSB_BUSTYPE_PCMCIA) 689 if (bus->bustype != SSB_BUSTYPE_PCMCIA)
@@ -681,7 +694,6 @@ void ssb_pcmcia_exit(struct ssb_bus *bus)
681 694
682int ssb_pcmcia_init(struct ssb_bus *bus) 695int ssb_pcmcia_init(struct ssb_bus *bus)
683{ 696{
684 u8 val, offset;
685 int err; 697 int err;
686 698
687 if (bus->bustype != SSB_BUSTYPE_PCMCIA) 699 if (bus->bustype != SSB_BUSTYPE_PCMCIA)
@@ -691,16 +703,12 @@ int ssb_pcmcia_init(struct ssb_bus *bus)
691 * bus->mapped_pcmcia_seg with hardware state. */ 703 * bus->mapped_pcmcia_seg with hardware state. */
692 ssb_pcmcia_switch_segment(bus, 0); 704 ssb_pcmcia_switch_segment(bus, 0);
693 705
694 /* Init IRQ routing */ 706 /* Init the COR register. */
695 if (bus->chip_id == 0x4306) 707 err = ssb_pcmcia_cor_setup(bus, CISREG_COR);
696 offset = SSB_PCMCIA_CORECTL;
697 else
698 offset = SSB_PCMCIA_CORECTL2;
699 err = ssb_pcmcia_cfg_read(bus, offset, &val);
700 if (err) 708 if (err)
701 goto error; 709 goto error;
702 val |= SSB_PCMCIA_CORECTL_IRQEN | SSB_PCMCIA_CORECTL_FUNCEN; 710 /* Some cards also need this register to get poked. */
703 err = ssb_pcmcia_cfg_write(bus, offset, val); 711 err = ssb_pcmcia_cor_setup(bus, CISREG_COR + 0x80);
704 if (err) 712 if (err)
705 goto error; 713 goto error;
706 714