Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+89 −26
Original line number Diff line number Diff line
@@ -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);