From patchwork Sat Jun 28 18:33:41 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Aring X-Patchwork-Id: 365308 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id AC35D1400B5 for ; Sun, 29 Jun 2014 04:35:47 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932477AbaF1Sfj (ORCPT ); Sat, 28 Jun 2014 14:35:39 -0400 Received: from mail-we0-f175.google.com ([74.125.82.175]:42793 "EHLO mail-we0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932120AbaF1Sei (ORCPT ); Sat, 28 Jun 2014 14:34:38 -0400 Received: by mail-we0-f175.google.com with SMTP id k48so6504819wev.34 for ; Sat, 28 Jun 2014 11:34:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VvRANrpOWSKn1rZ2fPi3GH0k1GmUxqshABekqWG19W4=; b=S6T7zkkDkeLUgbfypXC17Fzznql8FnQWSSEun6ZozVd8u1NTZv8eFvDn3cujVzF7+r 2znP4nWeWmKQs3kryLsx14Ri/F9Y9zoWrQkNoHQ23TeL+pI3TAv4OdviAVpPP8rT6fEg XG26NE+oFKDHpoVSSGF+0oibxhOKg+Qu6jlGhfvGk3qFK177UW0HZ19srw2Lp2yL7Bn2 Kqlq+HTaCvWPSO9vnUdDXheQlbLQN2FFxwpcS1Ff5AnC9PxD4C93RBucb6LEyayaOLhA oUc6dgiSuCi9wqOi4peHdJEb/HH4xYI0l3+ZHi8G6CChK0E/G5iuVH4g36wNiDDau3BS 7F/A== X-Received: by 10.180.75.75 with SMTP id a11mr18924722wiw.3.1403980477453; Sat, 28 Jun 2014 11:34:37 -0700 (PDT) Received: from omega.localdomain (p4FD3BDAF.dip0.t-ipconnect.de. [79.211.189.175]) by mx.google.com with ESMTPSA id m3sm29433289wjr.49.2014.06.28.11.34.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 28 Jun 2014 11:34:37 -0700 (PDT) From: Alexander Aring To: alex.bluesman.smirnov@gmail.com Cc: dbaryshkov@gmail.com, linux-zigbee-devel@lists.sourceforge.net, netdev@vger.kernel.org, werner@almesberger.net, Alexander Aring Subject: [PATCH net-next 03/13] at86rf230: rework detect device handling Date: Sat, 28 Jun 2014 20:33:41 +0200 Message-Id: <1403980431-6201-4-git-send-email-alex.aring@gmail.com> X-Mailer: git-send-email 2.0.1 In-Reply-To: <1403980431-6201-1-git-send-email-alex.aring@gmail.com> References: <1403980431-6201-1-git-send-email-alex.aring@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch drops the current lowlevel spi calls for the detect device function instead we handle this via regmap. Also put the detection of in a seperate function and set all device specific attributes while detection. Signed-off-by: Alexander Aring --- drivers/net/ieee802154/at86rf230.c | 183 +++++++++++++++---------------------- 1 file changed, 76 insertions(+), 107 deletions(-) diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c index 8784b8a..7895db7 100644 --- a/drivers/net/ieee802154/at86rf230.c +++ b/drivers/net/ieee802154/at86rf230.c @@ -410,57 +410,6 @@ static struct regmap_config at86rf230_regmap_spi_config = { }; static int -__at86rf230_detect_device(struct spi_device *spi, u16 *man_id, u8 *part, - u8 *version) -{ - u8 data[4]; - u8 *buf = kmalloc(2, GFP_KERNEL); - int status; - struct spi_message msg; - struct spi_transfer xfer = { - .len = 2, - .tx_buf = buf, - .rx_buf = buf, - }; - u8 reg; - - if (!buf) - return -ENOMEM; - - for (reg = RG_PART_NUM; reg <= RG_MAN_ID_1; reg++) { - buf[0] = (reg & CMD_REG_MASK) | CMD_REG; - buf[1] = 0xff; - dev_vdbg(&spi->dev, "buf[0] = %02x\n", buf[0]); - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - - status = spi_sync(spi, &msg); - dev_vdbg(&spi->dev, "status = %d\n", status); - if (msg.status) - status = msg.status; - - dev_vdbg(&spi->dev, "status = %d\n", status); - dev_vdbg(&spi->dev, "buf[0] = %02x\n", buf[0]); - dev_vdbg(&spi->dev, "buf[1] = %02x\n", buf[1]); - - if (status == 0) - data[reg - RG_PART_NUM] = buf[1]; - else - break; - } - - if (status == 0) { - *part = data[0]; - *version = data[1]; - *man_id = (data[3] << 8) | data[2]; - } - - kfree(buf); - - return status; -} - -static int at86rf230_write_fbuf(struct at86rf230_local *lp, u8 *data, u8 len) { u8 *buf = lp->buf; @@ -1080,18 +1029,87 @@ done: return pdata; } +static int +at86rf230_detect_device(struct at86rf230_local *lp) +{ + unsigned int part, version, val; + u16 man_id = 0; + const char *chip; + int rc; + + rc = __at86rf230_read(lp, RG_MAN_ID_0, &val); + if (rc) + return rc; + man_id |= val; + + rc = __at86rf230_read(lp, RG_MAN_ID_1, &val); + if (rc) + return rc; + man_id |= (val << 8); + + rc = __at86rf230_read(lp, RG_PART_NUM, &part); + if (rc) + return rc; + + rc = __at86rf230_read(lp, RG_PART_NUM, &version); + if (rc) + return rc; + + if (man_id != 0x001f) { + dev_err(&lp->spi->dev, "Non-Atmel dev found (MAN_ID %02x %02x)\n", + man_id >> 8, man_id & 0xFF); + return -EINVAL; + } + + lp->part = part; + lp->vers = version; + lp->dev->extra_tx_headroom = 0; + lp->dev->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK | + IEEE802154_HW_TXPOWER | IEEE802154_HW_CSMA; + + switch (part) { + case 2: + chip = "at86rf230"; + rc = -ENOTSUPP; + break; + case 3: + chip = "at86rf231"; + lp->dev->phy->channels_supported[0] = 0x7FFF800; + break; + case 7: + chip = "at86rf212"; + if (version == 1) { + lp->dev->flags |= IEEE802154_HW_LBT; + lp->dev->phy->channels_supported[0] = 0x00007FF; + lp->dev->phy->channels_supported[2] = 0x00007FF; + } else { + rc = -ENOTSUPP; + } + break; + case 11: + chip = "at86rf233"; + lp->dev->phy->channels_supported[0] = 0x7FFF800; + break; + default: + chip = "unkown"; + rc = -ENOTSUPP; + break; + } + + dev_info(&lp->spi->dev, "Detected %s chip version %d\n", chip, version); + + return rc; +} + static int at86rf230_probe(struct spi_device *spi) { struct at86rf230_platform_data *pdata; struct ieee802154_dev *dev; struct at86rf230_local *lp; - u16 man_id = 0; - u8 part = 0, version = 0; unsigned int status; irq_handler_t irq_handler; work_func_t irq_worker; int rc, irq_type; - const char *chip; if (!spi->irq) { dev_err(&spi->dev, "no IRQ specified\n"); @@ -1133,54 +1151,8 @@ static int at86rf230_probe(struct spi_device *spi) lp = dev->priv; lp->dev = dev; - lp->part = part; - lp->vers = version; - lp->spi = spi; - dev->parent = &spi->dev; - dev->extra_tx_headroom = 0; - dev->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK | - IEEE802154_HW_TXPOWER | IEEE802154_HW_CSMA; - - rc = __at86rf230_detect_device(spi, &man_id, &part, &version); - if (rc < 0) - goto free_dev; - - if (man_id != 0x001f) { - dev_err(&spi->dev, "Non-Atmel dev found (MAN_ID %02x %02x)\n", - man_id >> 8, man_id & 0xFF); - return -EINVAL; - } - - switch (part) { - case 2: - chip = "at86rf230"; - rc = -ENOTSUPP; - /* FIXME: should be easy to support; */ - break; - case 3: - chip = "at86rf231"; - break; - case 7: - chip = "at86rf212"; - if (version == 1) - dev->flags |= IEEE802154_HW_LBT; - else - rc = -ENOTSUPP; - break; - case 11: - chip = "at86rf233"; - break; - default: - chip = "UNKNOWN"; - rc = -ENOTSUPP; - break; - } - - dev_info(&spi->dev, "Detected %s chip version %d\n", chip, version); - if (rc < 0) - goto free_dev; lp->regmap = devm_regmap_init_spi(spi, &at86rf230_regmap_spi_config); if (IS_ERR(lp->regmap)) { @@ -1190,6 +1162,10 @@ static int at86rf230_probe(struct spi_device *spi) goto free_dev; } + rc = at86rf230_detect_device(lp); + if (rc < 0) + goto free_dev; + irq_type = irq_get_trigger_type(spi->irq); if (!irq_type) irq_type = IRQF_TRIGGER_RISING; @@ -1208,13 +1184,6 @@ static int at86rf230_probe(struct spi_device *spi) spi_set_drvdata(spi, lp); - if (is_rf212(lp)) { - dev->phy->channels_supported[0] = 0x00007FF; - dev->phy->channels_supported[2] = 0x00007FF; - } else { - dev->phy->channels_supported[0] = 0x7FFF800; - } - rc = at86rf230_hw_init(lp); if (rc) goto err_hw_init;