9
0
Fork 0

smc911x: improve detection handle

detect if the bus is swapped and report a 32bit drivers is used on a 16bit bus

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2012-09-01 10:52:42 +02:00 committed by Sascha Hauer
parent 655dc6b8aa
commit fb11747bfe
2 changed files with 22 additions and 1 deletions

View File

@ -470,9 +470,28 @@ static int smc911x_probe(struct device_d *dev)
}
val = smc911x_reg_read(priv, BYTE_TEST);
if(val != 0x87654321) {
if (val == 0x43218765) {
dev_dbg(dev, "BYTE_TEST looks swapped, "
"applying WORD_SWAP");
smc911x_reg_write(priv, WORD_SWAP, 0xffffffff);
/* 1 dummy read of BYTE_TEST is needed after a write to
* WORD_SWAP before its contents are valid */
val = smc911x_reg_read(priv, BYTE_TEST);
val = smc911x_reg_read(priv, BYTE_TEST);
}
if (val != 0x87654321) {
dev_err(dev, "no smc911x found on 0x%p (byte_test=0x%08x)\n",
priv->base, val);
if (((val >> 16) & 0xFFFF) == (val & 0xFFFF)) {
/*
* This may mean the chip is set
* for 32 bit while the bus is reading 16 bit
*/
dev_err(dev, "top 16 bits equal to bottom 16 bits\n");
}
return -ENODEV;
}

View File

@ -26,6 +26,8 @@
* of the Lan911x memory space
*/
#define WORD_SWAP 0x98
#define RX_DATA_FIFO 0x00
#define TX_DATA_FIFO 0x20