Commit 3dac9a79 authored by Varka Bhadram's avatar Varka Bhadram Committed by David S. Miller

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: default avatarVarka Bhadram <varkab@cdac.in>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7171511e
...@@ -610,10 +610,95 @@ static irqreturn_t mrf24j40_isr(int irq, void *data) ...@@ -610,10 +610,95 @@ static irqreturn_t mrf24j40_isr(int irq, void *data)
return IRQ_HANDLED; 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) static int mrf24j40_probe(struct spi_device *spi)
{ {
int ret = -ENOMEM; int ret = -ENOMEM;
u8 val;
struct mrf24j40 *devrec; struct mrf24j40 *devrec;
printk(KERN_INFO "mrf24j40: probe(). IRQ: %d\n", spi->irq); printk(KERN_INFO "mrf24j40: probe(). IRQ: %d\n", spi->irq);
...@@ -650,31 +735,9 @@ static int mrf24j40_probe(struct spi_device *spi) ...@@ -650,31 +735,9 @@ static int mrf24j40_probe(struct spi_device *spi)
if (ret) if (ret)
goto err_register_device; goto err_register_device;
/* Initialize the device. ret = mrf24j40_hw_init(devrec);
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);
if (ret) if (ret)
goto err_read_reg; goto err_hw_init;
val &= ~0x3; /* Clear RX mode (normal) */
write_short_reg(devrec, REG_RXMCR, val);
ret = devm_request_threaded_irq(&spi->dev, ret = devm_request_threaded_irq(&spi->dev,
spi->irq, spi->irq,
...@@ -692,7 +755,7 @@ static int mrf24j40_probe(struct spi_device *spi) ...@@ -692,7 +755,7 @@ static int mrf24j40_probe(struct spi_device *spi)
return 0; return 0;
err_irq: err_irq:
err_read_reg: err_hw_init:
ieee802154_unregister_device(devrec->dev); ieee802154_unregister_device(devrec->dev);
err_register_device: err_register_device:
ieee802154_free_device(devrec->dev); ieee802154_free_device(devrec->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment