From patchwork Tue Aug 7 17:32:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954597 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Kw6mVGIX"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM690wzRz9rvt for ; Wed, 8 Aug 2018 03:32:33 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389682AbeHGTrv (ORCPT ); Tue, 7 Aug 2018 15:47:51 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:35571 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727194AbeHGTru (ORCPT ); Tue, 7 Aug 2018 15:47:50 -0400 Received: by mail-wr1-f67.google.com with SMTP id g1-v6so13043757wru.2 for ; Tue, 07 Aug 2018 10:32:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WK5F2yjl+SJMclJ7+aUdh9N2Y6qe0Y/aUUufNxYtWLw=; b=Kw6mVGIXgxNLN1bZfkPte35Bs1EqcOO8TfzulzZlvvR6D/qYPusq6OssXkLbqiwUuC +Slm6rw/Lbrtt+kq6CW0A2jiu5ofYBgX0jzCqviLa1yZziPfBfO2TGxPvZN7hfhCHxQ6 9Jv/5UbNZ12+AvFAAbTCfUulTH5gjy1h0+QAIPl/lwbcN3TFvBoH+HRwEvxOlMLF6ELQ Nv7QvENjZYvwT8yvtRr2bwmCnQzc4dcwJAgHGaJRnVWKVFecLxj4FOqMXz8lT6wulOck HChx2JNEnIfCZZ7Vurge/fyMEnxdd8BmLSKtiiF9i5ZFvEL0b6YysdFya4PEOEsNrePv eHhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=WK5F2yjl+SJMclJ7+aUdh9N2Y6qe0Y/aUUufNxYtWLw=; b=rDIrqEyjZaICJz8H/NuakWvij5uEI185AJknGJXcOJFHyAbSdVQ0USwsYb3fkNfj9Q foure2oo5caf1zBnCrHvuiJSIpwCZYRkjylxTp7YynVr/Rrb7Dly/RbgMkutemzfJ5xW XmlGq1rPkrMt0EqIF2GB7sWBH3SGEXXvbhnGtoxp6tjmVKgKbymGEjhrf6Ax6IWav7YO X/ulMxPSxK24gKxn8cmIMco63e9vZNmbHfAK4N2OWgDz8daDhGO3lLv93NHpXEvT44eW fsVfVXb/7ahKJZflcYakNlTqO8zzlggGXv21LL3JddwbtcLGF0FEoYFCbTIuxELakRez zpQQ== X-Gm-Message-State: AOUpUlG7/w9ziv+IsWwN9eQMzgnuDcv5Ljdov/vVBPfuvqe+kar738vB hQYmfHbJfb0Fx+/Qf1y5ssc= X-Google-Smtp-Source: AAOMgpeiEHz/ttga7Nv7rs2/eKNX3cm2WcygdLEbCauawne8nJzXHi/hEy/llRiYGrS9CpLxNqrElA== X-Received: by 2002:adf:c4f0:: with SMTP id o45-v6mr13241072wrf.173.1533663145150; Tue, 07 Aug 2018 10:32:25 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:24 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 01/10] net: lora: sx1301: add register, bit-fields, and helpers for regmap Date: Tue, 7 Aug 2018 18:32:01 +0100 Message-Id: <1533663131-16313-2-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten The register and bit-field definitions are taken from the SX1301 datasheet version 2.01 dated June 2014 with the revision information 'First released version'. The reset state and RW capability of each field is not reflected in this patch however from the datasheet: "Bits and registers that are not documented are reserved. They may include calibration values. It is important not to modify these bits and registers. If specific bits must be changed in a register with reserved bits, the register must be read first, specific bits modified while masking reserved bits and then the register can be written." Then goes on to state: "Reserved bits should be written with their reset state, they may be read different states." Caching is currently disabled. The version is read back using regmap_read to verify regmap operation, in doing so needs to be moved after priv and regmap allocation. Signed-off-by: Ben Whitten --- drivers/net/lora/Kconfig | 1 + drivers/net/lora/sx1301.c | 282 +++++++++++++++++++++++++++++++++++++++++++--- drivers/net/lora/sx1301.h | 169 +++++++++++++++++++++++++++ 3 files changed, 439 insertions(+), 13 deletions(-) create mode 100644 drivers/net/lora/sx1301.h diff --git a/drivers/net/lora/Kconfig b/drivers/net/lora/Kconfig index bb57a01..79d23f2 100644 --- a/drivers/net/lora/Kconfig +++ b/drivers/net/lora/Kconfig @@ -49,6 +49,7 @@ config LORA_SX1301 tristate "Semtech SX1301 SPI driver" default y depends on SPI + select REGMAP_SPI help Semtech SX1301 diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index 5342b61..49958f0 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -3,6 +3,7 @@ * Semtech SX1301 LoRa concentrator * * Copyright (c) 2018 Andreas Färber + * Copyright (c) 2018 Ben Whitten * * Based on SX1301 HAL code: * Copyright (c) 2013 Semtech-Cycleo @@ -19,6 +20,9 @@ #include #include #include +#include + +#include "sx1301.h" #define REG_PAGE_RESET 0 #define REG_VERSION 1 @@ -65,6 +69,213 @@ #define REG_EMERGENCY_FORCE_HOST_CTRL BIT(0) +enum sx1301_fields { + F_SOFT_RESET, + F_START_BIST0, + F_START_BIST1, + F_BIST0_FINISHED, + F_BIST1_FINISHED, + F_GLOBAL_EN, + F_CLK32M_EN, + F_RADIO_A_EN, + F_RADIO_B_EN, + F_RADIO_RST, + + F_RX_INVERT_IQ, + F_MODEM_INVERT_IQ, + F_MBWSSF_MODEM_INVERT_IQ, + F_RX_EDGE_SELECT, + F_MISC_RADIO_EN, + F_FSK_MODEM_INVERT_IQ, + + F_RSSI_BB_FILTER_ALPHA, + F_RSSI_DEC_FILTER_ALPHA, + F_RSSI_CHANN_FILTER_ALPHA, + + F_DEC_GAIN_OFFSET, + F_CHAN_GAIN_OFFSET, + + F_LLR_SCALE, + F_SNR_AVG_CST, + + F_CORR_NUM_SAME_PEAK, + F_CORR_MAC_GAIN, + + F_FSK_CH_BW_EXPO, + F_FSK_RSSI_LENGTH, + F_FSK_RX_INVERT, + F_FSK_PKT_MODE, + + F_FSK_PSIZE, + F_FSK_CRC_EN, + F_FSK_DCFREE_ENC, + F_FSK_CRC_IBM, + + F_FSK_ERROR_OSR_TOL, + F_FSK_RADIO_SELECT, + + F_TX_MODE, + F_TX_ZERO_PAD, + F_TX_EDGE_SELECT, + F_TX_EDGE_SELECT_TOP, + + F_TX_GAIN, + F_TX_CHIRP_LOW_PASS, + F_TX_FCC_WIDEBAND, + F_TX_SWAP_IQ, + + F_FSK_TX_GAUSSIAN_EN, + F_FSK_TX_GAUSSIAN_SELECT_BT, + F_FSK_TX_PATTERN_EN, + F_FSK_TX_PREAMBLE_SEQ, + F_FSK_TX_PSIZE, + + F_FORCE_HOST_RADIO_CTRL, + F_FORCE_HOST_FE_CTRL, + F_FORCE_DEC_FILTER_GAIN, + + F_MCU_RST_0, + F_MCU_RST_1, + F_MCU_SELECT_MUX_0, + F_MCU_SELECT_MUX_1, + F_MCU_CORRUPTION_DETECTED_0, + F_MCU_CORRUPTION_DETECTED_1, + F_MCU_SELECT_EDGE_0, + F_MCU_SELECT_EDGE_1, + + F_EMERGENCY_FORCE_HOST_CTRL, +}; + +static const struct reg_field sx1301_reg_fields[] = { + /* PAGE */ + [F_SOFT_RESET] = REG_FIELD(SX1301_PAGE, 7, 7), + /* BIST */ + [F_START_BIST0] = REG_FIELD(SX1301_BIST, 0, 0), + [F_START_BIST1] = REG_FIELD(SX1301_BIST, 1, 1), + /* BIST_S */ + [F_BIST0_FINISHED] = REG_FIELD(SX1301_BIST_S, 0, 0), + [F_BIST1_FINISHED] = REG_FIELD(SX1301_BIST_S, 1, 1), + /* GEN */ + [F_GLOBAL_EN] = REG_FIELD(SX1301_GEN, 3, 3), + /* CKEN */ + [F_CLK32M_EN] = REG_FIELD(SX1301_CKEN, 0, 0), + /* RADIO_CFG */ + [F_RADIO_A_EN] = REG_FIELD(SX1301_RADIO_CFG, 0, 0), + [F_RADIO_B_EN] = REG_FIELD(SX1301_RADIO_CFG, 1, 1), + [F_RADIO_RST] = REG_FIELD(SX1301_RADIO_CFG, 2, 2), + + /* IQCFG */ + [F_RX_INVERT_IQ] = REG_FIELD(SX1301_IQCFG, 0, 0), + [F_MODEM_INVERT_IQ] = REG_FIELD(SX1301_IQCFG, 1, 1), + [F_MBWSSF_MODEM_INVERT_IQ] = REG_FIELD(SX1301_IQCFG, 2, 2), + [F_RX_EDGE_SELECT] = REG_FIELD(SX1301_IQCFG, 3, 3), + [F_MISC_RADIO_EN] = REG_FIELD(SX1301_IQCFG, 4, 4), + [F_FSK_MODEM_INVERT_IQ] = REG_FIELD(SX1301_IQCFG, 5, 5), + + /* RSSI_X_FILTER_ALPHA */ + [F_RSSI_BB_FILTER_ALPHA] = + REG_FIELD(SX1301_RSSI_BB_FILTER_ALPHA, 0, 4), + [F_RSSI_DEC_FILTER_ALPHA] = + REG_FIELD(SX1301_RSSI_DEC_FILTER_ALPHA, 0, 4), + [F_RSSI_CHANN_FILTER_ALPHA] = + REG_FIELD(SX1301_RSSI_CHANN_FILTER_ALPHA, 0, 4), + + /* GAIN_OFFSET */ + [F_DEC_GAIN_OFFSET] = REG_FIELD(SX1301_GAIN_OFFSET, 0, 3), + [F_CHAN_GAIN_OFFSET] = REG_FIELD(SX1301_GAIN_OFFSET, 4, 7), + + /* MISC_CFG1 */ + [F_LLR_SCALE] = REG_FIELD(SX1301_MISC_CFG1, 0, 3), + [F_SNR_AVG_CST] = REG_FIELD(SX1301_MISC_CFG1, 4, 5), + + /* CORR_CFG */ + [F_CORR_NUM_SAME_PEAK] = REG_FIELD(SX1301_CORR_CFG, 0, 3), + [F_CORR_MAC_GAIN] = REG_FIELD(SX1301_CORR_CFG, 4, 6), + + /* FSK_CFG1 */ + [F_FSK_CH_BW_EXPO] = REG_FIELD(SX1301_FSK_CFG1, 0, 2), + [F_FSK_RSSI_LENGTH] = REG_FIELD(SX1301_FSK_CFG1, 3, 5), + [F_FSK_RX_INVERT] = REG_FIELD(SX1301_FSK_CFG1, 6, 6), + [F_FSK_PKT_MODE] = REG_FIELD(SX1301_FSK_CFG1, 7, 7), + + /* FSK_CFG2 */ + [F_FSK_PSIZE] = REG_FIELD(SX1301_FSK_CFG2, 0, 2), + [F_FSK_CRC_EN] = REG_FIELD(SX1301_FSK_CFG2, 3, 3), + [F_FSK_DCFREE_ENC] = REG_FIELD(SX1301_FSK_CFG2, 4, 5), + [F_FSK_CRC_IBM] = REG_FIELD(SX1301_FSK_CFG2, 6, 6), + + /* FSK_ERROR_OSR_TOL */ + [F_FSK_ERROR_OSR_TOL] = REG_FIELD(SX1301_FSK_ERROR_OSR_TOL, 0, 4), + [F_FSK_RADIO_SELECT] = REG_FIELD(SX1301_FSK_ERROR_OSR_TOL, 7, 7), + + /* TX_CFG1 */ + [F_TX_MODE] = REG_FIELD(SX1301_TX_CFG1, 0, 0), + [F_TX_ZERO_PAD] = REG_FIELD(SX1301_TX_CFG1, 1, 4), + [F_TX_EDGE_SELECT] = REG_FIELD(SX1301_TX_CFG1, 5, 5), + [F_TX_EDGE_SELECT_TOP] = REG_FIELD(SX1301_TX_CFG1, 6, 6), + + /* TX_CFG2 */ + [F_TX_GAIN] = REG_FIELD(SX1301_TX_CFG2, 0, 1), + [F_TX_CHIRP_LOW_PASS] = REG_FIELD(SX1301_TX_CFG2, 2, 4), + [F_TX_FCC_WIDEBAND] = REG_FIELD(SX1301_TX_CFG2, 5, 6), + [F_TX_SWAP_IQ] = REG_FIELD(SX1301_TX_CFG2, 7, 7), + + /* FSK_TX */ + [F_FSK_TX_GAUSSIAN_EN] = REG_FIELD(SX1301_FSK_TX, 0, 0), + [F_FSK_TX_GAUSSIAN_SELECT_BT] = REG_FIELD(SX1301_FSK_TX, 1, 2), + [F_FSK_TX_PATTERN_EN] = REG_FIELD(SX1301_FSK_TX, 3, 3), + [F_FSK_TX_PREAMBLE_SEQ] = REG_FIELD(SX1301_FSK_TX, 4, 4), + [F_FSK_TX_PSIZE] = REG_FIELD(SX1301_FSK_TX, 5, 7), + + /* FORCE_CTRL */ + [F_FORCE_HOST_RADIO_CTRL] = REG_FIELD(SX1301_FORCE_CTRL, 1, 1), + [F_FORCE_HOST_FE_CTRL] = REG_FIELD(SX1301_FORCE_CTRL, 2, 2), + [F_FORCE_DEC_FILTER_GAIN] = REG_FIELD(SX1301_FORCE_CTRL, 3, 3), + + /* MCU_CTRL */ + [F_MCU_RST_0] = REG_FIELD(SX1301_MCU_CTRL, 0, 0), + [F_MCU_RST_1] = REG_FIELD(SX1301_MCU_CTRL, 1, 1), + [F_MCU_SELECT_MUX_0] = REG_FIELD(SX1301_MCU_CTRL, 2, 2), + [F_MCU_SELECT_MUX_1] = REG_FIELD(SX1301_MCU_CTRL, 3, 3), + [F_MCU_CORRUPTION_DETECTED_0] = REG_FIELD(SX1301_MCU_CTRL, 4, 4), + [F_MCU_CORRUPTION_DETECTED_1] = REG_FIELD(SX1301_MCU_CTRL, 5, 5), + [F_MCU_SELECT_EDGE_0] = REG_FIELD(SX1301_MCU_CTRL, 6, 6), + [F_MCU_SELECT_EDGE_1] = REG_FIELD(SX1301_MCU_CTRL, 7, 7), + + /* EMERGENCY_FORCE_HOST_CTRL */ + [F_EMERGENCY_FORCE_HOST_CTRL] = + REG_FIELD(SX1301_EMERGENCY_FORCE_HOST_CTRL, 0, 0), +}; + +static const struct regmap_range_cfg sx1301_ranges[] = { + { + .name = "Pages", + + .range_min = SX1301_VIRT_BASE, + .range_max = SX1301_MAX_REGISTER, + + .selector_reg = SX1301_PAGE, + .selector_mask = 0x3, + + .window_start = 0, + .window_len = SX1301_PAGE_LEN, + }, +}; + +static struct regmap_config sx1301_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + + .cache_type = REGCACHE_NONE, + + .read_flag_mask = 0, + .write_flag_mask = BIT(7), + + .ranges = sx1301_ranges, + .num_ranges = ARRAY_SIZE(sx1301_ranges), + .max_register = SX1301_MAX_REGISTER, +}; + struct spi_sx1301 { struct spi_device *parent; u8 page; @@ -76,8 +287,29 @@ struct sx1301_priv { struct gpio_desc *rst_gpio; u8 cur_page; struct spi_controller *radio_a_ctrl, *radio_b_ctrl; + struct regmap *regmap; + struct regmap_field *regmap_fields[ARRAY_SIZE(sx1301_reg_fields)]; }; +static int sx1301_field_read(struct sx1301_priv *priv, + enum sx1301_fields field_id) +{ + int ret; + int val; + + ret = regmap_field_read(priv->regmap_fields[field_id], &val); + if (ret) + return ret; + + return val; +} + +static int sx1301_field_write(struct sx1301_priv *priv, + enum sx1301_fields field_id, u8 val) +{ + return regmap_field_write(priv->regmap_fields[field_id], val); +} + static int sx1301_read_burst(struct spi_device *spi, u8 reg, u8 *val, size_t len) { u8 addr = reg & 0x7f; @@ -620,6 +852,8 @@ static int sx1301_probe(struct spi_device *spi) struct spi_sx1301 *radio; struct gpio_desc *rst; int ret; + int i; + unsigned int ver; u8 val; rst = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_LOW); @@ -634,18 +868,6 @@ static int sx1301_probe(struct spi_device *spi) spi->bits_per_word = 8; spi_setup(spi); - ret = sx1301_read(spi, REG_VERSION, &val); - if (ret) { - dev_err(&spi->dev, "version read failed\n"); - goto err_version; - } - - if (val != 103) { - dev_err(&spi->dev, "unexpected version: %u\n", val); - ret = -ENXIO; - goto err_version; - } - netdev = alloc_loradev(sizeof(*priv)); if (!netdev) { ret = -ENOMEM; @@ -659,6 +881,38 @@ static int sx1301_probe(struct spi_device *spi) spi_set_drvdata(spi, netdev); SET_NETDEV_DEV(netdev, &spi->dev); + priv->regmap = devm_regmap_init_spi(spi, &sx1301_regmap_config); + if (IS_ERR(priv->regmap)) { + ret = PTR_ERR(priv->regmap); + dev_err(&spi->dev, "Regmap allocation failed: %d\n", ret); + return err_regmap; + } + + for (i = 0; i < ARRAY_SIZE(sx1301_reg_fields); i++) { + const struct reg_field *reg_fields = sx1301_reg_fields; + + priv->regmap_fields[i] = devm_regmap_field_alloc(&spi->dev, + priv->regmap, + reg_fields[i]); + if (IS_ERR(priv->regmap_fields[i])) { + ret = PTR_ERR(priv->regmap_fields[i]); + dev_err(&spi->dev, "Cannot allocate regmap field: %d\n", ret); + goto err_regmap; + } + } + + ret = regmap_read(priv->regmap, SX1301_VER, &ver); + if (ret) { + dev_err(&spi->dev, "version read failed\n"); + goto err_version; + } + + if (ver != 103) { + dev_err(&spi->dev, "unexpected version: %u\n", ver); + ret = -ENXIO; + goto err_version; + } + ret = sx1301_write(spi, REG_PAGE_RESET, 0); if (ret) { dev_err(&spi->dev, "page/reset write failed\n"); @@ -888,9 +1142,10 @@ static int sx1301_probe(struct spi_device *spi) err_read_global_en_0: err_soft_reset: err_init_page: +err_version: +err_regmap: free_loradev(netdev); err_alloc_loradev: -err_version: return ret; } @@ -927,4 +1182,5 @@ module_spi_driver(sx1301_spi_driver); MODULE_DESCRIPTION("SX1301 SPI driver"); MODULE_AUTHOR("Andreas Färber "); +MODULE_AUTHOR("Ben Whitten "); MODULE_LICENSE("GPL"); diff --git a/drivers/net/lora/sx1301.h b/drivers/net/lora/sx1301.h new file mode 100644 index 0000000..abfb7b5 --- /dev/null +++ b/drivers/net/lora/sx1301.h @@ -0,0 +1,169 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Semtech SX1301 lora concentrator + * + * Copyright (c) 2018 Ben Whitten + */ + +#ifndef _SX1301_ +#define _SX1301_ + +/* Page independent */ +#define SX1301_PAGE 0x00 +#define SX1301_VER 0x01 +#define SX1301_RDBAL 0x02 +#define SX1301_RDBAH 0x03 +#define SX1301_RDBD 0x04 +#define SX1301_TDBA 0x05 +#define SX1301_TDBD 0x06 +#define SX1301_MPA 0x09 +#define SX1301_MPD 0x0A +#define SX1301_RPNS 0x0B +#define SX1301_RPAPL 0x0C +#define SX1301_RPAPH 0x0D +#define SX1301_RPS 0x0E +#define SX1301_RPPS 0x0F +#define SX1301_GEN 0x10 +#define SX1301_CKEN 0x11 +#define SX1301_BIST 0x12 +#define SX1301_BIST_S 0x13 +#define SX1301_GPSI 0x1B +#define SX1301_GPSO 0x1C +#define SX1301_GPMODE 0x1D +#define SX1301_GPREGI 0x1E +#define SX1301_GPREGO 0x1F +#define SX1301_AGCSTS 0x20 +#define SX1301_ARBSTS 0x7D +#define SX1301_ID 0x7F + +#define SX1301_VIRT_BASE 0x100 +#define SX1301_PAGE_LEN 0x80 +#define SX1301_PAGE_BASE(n) (SX1301_VIRT_BASE + (SX1301_PAGE_LEN * n)) + +/* Page 0 */ +#define SX1301_IQCFG (SX1301_PAGE_BASE(0) + 0x21) +#define SX1301_DECCFG (SX1301_PAGE_BASE(0) + 0x22) +#define SX1301_CHRS (SX1301_PAGE_BASE(0) + 0x23) +#define SX1301_IF0L (SX1301_PAGE_BASE(0) + 0x24) +#define SX1301_IF0H (SX1301_PAGE_BASE(0) + 0x25) +#define SX1301_IF1L (SX1301_PAGE_BASE(0) + 0x26) +#define SX1301_IF1H (SX1301_PAGE_BASE(0) + 0x27) +#define SX1301_IF2L (SX1301_PAGE_BASE(0) + 0x28) +#define SX1301_IF2H (SX1301_PAGE_BASE(0) + 0x29) +#define SX1301_IF3L (SX1301_PAGE_BASE(0) + 0x2A) +#define SX1301_IF3H (SX1301_PAGE_BASE(0) + 0x2B) +#define SX1301_IF4L (SX1301_PAGE_BASE(0) + 0x2C) +#define SX1301_IF4H (SX1301_PAGE_BASE(0) + 0x2D) +#define SX1301_IF5L (SX1301_PAGE_BASE(0) + 0x2E) +#define SX1301_IF5H (SX1301_PAGE_BASE(0) + 0x2F) +#define SX1301_IF6L (SX1301_PAGE_BASE(0) + 0x30) +#define SX1301_IF6H (SX1301_PAGE_BASE(0) + 0x31) +#define SX1301_IF7L (SX1301_PAGE_BASE(0) + 0x32) +#define SX1301_IF7H (SX1301_PAGE_BASE(0) + 0x33) +#define SX1301_IF8L (SX1301_PAGE_BASE(0) + 0x34) +#define SX1301_IF8H (SX1301_PAGE_BASE(0) + 0x35) +#define SX1301_IF9L (SX1301_PAGE_BASE(0) + 0x36) +#define SX1301_IF9H (SX1301_PAGE_BASE(0) + 0x37) +#define SX1301_COR0DETEN (SX1301_PAGE_BASE(0) + 0x41) +#define SX1301_COR1DETEN (SX1301_PAGE_BASE(0) + 0x42) +#define SX1301_COR2DETEN (SX1301_PAGE_BASE(0) + 0x43) +#define SX1301_COR3DETEN (SX1301_PAGE_BASE(0) + 0x44) +#define SX1301_COR4DETEN (SX1301_PAGE_BASE(0) + 0x45) +#define SX1301_COR5DETEN (SX1301_PAGE_BASE(0) + 0x46) +#define SX1301_COR6DETEN (SX1301_PAGE_BASE(0) + 0x47) +#define SX1301_COR7DETEN (SX1301_PAGE_BASE(0) + 0x48) +#define SX1301_CORR_CFG (SX1301_PAGE_BASE(0) + 0x4E) +#define SX1301_MODEM_START_RDX4_L (SX1301_PAGE_BASE(0) + 0x51) +#define SX1301_MODEM_START_RDX4_H (SX1301_PAGE_BASE(0) + 0x52) +#define SX1301_MODEM_START_SF12_RDX4_L (SX1301_PAGE_BASE(0) + 0x53) +#define SX1301_MODEM_START_SF12_RDX4_H (SX1301_PAGE_BASE(0) + 0x54) +#define SX1301_TIMTRAK2 (SX1301_PAGE_BASE(0) + 0x5D) +#define SX1301_PRSYMBNBL (SX1301_PAGE_BASE(0) + 0x60) +#define SX1301_PRSYMBNBH (SX1301_PAGE_BASE(0) + 0x61) +#define SX1301_MISC_CFG1 (SX1301_PAGE_BASE(0) + 0x63) +#define SX1301_MISC_CFG2 (SX1301_PAGE_BASE(0) + 0x64) +#define SX1301_HEADER_CFG1 (SX1301_PAGE_BASE(0) + 0x65) +#define SX1301_HEADER_CFG2 (SX1301_PAGE_BASE(0) + 0x66) +#define SX1301_GAIN_OFFSET (SX1301_PAGE_BASE(0) + 0x68) +#define SX1301_FORCE_CTRL (SX1301_PAGE_BASE(0) + 0x69) +#define SX1301_MCU_CTRL (SX1301_PAGE_BASE(0) + 0x6A) +#define SX1301_CHANN_SELECT_RSSI (SX1301_PAGE_BASE(0) + 0x6B) +#define SX1301_RSSI_BB_DEFAULT_VALUE (SX1301_PAGE_BASE(0) + 0x6C) +#define SX1301_RSSI_DEC_DEFAULT_VALUE (SX1301_PAGE_BASE(0) + 0x6D) +#define SX1301_RSSI_CHANN_DEFAULT_VALUE (SX1301_PAGE_BASE(0) + 0x6E) +#define SX1301_RSSI_BB_FILTER_ALPHA (SX1301_PAGE_BASE(0) + 0x6F) +#define SX1301_RSSI_DEC_FILTER_ALPHA (SX1301_PAGE_BASE(0) + 0x70) +#define SX1301_RSSI_CHANN_FILTER_ALPHA (SX1301_PAGE_BASE(0) + 0x71) + +/* Page 1 */ +#define SX1301_TXTRIG (SX1301_PAGE_BASE(1) + 0x21) +#define SX1301_TX_OFFSET_I (SX1301_PAGE_BASE(1) + 0x27) +#define SX1301_TX_OFFSET_Q (SX1301_PAGE_BASE(1) + 0x28) +#define SX1301_TX_CFG1 (SX1301_PAGE_BASE(1) + 0x29) +#define SX1301_TX_CFG2 (SX1301_PAGE_BASE(1) + 0x2A) +#define SX1301_BHIMPCFG1 (SX1301_PAGE_BASE(1) + 0x2B) +#define SX1301_BHIMPCFG2 (SX1301_PAGE_BASE(1) + 0x2C) +#define SX1301_BHSYNCPOS (SX1301_PAGE_BASE(1) + 0x2E) +#define SX1301_BHPRSYMNBL (SX1301_PAGE_BASE(1) + 0x2F) +#define SX1301_MBWSSF_MISC_CFG1 (SX1301_PAGE_BASE(1) + 0x3A) +#define SX1301_MBWSSF_MISC_CFG2 (SX1301_PAGE_BASE(1) + 0x3B) +#define SX1301_MBWSSF_MISC_CFG3 (SX1301_PAGE_BASE(1) + 0x3C) +#define SX1301_MBWSSF_MISC_CFG4 (SX1301_PAGE_BASE(1) + 0x3D) +#define SX1301_TX_STATUS (SX1301_PAGE_BASE(1) + 0x3E) +#define SX1301_FSK_CFG1 (SX1301_PAGE_BASE(1) + 0x3F) +#define SX1301_FSK_CFG2 (SX1301_PAGE_BASE(1) + 0x40) +#define SX1301_FSK_ERROR_OSR_TOL (SX1301_PAGE_BASE(1) + 0x41) +#define SX1301_FSK_BR_RATIOL (SX1301_PAGE_BASE(1) + 0x42) +#define SX1301_FSK_BR_RATIOH (SX1301_PAGE_BASE(1) + 0x43) +#define SX1301_FSK_REF_PATTERN_0 (SX1301_PAGE_BASE(1) + 0x44) +#define SX1301_FSK_REF_PATTERN_1 (SX1301_PAGE_BASE(1) + 0x45) +#define SX1301_FSK_REF_PATTERN_2 (SX1301_PAGE_BASE(1) + 0x46) +#define SX1301_FSK_REF_PATTERN_3 (SX1301_PAGE_BASE(1) + 0x47) +#define SX1301_FSK_REF_PATTERN_4 (SX1301_PAGE_BASE(1) + 0x48) +#define SX1301_FSK_REF_PATTERN_5 (SX1301_PAGE_BASE(1) + 0x49) +#define SX1301_FSK_REF_PATTERN_6 (SX1301_PAGE_BASE(1) + 0x4A) +#define SX1301_FSK_REF_PATTERN_7 (SX1301_PAGE_BASE(1) + 0x4B) +#define SX1301_FSK_PKT_LENGTH (SX1301_PAGE_BASE(1) + 0x4C) +#define SX1301_FSK_TX (SX1301_PAGE_BASE(1) + 0x4D) +#define SX1301_FSK_AAFC (SX1301_PAGE_BASE(1) + 0x52) +#define SX1301_FSK_PATTERN_TIMEOUT_CFGL (SX1301_PAGE_BASE(1) + 0x53) +#define SX1301_FSK_PATTERN_TIMEOUT_CFGH (SX1301_PAGE_BASE(1) + 0x54) + +/* Page 2 */ +#define SX1301_RADIO_A_SPI_DATA (SX1301_PAGE_BASE(2) + 0x21) +#define SX1301_RADIO_A_SPI_DATA_RB (SX1301_PAGE_BASE(2) + 0x22) +#define SX1301_RADIO_A_SPI_ADDR (SX1301_PAGE_BASE(2) + 0x23) +#define SX1301_RADIO_A_SPI_CS (SX1301_PAGE_BASE(2) + 0x25) +#define SX1301_RADIO_B_SPI_DATA (SX1301_PAGE_BASE(2) + 0x26) +#define SX1301_RADIO_B_SPI_DATA_RB (SX1301_PAGE_BASE(2) + 0x27) +#define SX1301_RADIO_B_SPI_ADDR (SX1301_PAGE_BASE(2) + 0x28) +#define SX1301_RADIO_B_SPI_CS (SX1301_PAGE_BASE(2) + 0x2A) +#define SX1301_RADIO_CFG (SX1301_PAGE_BASE(2) + 0x2B) +#define SX1301_PA_GAIN (SX1301_PAGE_BASE(2) + 0x2C) +#define SX1301_FE_A_CTRL_LUT (SX1301_PAGE_BASE(2) + 0x2D) +#define SX1301_FE_B_CTRL_LUT (SX1301_PAGE_BASE(2) + 0x2E) +#define SX1301_VALID_HEADER_COUNTER_M_WSSF (SX1301_PAGE_BASE(2) + 0x38) +#define SX1301_VALID_HEADER_COUNTER_FSK (SX1301_PAGE_BASE(2) + 0x39) +#define SX1301_VALID_PACKET_COUNTER_MB_SSF (SX1301_PAGE_BASE(2) + 0x3A) +#define SX1301_VALID_PACKET_COUNTER_FSK (SX1301_PAGE_BASE(2) + 0x3B) +#define SX1301_CHANN_RSSI (SX1301_PAGE_BASE(2) + 0x3C) +#define SX1301_BB_RSSI (SX1301_PAGE_BASE(2) + 0x3D) +#define SX1301_DEC_RSSI (SX1301_PAGE_BASE(2) + 0x3E) +#define SX1301_DBG_MCU_DATA (SX1301_PAGE_BASE(2) + 0x3F) +#define SX1301_DBG_ARB_MCU_RAM_DATA (SX1301_PAGE_BASE(2) + 0x40) +#define SX1301_DBG_AGC_MCU_RAM_DATA (SX1301_PAGE_BASE(2) + 0x41) +#define SX1301_TIMESTAMP_0 (SX1301_PAGE_BASE(2) + 0x46) +#define SX1301_TIMESTAMP_1 (SX1301_PAGE_BASE(2) + 0x47) +#define SX1301_TIMESTAMP_2 (SX1301_PAGE_BASE(2) + 0x48) +#define SX1301_TIMESTAMP_3 (SX1301_PAGE_BASE(2) + 0x49) +#define SX1301_DBG_ARB_MCU_RAM_ADDR (SX1301_PAGE_BASE(2) + 0x50) +#define SX1301_DBG_AGC_MCU_RAM_ADDR (SX1301_PAGE_BASE(2) + 0x51) +#define SX1301_SPI_MASTER_CFG (SX1301_PAGE_BASE(2) + 0x52) +#define SX1301_GPS_CFG (SX1301_PAGE_BASE(2) + 0x59) + +/* Page 3 */ +#define SX1301_EMERGENCY_FORCE_HOST_CTRL (SX1301_PAGE_BASE(3) + 0x7F) + +#define SX1301_MAX_REGISTER (SX1301_PAGE_BASE(3) + 0x7F) + +#endif From patchwork Tue Aug 7 17:32:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954596 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="g+qEGOBO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM673BYdz9ryt for ; Wed, 8 Aug 2018 03:32:31 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389711AbeHGTrw (ORCPT ); Tue, 7 Aug 2018 15:47:52 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:38751 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727194AbeHGTrw (ORCPT ); Tue, 7 Aug 2018 15:47:52 -0400 Received: by mail-wr1-f66.google.com with SMTP id v14-v6so16533986wro.5 for ; Tue, 07 Aug 2018 10:32:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=6CNlwYrTrq14uqRBkuiW5Fd8XrHpXZET1NEd2r5uCAs=; b=g+qEGOBOGJKdpUJWMIIIRzCMmuFFM++7YpMQAotP0vpK1hfKDW+Q8/AGYSnz/iCyAy 7um9GrjN/2UmktTiShh64WjuJcxBuD3NO46nYbIUenfu6/drs8uE+A61aS4mMc4UdYR/ FM8OoQnXd/i8lCmCc0plGSzlhfsZcpg5A7MJSa/0QteIpJw6xwmAeeUdLqMNJZzRSFzI da7tdLUPGsubiQcdQqQDMtfW3lJ9a2/R8YbOoQxLwQ16e2YuyoAGI5eibDTxZW4IyOXz pD5mJSbBgSRh0oTSZYgKt9krfWr6QCKjjutMU7mbtYChShugUmKfDMsqT1eVO6TZq7Xe z6lQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=6CNlwYrTrq14uqRBkuiW5Fd8XrHpXZET1NEd2r5uCAs=; b=jwHaSuHp+zEokrSvRjUsAA1c2VCkJjIhjiZ+VSenQjY7OjKaDy1vayL4GYjFbgr7JK 0y6IqvSxHh5U2GbyCjzrdzzd8mjHHE/EyysscqWv7xbRtS+bYF/ZMRKyLz/5pTGwgtuA tO7T6kdYKVzBCUcl6Sjuz2seiLSCpPy43cuvFD32IMkZc4xCeMuolGKp5iRmY0exPhUY AKzkFJ4NcXD2ThUk4LmyVx/85QbPGDkRDCSsvnklRt5L9OZNlMyN2wepKwUgRE86NY1X c1/BD7/20Yb/XsUl4n9mOJ7NSDLeLuBCZ5/RGboMXTu+djjd9gJ8EFKG9+IcHhP49mUB HSqQ== X-Gm-Message-State: AOUpUlH2a5nbukOFkz4oLucnhr9OlTlcvJj8Ac5n03vxCGwAYNZxytFN R3aGi22UcDYynSsO9nG1SS0= X-Google-Smtp-Source: AAOMgpcaYe/yIkfEStKa2UB37FHrT4tOazdS3gFH4JhZE0w+cf78Rlh1utMohzJASObvkFWlX2AlXQ== X-Received: by 2002:adf:f910:: with SMTP id b16-v6mr13995139wrr.28.1533663148835; Tue, 07 Aug 2018 10:32:28 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:27 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 02/10] net: lora: add methods for devm registration Date: Tue, 7 Aug 2018 18:32:03 +0100 Message-Id: <1533663131-16313-4-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten Follow the devm model so that we can avoid lengthy unwind code. Signed-off-by: Ben Whitten --- drivers/net/lora/dev.c | 20 ++++++++++++++++++++ include/linux/lora/dev.h | 1 + 2 files changed, 21 insertions(+) diff --git a/drivers/net/lora/dev.c b/drivers/net/lora/dev.c index 8c01106..69a8b52 100644 --- a/drivers/net/lora/dev.c +++ b/drivers/net/lora/dev.c @@ -84,6 +84,26 @@ void free_loradev(struct net_device *dev) } EXPORT_SYMBOL_GPL(free_loradev); +static void devm_lora_unregister(struct device *dev, void *res) +{ + free_loradev(*(struct net_device **)res); +} + +int devm_lora_register_netdev(struct device *dev, struct net_device *net) +{ + struct net_device **ptr; + + ptr = devres_alloc(devm_lora_unregister, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return -ENOMEM; + + *ptr = net; + devres_add(dev, ptr); + + return 0; +} +EXPORT_SYMBOL_GPL(devm_lora_register_netdev); + static struct rtnl_link_ops lora_link_ops __read_mostly = { .kind = "lora", .setup = lora_setup, diff --git a/include/linux/lora/dev.h b/include/linux/lora/dev.h index 153f9b2..3f871c6 100644 --- a/include/linux/lora/dev.h +++ b/include/linux/lora/dev.h @@ -32,6 +32,7 @@ static inline int lora_strtoeui(const char *str, lora_eui *val) struct net_device *alloc_loradev(int sizeof_priv); void free_loradev(struct net_device *dev); +int devm_lora_register_netdev(struct device *dev, struct net_device *net); int register_loradev(struct net_device *dev); void unregister_loradev(struct net_device *dev); int open_loradev(struct net_device *dev); From patchwork Tue Aug 7 17:32:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954598 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="KH6pM6fs"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6B0jZYz9ryt for ; Wed, 8 Aug 2018 03:32:34 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390046AbeHGTry (ORCPT ); Tue, 7 Aug 2018 15:47:54 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:52408 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727194AbeHGTry (ORCPT ); Tue, 7 Aug 2018 15:47:54 -0400 Received: by mail-wm0-f66.google.com with SMTP id o11-v6so18128465wmh.2 for ; Tue, 07 Aug 2018 10:32:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=lKWx+yST+ffaoUkr97j17RwOsy1uyXtUQ2DbexhBE2E=; b=KH6pM6fsSD74+e/e4/+qiYpAk5UKbr2sCM75pFGrWxrKUXksEwAdoQONwSdyzjdJwa ytA0bKxPM7C4Tgsdr2OvIuoU2tw9VOMjMFhehfBUigGMCZap/9ODeL6TI0jm9MhwNhrt rT33PtbasHLWcsjLzT0BGZGS5aVnQPvJVhu/XAW/TucOKArcsbGWTvXctUniisLvgaWW MlYuXU9KKRbJ4jFGJ0Fo0hiGYVHy3+nsD1y33C+yuH4zHSNOpvfM6lKzNHLkg2E0mnvS EqdU+6smujd5xkghgrjlbYeFhEX8/mBCc0FrG/1D+Eh7i4ICzHuzv82jg0iidDd15FoV r73Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=lKWx+yST+ffaoUkr97j17RwOsy1uyXtUQ2DbexhBE2E=; b=AVxYdyS96E1tCouU/cfBsYkAQwOcKc2C0dXgrW5C/qGM2zbVbL+hrXltngLwLm4mLL Ey3L2U5XkYK3PGZ0NrYOPXLKmTuUtvbKTH7N5f4Kp26FbH6xurw7qNfLrK2SoHKgWlRK ZqokcfGJV8T+4fXN7DKrwFIEPVSlgIsxpyX2jfHHNl7Jy7ts410cwkdkwVuEtCXGsFy5 3Zt31gMR3Wb/iBTKBmkG7aOtRUvHL6S7r/etFCscp8VeBLaUQRfiJR1og8PXLDfmCfNq jzxAx4B19CrPwjw65QRb3IpNSHhJanwRiC+pNx1ri/pRFyKISNk9F9WGprTZbUaL+hMj QahQ== X-Gm-Message-State: AOUpUlFLAkzI1I/UKOMW1pxysKqZ0b9Nlm5TCyQ9H/d31nJXC13FRZjP FDsEqkKDqQWYaSMHBqeydkk= X-Google-Smtp-Source: AA+uWPyyXQA9uKgAbFfyugV9FnALseZe3ZAxm56zNaVx2ebL9BfjoqqVrzqS2Z1bv0b+NZEOpQJuBg== X-Received: by 2002:a1c:889:: with SMTP id 131-v6mr2201044wmi.142.1533663150250; Tue, 07 Aug 2018 10:32:30 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:29 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 03/10] net: lora: sx1301: convert to devm registration of netdev Date: Tue, 7 Aug 2018 18:32:04 +0100 Message-Id: <1533663131-16313-5-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten We allow the devres framework handle the clean removal of resources on teardown of the device, in this case the SPI device, saving lengthy unwind code and improving clarity. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 87 +++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 56 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index 49958f0..54bfc31 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -869,9 +869,13 @@ static int sx1301_probe(struct spi_device *spi) spi_setup(spi); netdev = alloc_loradev(sizeof(*priv)); - if (!netdev) { - ret = -ENOMEM; - goto err_alloc_loradev; + if (!netdev) + return -ENOMEM; + + ret = devm_lora_register_netdev(&spi->dev, netdev); + if (ret) { + free_loradev(netdev); + return ret; } priv = netdev_priv(netdev); @@ -885,7 +889,7 @@ static int sx1301_probe(struct spi_device *spi) if (IS_ERR(priv->regmap)) { ret = PTR_ERR(priv->regmap); dev_err(&spi->dev, "Regmap allocation failed: %d\n", ret); - return err_regmap; + return ret; } for (i = 0; i < ARRAY_SIZE(sx1301_reg_fields); i++) { @@ -897,38 +901,37 @@ static int sx1301_probe(struct spi_device *spi) if (IS_ERR(priv->regmap_fields[i])) { ret = PTR_ERR(priv->regmap_fields[i]); dev_err(&spi->dev, "Cannot allocate regmap field: %d\n", ret); - goto err_regmap; + return ret; } } ret = regmap_read(priv->regmap, SX1301_VER, &ver); if (ret) { dev_err(&spi->dev, "version read failed\n"); - goto err_version; + return ret; } if (ver != 103) { dev_err(&spi->dev, "unexpected version: %u\n", ver); - ret = -ENXIO; - goto err_version; + return -ENXIO; } ret = sx1301_write(spi, REG_PAGE_RESET, 0); if (ret) { dev_err(&spi->dev, "page/reset write failed\n"); - goto err_init_page; + return ret; } ret = sx1301_soft_reset(spi); if (ret) { dev_err(&spi->dev, "soft reset failed\n"); - goto err_soft_reset; + return ret; } ret = sx1301_read(spi, 16, &val); if (ret) { dev_err(&spi->dev, "16 read failed\n"); - goto err_read_global_en_0; + return ret; } val &= ~REG_16_GLOBAL_EN; @@ -936,13 +939,13 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_write(spi, 16, val); if (ret) { dev_err(&spi->dev, "16 write failed\n"); - goto err_write_global_en_0; + return ret; } ret = sx1301_read(spi, 17, &val); if (ret) { dev_err(&spi->dev, "17 read failed\n"); - goto err_read_clk32m_0; + return ret; } val &= ~REG_17_CLK32M_EN; @@ -950,7 +953,7 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_write(spi, 17, val); if (ret) { dev_err(&spi->dev, "17 write failed\n"); - goto err_write_clk32m_0; + return ret; } ret = sx1301_page_read(spi, 2, 43, &val); @@ -1003,8 +1006,7 @@ static int sx1301_probe(struct spi_device *spi) priv->radio_a_ctrl = spi_alloc_master(&spi->dev, sizeof(*radio)); if (!priv->radio_a_ctrl) { - ret = -ENOMEM; - goto err_radio_a_alloc; + return -ENOMEM; } sx1301_radio_setup(priv->radio_a_ctrl); @@ -1019,15 +1021,14 @@ static int sx1301_probe(struct spi_device *spi) if (ret) { dev_err(&spi->dev, "radio A SPI register failed\n"); spi_controller_put(priv->radio_a_ctrl); - goto err_radio_a_register; + return ret; } /* radio B */ priv->radio_b_ctrl = spi_alloc_master(&spi->dev, sizeof(*radio)); if (!priv->radio_b_ctrl) { - ret = -ENOMEM; - goto err_radio_b_alloc; + return -ENOMEM; } sx1301_radio_setup(priv->radio_b_ctrl); @@ -1042,7 +1043,7 @@ static int sx1301_probe(struct spi_device *spi) if (ret) { dev_err(&spi->dev, "radio B SPI register failed\n"); spi_controller_put(priv->radio_b_ctrl); - goto err_radio_b_register; + return ret; } /* GPIO */ @@ -1050,7 +1051,7 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_read(spi, REG_GPIO_MODE, &val); if (ret) { dev_err(&spi->dev, "GPIO mode read failed\n"); - goto err_read_gpio_mode; + return ret; } val |= GENMASK(4, 0); @@ -1058,13 +1059,13 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_write(spi, REG_GPIO_MODE, val); if (ret) { dev_err(&spi->dev, "GPIO mode write failed\n"); - goto err_write_gpio_mode; + return ret; } ret = sx1301_read(spi, REG_GPIO_SELECT_OUTPUT, &val); if (ret) { dev_err(&spi->dev, "GPIO select output read failed\n"); - goto err_read_gpio_select_output; + return ret; } val &= ~GENMASK(3, 0); @@ -1073,7 +1074,7 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_write(spi, REG_GPIO_SELECT_OUTPUT, val); if (ret) { dev_err(&spi->dev, "GPIO select output write failed\n"); - goto err_write_gpio_select_output; + return ret; } /* TODO LBT */ @@ -1081,7 +1082,7 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_read(spi, 16, &val); if (ret) { dev_err(&spi->dev, "16 read (1) failed\n"); - goto err_read_global_en_1; + return ret; } val |= REG_16_GLOBAL_EN; @@ -1089,13 +1090,13 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_write(spi, 16, val); if (ret) { dev_err(&spi->dev, "16 write (1) failed\n"); - goto err_write_global_en_1; + return ret; } ret = sx1301_read(spi, 17, &val); if (ret) { dev_err(&spi->dev, "17 read (1) failed\n"); - goto err_read_clk32m_1; + return ret; } val |= REG_17_CLK32M_EN; @@ -1103,50 +1104,24 @@ static int sx1301_probe(struct spi_device *spi) ret = sx1301_write(spi, 17, val); if (ret) { dev_err(&spi->dev, "17 write (1) failed\n"); - goto err_write_clk32m_1; + return ret; } /* calibration */ ret = sx1301_agc_calibrate(spi); if (ret) - goto err_agc_calibrate; + return ret; /* TODO */ ret = sx1301_load_all_firmware(spi); if (ret) - goto err_load_firmware; + return ret; dev_info(&spi->dev, "SX1301 module probed\n"); return 0; - -err_load_firmware: -err_agc_calibrate: -err_write_clk32m_1: -err_read_clk32m_1: -err_write_global_en_1: -err_read_global_en_1: -err_write_gpio_select_output: -err_read_gpio_select_output: -err_write_gpio_mode: -err_read_gpio_mode: -err_radio_b_register: -err_radio_b_alloc: -err_radio_a_register: -err_radio_a_alloc: -err_write_clk32m_0: -err_read_clk32m_0: -err_write_global_en_0: -err_read_global_en_0: -err_soft_reset: -err_init_page: -err_version: -err_regmap: - free_loradev(netdev); -err_alloc_loradev: - return ret; } static int sx1301_remove(struct spi_device *spi) From patchwork Tue Aug 7 17:32:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954599 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="QCx9wyaI"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6B5bk9z9rvt for ; Wed, 8 Aug 2018 03:32:34 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390258AbeHGTrz (ORCPT ); Tue, 7 Aug 2018 15:47:55 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:36098 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389712AbeHGTrz (ORCPT ); Tue, 7 Aug 2018 15:47:55 -0400 Received: by mail-wr1-f66.google.com with SMTP id h9-v6so16554561wro.3 for ; Tue, 07 Aug 2018 10:32:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZaRagN3HaIOK1TlMtP7cqEyK4U21bXdXWl7O0dOlcc8=; b=QCx9wyaIE2/1fH8/xD0YCcP6NvRgzHU/mvikUtTv8VkpYc6p+ZBKDdfnmRoT260K6e XU7xkauR6wAHxHDfdpfD3IyBfWPXm018m5S6nus9YJd/QkZR4qm6NhsecHlAvUBpHo1q 5oKOBWC3nLSlagXj5qgKo8LziNt5lfqg7NAGbFojnOZhXJIoRGsAwMr84HXke7RX3tbP VsCtOKw6ByQw/cLRR4Tw4UvxwSYq2/QWctXsDGzCxiha4tELV1V/tc+JSNjq4BDZf+E0 iJxtKnRUyw95LO8MAHKqHrWnL0C8EAA846wx6S0jgIxLChMcM/VrO6w1qVuMPjRZj0dC 5dEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=ZaRagN3HaIOK1TlMtP7cqEyK4U21bXdXWl7O0dOlcc8=; b=c/QuJIGPlEtnLsqpZfUYzUxOWCwTtKD/HGKVij4ApFhQ0fBeL4w6cHiO8OhvqtLeZe cgjkyMcaf8UJ1MJ4ix6lLr9SqqIff/5f/MgnOlRzkNxdX+BLXYm2jinq33Pw+1fzl3IA b+EA1DrdoA9qAQOPUDi181bo1AAxnm2Jy+Ab5+AR+P0Jp88vGQUCt7i4zAC6kJ5lxs03 D2X8pTuKm8FKBrhlDw53Q1VjhVr7tNXtRJKCquCHGDIV81WNg6q5lXOW9MWcpmgFdpW1 N/tAncQbIhjTiZqVaVYlUC7FQaB8nJDcPTEMKcB+VVSvatYFGiqy9c7MPL8DaqfEYTQ4 4Kjw== X-Gm-Message-State: AOUpUlHq5/uNZ2gOsC7pKWBjRI1hlxPYkDtdhAay4s2ecSRt9cYj0dZe ChI2+HIhY8kJwG/mCWpLRYk= X-Google-Smtp-Source: AAOMgpciIxGOrG2Rlt/UfBxqThCNC0XwF9AM2CBRk4wkzoCeEUwnpAR7Y5sW1oVJQ3AE8MfWkJ0NyA== X-Received: by 2002:adf:ef8c:: with SMTP id d12-v6mr14010641wro.195.1533663151904; Tue, 07 Aug 2018 10:32:31 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:31 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 04/10] net: lora: sx1301: convert probe function to regmap access Date: Tue, 7 Aug 2018 18:32:05 +0100 Message-Id: <1533663131-16313-6-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten Keeping change sets small we convert the probe function over to regmap and regmap_field access for initialisation. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 155 +++++++++------------------------------------- drivers/net/lora/sx1301.h | 7 +++ 2 files changed, 35 insertions(+), 127 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index 54bfc31..118e8d8 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -379,11 +379,6 @@ static int sx1301_page_write(struct spi_device *spi, u8 page, u8 reg, u8 val) return sx1301_write(spi, reg, val); } -static int sx1301_soft_reset(struct spi_device *spi) -{ - return sx1301_write(spi, REG_PAGE_RESET, REG_PAGE_RESET_SOFT_RESET); -} - #define REG_RADIO_X_DATA 0 #define REG_RADIO_X_DATA_READBACK 1 #define REG_RADIO_X_ADDR 2 @@ -854,7 +849,6 @@ static int sx1301_probe(struct spi_device *spi) int ret; int i; unsigned int ver; - u8 val; rst = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_LOW); if (IS_ERR(rst)) @@ -911,96 +905,46 @@ static int sx1301_probe(struct spi_device *spi) return ret; } - if (ver != 103) { + if (ver != SX1301_CHIP_VERSION) { dev_err(&spi->dev, "unexpected version: %u\n", ver); return -ENXIO; } - ret = sx1301_write(spi, REG_PAGE_RESET, 0); + ret = regmap_write(priv->regmap, SX1301_PAGE, 0); if (ret) { dev_err(&spi->dev, "page/reset write failed\n"); return ret; } - ret = sx1301_soft_reset(spi); + ret = sx1301_field_write(priv, F_SOFT_RESET, 1); if (ret) { dev_err(&spi->dev, "soft reset failed\n"); return ret; } - ret = sx1301_read(spi, 16, &val); - if (ret) { - dev_err(&spi->dev, "16 read failed\n"); - return ret; - } - - val &= ~REG_16_GLOBAL_EN; - - ret = sx1301_write(spi, 16, val); - if (ret) { - dev_err(&spi->dev, "16 write failed\n"); - return ret; - } - - ret = sx1301_read(spi, 17, &val); - if (ret) { - dev_err(&spi->dev, "17 read failed\n"); - return ret; - } - - val &= ~REG_17_CLK32M_EN; - - ret = sx1301_write(spi, 17, val); - if (ret) { - dev_err(&spi->dev, "17 write failed\n"); - return ret; - } - - ret = sx1301_page_read(spi, 2, 43, &val); - if (ret) { - dev_err(&spi->dev, "2|43 read failed\n"); + /* gate clocks */ + ret = sx1301_field_write(priv, F_GLOBAL_EN, 0); + if (ret) return ret; - } - - val |= REG_2_43_RADIO_B_EN | REG_2_43_RADIO_A_EN; - - ret = sx1301_page_write(spi, 2, 43, val); - if (ret) { - dev_err(&spi->dev, "2|43 write failed\n"); + ret = sx1301_field_write(priv, F_CLK32M_EN, 0); + if (ret) return ret; - } - msleep(500); - - ret = sx1301_page_read(spi, 2, 43, &val); - if (ret) { - dev_err(&spi->dev, "2|43 read failed\n"); + /* switch on and reset the radios (also starts the 32 MHz XTAL) */ + ret = sx1301_field_write(priv, F_RADIO_A_EN, 1); + if (ret) return ret; - } - - val |= REG_2_43_RADIO_RST; - - ret = sx1301_page_write(spi, 2, 43, val); - if (ret) { - dev_err(&spi->dev, "2|43 write failed\n"); + ret = sx1301_field_write(priv, F_RADIO_B_EN, 1); + if (ret) return ret; - } - - msleep(5); - - ret = sx1301_page_read(spi, 2, 43, &val); - if (ret) { - dev_err(&spi->dev, "2|43 read failed\n"); + mdelay(500); + ret = sx1301_field_write(priv, F_RADIO_RST, 1); + if (ret) return ret; - } - - val &= ~REG_2_43_RADIO_RST; - - ret = sx1301_page_write(spi, 2, 43, val); - if (ret) { - dev_err(&spi->dev, "2|43 write failed\n"); + mdelay(5); + ret = sx1301_field_write(priv, F_RADIO_RST, 0); + if (ret) return ret; - } /* radio A */ @@ -1047,65 +991,22 @@ static int sx1301_probe(struct spi_device *spi) } /* GPIO */ - - ret = sx1301_read(spi, REG_GPIO_MODE, &val); - if (ret) { - dev_err(&spi->dev, "GPIO mode read failed\n"); - return ret; - } - - val |= GENMASK(4, 0); - - ret = sx1301_write(spi, REG_GPIO_MODE, val); - if (ret) { - dev_err(&spi->dev, "GPIO mode write failed\n"); - return ret; - } - - ret = sx1301_read(spi, REG_GPIO_SELECT_OUTPUT, &val); - if (ret) { - dev_err(&spi->dev, "GPIO select output read failed\n"); + ret = regmap_write(priv->regmap, SX1301_GPMODE, 0x1F); + if (ret) return ret; - } - - val &= ~GENMASK(3, 0); - val |= 2; - - ret = sx1301_write(spi, REG_GPIO_SELECT_OUTPUT, val); - if (ret) { - dev_err(&spi->dev, "GPIO select output write failed\n"); + ret = regmap_write(priv->regmap, SX1301_GPSO, 0x2); + if (ret) return ret; - } /* TODO LBT */ - ret = sx1301_read(spi, 16, &val); - if (ret) { - dev_err(&spi->dev, "16 read (1) failed\n"); - return ret; - } - - val |= REG_16_GLOBAL_EN; - - ret = sx1301_write(spi, 16, val); - if (ret) { - dev_err(&spi->dev, "16 write (1) failed\n"); - return ret; - } - - ret = sx1301_read(spi, 17, &val); - if (ret) { - dev_err(&spi->dev, "17 read (1) failed\n"); + /* start clocks */ + ret = sx1301_field_write(priv, F_GLOBAL_EN, 1); + if (ret) return ret; - } - - val |= REG_17_CLK32M_EN; - - ret = sx1301_write(spi, 17, val); - if (ret) { - dev_err(&spi->dev, "17 write (1) failed\n"); + ret = sx1301_field_write(priv, F_CLK32M_EN, 1); + if (ret) return ret; - } /* calibration */ diff --git a/drivers/net/lora/sx1301.h b/drivers/net/lora/sx1301.h index abfb7b5..0e84703 100644 --- a/drivers/net/lora/sx1301.h +++ b/drivers/net/lora/sx1301.h @@ -8,6 +8,13 @@ #ifndef _SX1301_ #define _SX1301_ +#define SX1301_CHIP_VERSION 103 + +#define SX1301_MCU_FW_BYTE 8192 +#define SX1301_MCU_ARB_FW_VERSION 1 +#define SX1301_MCU_AGC_FW_VERSION 4 +#define SX1301_MCU_AGC_CAL_FW_VERSION 2 + /* Page independent */ #define SX1301_PAGE 0x00 #define SX1301_VER 0x01 From patchwork Tue Aug 7 17:32:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954600 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="djoc9E4X"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6D3681z9rvt for ; Wed, 8 Aug 2018 03:32:36 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389715AbeHGTr5 (ORCPT ); Tue, 7 Aug 2018 15:47:57 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:41093 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389712AbeHGTr4 (ORCPT ); Tue, 7 Aug 2018 15:47:56 -0400 Received: by mail-wr1-f67.google.com with SMTP id j5-v6so16517978wrr.8 for ; Tue, 07 Aug 2018 10:32:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=ku+YNsPkDcmm8KGrIQIicGRM797KBrbjb3eeHeTbovo=; b=djoc9E4XOEh6Q2tAiCbOZVhAo8zBAr6kG/7/RpZDOzF9GK7xhNl2aKETai9hH14W+x TzZ0vwwH099terCWdTX2E1Ursk4Q+xG6C9SJ5NjHYsGG9Qi3V6cKBDpYu5VE2yAgoWR7 mXObMrlK9xgxd7odsvz5aQp6sa5ZNkFS4elnD6SAETVauhU2SWeTRHKYTf/vRi+5HKCf 4k9lksh6bRonvGyzpwvMqHPL1qD8r9jYzorslmkK2Grwn707TSWtxIrjyL74RKOc0c7v 2IJA2js+WigvLxv9RJgndGPLLr2fUsWwdiq1ZAJ9HJoOSehHHWqp4rzK1fd2C1pQ8GW8 qFbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=ku+YNsPkDcmm8KGrIQIicGRM797KBrbjb3eeHeTbovo=; b=LRx1nmoBQliQtI0qrepPmx11pTOmsbv7DR2ES2IprckKA2PmZffVgYBxzdrmhfbTPg U998G4r2pVjLxQz684XQOIv/Ygd7ucV9d8gjEDmZLtOS18zPkZ2EzlJUDQ6FB0MW7Gyf lBvltUrxEdvVfKEwCoweXp0x93AvtT85LdHtWbW14OCvbcTNcGXjsfr9kMhwdkOizXdZ 4H+5Av50qpgAkBymArUkSi2RbuYavORy3gZqGuHzyeaoeVPvr1mBUhJtI3Uz7Kp0ersc mp/lUGULS5begtnrKOAoSmLWyR2XNGwLPwx2eEREqq3xRQy67EA6ZnQXEiRfRWPByz+u 7Umw== X-Gm-Message-State: AOUpUlFfft4LV6zYVNcfSW7yet3C+wYjhceVhc7QSkZz61upM0L6F4yw /Ft8X9potxINNwXe7akyOA9V2qPWTGCy4A== X-Google-Smtp-Source: AAOMgpdFUxO0gHh3y5cdjgTGHv3hDQuQJmpkA0Px6rvUMgQmFO/oPNi4CcPpFmvtBYXcDLrFNferlw== X-Received: by 2002:adf:8103:: with SMTP id 3-v6mr13222822wrm.213.1533663153217; Tue, 07 Aug 2018 10:32:33 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:32 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 05/10] net: lora: sx1301: add device to private data and convert ram reads Date: Tue, 7 Aug 2018 18:32:06 +0100 Message-Id: <1533663131-16313-7-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten It's easier to simply add a pointer to our device to our private data, this way we can avoid passing around our spi_device and instead just pass private data which is more flexible. As its a two line change its coupled with converting AGC and ARB ram reads to regmap functions. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index 118e8d8..249551b 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -283,6 +283,7 @@ struct spi_sx1301 { }; struct sx1301_priv { + struct device *dev; struct lora_priv lora; struct gpio_desc *rst_gpio; u8 cur_page; @@ -472,40 +473,44 @@ static int sx1301_radio_spi_transfer_one(struct spi_controller *ctrl, return 0; } -static int sx1301_agc_ram_read(struct spi_device *spi, u8 addr, u8 *val) +static int sx1301_agc_ram_read(struct sx1301_priv *priv, u8 addr, u8 *val) { int ret; + unsigned int read; - ret = sx1301_page_write(spi, 2, REG_2_DBG_AGC_MCU_RAM_ADDR, addr); + ret = regmap_write(priv->regmap, SX1301_DBG_AGC_MCU_RAM_ADDR, addr); if (ret) { - dev_err(&spi->dev, "AGC RAM addr write failed\n"); + dev_err(priv->dev, "AGC RAM addr write failed\n"); return ret; } - ret = sx1301_page_read(spi, 2, REG_2_DBG_AGC_MCU_RAM_DATA, val); + ret = regmap_read(priv->regmap, SX1301_DBG_AGC_MCU_RAM_DATA, &read); if (ret) { - dev_err(&spi->dev, "AGC RAM data read failed\n"); + dev_err(priv->dev, "AGC RAM data read failed\n"); return ret; } + *val = read; return 0; } -static int sx1301_arb_ram_read(struct spi_device *spi, u8 addr, u8 *val) +static int sx1301_arb_ram_read(struct sx1301_priv *priv, u8 addr, u8 *val) { int ret; + unsigned int read; - ret = sx1301_page_write(spi, 2, REG_2_DBG_ARB_MCU_RAM_ADDR, addr); + ret = regmap_write(priv->regmap, SX1301_DBG_ARB_MCU_RAM_ADDR, addr); if (ret) { - dev_err(&spi->dev, "ARB RAM addr write failed\n"); + dev_err(priv->dev, "ARB RAM addr write failed\n"); return ret; } - ret = sx1301_page_read(spi, 2, REG_2_DBG_ARB_MCU_RAM_DATA, val); + ret = regmap_read(priv->regmap, SX1301_DBG_ARB_MCU_RAM_DATA, &read); if (ret) { - dev_err(&spi->dev, "ARB RAM data read failed\n"); + dev_err(priv->dev, "ARB RAM data read failed\n"); return ret; } + *val = read; return 0; } @@ -604,6 +609,7 @@ static int sx1301_load_firmware(struct spi_device *spi, int mcu, const u8 *data, static int sx1301_agc_calibrate(struct spi_device *spi) { const struct firmware *fw; + struct sx1301_priv *priv = spi_get_drvdata(spi); u8 val; int ret; @@ -663,7 +669,7 @@ static int sx1301_agc_calibrate(struct spi_device *spi) return ret; } - ret = sx1301_agc_ram_read(spi, 0x20, &val); + ret = sx1301_agc_ram_read(priv, 0x20, &val); if (ret) { dev_err(&spi->dev, "AGC RAM data read failed\n"); return ret; @@ -730,6 +736,7 @@ static int sx1301_agc_calibrate(struct spi_device *spi) static int sx1301_load_all_firmware(struct spi_device *spi) { + struct sx1301_priv *priv = spi_get_drvdata(spi); const struct firmware *fw; u8 val; int ret; @@ -802,7 +809,7 @@ static int sx1301_load_all_firmware(struct spi_device *spi) return ret; } - ret = sx1301_agc_ram_read(spi, 0x20, &val); + ret = sx1301_agc_ram_read(priv, 0x20, &val); if (ret) { dev_err(&spi->dev, "AGC RAM data read failed\n"); return ret; @@ -815,7 +822,7 @@ static int sx1301_load_all_firmware(struct spi_device *spi) return -ENXIO; } - ret = sx1301_arb_ram_read(spi, 0x20, &val); + ret = sx1301_arb_ram_read(priv, 0x20, &val); if (ret) { dev_err(&spi->dev, "ARB RAM data read failed\n"); return ret; @@ -878,6 +885,7 @@ static int sx1301_probe(struct spi_device *spi) spi_set_drvdata(spi, netdev); SET_NETDEV_DEV(netdev, &spi->dev); + priv->dev = &spi->dev; priv->regmap = devm_regmap_init_spi(spi, &sx1301_regmap_config); if (IS_ERR(priv->regmap)) { From patchwork Tue Aug 7 17:32:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954601 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="fk8zfEE3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6G3C9Wz9rvt for ; Wed, 8 Aug 2018 03:32:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390280AbeHGTr7 (ORCPT ); Tue, 7 Aug 2018 15:47:59 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:34328 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389361AbeHGTr6 (ORCPT ); Tue, 7 Aug 2018 15:47:58 -0400 Received: by mail-wm0-f67.google.com with SMTP id l2-v6so15013993wme.1 for ; Tue, 07 Aug 2018 10:32:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=xtxKQGfM9yQXa0E3vpkrVksojIPOFm3MDh07GPF+smo=; b=fk8zfEE3RxZmGYYymck3ELPiN56K1GK6cPuwaN1Qf69RoiCcRJouWmetV2s4vFEH8T 6MNZW/2Ynz8OU7VOtLOx6XbLvIUI8APJpjf0EuL+GafoYOwB5uivbQCTAWr3jhWCRHui xemO40dd4f1iBJixyD0QHcJfmtzVcB3j17PzrzxBypWVBGzx2J7zxf2ANM1jDjDBxxmv ZFLQz9eatuoEdWii1uwZ4uEy8UmgWuJ8nvim+T67cq4n+2VTpQtrfXHNsgzNQORNJRGE dnWynLOfWruiszJC56xMGXBH8iR13OIbM8yq/RE8nwGaxFfOsvzZ6KKR6s246nSVGsuR Uv+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=xtxKQGfM9yQXa0E3vpkrVksojIPOFm3MDh07GPF+smo=; b=GpYt53e+cVEjeOirgnyRdZhzXcy2jmxvCsronC7xDCkpVpceughcKlZQH5hpgBmaiw 2p40k0dEfkzAvGuOR4hEpIThoXxc3I0OGzenT58QqL7ouvY6OS1uqpkijRxx2eAnZLV0 jQqQP6O8wkE5QmofO7tbJLEQfSOz4wGNof3n8MPnawUay5NBTleUqpqfNsfpPQuYSiwM j4vDEEa1P3/vaBfrQndAob1woyUy5rnHMBt3DLA5pMW5JTTkcM9cUxGQZ5WFA9QR1k7S UWY6zWatR/isRRlzCX3jmiuTgiE8QPC9kgPU8zNtLjwfbFj72Rf31IOEmKo5X4z+8K2l iaWg== X-Gm-Message-State: AOUpUlEUZHU/G/TRNltUS/1mn2GF0AYfTwbo5EIHB5bMEH+RpnNGQApN +DiibdYon/JKcxrLLuX+JDQ= X-Google-Smtp-Source: AA+uWPxiZCsp2vtuQeczjc2sFRJpjAu/PfxyeHG1XD3nj5pg+CYM+0ygvj7oLjq6frcAQLYPmisXug== X-Received: by 2002:a1c:4004:: with SMTP id n4-v6mr2236236wma.83.1533663154658; Tue, 07 Aug 2018 10:32:34 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:33 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 06/10] net: lora: sx1301: simplify firmware loading and convert Date: Tue, 7 Aug 2018 18:32:07 +0100 Message-Id: <1533663131-16313-8-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten As part of changing our internal pointers to our priv data we add the spi_device temporarily for downstream burst read/writes. Just pass firmware pointer to the load and remove redundant size checks, as both MCUs have the same program size add a define. Use devm_kzalloc for automatic cleanup on failure to load firmware, manually cleaup this memory on success. Convert firmware loading to regmap functions. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 109 ++++++++++++++++------------------------------ 1 file changed, 37 insertions(+), 72 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index 249551b..4cec524 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -284,6 +284,7 @@ struct spi_sx1301 { struct sx1301_priv { struct device *dev; + struct spi_device *spi; struct lora_priv lora; struct gpio_desc *rst_gpio; u8 cur_page; @@ -515,93 +516,73 @@ static int sx1301_arb_ram_read(struct sx1301_priv *priv, u8 addr, u8 *val) return 0; } -static int sx1301_load_firmware(struct spi_device *spi, int mcu, const u8 *data, size_t len) +static int sx1301_load_firmware(struct sx1301_priv *priv, int mcu, const struct firmware *fw) { u8 *buf; - u8 val, rst, select_mux; int ret; + unsigned int read; + enum sx1301_fields rst, select_mux; - if (len > 8192) + if (fw->size > SX1301_MCU_FW_BYTE) return -EINVAL; switch (mcu) { case 0: - rst = REG_0_MCU_RST_0; - select_mux = REG_0_MCU_SELECT_MUX_0; + rst = F_MCU_RST_0; + select_mux = F_MCU_SELECT_MUX_0; break; case 1: - rst = REG_0_MCU_RST_1; - select_mux = REG_0_MCU_SELECT_MUX_1; + rst = F_MCU_RST_1; + select_mux = F_MCU_SELECT_MUX_1; break; default: return -EINVAL; } - ret = sx1301_page_read(spi, 0, REG_0_MCU, &val); - if (ret) { - dev_err(&spi->dev, "MCU read failed\n"); + ret = sx1301_field_write(priv, rst, 1); + if (ret) return ret; - } - - val |= rst; - val &= ~select_mux; - - ret = sx1301_page_write(spi, 0, REG_0_MCU, val); - if (ret) { - dev_err(&spi->dev, "MCU reset / select mux write failed\n"); + ret = sx1301_field_write(priv, select_mux, 0); + if (ret) return ret; - } - ret = sx1301_write(spi, REG_MCU_PROM_ADDR, 0); - if (ret) { - dev_err(&spi->dev, "MCU prom addr write failed\n"); + /* Load firmware into the data register */ + ret = regmap_write(priv->regmap, SX1301_MPA, 0); + if (ret) return ret; - } - ret = sx1301_write_burst(spi, REG_MCU_PROM_DATA, data, len); + ret = sx1301_write_burst(priv->spi, REG_MCU_PROM_DATA, fw->data, fw->size); if (ret) { - dev_err(&spi->dev, "MCU prom data write failed\n"); + dev_err(priv->dev, "MCU prom data write failed\n"); return ret; } - ret = sx1301_read(spi, REG_MCU_PROM_DATA, &val); + ret = regmap_read(priv->regmap, SX1301_MPD, &read); if (ret) { - dev_err(&spi->dev, "MCU prom data dummy read failed\n"); + dev_err(priv->dev, "MCU prom data dummy read failed\n"); return ret; } - buf = kzalloc(len, GFP_KERNEL); + buf = devm_kzalloc(priv->dev, fw->size, GFP_KERNEL); if (!buf) return -ENOMEM; - ret = sx1301_read_burst(spi, REG_MCU_PROM_DATA, buf, len); + ret = sx1301_read_burst(priv->spi, REG_MCU_PROM_DATA, buf, fw->size); if (ret) { - dev_err(&spi->dev, "MCU prom data read failed\n"); - kfree(buf); + dev_err(priv->dev, "MCU prom data read failed\n"); return ret; } - if (memcmp(data, buf, len)) { - dev_err(&spi->dev, "MCU prom data read does not match data written\n"); - kfree(buf); + if (memcmp(fw->data, buf, fw->size)) { + dev_err(priv->dev, "MCU prom data read does not match data written\n"); return -ENXIO; } - kfree(buf); + devm_kfree(priv->dev, buf); - ret = sx1301_page_read(spi, 0, REG_0_MCU, &val); - if (ret) { - dev_err(&spi->dev, "MCU read (1) failed\n"); - return ret; - } - - val |= select_mux; - - ret = sx1301_page_write(spi, 0, REG_0_MCU, val); - if (ret) { - dev_err(&spi->dev, "MCU reset / select mux write (1) failed\n"); + ret = sx1301_field_write(priv, select_mux, 1); + if (ret) return ret; - } return 0; } @@ -613,18 +594,13 @@ static int sx1301_agc_calibrate(struct spi_device *spi) u8 val; int ret; - ret = request_firmware(&fw, "sx1301_agc_calibration.bin", &spi->dev); + ret = request_firmware(&fw, "sx1301_agc_calibration.bin", priv->dev); if (ret) { dev_err(&spi->dev, "agc cal firmware file load failed\n"); return ret; } - if (fw->size != 8192) { - dev_err(&spi->dev, "unexpected agc cal firmware size\n"); - return -EINVAL; - } - - ret = sx1301_load_firmware(spi, 1, fw->data, fw->size); + ret = sx1301_load_firmware(priv, 1, fw); release_firmware(fw); if (ret) { dev_err(&spi->dev, "agc cal firmware load failed\n"); @@ -741,36 +717,24 @@ static int sx1301_load_all_firmware(struct spi_device *spi) u8 val; int ret; - ret = request_firmware(&fw, "sx1301_arb.bin", &spi->dev); + ret = request_firmware(&fw, "sx1301_arb.bin", priv->dev); if (ret) { - dev_err(&spi->dev, "arb firmware file load failed\n"); + dev_err(priv->dev, "arb firmware file load failed\n"); return ret; } - if (fw->size != 8192) { - dev_err(&spi->dev, "unexpected arb firmware size\n"); - release_firmware(fw); - return -EINVAL; - } - - ret = sx1301_load_firmware(spi, 0, fw->data, fw->size); + ret = sx1301_load_firmware(priv, 0, fw); release_firmware(fw); if (ret) return ret; - ret = request_firmware(&fw, "sx1301_agc.bin", &spi->dev); + ret = request_firmware(&fw, "sx1301_agc.bin", priv->dev); if (ret) { - dev_err(&spi->dev, "agc firmware file load failed\n"); + dev_err(priv->dev, "agc firmware file load failed\n"); return ret; } - if (fw->size != 8192) { - dev_err(&spi->dev, "unexpected agc firmware size\n"); - release_firmware(fw); - return -EINVAL; - } - - ret = sx1301_load_firmware(spi, 1, fw->data, fw->size); + ret = sx1301_load_firmware(priv, 1, fw); release_firmware(fw); if (ret) return ret; @@ -886,6 +850,7 @@ static int sx1301_probe(struct spi_device *spi) spi_set_drvdata(spi, netdev); SET_NETDEV_DEV(netdev, &spi->dev); priv->dev = &spi->dev; + priv->spi = spi; priv->regmap = devm_regmap_init_spi(spi, &sx1301_regmap_config); if (IS_ERR(priv->regmap)) { From patchwork Tue Aug 7 17:32:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954602 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UaDYZI8l"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6H3jq4z9rvt for ; Wed, 8 Aug 2018 03:32:39 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390284AbeHGTsA (ORCPT ); Tue, 7 Aug 2018 15:48:00 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:35593 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389712AbeHGTr7 (ORCPT ); Tue, 7 Aug 2018 15:47:59 -0400 Received: by mail-wr1-f67.google.com with SMTP id g1-v6so13044186wru.2 for ; Tue, 07 Aug 2018 10:32:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=kDCb8k+kN+tFgSMUqYhmdEKhcnRpMOxgnozw8xBJx4o=; b=UaDYZI8lB4fX6RUUaJFLiIfh+DJqwEzNGNsRc14GZ1CEBAt4XXtdRyaOjKgBOseF5S bwij8PlmhDnqVcRABD6rHRqRWxcPqVxmiaqGQ0wTJz2XqreYp8KDBTmiuxKL6DHFHjv1 BnWDZL0Qw2wVH8PY11pj9Gv4GuiIIohkpHeG5bcWP3CxeuqJrOklyh+MsZN8n8ERY7bl UGQkhY9GSw2kaer7hzXcKBOOe2BYHAgVoGEQUWENbZZIaWOW6uGkxPw2fd6zJrkInr7V j41V+3W6vRjEx3YhpQsQE+o/0WWQA0QlW6jJFokGI5hPNXV2kRs+eYLtJqYdfUT6A1K3 dtZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=kDCb8k+kN+tFgSMUqYhmdEKhcnRpMOxgnozw8xBJx4o=; b=E8E/EJ5giLw2g/heVbg6aUBGjMSQuolsTy83h9qCToedZQyO6nhru55qOpOw/NbxJ/ uWYrZgrGxw5vLy5b46OtTV906+bTGm25XfknXbbDw8JE8+zK7KSfmfkDZYZn4mXO3TL5 RdNdfP3mBpDGEn1eZ6h9cr8czt1POI13SoWdfiK9jrK+C40koB+TqOhFehJqcepV6Whs 8Zpif7jgvXkRWL3530onKtrsNKZP9qVbtLCLvenxYZAMboIl20v9Cr3dhPj+OvoMC+oh 0FoQM0SITtzjzFyfCgk6bSSlxgIpa5W5yJWY6y/SPk2wLYvGveMmrFiLvjE19Zt25YzU Oa5w== X-Gm-Message-State: AOUpUlGMsCzYSJBaCbcxOV/+kW0h5iaTaN4sRkr8GsTFOYOXmUnKQqUg pTiLCTAHeWu6L7hGJIt18Dc0wuibQK8d9A== X-Google-Smtp-Source: AAOMgpchhONzRLO4xXR8kf7RSPm1prbAOlkYKMx1uiir7KHlNWvQJXj0SPHufuLV+lIT06MJCkw8Mw== X-Received: by 2002:adf:d842:: with SMTP id k2-v6mr13301769wrl.26.1533663156076; Tue, 07 Aug 2018 10:32:36 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:35 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 07/10] net: lora: sx1301: convert read and write burst to take priv data Date: Tue, 7 Aug 2018 18:32:08 +0100 Message-Id: <1533663131-16313-9-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten As part of standardising on passing our priv data around we convert read and write burst to take the priv data, there is a small compat step needed in the old _read and _write functions and will be removed in the next step. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index 4cec524..ab45b5b 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -312,18 +312,19 @@ static int sx1301_field_write(struct sx1301_priv *priv, return regmap_field_write(priv->regmap_fields[field_id], val); } -static int sx1301_read_burst(struct spi_device *spi, u8 reg, u8 *val, size_t len) +static int sx1301_read_burst(struct sx1301_priv *priv, u8 reg, u8 *val, size_t len) { u8 addr = reg & 0x7f; - return spi_write_then_read(spi, &addr, 1, val, len); + return spi_write_then_read(priv->spi, &addr, 1, val, len); } static int sx1301_read(struct spi_device *spi, u8 reg, u8 *val) { - return sx1301_read_burst(spi, reg, val, 1); + struct sx1301_priv *priv = spi_get_drvdata(spi); + return sx1301_read_burst(priv, reg, val, 1); } -static int sx1301_write_burst(struct spi_device *spi, u8 reg, const u8 *val, size_t len) +static int sx1301_write_burst(struct sx1301_priv *priv, u8 reg, const u8 *val, size_t len) { u8 addr = reg | BIT(7); struct spi_transfer xfr[2] = { @@ -331,12 +332,13 @@ static int sx1301_write_burst(struct spi_device *spi, u8 reg, const u8 *val, siz { .tx_buf = val, .len = len }, }; - return spi_sync_transfer(spi, xfr, 2); + return spi_sync_transfer(priv->spi, xfr, 2); } static int sx1301_write(struct spi_device *spi, u8 reg, u8 val) { - return sx1301_write_burst(spi, reg, &val, 1); + struct sx1301_priv *priv = spi_get_drvdata(spi); + return sx1301_write_burst(priv, reg, &val, 1); } static int sx1301_page_switch(struct spi_device *spi, u8 page) @@ -551,7 +553,7 @@ static int sx1301_load_firmware(struct sx1301_priv *priv, int mcu, const struct if (ret) return ret; - ret = sx1301_write_burst(priv->spi, REG_MCU_PROM_DATA, fw->data, fw->size); + ret = sx1301_write_burst(priv, REG_MCU_PROM_DATA, fw->data, fw->size); if (ret) { dev_err(priv->dev, "MCU prom data write failed\n"); return ret; @@ -567,7 +569,7 @@ static int sx1301_load_firmware(struct sx1301_priv *priv, int mcu, const struct if (!buf) return -ENOMEM; - ret = sx1301_read_burst(priv->spi, REG_MCU_PROM_DATA, buf, fw->size); + ret = sx1301_read_burst(priv, REG_MCU_PROM_DATA, buf, fw->size); if (ret) { dev_err(priv->dev, "MCU prom data read failed\n"); return ret; From patchwork Tue Aug 7 17:32:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954603 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="t2nJCiiW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6J482Zz9rvt for ; Wed, 8 Aug 2018 03:32:40 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390288AbeHGTsB (ORCPT ); Tue, 7 Aug 2018 15:48:01 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:53398 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389361AbeHGTsB (ORCPT ); Tue, 7 Aug 2018 15:48:01 -0400 Received: by mail-wm0-f67.google.com with SMTP id s9-v6so18255035wmh.3 for ; Tue, 07 Aug 2018 10:32:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=z/0X+l0WWJEeULcbLvmWfoKxdPWx6ekR/nPK+Iy5WMY=; b=t2nJCiiWfO+KL+ITgrw0jPqJeLKoCUdiNF4wHhV624Qx0xdTmJjzgAnBOC/5xdCgJZ /dySr+EMKqBQ4iQ10xoTaB4NZfFPnFc3EtM+l9VZNg3ruNYLIelD/cUh3uf3Mn5tTFtQ IX4c7+2N3t9OegITDCM3O3SJ03LV2aCfJDNXmrn+hkfAaTLDfe7YCtW2ukHonOCcoPsR dwvkI2bR50Jh/TnVfTP6I2QihN4UXMW31AwRhIlgAwnCND8JBI9+Mlc7FAh6FN2MT8NF 0sIYVzHAuLi+Tc+1kzYe6CBrGPV2a8nngSf8EmEd/wFHU1yTLmu0zn4tSf7MZjf5Aid+ FQFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=z/0X+l0WWJEeULcbLvmWfoKxdPWx6ekR/nPK+Iy5WMY=; b=kfujwyxM/n8LjmdeD4hpQY8V5ALoAdgXo2+TWPUFx8/HTDjVPmUS1E0gqXqwey4w8l XIfvh2b47QdGJ9O6b4Wai9KAmvczznGJ7FZ71q5vXEpLW8jhTqIMiUM97NBEmW2KNFD7 WOGq/y+u8t6e9wXs5wXmMWHReBTw1Z6Vtb72VkzkxRsW5njuHpwL4L2W8CdOFsqSawfA +bMJ7+7u6tx0BXKcWqXl6TezhI1IrwmIb+btqMRjbyBilT3Pq0jDL+OFIJiV5h/CKdtt p5G+B8a2cua0WPxSAMROpa2SSohfTwzZP6gx2k9lChvCMWqMfWxKMyzbttxhXslCYTZb m77A== X-Gm-Message-State: AOUpUlGeqc9c1WmXSQDnMCXr3tBQYVXrSuWFv1noOeM9imyqiuMadHAU JJAelHr3rpzNOVk2O32kTI8= X-Google-Smtp-Source: AA+uWPxmyrbA9XTwb+dPBpgxz0g/XWhens4pWM1QuZ4FHS/26tfpLkmhzPbtpSBQShYHgXhAcnAdYg== X-Received: by 2002:a1c:2208:: with SMTP id i8-v6mr2165291wmi.105.1533663157613; Tue, 07 Aug 2018 10:32:37 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:36 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 08/10] net: lora: sx1301: convert read and write to priv pointer Date: Tue, 7 Aug 2018 18:32:09 +0100 Message-Id: <1533663131-16313-10-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten Convert the next layer of read and writes to our private pointer, once again compatiblity later in the page read and write layer. The page functions will be removed with this full stack as page switches are handled by regmap automatically. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index ab45b5b..f84a6ce 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -318,9 +318,8 @@ static int sx1301_read_burst(struct sx1301_priv *priv, u8 reg, u8 *val, size_t l return spi_write_then_read(priv->spi, &addr, 1, val, len); } -static int sx1301_read(struct spi_device *spi, u8 reg, u8 *val) +static int sx1301_read(struct sx1301_priv *priv, u8 reg, u8 *val) { - struct sx1301_priv *priv = spi_get_drvdata(spi); return sx1301_read_burst(priv, reg, val, 1); } @@ -335,9 +334,8 @@ static int sx1301_write_burst(struct sx1301_priv *priv, u8 reg, const u8 *val, s return spi_sync_transfer(priv->spi, xfr, 2); } -static int sx1301_write(struct spi_device *spi, u8 reg, u8 val) +static int sx1301_write(struct sx1301_priv *priv, u8 reg, u8 val) { - struct sx1301_priv *priv = spi_get_drvdata(spi); return sx1301_write_burst(priv, reg, &val, 1); } @@ -350,7 +348,7 @@ static int sx1301_page_switch(struct spi_device *spi, u8 page) return 0; dev_dbg(&spi->dev, "switching to page %u\n", (unsigned)page); - ret = sx1301_write(spi, REG_PAGE_RESET, page & 0x3); + ret = sx1301_write(priv, REG_PAGE_RESET, page & 0x3); if (ret) { dev_err(&spi->dev, "switching to page %u failed\n", (unsigned)page); return ret; @@ -364,23 +362,25 @@ static int sx1301_page_switch(struct spi_device *spi, u8 page) static int sx1301_page_read(struct spi_device *spi, u8 page, u8 reg, u8 *val) { int ret; + struct sx1301_priv *priv = spi_get_drvdata(spi); ret = sx1301_page_switch(spi, page); if (ret) return ret; - return sx1301_read(spi, reg, val); + return sx1301_read(priv, reg, val); } static int sx1301_page_write(struct spi_device *spi, u8 page, u8 reg, u8 val) { int ret; + struct sx1301_priv *priv = spi_get_drvdata(spi); ret = sx1301_page_switch(spi, page); if (ret) return ret; - return sx1301_write(spi, reg, val); + return sx1301_write(priv, reg, val); } #define REG_RADIO_X_DATA 0 @@ -666,7 +666,7 @@ static int sx1301_agc_calibrate(struct spi_device *spi) return ret; } - ret = sx1301_read(spi, REG_EMERGENCY_FORCE, &val); + ret = sx1301_read(priv, REG_EMERGENCY_FORCE, &val); if (ret) { dev_err(&spi->dev, "emergency force read failed\n"); return ret; @@ -674,7 +674,7 @@ static int sx1301_agc_calibrate(struct spi_device *spi) val &= ~REG_EMERGENCY_FORCE_HOST_CTRL; - ret = sx1301_write(spi, REG_EMERGENCY_FORCE, val); + ret = sx1301_write(priv, REG_EMERGENCY_FORCE, val); if (ret) { dev_err(&spi->dev, "emergency force write failed\n"); return ret; @@ -683,7 +683,7 @@ static int sx1301_agc_calibrate(struct spi_device *spi) dev_err(&spi->dev, "starting calibration...\n"); msleep(2300); - ret = sx1301_read(spi, REG_EMERGENCY_FORCE, &val); + ret = sx1301_read(priv, REG_EMERGENCY_FORCE, &val); if (ret) { dev_err(&spi->dev, "emergency force read (1) failed\n"); return ret; @@ -691,13 +691,13 @@ static int sx1301_agc_calibrate(struct spi_device *spi) val |= REG_EMERGENCY_FORCE_HOST_CTRL; - ret = sx1301_write(spi, REG_EMERGENCY_FORCE, val); + ret = sx1301_write(priv, REG_EMERGENCY_FORCE, val); if (ret) { dev_err(&spi->dev, "emergency force write (1) failed\n"); return ret; } - ret = sx1301_read(spi, REG_MCU_AGC_STATUS, &val); + ret = sx1301_read(priv, REG_MCU_AGC_STATUS, &val); if (ret) { dev_err(&spi->dev, "AGC status read failed\n"); return ret; From patchwork Tue Aug 7 17:32:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954604 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="pUQhqH12"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6N75lkz9rvt for ; Wed, 8 Aug 2018 03:32:44 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390289AbeHGTsF (ORCPT ); Tue, 7 Aug 2018 15:48:05 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:33829 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389361AbeHGTsF (ORCPT ); Tue, 7 Aug 2018 15:48:05 -0400 Received: by mail-wr1-f67.google.com with SMTP id c13-v6so16538369wrt.1 for ; Tue, 07 Aug 2018 10:32:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=t8ZJo4v4brCziy76WKqQEjU5rpsQ+u6GKTCbrmnD0ZE=; b=pUQhqH121GzC18g9CtEmO4o3FhHd2LXLxgiOfCrXJCIy1JnQZz3j/AhhPUGis+hncq tXbn9QqjaLRrA5s3rOfZCHaBgAW+2Mn0uJ+1pobB2cG4SX7Cobim4PMk9kffqexKAId5 1tXHywV10kG6+4Auj7vje1DuqKlkvlJuTDHXntlldJhR1LuwMerOK5ERC/ISMDiHyI+x kSEjjBRyw1nnsIxqcOHEfI/YeJQD8KZtRQUYs1MQbFx3a438DxSDNi6y6mvtCnGox+de 6DpWz70qh89ipOlYs8MbvSRFQkzG3YcK62so8ISB/873EyOcP9N4yLy7JIb/RKcRI+EL 0FiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=t8ZJo4v4brCziy76WKqQEjU5rpsQ+u6GKTCbrmnD0ZE=; b=svb+eH5o07izM6eEut6wzqBuhKwa3X0NUMvicPSyijiSLbpbX2GWsLgTpwRK70yJGh 5TAzZvfxkTVzmnGH4UunPIgmM2SpSTMRondOON2AZIGoNOrU60DLpkI8QhLBDu8Yp0iM Hm1PEQdERvu5lJ3XwPhOuzy3HnO3axwOX5KMuK0gpcedbIIZuawxR5mPNxje8mhGyiT9 murwB/uEVt65iseeiWC/Gw3fRd9dq1iImVRYDxvt0UzHVAkvOZ3dCKBRTOKmIFCP0mwz KHPa6otL62JGEwdMGExL3FTiOlFmEygcrlnPdQxVkT/55IDpB9wzKpdgfpYx7r7aQMFs nuBQ== X-Gm-Message-State: AOUpUlHWls0at9pIr5dS9jXd6c2K/pbxjlQ6cv/esgPzmM+Jo6AOwhZS VlEIhv3BiCO/1zzhKiJQ/QA= X-Google-Smtp-Source: AAOMgpcoZEjgbLDLufoIqdDOgLinmPg7tY5iNwzrdHX8vHKcWYuzLXUFF2zCXjoigEBnkurPbF7FUg== X-Received: by 2002:adf:9546:: with SMTP id 64-v6mr12903123wrs.257.1533663159548; Tue, 07 Aug 2018 10:32:39 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:38 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 09/10] net: lora: sx1301: convert agc calibrate to regmap functions Date: Tue, 7 Aug 2018 18:32:10 +0100 Message-Id: <1533663131-16313-11-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten We convert the AGC calibration function over to regmap and take the opportunity to make the expected firmware versions defines. Switch to taking a pointer to our private data. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 101 ++++++++++++---------------------------------- 1 file changed, 26 insertions(+), 75 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index f84a6ce..21b3f9a 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -589,123 +589,74 @@ static int sx1301_load_firmware(struct sx1301_priv *priv, int mcu, const struct return 0; } -static int sx1301_agc_calibrate(struct spi_device *spi) +static int sx1301_agc_calibrate(struct sx1301_priv *priv) { const struct firmware *fw; - struct sx1301_priv *priv = spi_get_drvdata(spi); u8 val; int ret; + unsigned int cal; ret = request_firmware(&fw, "sx1301_agc_calibration.bin", priv->dev); if (ret) { - dev_err(&spi->dev, "agc cal firmware file load failed\n"); + dev_err(priv->dev, "AGC CAL firmware file load failed\n"); return ret; } ret = sx1301_load_firmware(priv, 1, fw); release_firmware(fw); if (ret) { - dev_err(&spi->dev, "agc cal firmware load failed\n"); - return ret; - } - - ret = sx1301_page_read(spi, 0, 105, &val); - if (ret) { - dev_err(&spi->dev, "0|105 read failed\n"); + dev_err(priv->dev, "AGC CAL firmware load failed\n"); return ret; } - val &= ~REG_0_105_FORCE_HOST_RADIO_CTRL; - - ret = sx1301_page_write(spi, 0, 105, val); - if (ret) { - dev_err(&spi->dev, "0|105 write failed\n"); + ret = sx1301_field_write(priv, F_FORCE_HOST_RADIO_CTRL, 0); + if (ret) return ret; - } val = BIT(4); /* with DAC gain=3 */ if (false) val |= BIT(5); /* SX1255 */ - ret = sx1301_page_write(spi, 0, REG_0_RADIO_SELECT, val); - if (ret) { - dev_err(&spi->dev, "radio select write failed\n"); - return ret; - } - - ret = sx1301_page_read(spi, 0, REG_0_MCU, &val); - if (ret) { - dev_err(&spi->dev, "MCU read (0) failed\n"); + ret = regmap_write(priv->regmap, SX1301_CHRS, val); + if (ret) return ret; - } - - val &= ~REG_0_MCU_RST_1; - ret = sx1301_page_write(spi, 0, REG_0_MCU, val); - if (ret) { - dev_err(&spi->dev, "MCU write (0) failed\n"); + ret = sx1301_field_write(priv, F_MCU_RST_1, 0); + if (ret) return ret; - } ret = sx1301_agc_ram_read(priv, 0x20, &val); if (ret) { - dev_err(&spi->dev, "AGC RAM data read failed\n"); + dev_err(priv->dev, "AGC RAM data read failed\n"); return ret; } - dev_info(&spi->dev, "AGC calibration firmware version %u\n", (unsigned)val); + dev_info(priv->dev, "AGC calibration firmware version %u\n", (unsigned)val); - if (val != 2) { - dev_err(&spi->dev, "unexpected firmware version, expecting %u\n", 2); + if (val != SX1301_MCU_AGC_CAL_FW_VERSION) { + dev_err(priv->dev, "unexpected firmware version, expecting %u\n", + SX1301_MCU_AGC_CAL_FW_VERSION); return -ENXIO; } - ret = sx1301_page_switch(spi, 3); - if (ret) { - dev_err(&spi->dev, "page switch 3 failed\n"); - return ret; - } - - ret = sx1301_read(priv, REG_EMERGENCY_FORCE, &val); - if (ret) { - dev_err(&spi->dev, "emergency force read failed\n"); - return ret; - } - - val &= ~REG_EMERGENCY_FORCE_HOST_CTRL; - - ret = sx1301_write(priv, REG_EMERGENCY_FORCE, val); - if (ret) { - dev_err(&spi->dev, "emergency force write failed\n"); + ret = sx1301_field_write(priv, F_EMERGENCY_FORCE_HOST_CTRL, 0); + if (ret) return ret; - } - dev_err(&spi->dev, "starting calibration...\n"); + dev_err(priv->dev, "starting calibration...\n"); msleep(2300); - ret = sx1301_read(priv, REG_EMERGENCY_FORCE, &val); - if (ret) { - dev_err(&spi->dev, "emergency force read (1) failed\n"); - return ret; - } - - val |= REG_EMERGENCY_FORCE_HOST_CTRL; - - ret = sx1301_write(priv, REG_EMERGENCY_FORCE, val); - if (ret) { - dev_err(&spi->dev, "emergency force write (1) failed\n"); + ret = sx1301_field_write(priv, F_EMERGENCY_FORCE_HOST_CTRL, 1); + if (ret) return ret; - } - ret = sx1301_read(priv, REG_MCU_AGC_STATUS, &val); - if (ret) { - dev_err(&spi->dev, "AGC status read failed\n"); + ret = regmap_read(priv->regmap, SX1301_AGCSTS, &cal); + if (ret) return ret; - } - dev_info(&spi->dev, "AGC status: %02x\n", (unsigned)val); - if ((val & (BIT(7) | BIT(0))) != (BIT(7) | BIT(0))) { - dev_err(&spi->dev, "AGC calibration failed\n"); + dev_info(priv->dev, "AGC status: %02x\n", cal); + if ((cal & (BIT(7) | BIT(0))) != (BIT(7) | BIT(0))) { + dev_err(priv->dev, "AGC calibration failed\n"); return -ENXIO; } @@ -985,7 +936,7 @@ static int sx1301_probe(struct spi_device *spi) /* calibration */ - ret = sx1301_agc_calibrate(spi); + ret = sx1301_agc_calibrate(priv); if (ret) return ret; From patchwork Tue Aug 7 17:32:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 954605 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="FiadZCfn"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41lM6P5f8xz9ryt for ; Wed, 8 Aug 2018 03:32:45 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390293AbeHGTsG (ORCPT ); Tue, 7 Aug 2018 15:48:06 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:37412 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727056AbeHGTsF (ORCPT ); Tue, 7 Aug 2018 15:48:05 -0400 Received: by mail-wm0-f66.google.com with SMTP id n11-v6so18955341wmc.2 for ; Tue, 07 Aug 2018 10:32:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=WFROPA3d/JAcAQPOSGLBq5QOHvzqkpyFCjWWI3T07dE=; b=FiadZCfnDmFNLWkr12y9jQviUc3UVs2aMdB3LlQ1PvSiicr38Bv3Qfta3ZZHmzCWoL M8UAkYRknbPS+gW2yzN269kU8SnChKNXE3iNyZUZ+RaR/kivHTjbi6Tii+XbGf2CUaKr BAuif+UG57qnDKYkOuWF1MU/T9G3bNha6bxQO7AKFPaxyP1f+vpZKh6snbr7Tx8vKPdI KonESeFreGFlBJuQbTaR9rPcXfKCxxGsiEZeupnT7MSoDevEy7qZ+ENgPkXBEQ/d4Bsy jwd4b7yHp8l2PnJRh15zDKZ6XpdUu6Izn5zobTAi71l3lPfyy4U1bS88E6ytQkV6JUHd vPIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=WFROPA3d/JAcAQPOSGLBq5QOHvzqkpyFCjWWI3T07dE=; b=p9RDW90gs2BbdZB0+jTU6Xl0wcz1RhJiSy+6NaGPm3mfTgM30GitQsEaFfXJAuOvAw DnwGa1SSZHyY/uB+vf4CpHy/amOdT9vQES/0LhKpL1uRFy88P/y3qVx2ZZfXFzEL3YJ/ IPZKkpDGVavb/arryC+P1o8vhSn1JLQi8IUzoU2zuWEoYzPh6BwJAfvPOEk8PFdHe8P3 wfWQQfIW/E75IUoFSPh95bnMsmjZdYxmabbMzKt70TRQIkDi4p9awkvqqA0UR4MougMx XhJGQ807JtPshI4AlLybV2knIH/hN623i/cJwbSLC8A6AsDpEnHC9zB60RtNg8msIsem QvHA== X-Gm-Message-State: AOUpUlHL+oQpQpGtURu4qBQNQzrFwaSObRC1Tr/WDbFxjiWEvpG6cjFX tcpSZr8/0Oet2d2TFlXFcbs/9UVMBJywhQ== X-Google-Smtp-Source: AA+uWPxigCrX47uCMnAgD8GysD0rco+66vXvy4RYiK9ar3FYkiLrdVFvBCU1bf+3j3xBVbj0TYb1Tw== X-Received: by 2002:a1c:bb86:: with SMTP id l128-v6mr2300745wmf.26.1533663161319; Tue, 07 Aug 2018 10:32:41 -0700 (PDT) Received: from Lappy.lan (196.98.125.91.dyn.plus.net. [91.125.98.196]) by smtp.gmail.com with ESMTPSA id m207-v6sm3234263wma.31.2018.08.07.10.32.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Aug 2018 10:32:40 -0700 (PDT) From: Ben Whitten To: afaerber@suse.de, starnight@g.ncu.edu.tw, hasnain.virk@arm.com Cc: netdev@vger.kernel.org, Ben Whitten Subject: [PATCH lora-next 10/10] net: lora: sx1301: convert all firmware to regmap Date: Tue, 7 Aug 2018 18:32:11 +0100 Message-Id: <1533663131-16313-12-git-send-email-ben.whitten@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> References: <1533663131-16313-1-git-send-email-ben.whitten@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The last stage in the probe function loads the final firmwares to the sx1301. Signed-off-by: Ben Whitten --- drivers/net/lora/sx1301.c | 67 ++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 39 deletions(-) diff --git a/drivers/net/lora/sx1301.c b/drivers/net/lora/sx1301.c index 21b3f9a..7f4bfa1 100644 --- a/drivers/net/lora/sx1301.c +++ b/drivers/net/lora/sx1301.c @@ -663,16 +663,15 @@ static int sx1301_agc_calibrate(struct sx1301_priv *priv) return 0; } -static int sx1301_load_all_firmware(struct spi_device *spi) +static int sx1301_load_all_firmware(struct sx1301_priv *priv) { - struct sx1301_priv *priv = spi_get_drvdata(spi); const struct firmware *fw; u8 val; int ret; ret = request_firmware(&fw, "sx1301_arb.bin", priv->dev); if (ret) { - dev_err(priv->dev, "arb firmware file load failed\n"); + dev_err(priv->dev, "ARB firmware file load failed\n"); return ret; } @@ -683,7 +682,7 @@ static int sx1301_load_all_firmware(struct spi_device *spi) ret = request_firmware(&fw, "sx1301_agc.bin", priv->dev); if (ret) { - dev_err(priv->dev, "agc firmware file load failed\n"); + dev_err(priv->dev, "AGC firmware file load failed\n"); return ret; } @@ -692,63 +691,53 @@ static int sx1301_load_all_firmware(struct spi_device *spi) if (ret) return ret; - ret = sx1301_page_read(spi, 0, 105, &val); - if (ret) { - dev_err(&spi->dev, "0|105 read failed\n"); + ret = sx1301_field_write(priv, F_FORCE_HOST_RADIO_CTRL, 0); + if (ret) return ret; - } - - val &= ~(REG_0_105_FORCE_HOST_RADIO_CTRL | REG_0_105_FORCE_HOST_FE_CTRL | REG_0_105_FORCE_DEC_FILTER_GAIN); - - ret = sx1301_page_write(spi, 0, 105, val); - if (ret) { - dev_err(&spi->dev, "0|105 write failed\n"); + ret = sx1301_field_write(priv, F_FORCE_HOST_FE_CTRL, 0); + if (ret) return ret; - } - - ret = sx1301_page_write(spi, 0, REG_0_RADIO_SELECT, 0); - if (ret) { - dev_err(&spi->dev, "radio select write failed\n"); + ret = sx1301_field_write(priv, F_FORCE_DEC_FILTER_GAIN, 0); + if (ret) return ret; - } - ret = sx1301_page_read(spi, 0, REG_0_MCU, &val); - if (ret) { - dev_err(&spi->dev, "MCU read (0) failed\n"); + ret = regmap_write(priv->regmap, SX1301_CHRS, 0); + if (ret) return ret; - } - - val &= ~(REG_0_MCU_RST_1 | REG_0_MCU_RST_0); - ret = sx1301_page_write(spi, 0, REG_0_MCU, val); - if (ret) { - dev_err(&spi->dev, "MCU write (0) failed\n"); + /* Release the CPUs */ + ret = sx1301_field_write(priv, F_MCU_RST_0, 0); + if (ret) + return ret; + ret = sx1301_field_write(priv, F_MCU_RST_1, 0); + if (ret) return ret; - } ret = sx1301_agc_ram_read(priv, 0x20, &val); if (ret) { - dev_err(&spi->dev, "AGC RAM data read failed\n"); + dev_err(priv->dev, "AGC RAM data read failed\n"); return ret; } - dev_info(&spi->dev, "AGC firmware version %u\n", (unsigned)val); + dev_info(priv->dev, "AGC firmware version %u\n", (unsigned)val); - if (val != 4) { - dev_err(&spi->dev, "unexpected firmware version, expecting %u\n", 4); + if (val != SX1301_MCU_AGC_FW_VERSION) { + dev_err(priv->dev, "unexpected firmware version, expecting %u\n", + SX1301_MCU_AGC_FW_VERSION); return -ENXIO; } ret = sx1301_arb_ram_read(priv, 0x20, &val); if (ret) { - dev_err(&spi->dev, "ARB RAM data read failed\n"); + dev_err(priv->dev, "ARB RAM data read failed\n"); return ret; } - dev_info(&spi->dev, "ARB firmware version %u\n", (unsigned)val); + dev_info(priv->dev, "ARB firmware version %u\n", (unsigned)val); - if (val != 1) { - dev_err(&spi->dev, "unexpected firmware version, expecting %u\n", 1); + if (val != SX1301_MCU_ARB_FW_VERSION) { + dev_err(priv->dev, "unexpected firmware version, expecting %u\n", + SX1301_MCU_ARB_FW_VERSION); return -ENXIO; } @@ -942,7 +931,7 @@ static int sx1301_probe(struct spi_device *spi) /* TODO */ - ret = sx1301_load_all_firmware(spi); + ret = sx1301_load_all_firmware(priv); if (ret) return ret;