|
|
@@ -0,0 +1,181 @@
|
|
|
+--- a/drivers/bcma/driver_chipcommon.c
|
|
|
++++ b/drivers/bcma/driver_chipcommon.c
|
|
|
+@@ -22,12 +22,9 @@ static inline u32 bcma_cc_write32_masked
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+
|
|
|
+-void bcma_core_chipcommon_init(struct bcma_drv_cc *cc)
|
|
|
++void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc)
|
|
|
+ {
|
|
|
+- u32 leddc_on = 10;
|
|
|
+- u32 leddc_off = 90;
|
|
|
+-
|
|
|
+- if (cc->setup_done)
|
|
|
++ if (cc->early_setup_done)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (cc->core->id.rev >= 11)
|
|
|
+@@ -36,6 +33,22 @@ void bcma_core_chipcommon_init(struct bc
|
|
|
+ if (cc->core->id.rev >= 35)
|
|
|
+ cc->capabilities_ext = bcma_cc_read32(cc, BCMA_CC_CAP_EXT);
|
|
|
+
|
|
|
++ if (cc->capabilities & BCMA_CC_CAP_PMU)
|
|
|
++ bcma_pmu_early_init(cc);
|
|
|
++
|
|
|
++ cc->early_setup_done = true;
|
|
|
++}
|
|
|
++
|
|
|
++void bcma_core_chipcommon_init(struct bcma_drv_cc *cc)
|
|
|
++{
|
|
|
++ u32 leddc_on = 10;
|
|
|
++ u32 leddc_off = 90;
|
|
|
++
|
|
|
++ if (cc->setup_done)
|
|
|
++ return;
|
|
|
++
|
|
|
++ bcma_core_chipcommon_early_init(cc);
|
|
|
++
|
|
|
+ if (cc->core->id.rev >= 20) {
|
|
|
+ bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, 0);
|
|
|
+ bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, 0);
|
|
|
+--- a/drivers/bcma/driver_chipcommon_pmu.c
|
|
|
++++ b/drivers/bcma/driver_chipcommon_pmu.c
|
|
|
+@@ -141,7 +141,7 @@ void bcma_pmu_workarounds(struct bcma_dr
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+-void bcma_pmu_init(struct bcma_drv_cc *cc)
|
|
|
++void bcma_pmu_early_init(struct bcma_drv_cc *cc)
|
|
|
+ {
|
|
|
+ u32 pmucap;
|
|
|
+
|
|
|
+@@ -150,7 +150,10 @@ void bcma_pmu_init(struct bcma_drv_cc *c
|
|
|
+
|
|
|
+ bcma_debug(cc->core->bus, "Found rev %u PMU (capabilities 0x%08X)\n",
|
|
|
+ cc->pmu.rev, pmucap);
|
|
|
++}
|
|
|
+
|
|
|
++void bcma_pmu_init(struct bcma_drv_cc *cc)
|
|
|
++{
|
|
|
+ if (cc->pmu.rev == 1)
|
|
|
+ bcma_cc_mask32(cc, BCMA_CC_PMU_CTL,
|
|
|
+ ~BCMA_CC_PMU_CTL_NOILPONW);
|
|
|
+--- a/drivers/bcma/driver_mips.c
|
|
|
++++ b/drivers/bcma/driver_mips.c
|
|
|
+@@ -222,16 +222,33 @@ static void bcma_core_mips_flash_detect(
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
++void bcma_core_mips_early_init(struct bcma_drv_mips *mcore)
|
|
|
++{
|
|
|
++ struct bcma_bus *bus = mcore->core->bus;
|
|
|
++
|
|
|
++ if (mcore->early_setup_done)
|
|
|
++ return;
|
|
|
++
|
|
|
++ bcma_chipco_serial_init(&bus->drv_cc);
|
|
|
++ bcma_core_mips_flash_detect(mcore);
|
|
|
++
|
|
|
++ mcore->early_setup_done = true;
|
|
|
++}
|
|
|
++
|
|
|
+ void bcma_core_mips_init(struct bcma_drv_mips *mcore)
|
|
|
+ {
|
|
|
+ struct bcma_bus *bus;
|
|
|
+ struct bcma_device *core;
|
|
|
+ bus = mcore->core->bus;
|
|
|
+
|
|
|
++ if (mcore->setup_done)
|
|
|
++ return;
|
|
|
++
|
|
|
+ bcma_info(bus, "Initializing MIPS core...\n");
|
|
|
+
|
|
|
+- if (!mcore->setup_done)
|
|
|
+- mcore->assigned_irqs = 1;
|
|
|
++ bcma_core_mips_early_init(mcore);
|
|
|
++
|
|
|
++ mcore->assigned_irqs = 1;
|
|
|
+
|
|
|
+ /* Assign IRQs to all cores on the bus */
|
|
|
+ list_for_each_entry(core, &bus->cores, list) {
|
|
|
+@@ -266,10 +283,5 @@ void bcma_core_mips_init(struct bcma_drv
|
|
|
+ bcma_info(bus, "IRQ reconfiguration done\n");
|
|
|
+ bcma_core_mips_dump_irq(bus);
|
|
|
+
|
|
|
+- if (mcore->setup_done)
|
|
|
+- return;
|
|
|
+-
|
|
|
+- bcma_chipco_serial_init(&bus->drv_cc);
|
|
|
+- bcma_core_mips_flash_detect(mcore);
|
|
|
+ mcore->setup_done = true;
|
|
|
+ }
|
|
|
+--- a/drivers/bcma/main.c
|
|
|
++++ b/drivers/bcma/main.c
|
|
|
+@@ -247,18 +247,18 @@ int __init bcma_bus_early_register(struc
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+- /* Init CC core */
|
|
|
++ /* Early init CC core */
|
|
|
+ core = bcma_find_core(bus, bcma_cc_core_id(bus));
|
|
|
+ if (core) {
|
|
|
+ bus->drv_cc.core = core;
|
|
|
+- bcma_core_chipcommon_init(&bus->drv_cc);
|
|
|
++ bcma_core_chipcommon_early_init(&bus->drv_cc);
|
|
|
+ }
|
|
|
+
|
|
|
+- /* Init MIPS core */
|
|
|
++ /* Early init MIPS core */
|
|
|
+ core = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
|
|
|
+ if (core) {
|
|
|
+ bus->drv_mips.core = core;
|
|
|
+- bcma_core_mips_init(&bus->drv_mips);
|
|
|
++ bcma_core_mips_early_init(&bus->drv_mips);
|
|
|
+ }
|
|
|
+
|
|
|
+ bcma_info(bus, "Early bus registered\n");
|
|
|
+--- a/include/linux/bcma/bcma_driver_chipcommon.h
|
|
|
++++ b/include/linux/bcma/bcma_driver_chipcommon.h
|
|
|
+@@ -476,6 +476,7 @@ struct bcma_drv_cc {
|
|
|
+ u32 capabilities;
|
|
|
+ u32 capabilities_ext;
|
|
|
+ u8 setup_done:1;
|
|
|
++ u8 early_setup_done:1;
|
|
|
+ /* Fast Powerup Delay constant */
|
|
|
+ u16 fast_pwrup_delay;
|
|
|
+ struct bcma_chipcommon_pmu pmu;
|
|
|
+@@ -510,6 +511,7 @@ struct bcma_drv_cc {
|
|
|
+ bcma_cc_write32(cc, offset, (bcma_cc_read32(cc, offset) & (mask)) | (set))
|
|
|
+
|
|
|
+ extern void bcma_core_chipcommon_init(struct bcma_drv_cc *cc);
|
|
|
++extern void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc);
|
|
|
+
|
|
|
+ extern void bcma_chipco_suspend(struct bcma_drv_cc *cc);
|
|
|
+ extern void bcma_chipco_resume(struct bcma_drv_cc *cc);
|
|
|
+@@ -533,6 +535,7 @@ u32 bcma_chipco_gpio_polarity(struct bcm
|
|
|
+
|
|
|
+ /* PMU support */
|
|
|
+ extern void bcma_pmu_init(struct bcma_drv_cc *cc);
|
|
|
++extern void bcma_pmu_early_init(struct bcma_drv_cc *cc);
|
|
|
+
|
|
|
+ extern void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset,
|
|
|
+ u32 value);
|
|
|
+--- a/include/linux/bcma/bcma_driver_mips.h
|
|
|
++++ b/include/linux/bcma/bcma_driver_mips.h
|
|
|
+@@ -35,13 +35,16 @@ struct bcma_device;
|
|
|
+ struct bcma_drv_mips {
|
|
|
+ struct bcma_device *core;
|
|
|
+ u8 setup_done:1;
|
|
|
++ u8 early_setup_done:1;
|
|
|
+ unsigned int assigned_irqs;
|
|
|
+ };
|
|
|
+
|
|
|
+ #ifdef CONFIG_BCMA_DRIVER_MIPS
|
|
|
+ extern void bcma_core_mips_init(struct bcma_drv_mips *mcore);
|
|
|
++extern void bcma_core_mips_early_init(struct bcma_drv_mips *mcore);
|
|
|
+ #else
|
|
|
+ static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { }
|
|
|
++static inline void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) { }
|
|
|
+ #endif
|
|
|
+
|
|
|
+ extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore);
|