mrf24j40: separate h/w init and add checkings

separate the mrf24j40 hardware initialisation from probe()
and adds the sanity checkings.

These checkings are required if somebody hasn't a right spi configuration
the probe function should fail. So we have to return from there.

Signed-off-by: Varka Bhadram <varkab@cdac.in>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Varka Bhadram 2014-06-16 09:12:31 +05:30 committed by David S. Miller
parent 7171511eae
commit 3dac9a79e1

View File

@ -610,10 +610,95 @@ out:
return IRQ_HANDLED;
}
static int mrf24j40_hw_init(struct mrf24j40 *devrec)
{
int ret;
u8 val;
/* Initialize the device.
From datasheet section 3.2: Initialization. */
ret = write_short_reg(devrec, REG_SOFTRST, 0x07);
if (ret)
goto err_ret;
ret = write_short_reg(devrec, REG_PACON2, 0x98);
if (ret)
goto err_ret;
ret = write_short_reg(devrec, REG_TXSTBL, 0x95);
if (ret)
goto err_ret;
ret = write_long_reg(devrec, REG_RFCON0, 0x03);
if (ret)
goto err_ret;
ret = write_long_reg(devrec, REG_RFCON1, 0x01);
if (ret)
goto err_ret;
ret = write_long_reg(devrec, REG_RFCON2, 0x80);
if (ret)
goto err_ret;
ret = write_long_reg(devrec, REG_RFCON6, 0x90);
if (ret)
goto err_ret;
ret = write_long_reg(devrec, REG_RFCON7, 0x80);
if (ret)
goto err_ret;
ret = write_long_reg(devrec, REG_RFCON8, 0x10);
if (ret)
goto err_ret;
ret = write_long_reg(devrec, REG_SLPCON1, 0x21);
if (ret)
goto err_ret;
ret = write_short_reg(devrec, REG_BBREG2, 0x80);
if (ret)
goto err_ret;
ret = write_short_reg(devrec, REG_CCAEDTH, 0x60);
if (ret)
goto err_ret;
ret = write_short_reg(devrec, REG_BBREG6, 0x40);
if (ret)
goto err_ret;
ret = write_short_reg(devrec, REG_RFCTL, 0x04);
if (ret)
goto err_ret;
ret = write_short_reg(devrec, REG_RFCTL, 0x0);
if (ret)
goto err_ret;
udelay(192);
/* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
ret = read_short_reg(devrec, REG_RXMCR, &val);
if (ret)
goto err_ret;
val &= ~0x3; /* Clear RX mode (normal) */
ret = write_short_reg(devrec, REG_RXMCR, val);
if (ret)
goto err_ret;
return 0;
err_ret:
return ret;
}
static int mrf24j40_probe(struct spi_device *spi)
{
int ret = -ENOMEM;
u8 val;
struct mrf24j40 *devrec;
printk(KERN_INFO "mrf24j40: probe(). IRQ: %d\n", spi->irq);
@ -650,31 +735,9 @@ static int mrf24j40_probe(struct spi_device *spi)
if (ret)
goto err_register_device;
/* Initialize the device.
From datasheet section 3.2: Initialization. */
write_short_reg(devrec, REG_SOFTRST, 0x07);
write_short_reg(devrec, REG_PACON2, 0x98);
write_short_reg(devrec, REG_TXSTBL, 0x95);
write_long_reg(devrec, REG_RFCON0, 0x03);
write_long_reg(devrec, REG_RFCON1, 0x01);
write_long_reg(devrec, REG_RFCON2, 0x80);
write_long_reg(devrec, REG_RFCON6, 0x90);
write_long_reg(devrec, REG_RFCON7, 0x80);
write_long_reg(devrec, REG_RFCON8, 0x10);
write_long_reg(devrec, REG_SLPCON1, 0x21);
write_short_reg(devrec, REG_BBREG2, 0x80);
write_short_reg(devrec, REG_CCAEDTH, 0x60);
write_short_reg(devrec, REG_BBREG6, 0x40);
write_short_reg(devrec, REG_RFCTL, 0x04);
write_short_reg(devrec, REG_RFCTL, 0x0);
udelay(192);
/* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
ret = read_short_reg(devrec, REG_RXMCR, &val);
ret = mrf24j40_hw_init(devrec);
if (ret)
goto err_read_reg;
val &= ~0x3; /* Clear RX mode (normal) */
write_short_reg(devrec, REG_RXMCR, val);
goto err_hw_init;
ret = devm_request_threaded_irq(&spi->dev,
spi->irq,
@ -692,7 +755,7 @@ static int mrf24j40_probe(struct spi_device *spi)
return 0;
err_irq:
err_read_reg:
err_hw_init:
ieee802154_unregister_device(devrec->dev);
err_register_device:
ieee802154_free_device(devrec->dev);