Skip to content

Commit

Permalink
mrf24j40: separate h/w init and add checkings
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Varka Bhadram authored and David S. Miller committed Jun 17, 2014
1 parent 7171511 commit 3dac9a7
Showing 1 changed file with 89 additions and 26 deletions.
115 changes: 89 additions & 26 deletions drivers/net/ieee802154/mrf24j40.c
Original file line number Diff line number Diff line change
Expand Up @@ -610,10 +610,95 @@ static irqreturn_t mrf24j40_isr(int irq, void *data)
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);
Expand Down Expand Up @@ -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,
Expand All @@ -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);
Expand Down

0 comments on commit 3dac9a7

Please sign in to comment.