mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2024-11-18 14:47:46 +01:00
parent
d9b2f5c07b
commit
5d28e0fd0e
@ -235,6 +235,7 @@ static int ssb_attach_queued_buses(void)
|
|||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
list_for_each_entry_safe(bus, n, &attach_queue, list) {
|
list_for_each_entry_safe(bus, n, &attach_queue, list) {
|
||||||
|
ssb_pcicore_init(&bus->pcicore);
|
||||||
for (i = 0; i < bus->nr_devices; i++) {
|
for (i = 0; i < bus->nr_devices; i++) {
|
||||||
dev = &(bus->devices[i]);
|
dev = &(bus->devices[i]);
|
||||||
|
|
||||||
@ -350,7 +351,6 @@ static int ssb_bus_register(struct ssb_bus *bus,
|
|||||||
/* Initialize basic system devices (if available) */
|
/* Initialize basic system devices (if available) */
|
||||||
ssb_chipcommon_init(&bus->chipco);
|
ssb_chipcommon_init(&bus->chipco);
|
||||||
ssb_mipscore_init(&bus->mipscore);
|
ssb_mipscore_init(&bus->mipscore);
|
||||||
ssb_pcicore_init(&bus->pcicore);
|
|
||||||
|
|
||||||
/* Queue it for attach */
|
/* Queue it for attach */
|
||||||
list_add_tail(&bus->list, &attach_queue);
|
list_add_tail(&bus->list, &attach_queue);
|
||||||
|
@ -266,6 +266,35 @@ void ssb_chipco_resume(struct ssb_chipcommon *cc)
|
|||||||
chipco_powercontrol_init(cc);
|
chipco_powercontrol_init(cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc, u32 chip_id, u32 *rate,
|
||||||
|
u32 *plltype, u32 *n, u32 *m)
|
||||||
|
{
|
||||||
|
*rate = 0;
|
||||||
|
*n = chipco_read32(cc, SSB_CHIPCO_CLOCK_N);
|
||||||
|
*plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
|
||||||
|
switch (*plltype) {
|
||||||
|
case SSB_PLLTYPE_2:
|
||||||
|
case SSB_PLLTYPE_4:
|
||||||
|
case SSB_PLLTYPE_6:
|
||||||
|
case SSB_PLLTYPE_7:
|
||||||
|
*m = chipco_read32(cc, SSB_CHIPCO_CLOCK_MIPS);
|
||||||
|
break;
|
||||||
|
case SSB_PLLTYPE_5:
|
||||||
|
*rate = 200000000;
|
||||||
|
break;
|
||||||
|
case SSB_PLLTYPE_3:
|
||||||
|
/* 5350 uses m2 to control mips */
|
||||||
|
*m = chipco_read32(cc, SSB_CHIPCO_CLOCK_M2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*m = chipco_read32(cc, SSB_CHIPCO_CLOCK_SB);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*rate == 0 && chip_id == 0x5365)
|
||||||
|
*rate = 200000000;
|
||||||
|
}
|
||||||
|
|
||||||
void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc,
|
void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc,
|
||||||
u32 *plltype, u32 *n, u32 *m)
|
u32 *plltype, u32 *n, u32 *m)
|
||||||
{
|
{
|
||||||
|
@ -215,15 +215,14 @@ u32 ssb_cpu_clock(struct ssb_mipscore *mcore)
|
|||||||
if (bus->extif.dev) {
|
if (bus->extif.dev) {
|
||||||
ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m);
|
ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m);
|
||||||
} else if (bus->chipco.dev) {
|
} else if (bus->chipco.dev) {
|
||||||
if (bus->chip_id == 0x5365)
|
ssb_chipco_get_clockcpu(&bus->chipco, bus->chip_id, &rate,
|
||||||
/* FIXME: is this override really necessary? */
|
&pll_type, &n, &m);
|
||||||
return 200000000;
|
|
||||||
|
|
||||||
ssb_chipco_get_clockcontrol(&bus->chipco, &pll_type, &n, &m);
|
|
||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (rate == 0)
|
||||||
rate = ssb_calc_clock_rate(pll_type, n, m);
|
rate = ssb_calc_clock_rate(pll_type, n, m);
|
||||||
|
|
||||||
if (pll_type == SSB_PLLTYPE_6)
|
if (pll_type == SSB_PLLTYPE_6)
|
||||||
rate *= 2;
|
rate *= 2;
|
||||||
|
|
||||||
|
@ -303,6 +303,8 @@ static void ssb_pcicore_init_hostmode(struct ssb_pcicore *pc)
|
|||||||
udelay(150);
|
udelay(150);
|
||||||
val |= SSB_PCICORE_CTL_RST; /* Deassert RST# */
|
val |= SSB_PCICORE_CTL_RST; /* Deassert RST# */
|
||||||
pcicore_write32(pc, SSB_PCICORE_CTL, val);
|
pcicore_write32(pc, SSB_PCICORE_CTL, val);
|
||||||
|
val = SSB_PCICORE_ARBCTL_INTERN;
|
||||||
|
pcicore_write32(pc, SSB_PCICORE_ARBCTL, val);
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
|
||||||
//TODO cardbus mode
|
//TODO cardbus mode
|
||||||
@ -329,6 +331,7 @@ static void ssb_pcicore_init_hostmode(struct ssb_pcicore *pc)
|
|||||||
* The following needs change, if we want to port hostmode
|
* The following needs change, if we want to port hostmode
|
||||||
* to non-MIPS platform. */
|
* to non-MIPS platform. */
|
||||||
set_io_port_base((unsigned long)ioremap_nocache(SSB_PCI_MEM, 0x04000000));
|
set_io_port_base((unsigned long)ioremap_nocache(SSB_PCI_MEM, 0x04000000));
|
||||||
|
mdelay(300);
|
||||||
register_pci_controller(&ssb_pcicore_controller);
|
register_pci_controller(&ssb_pcicore_controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,6 +364,8 @@ extern void ssb_chipcommon_init(struct ssb_chipcommon *cc);
|
|||||||
extern void ssb_chipco_suspend(struct ssb_chipcommon *cc, pm_message_t state);
|
extern void ssb_chipco_suspend(struct ssb_chipcommon *cc, pm_message_t state);
|
||||||
extern void ssb_chipco_resume(struct ssb_chipcommon *cc);
|
extern void ssb_chipco_resume(struct ssb_chipcommon *cc);
|
||||||
|
|
||||||
|
extern void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc, u32 chip_id,
|
||||||
|
u32 *rate, u32 *plltype, u32 *n, u32 *m);
|
||||||
extern void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc,
|
extern void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc,
|
||||||
u32 *plltype, u32 *n, u32 *m);
|
u32 *plltype, u32 *n, u32 *m);
|
||||||
extern void ssb_chipco_timing_init(struct ssb_chipcommon *cc,
|
extern void ssb_chipco_timing_init(struct ssb_chipcommon *cc,
|
||||||
|
Loading…
Reference in New Issue
Block a user