diff options
-rw-r--r-- | drivers/bcma/driver_pci.c | 19 | ||||
-rw-r--r-- | include/linux/bcma/bcma_driver_pci.h | 5 |
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/bcma/driver_pci.c b/drivers/bcma/driver_pci.c index 949206674dc8..472d14fad643 100644 --- a/drivers/bcma/driver_pci.c +++ b/drivers/bcma/driver_pci.c | |||
@@ -168,12 +168,31 @@ static void bcma_pcicore_serdes_workaround(struct bcma_drv_pci *pc) | |||
168 | tmp & ~BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN); | 168 | tmp & ~BCMA_CORE_PCI_PLL_CTRL_FREQDET_EN); |
169 | } | 169 | } |
170 | 170 | ||
171 | static void bcma_core_pci_fixcfg(struct bcma_drv_pci *pc) | ||
172 | { | ||
173 | struct bcma_device *core = pc->core; | ||
174 | u16 val16, core_index; | ||
175 | uint regoff; | ||
176 | |||
177 | regoff = BCMA_CORE_PCI_SPROM(BCMA_CORE_PCI_SPROM_PI_OFFSET); | ||
178 | core_index = (u16)core->core_index; | ||
179 | |||
180 | val16 = pcicore_read16(pc, regoff); | ||
181 | if (((val16 & BCMA_CORE_PCI_SPROM_PI_MASK) >> BCMA_CORE_PCI_SPROM_PI_SHIFT) | ||
182 | != core_index) { | ||
183 | val16 = (core_index << BCMA_CORE_PCI_SPROM_PI_SHIFT) | | ||
184 | (val16 & ~BCMA_CORE_PCI_SPROM_PI_MASK); | ||
185 | pcicore_write16(pc, regoff, val16); | ||
186 | } | ||
187 | } | ||
188 | |||
171 | /************************************************** | 189 | /************************************************** |
172 | * Init. | 190 | * Init. |
173 | **************************************************/ | 191 | **************************************************/ |
174 | 192 | ||
175 | static void __devinit bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc) | 193 | static void __devinit bcma_core_pci_clientmode_init(struct bcma_drv_pci *pc) |
176 | { | 194 | { |
195 | bcma_core_pci_fixcfg(pc); | ||
177 | bcma_pcicore_serdes_workaround(pc); | 196 | bcma_pcicore_serdes_workaround(pc); |
178 | } | 197 | } |
179 | 198 | ||
diff --git a/include/linux/bcma/bcma_driver_pci.h b/include/linux/bcma/bcma_driver_pci.h index 20c9f96d4070..5b0542c336ed 100644 --- a/include/linux/bcma/bcma_driver_pci.h +++ b/include/linux/bcma/bcma_driver_pci.h | |||
@@ -87,6 +87,9 @@ struct pci_dev; | |||
87 | #define BCMA_CORE_PCI_PCICFG2 0x0600 /* PCI config space 2 (rev >= 8) */ | 87 | #define BCMA_CORE_PCI_PCICFG2 0x0600 /* PCI config space 2 (rev >= 8) */ |
88 | #define BCMA_CORE_PCI_PCICFG3 0x0700 /* PCI config space 3 (rev >= 8) */ | 88 | #define BCMA_CORE_PCI_PCICFG3 0x0700 /* PCI config space 3 (rev >= 8) */ |
89 | #define BCMA_CORE_PCI_SPROM(wordoffset) (0x0800 + ((wordoffset) * 2)) /* SPROM shadow area (72 bytes) */ | 89 | #define BCMA_CORE_PCI_SPROM(wordoffset) (0x0800 + ((wordoffset) * 2)) /* SPROM shadow area (72 bytes) */ |
90 | #define BCMA_CORE_PCI_SPROM_PI_OFFSET 0 /* first word */ | ||
91 | #define BCMA_CORE_PCI_SPROM_PI_MASK 0xf000 /* bit 15:12 */ | ||
92 | #define BCMA_CORE_PCI_SPROM_PI_SHIFT 12 /* bit 15:12 */ | ||
90 | 93 | ||
91 | /* SBtoPCIx */ | 94 | /* SBtoPCIx */ |
92 | #define BCMA_CORE_PCI_SBTOPCI_MEM 0x00000000 | 95 | #define BCMA_CORE_PCI_SBTOPCI_MEM 0x00000000 |
@@ -202,7 +205,9 @@ struct bcma_drv_pci { | |||
202 | }; | 205 | }; |
203 | 206 | ||
204 | /* Register access */ | 207 | /* Register access */ |
208 | #define pcicore_read16(pc, offset) bcma_read16((pc)->core, offset) | ||
205 | #define pcicore_read32(pc, offset) bcma_read32((pc)->core, offset) | 209 | #define pcicore_read32(pc, offset) bcma_read32((pc)->core, offset) |
210 | #define pcicore_write16(pc, offset, val) bcma_write16((pc)->core, offset, val) | ||
206 | #define pcicore_write32(pc, offset, val) bcma_write32((pc)->core, offset, val) | 211 | #define pcicore_write32(pc, offset, val) bcma_write32((pc)->core, offset, val) |
207 | 212 | ||
208 | extern void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc); | 213 | extern void __devinit bcma_core_pci_init(struct bcma_drv_pci *pc); |