aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bcma
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2012-09-29 14:29:49 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-19 15:52:18 -0400
commit49655bb8a51565f0375a4f783334c9de78134be5 (patch)
tree2e1b63c9fa53e5e53190ff2d9d652dd057158846 /drivers/bcma
parentb0a949b42ba7d6f1b2876045a5e062fdfe8c691f (diff)
bcma: just do the necessary things in early register on SoCs
Some parts of the initialization for chip common and the pcie core are accessing the sprom struct, but it is not initialized at that stage. Just do the necessary thing in the early register on SoCs and not the complete initialization to read out the nvram from the flash chip. After it is possible to read out the nvram, the sprom should be parsed from it and the full initialization of the cores should be run. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/bcma')
-rw-r--r--drivers/bcma/driver_chipcommon.c23
-rw-r--r--drivers/bcma/driver_chipcommon_pmu.c5
-rw-r--r--drivers/bcma/driver_mips.c26
-rw-r--r--drivers/bcma/main.c8
4 files changed, 45 insertions, 17 deletions
diff --git a/drivers/bcma/driver_chipcommon.c b/drivers/bcma/driver_chipcommon.c
index a4c3ebcc4c86..ffd74e51f02d 100644
--- a/drivers/bcma/driver_chipcommon.c
+++ b/drivers/bcma/driver_chipcommon.c
@@ -22,12 +22,9 @@ static inline u32 bcma_cc_write32_masked(struct bcma_drv_cc *cc, u16 offset,
22 return value; 22 return value;
23} 23}
24 24
25void bcma_core_chipcommon_init(struct bcma_drv_cc *cc) 25void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc)
26{ 26{
27 u32 leddc_on = 10; 27 if (cc->early_setup_done)
28 u32 leddc_off = 90;
29
30 if (cc->setup_done)
31 return; 28 return;
32 29
33 if (cc->core->id.rev >= 11) 30 if (cc->core->id.rev >= 11)
@@ -36,6 +33,22 @@ void bcma_core_chipcommon_init(struct bcma_drv_cc *cc)
36 if (cc->core->id.rev >= 35) 33 if (cc->core->id.rev >= 35)
37 cc->capabilities_ext = bcma_cc_read32(cc, BCMA_CC_CAP_EXT); 34 cc->capabilities_ext = bcma_cc_read32(cc, BCMA_CC_CAP_EXT);
38 35
36 if (cc->capabilities & BCMA_CC_CAP_PMU)
37 bcma_pmu_early_init(cc);
38
39 cc->early_setup_done = true;
40}
41
42void bcma_core_chipcommon_init(struct bcma_drv_cc *cc)
43{
44 u32 leddc_on = 10;
45 u32 leddc_off = 90;
46
47 if (cc->setup_done)
48 return;
49
50 bcma_core_chipcommon_early_init(cc);
51
39 if (cc->core->id.rev >= 20) { 52 if (cc->core->id.rev >= 20) {
40 bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, 0); 53 bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, 0);
41 bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, 0); 54 bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, 0);
diff --git a/drivers/bcma/driver_chipcommon_pmu.c b/drivers/bcma/driver_chipcommon_pmu.c
index 201faf106b3f..a63ddd9c70eb 100644
--- a/drivers/bcma/driver_chipcommon_pmu.c
+++ b/drivers/bcma/driver_chipcommon_pmu.c
@@ -144,7 +144,7 @@ static void bcma_pmu_workarounds(struct bcma_drv_cc *cc)
144 } 144 }
145} 145}
146 146
147void bcma_pmu_init(struct bcma_drv_cc *cc) 147void bcma_pmu_early_init(struct bcma_drv_cc *cc)
148{ 148{
149 u32 pmucap; 149 u32 pmucap;
150 150
@@ -153,7 +153,10 @@ void bcma_pmu_init(struct bcma_drv_cc *cc)
153 153
154 bcma_debug(cc->core->bus, "Found rev %u PMU (capabilities 0x%08X)\n", 154 bcma_debug(cc->core->bus, "Found rev %u PMU (capabilities 0x%08X)\n",
155 cc->pmu.rev, pmucap); 155 cc->pmu.rev, pmucap);
156}
156 157
158void bcma_pmu_init(struct bcma_drv_cc *cc)
159{
157 if (cc->pmu.rev == 1) 160 if (cc->pmu.rev == 1)
158 bcma_cc_mask32(cc, BCMA_CC_PMU_CTL, 161 bcma_cc_mask32(cc, BCMA_CC_PMU_CTL,
159 ~BCMA_CC_PMU_CTL_NOILPONW); 162 ~BCMA_CC_PMU_CTL_NOILPONW);
diff --git a/drivers/bcma/driver_mips.c b/drivers/bcma/driver_mips.c
index cc65b45b4368..f44f1fb67011 100644
--- a/drivers/bcma/driver_mips.c
+++ b/drivers/bcma/driver_mips.c
@@ -212,16 +212,33 @@ static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore)
212 } 212 }
213} 213}
214 214
215void bcma_core_mips_early_init(struct bcma_drv_mips *mcore)
216{
217 struct bcma_bus *bus = mcore->core->bus;
218
219 if (mcore->early_setup_done)
220 return;
221
222 bcma_chipco_serial_init(&bus->drv_cc);
223 bcma_core_mips_flash_detect(mcore);
224
225 mcore->early_setup_done = true;
226}
227
215void bcma_core_mips_init(struct bcma_drv_mips *mcore) 228void bcma_core_mips_init(struct bcma_drv_mips *mcore)
216{ 229{
217 struct bcma_bus *bus; 230 struct bcma_bus *bus;
218 struct bcma_device *core; 231 struct bcma_device *core;
219 bus = mcore->core->bus; 232 bus = mcore->core->bus;
220 233
234 if (mcore->setup_done)
235 return;
236
221 bcma_info(bus, "Initializing MIPS core...\n"); 237 bcma_info(bus, "Initializing MIPS core...\n");
222 238
223 if (!mcore->setup_done) 239 bcma_core_mips_early_init(mcore);
224 mcore->assigned_irqs = 1; 240
241 mcore->assigned_irqs = 1;
225 242
226 /* Assign IRQs to all cores on the bus */ 243 /* Assign IRQs to all cores on the bus */
227 list_for_each_entry(core, &bus->cores, list) { 244 list_for_each_entry(core, &bus->cores, list) {
@@ -256,10 +273,5 @@ void bcma_core_mips_init(struct bcma_drv_mips *mcore)
256 bcma_info(bus, "IRQ reconfiguration done\n"); 273 bcma_info(bus, "IRQ reconfiguration done\n");
257 bcma_core_mips_dump_irq(bus); 274 bcma_core_mips_dump_irq(bus);
258 275
259 if (mcore->setup_done)
260 return;
261
262 bcma_chipco_serial_init(&bus->drv_cc);
263 bcma_core_mips_flash_detect(mcore);
264 mcore->setup_done = true; 276 mcore->setup_done = true;
265} 277}
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index 432aeeedfd5e..bea2d7cfa6c2 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -274,18 +274,18 @@ int __init bcma_bus_early_register(struct bcma_bus *bus,
274 return -1; 274 return -1;
275 } 275 }
276 276
277 /* Init CC core */ 277 /* Early init CC core */
278 core = bcma_find_core(bus, bcma_cc_core_id(bus)); 278 core = bcma_find_core(bus, bcma_cc_core_id(bus));
279 if (core) { 279 if (core) {
280 bus->drv_cc.core = core; 280 bus->drv_cc.core = core;
281 bcma_core_chipcommon_init(&bus->drv_cc); 281 bcma_core_chipcommon_early_init(&bus->drv_cc);
282 } 282 }
283 283
284 /* Init MIPS core */ 284 /* Early init MIPS core */
285 core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 285 core = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
286 if (core) { 286 if (core) {
287 bus->drv_mips.core = core; 287 bus->drv_mips.core = core;
288 bcma_core_mips_init(&bus->drv_mips); 288 bcma_core_mips_early_init(&bus->drv_mips);
289 } 289 }
290 290
291 bcma_info(bus, "Early bus registered\n"); 291 bcma_info(bus, "Early bus registered\n");