MIPS: Alchemy: db1200: Improve PB1200 detection.
The PB1200 has the CPLD located at an address which on the DB1200 is RAM; reading the Board-ID sometimes results in a PB1200 being detected instead (especially during reboots after long uptimes). On the other hand, the address of the DB1200's CPLD is hosting Flash chips on the PB1200. Test for the DB1200 first and additionally do a quick write-test to the hexleds register to make sure we're writing to the CPLD. Signed-off-by: Manuel Lauss <manuel.lauss@googlemail.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/3005/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Родитель
3eab8095ef
Коммит
f2711be0f9
|
@ -66,19 +66,33 @@ static int __init detect_board(void)
|
|||
{
|
||||
int bid;
|
||||
|
||||
/* try the PB1200 first */
|
||||
/* try the DB1200 first */
|
||||
bcsr_init(DB1200_BCSR_PHYS_ADDR,
|
||||
DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS);
|
||||
if (BCSR_WHOAMI_DB1200 == BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI))) {
|
||||
unsigned short t = bcsr_read(BCSR_HEXLEDS);
|
||||
bcsr_write(BCSR_HEXLEDS, ~t);
|
||||
if (bcsr_read(BCSR_HEXLEDS) != t) {
|
||||
bcsr_write(BCSR_HEXLEDS, t);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* okay, try the PB1200 then */
|
||||
bcsr_init(PB1200_BCSR_PHYS_ADDR,
|
||||
PB1200_BCSR_PHYS_ADDR + PB1200_BCSR_HEXLED_OFS);
|
||||
bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
|
||||
if ((bid == BCSR_WHOAMI_PB1200_DDR1) ||
|
||||
(bid == BCSR_WHOAMI_PB1200_DDR2))
|
||||
return 0;
|
||||
(bid == BCSR_WHOAMI_PB1200_DDR2)) {
|
||||
unsigned short t = bcsr_read(BCSR_HEXLEDS);
|
||||
bcsr_write(BCSR_HEXLEDS, ~t);
|
||||
if (bcsr_read(BCSR_HEXLEDS) != t) {
|
||||
bcsr_write(BCSR_HEXLEDS, t);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* okay, try the DB1200 then */
|
||||
bcsr_init(DB1200_BCSR_PHYS_ADDR,
|
||||
DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS);
|
||||
bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
|
||||
return bid == BCSR_WHOAMI_DB1200 ? 0 : 1;
|
||||
return 1; /* it's neither */
|
||||
}
|
||||
|
||||
void __init board_setup(void)
|
||||
|
|
Загрузка…
Ссылка в новой задаче