Received: by 10.213.65.68 with SMTP id h4csp1317660imn; Thu, 29 Mar 2018 02:24:17 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+ZKS+FY7pMZvPeymc4eHUgVcLVAN0lfzYxLM1G85kHtY5AH8FQXufb22DqbEjQVUAa+STH X-Received: by 10.98.163.214 with SMTP id q83mr5718307pfl.94.1522315456937; Thu, 29 Mar 2018 02:24:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522315456; cv=none; d=google.com; s=arc-20160816; b=zJyhLUBI8izrnI8qbx03o1jOYQpphcPaWncXBlVssojud7ZgY9g3z8KuJpgr+7HDPu Fd79drs7EATdRyJHE8rcuTcMyDSAx0wkj5MyH5iCmDnyhWhPAucrtNTeW7ZQK2/ftUds 1tsx1sryu1HvfXRQsm8TQasP3QtPOIQoGEGRKpChqhx2xHREzVux6471nL3o+Lxl9mpv Zl2+CNEvD36SFNFRDSm4G/0IHtuyd+Bjsin8iAc2RGcc6CeEGBwlhFVGhSEmzljRjLNa J1pPhiVXAisd8gb3MxV+v4/7brpiYOxPS2JFPtaARp+r3IChQh2LyYqGBJellpviMv/i 7pDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=HHsnVWfUU37YI1fAKhBmIQcaiQUNiQcxDWxyu/lIHBw=; b=AogqvBpV0yOHtYV0sbE2JWN+6I0Kat98lBQe/dzFcUXt/CcNiU4Kt9+knHUT7xeWwj m0M/NezSUlouI3TjUQ/r6yN18IU/YkkmKXZa6EEmHRgf5IRqu3RwVApgtUx2u/qS34Z7 jjq1k4+3wTZ+SKZ7TVwq5EFGCd5n9ZvPhRHMbytiICNmeYMwADJOnmfKAGZQZX/DsV5A FrZJg5UrlMlCidBLVmON/u9375lxXWjmHy0am3glakAhIFpKhTZw8g/dp1NYVrj+UAcQ qpEDK7g72ErVmr3hecw3Dxmz1MioCCDvyHf3ufmxQRyLIXE20530B8kRMyrO2ddUmT0o gGtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=cFFITWdc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ay2-v6si5222728plb.749.2018.03.29.02.24.02; Thu, 29 Mar 2018 02:24:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=cFFITWdc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752199AbeC2JXE (ORCPT + 99 others); Thu, 29 Mar 2018 05:23:04 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:42277 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750735AbeC2JW7 (ORCPT ); Thu, 29 Mar 2018 05:22:59 -0400 Received: by mail-pf0-f194.google.com with SMTP id a16so2828155pfn.9; Thu, 29 Mar 2018 02:22:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HHsnVWfUU37YI1fAKhBmIQcaiQUNiQcxDWxyu/lIHBw=; b=cFFITWdcC2npJKzsesTrlgRm+4o3BqXwXUUt2Iup4XoygxylIeEO4d7ZIKqRBd51JF BjNSgNNKPHEgD9ncGxGA5oNrcTA4Iy8Z3+qFemo3+DTiLmA38pPr2MtD4Q86S//Rv+8k 9hR43ZkjJjb/kHO9Pk75MeSq1m0bpvzL2jsEqxSyXQiahOKozbXZqFu0eIN9mha23b2P 9DPLV874O9ml+2PKaHjt4GaCZ8m0gx8R1T6pm4qY7W0nHugeZvr8pKrE1AN1nPZOsEc2 uYWKtE7o76jUXNQCHwtNYYIup8ZVquYltu8a7NvVtrDe8+lieqT6ClxttPezRlgztsBy CwQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HHsnVWfUU37YI1fAKhBmIQcaiQUNiQcxDWxyu/lIHBw=; b=OTd3xBhlb5d7EiUflWyEMkP9CtGn29o7lH45ex+pfE6HoUsbrFXuflgzF8W9sfA7fA lwUvGW92hUlSytv14oQ+bm0siQSJ1vgGTVIlqTV2Emu1pkmU2N3xqOw3j+Y5SG98FFvM SJKvgFmcf5MOcfSLIwyJQKXzyCxb0uSdPwoKX1jECyORiyQuqD3Tw8t/ng4MNaM/7Itu ZoNxXit3xql38t4DPwgWYMnmJnTavVQUoWF9OBm0HSq2bqmilsCPdVoi8rwQFU4wCY9S KArRnM+V45Rbm+YcuvPN7PgkiTuJRlN60z1ym8dn4BEfIV1PjmcbuE2UfrfAL5MuR/E+ HO/w== X-Gm-Message-State: AElRT7Gz4OGFOxUrBv0s/iibgBvYmV3H9ztsF6fRDKZB5qe7u/CSuxYm 68QmMYbGZXfccPGtZ1KQ5vX8ow== X-Received: by 10.98.200.9 with SMTP id z9mr5825266pff.128.1522315378695; Thu, 29 Mar 2018 02:22:58 -0700 (PDT) Received: from shreeya-VirtualBox ([103.212.140.137]) by smtp.gmail.com with ESMTPSA id t14sm10426540pfa.74.2018.03.29.02.22.57 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 29 Mar 2018 02:22:58 -0700 (PDT) From: Shreeya Patel To: jic23@kernel.org, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, Michael.Hennerich@analog.com, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, devel@driverdev.osuosl.org, daniel.baluta@gmail.com Cc: Shreeya Patel Subject: [PATCH v6 6/6] Staging: iio: adis16209: Move adis16209 driver out of staging Date: Thu, 29 Mar 2018 14:52:51 +0530 Message-Id: X-Mailer: git-send-email 2.7.4 In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move the adis16209 driver out of staging directory and merge to the mainline IIO subsystem. Signed-off-by: Shreeya Patel --- Changes in v6 -Move driver adis16209 from staging to mainline IIO subsystem after complete cleanup of it. drivers/iio/accel/Kconfig | 12 ++ drivers/iio/accel/Makefile | 1 + drivers/iio/accel/adis16209.c | 330 ++++++++++++++++++++++++++++++++++ drivers/staging/iio/accel/Kconfig | 12 -- drivers/staging/iio/accel/Makefile | 1 - drivers/staging/iio/accel/adis16209.c | 330 ---------------------------------- 6 files changed, 343 insertions(+), 343 deletions(-) create mode 100644 drivers/iio/accel/adis16209.c delete mode 100644 drivers/staging/iio/accel/adis16209.c diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig index c6d9517..f95f43c 100644 --- a/drivers/iio/accel/Kconfig +++ b/drivers/iio/accel/Kconfig @@ -5,6 +5,18 @@ menu "Accelerometers" +config ADIS16209 + tristate "Analog Devices ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer" + depends on SPI + select IIO_ADIS_LIB + select IIO_ADIS_LIB_BUFFER if IIO_BUFFER + help + Say Y here to build support for Analog Devices adis16209 dual-axis digital inclinometer + and accelerometer. + + To compile this driver as a module, say M here: the module will be + called adis16209. + config ADXL345 tristate diff --git a/drivers/iio/accel/Makefile b/drivers/iio/accel/Makefile index 368aedb..40861b9 100644 --- a/drivers/iio/accel/Makefile +++ b/drivers/iio/accel/Makefile @@ -4,6 +4,7 @@ # # When adding new entries keep the list in alphabetical order +obj-$(CONFIG_ADIS16209) += adis16209.o obj-$(CONFIG_ADXL345) += adxl345_core.o obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o obj-$(CONFIG_ADXL345_SPI) += adxl345_spi.o diff --git a/drivers/iio/accel/adis16209.c b/drivers/iio/accel/adis16209.c new file mode 100644 index 0000000..cc50667 --- /dev/null +++ b/drivers/iio/accel/adis16209.c @@ -0,0 +1,330 @@ +/* + * ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer + * + * Copyright 2010 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define ADIS16209_STARTUP_DELAY_MS 220 +#define ADIS16209_FLASH_CNT_REG 0x00 + +/* Data Output Register Definitions */ +#define ADIS16209_SUPPLY_OUT_REG 0x02 +#define ADIS16209_XACCL_OUT_REG 0x04 +#define ADIS16209_YACCL_OUT_REG 0x06 +/* Output, auxiliary ADC input */ +#define ADIS16209_AUX_ADC_REG 0x08 +/* Output, temperature */ +#define ADIS16209_TEMP_OUT_REG 0x0A +/* Output, +/- 90 degrees X-axis inclination */ +#define ADIS16209_XINCL_OUT_REG 0x0C +#define ADIS16209_YINCL_OUT_REG 0x0E +/* Output, +/-180 vertical rotational position */ +#define ADIS16209_ROT_OUT_REG 0x10 + +/* + * Calibration Register Definitions. + * Acceleration, inclination or rotation offset null. + */ +#define ADIS16209_XACCL_NULL_REG 0x12 +#define ADIS16209_YACCL_NULL_REG 0x14 +#define ADIS16209_XINCL_NULL_REG 0x16 +#define ADIS16209_YINCL_NULL_REG 0x18 +#define ADIS16209_ROT_NULL_REG 0x1A + +/* Alarm Register Definitions */ +#define ADIS16209_ALM_MAG1_REG 0x20 +#define ADIS16209_ALM_MAG2_REG 0x22 +#define ADIS16209_ALM_SMPL1_REG 0x24 +#define ADIS16209_ALM_SMPL2_REG 0x26 +#define ADIS16209_ALM_CTRL_REG 0x28 + +#define ADIS16209_AUX_DAC_REG 0x30 +#define ADIS16209_GPIO_CTRL_REG 0x32 +#define ADIS16209_SMPL_PRD_REG 0x36 +#define ADIS16209_AVG_CNT_REG 0x38 +#define ADIS16209_SLP_CNT_REG 0x3A + +#define ADIS16209_MSC_CTRL_REG 0x34 +#define ADIS16209_MSC_CTRL_PWRUP_SELF_TEST BIT(10) +#define ADIS16209_MSC_CTRL_SELF_TEST_EN BIT(8) +#define ADIS16209_MSC_CTRL_DATA_RDY_EN BIT(2) +/* Data-ready polarity: 1 = active high, 0 = active low */ +#define ADIS16209_MSC_CTRL_ACTIVE_HIGH BIT(1) +#define ADIS16209_MSC_CTRL_DATA_RDY_DIO2 BIT(0) + +#define ADIS16209_STAT_REG 0x3C +#define ADIS16209_STAT_ALARM2 BIT(9) +#define ADIS16209_STAT_ALARM1 BIT(8) +#define ADIS16209_STAT_SELFTEST_FAIL_BIT 5 +#define ADIS16209_STAT_SPI_FAIL_BIT 3 +#define ADIS16209_STAT_FLASH_UPT_FAIL_BIT 2 +/* Power supply above 3.625 V */ +#define ADIS16209_STAT_POWER_HIGH_BIT 1 +/* Power supply below 3.15 V */ +#define ADIS16209_STAT_POWER_LOW_BIT 0 + +#define ADIS16209_CMD_REG 0x3E +#define ADIS16209_CMD_SW_RESET BIT(7) +#define ADIS16209_CMD_CLEAR_STAT BIT(4) +#define ADIS16209_CMD_FACTORY_CAL BIT(1) + +#define ADIS16209_ERROR_ACTIVE BIT(14) + +enum adis16209_scan { + ADIS16209_SCAN_SUPPLY, + ADIS16209_SCAN_ACC_X, + ADIS16209_SCAN_ACC_Y, + ADIS16209_SCAN_AUX_ADC, + ADIS16209_SCAN_TEMP, + ADIS16209_SCAN_INCLI_X, + ADIS16209_SCAN_INCLI_Y, + ADIS16209_SCAN_ROT, +}; + +static const u8 adis16209_addresses[8][1] = { + [ADIS16209_SCAN_SUPPLY] = { }, + [ADIS16209_SCAN_AUX_ADC] = { }, + [ADIS16209_SCAN_ACC_X] = { ADIS16209_XACCL_NULL_REG }, + [ADIS16209_SCAN_ACC_Y] = { ADIS16209_YACCL_NULL_REG }, + [ADIS16209_SCAN_INCLI_X] = { ADIS16209_XINCL_NULL_REG }, + [ADIS16209_SCAN_INCLI_Y] = { ADIS16209_YINCL_NULL_REG }, + [ADIS16209_SCAN_ROT] = { }, + [ADIS16209_SCAN_TEMP] = { }, +}; + +static int adis16209_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, + int val2, + long mask) +{ + struct adis *st = iio_priv(indio_dev); + int m; + + if (mask != IIO_CHAN_INFO_CALIBBIAS) + return -EINVAL; + + switch (chan->type) { + case IIO_ACCEL: + case IIO_INCLI: + m = GENMASK(13, 0); + break; + default: + return -EINVAL; + } + + return adis_write_reg_16(st, adis16209_addresses[chan->scan_index][0], + val & m); +} + +static int adis16209_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int *val, int *val2, + long mask) +{ + struct adis *st = iio_priv(indio_dev); + int ret; + int bits; + u8 addr; + s16 val16; + + switch (mask) { + case IIO_CHAN_INFO_RAW: + return adis_single_conversion(indio_dev, chan, + ADIS16209_ERROR_ACTIVE, val); + case IIO_CHAN_INFO_SCALE: + switch (chan->type) { + case IIO_VOLTAGE: + *val = 0; + switch (chan->channel) { + case 0: + *val2 = 305180; /* 0.30518 mV */ + break; + case 1: + *val2 = 610500; /* 0.6105 mV */ + break; + default: + return -EINVAL; + } + return IIO_VAL_INT_PLUS_MICRO; + case IIO_TEMP: + *val = -470; + *val2 = 0; + return IIO_VAL_INT_PLUS_MICRO; + case IIO_ACCEL: + /* + * IIO base unit for sensitivity of accelerometer + * is milli g. + * 1 LSB represents 0.244 mg. + */ + *val = 0; + *val2 = IIO_G_TO_M_S_2(244140); + return IIO_VAL_INT_PLUS_NANO; + case IIO_INCLI: + case IIO_ROT: + /* + * IIO base units for rotation are degrees. + * 1 LSB represents 0.025 milli degrees. + */ + *val = 0; + *val2 = 25000; + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } + break; + case IIO_CHAN_INFO_OFFSET: + /* + * The raw ADC value is 0x4FE when the temperature + * is 45 degrees and the scale factor per milli + * degree celcius is -470. + */ + *val = 25000 / -470 - 0x4FE; + return IIO_VAL_INT; + case IIO_CHAN_INFO_CALIBBIAS: + switch (chan->type) { + case IIO_ACCEL: + bits = 14; + break; + default: + return -EINVAL; + } + addr = adis16209_addresses[chan->scan_index][0]; + ret = adis_read_reg_16(st, addr, &val16); + if (ret) + return ret; + + *val = sign_extend32(val16, bits - 1); + return IIO_VAL_INT; + } + return -EINVAL; +} + +static const struct iio_chan_spec adis16209_channels[] = { + ADIS_SUPPLY_CHAN(ADIS16209_SUPPLY_OUT_REG, ADIS16209_SCAN_SUPPLY, + 0, 14), + ADIS_TEMP_CHAN(ADIS16209_TEMP_OUT_REG, ADIS16209_SCAN_TEMP, 0, 12), + ADIS_ACCEL_CHAN(X, ADIS16209_XACCL_OUT_REG, ADIS16209_SCAN_ACC_X, + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), + ADIS_ACCEL_CHAN(Y, ADIS16209_YACCL_OUT_REG, ADIS16209_SCAN_ACC_Y, + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), + ADIS_AUX_ADC_CHAN(ADIS16209_AUX_ADC_REG, ADIS16209_SCAN_AUX_ADC, 0, 12), + ADIS_INCLI_CHAN(X, ADIS16209_XINCL_OUT_REG, ADIS16209_SCAN_INCLI_X, + 0, 0, 14), + ADIS_INCLI_CHAN(Y, ADIS16209_YINCL_OUT_REG, ADIS16209_SCAN_INCLI_Y, + 0, 0, 14), + ADIS_ROT_CHAN(X, ADIS16209_ROT_OUT_REG, ADIS16209_SCAN_ROT, 0, 0, 14), + IIO_CHAN_SOFT_TIMESTAMP(8) +}; + +static const struct iio_info adis16209_info = { + .read_raw = adis16209_read_raw, + .write_raw = adis16209_write_raw, + .update_scan_mode = adis_update_scan_mode, +}; + +static const char * const adis16209_status_error_msgs[] = { + [ADIS16209_STAT_SELFTEST_FAIL_BIT] = "Self test failure", + [ADIS16209_STAT_SPI_FAIL_BIT] = "SPI failure", + [ADIS16209_STAT_FLASH_UPT_FAIL_BIT] = "Flash update failed", + [ADIS16209_STAT_POWER_HIGH_BIT] = "Power supply above 3.625V", + [ADIS16209_STAT_POWER_LOW_BIT] = "Power supply below 3.15V", +}; + +static const struct adis_data adis16209_data = { + .read_delay = 30, + .msc_ctrl_reg = ADIS16209_MSC_CTRL_REG, + .glob_cmd_reg = ADIS16209_CMD_REG, + .diag_stat_reg = ADIS16209_STAT_REG, + + .self_test_mask = ADIS16209_MSC_CTRL_SELF_TEST_EN, + .self_test_no_autoclear = true, + .startup_delay = ADIS16209_STARTUP_DELAY_MS, + + .status_error_msgs = adis16209_status_error_msgs, + .status_error_mask = BIT(ADIS16209_STAT_SELFTEST_FAIL_BIT) | + BIT(ADIS16209_STAT_SPI_FAIL_BIT) | + BIT(ADIS16209_STAT_FLASH_UPT_FAIL_BIT) | + BIT(ADIS16209_STAT_POWER_HIGH_BIT) | + BIT(ADIS16209_STAT_POWER_LOW_BIT), +}; + +static int adis16209_probe(struct spi_device *spi) +{ + struct iio_dev *indio_dev; + struct adis *st; + int ret; + + indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); + if (!indio_dev) + return -ENOMEM; + + st = iio_priv(indio_dev); + spi_set_drvdata(spi, indio_dev); + + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16209_info; + indio_dev->channels = adis16209_channels; + indio_dev->num_channels = ARRAY_SIZE(adis16209_channels); + indio_dev->modes = INDIO_DIRECT_MODE; + + ret = adis_init(st, indio_dev, spi, &adis16209_data); + if (ret) + return ret; + + ret = adis_setup_buffer_and_trigger(st, indio_dev, NULL); + if (ret) + return ret; + + ret = adis_initial_startup(st); + if (ret) + goto error_cleanup_buffer_trigger; + ret = iio_device_register(indio_dev); + if (ret) + goto error_cleanup_buffer_trigger; + + return 0; + +error_cleanup_buffer_trigger: + adis_cleanup_buffer_and_trigger(st, indio_dev); + return ret; +} + +static int adis16209_remove(struct spi_device *spi) +{ + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct adis *st = iio_priv(indio_dev); + + iio_device_unregister(indio_dev); + adis_cleanup_buffer_and_trigger(st, indio_dev); + + return 0; +} + +static struct spi_driver adis16209_driver = { + .driver = { + .name = "adis16209", + }, + .probe = adis16209_probe, + .remove = adis16209_remove, +}; +module_spi_driver(adis16209_driver); + +MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); +MODULE_DESCRIPTION("Analog Devices ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("spi:adis16209"); diff --git a/drivers/staging/iio/accel/Kconfig b/drivers/staging/iio/accel/Kconfig index c6b0f5e..bf8e43b 100644 --- a/drivers/staging/iio/accel/Kconfig +++ b/drivers/staging/iio/accel/Kconfig @@ -27,18 +27,6 @@ config ADIS16203 To compile this driver as a module, say M here: the module will be called adis16203. -config ADIS16209 - tristate "Analog Devices ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer" - depends on SPI - select IIO_ADIS_LIB - select IIO_ADIS_LIB_BUFFER if IIO_BUFFER - help - Say Y here to build support for Analog Devices adis16209 dual-axis digital inclinometer - and accelerometer. - - To compile this driver as a module, say M here: the module will be - called adis16209. - config ADIS16240 tristate "Analog Devices ADIS16240 Programmable Impact Sensor and Recorder" depends on SPI diff --git a/drivers/staging/iio/accel/Makefile b/drivers/staging/iio/accel/Makefile index 5d8ad21..ccbcac2 100644 --- a/drivers/staging/iio/accel/Makefile +++ b/drivers/staging/iio/accel/Makefile @@ -4,5 +4,4 @@ obj-$(CONFIG_ADIS16201) += adis16201.o obj-$(CONFIG_ADIS16203) += adis16203.o -obj-$(CONFIG_ADIS16209) += adis16209.o obj-$(CONFIG_ADIS16240) += adis16240.o diff --git a/drivers/staging/iio/accel/adis16209.c b/drivers/staging/iio/accel/adis16209.c deleted file mode 100644 index cc50667..0000000 --- a/drivers/staging/iio/accel/adis16209.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer - * - * Copyright 2010 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#define ADIS16209_STARTUP_DELAY_MS 220 -#define ADIS16209_FLASH_CNT_REG 0x00 - -/* Data Output Register Definitions */ -#define ADIS16209_SUPPLY_OUT_REG 0x02 -#define ADIS16209_XACCL_OUT_REG 0x04 -#define ADIS16209_YACCL_OUT_REG 0x06 -/* Output, auxiliary ADC input */ -#define ADIS16209_AUX_ADC_REG 0x08 -/* Output, temperature */ -#define ADIS16209_TEMP_OUT_REG 0x0A -/* Output, +/- 90 degrees X-axis inclination */ -#define ADIS16209_XINCL_OUT_REG 0x0C -#define ADIS16209_YINCL_OUT_REG 0x0E -/* Output, +/-180 vertical rotational position */ -#define ADIS16209_ROT_OUT_REG 0x10 - -/* - * Calibration Register Definitions. - * Acceleration, inclination or rotation offset null. - */ -#define ADIS16209_XACCL_NULL_REG 0x12 -#define ADIS16209_YACCL_NULL_REG 0x14 -#define ADIS16209_XINCL_NULL_REG 0x16 -#define ADIS16209_YINCL_NULL_REG 0x18 -#define ADIS16209_ROT_NULL_REG 0x1A - -/* Alarm Register Definitions */ -#define ADIS16209_ALM_MAG1_REG 0x20 -#define ADIS16209_ALM_MAG2_REG 0x22 -#define ADIS16209_ALM_SMPL1_REG 0x24 -#define ADIS16209_ALM_SMPL2_REG 0x26 -#define ADIS16209_ALM_CTRL_REG 0x28 - -#define ADIS16209_AUX_DAC_REG 0x30 -#define ADIS16209_GPIO_CTRL_REG 0x32 -#define ADIS16209_SMPL_PRD_REG 0x36 -#define ADIS16209_AVG_CNT_REG 0x38 -#define ADIS16209_SLP_CNT_REG 0x3A - -#define ADIS16209_MSC_CTRL_REG 0x34 -#define ADIS16209_MSC_CTRL_PWRUP_SELF_TEST BIT(10) -#define ADIS16209_MSC_CTRL_SELF_TEST_EN BIT(8) -#define ADIS16209_MSC_CTRL_DATA_RDY_EN BIT(2) -/* Data-ready polarity: 1 = active high, 0 = active low */ -#define ADIS16209_MSC_CTRL_ACTIVE_HIGH BIT(1) -#define ADIS16209_MSC_CTRL_DATA_RDY_DIO2 BIT(0) - -#define ADIS16209_STAT_REG 0x3C -#define ADIS16209_STAT_ALARM2 BIT(9) -#define ADIS16209_STAT_ALARM1 BIT(8) -#define ADIS16209_STAT_SELFTEST_FAIL_BIT 5 -#define ADIS16209_STAT_SPI_FAIL_BIT 3 -#define ADIS16209_STAT_FLASH_UPT_FAIL_BIT 2 -/* Power supply above 3.625 V */ -#define ADIS16209_STAT_POWER_HIGH_BIT 1 -/* Power supply below 3.15 V */ -#define ADIS16209_STAT_POWER_LOW_BIT 0 - -#define ADIS16209_CMD_REG 0x3E -#define ADIS16209_CMD_SW_RESET BIT(7) -#define ADIS16209_CMD_CLEAR_STAT BIT(4) -#define ADIS16209_CMD_FACTORY_CAL BIT(1) - -#define ADIS16209_ERROR_ACTIVE BIT(14) - -enum adis16209_scan { - ADIS16209_SCAN_SUPPLY, - ADIS16209_SCAN_ACC_X, - ADIS16209_SCAN_ACC_Y, - ADIS16209_SCAN_AUX_ADC, - ADIS16209_SCAN_TEMP, - ADIS16209_SCAN_INCLI_X, - ADIS16209_SCAN_INCLI_Y, - ADIS16209_SCAN_ROT, -}; - -static const u8 adis16209_addresses[8][1] = { - [ADIS16209_SCAN_SUPPLY] = { }, - [ADIS16209_SCAN_AUX_ADC] = { }, - [ADIS16209_SCAN_ACC_X] = { ADIS16209_XACCL_NULL_REG }, - [ADIS16209_SCAN_ACC_Y] = { ADIS16209_YACCL_NULL_REG }, - [ADIS16209_SCAN_INCLI_X] = { ADIS16209_XINCL_NULL_REG }, - [ADIS16209_SCAN_INCLI_Y] = { ADIS16209_YINCL_NULL_REG }, - [ADIS16209_SCAN_ROT] = { }, - [ADIS16209_SCAN_TEMP] = { }, -}; - -static int adis16209_write_raw(struct iio_dev *indio_dev, - struct iio_chan_spec const *chan, - int val, - int val2, - long mask) -{ - struct adis *st = iio_priv(indio_dev); - int m; - - if (mask != IIO_CHAN_INFO_CALIBBIAS) - return -EINVAL; - - switch (chan->type) { - case IIO_ACCEL: - case IIO_INCLI: - m = GENMASK(13, 0); - break; - default: - return -EINVAL; - } - - return adis_write_reg_16(st, adis16209_addresses[chan->scan_index][0], - val & m); -} - -static int adis16209_read_raw(struct iio_dev *indio_dev, - struct iio_chan_spec const *chan, - int *val, int *val2, - long mask) -{ - struct adis *st = iio_priv(indio_dev); - int ret; - int bits; - u8 addr; - s16 val16; - - switch (mask) { - case IIO_CHAN_INFO_RAW: - return adis_single_conversion(indio_dev, chan, - ADIS16209_ERROR_ACTIVE, val); - case IIO_CHAN_INFO_SCALE: - switch (chan->type) { - case IIO_VOLTAGE: - *val = 0; - switch (chan->channel) { - case 0: - *val2 = 305180; /* 0.30518 mV */ - break; - case 1: - *val2 = 610500; /* 0.6105 mV */ - break; - default: - return -EINVAL; - } - return IIO_VAL_INT_PLUS_MICRO; - case IIO_TEMP: - *val = -470; - *val2 = 0; - return IIO_VAL_INT_PLUS_MICRO; - case IIO_ACCEL: - /* - * IIO base unit for sensitivity of accelerometer - * is milli g. - * 1 LSB represents 0.244 mg. - */ - *val = 0; - *val2 = IIO_G_TO_M_S_2(244140); - return IIO_VAL_INT_PLUS_NANO; - case IIO_INCLI: - case IIO_ROT: - /* - * IIO base units for rotation are degrees. - * 1 LSB represents 0.025 milli degrees. - */ - *val = 0; - *val2 = 25000; - return IIO_VAL_INT_PLUS_MICRO; - default: - return -EINVAL; - } - break; - case IIO_CHAN_INFO_OFFSET: - /* - * The raw ADC value is 0x4FE when the temperature - * is 45 degrees and the scale factor per milli - * degree celcius is -470. - */ - *val = 25000 / -470 - 0x4FE; - return IIO_VAL_INT; - case IIO_CHAN_INFO_CALIBBIAS: - switch (chan->type) { - case IIO_ACCEL: - bits = 14; - break; - default: - return -EINVAL; - } - addr = adis16209_addresses[chan->scan_index][0]; - ret = adis_read_reg_16(st, addr, &val16); - if (ret) - return ret; - - *val = sign_extend32(val16, bits - 1); - return IIO_VAL_INT; - } - return -EINVAL; -} - -static const struct iio_chan_spec adis16209_channels[] = { - ADIS_SUPPLY_CHAN(ADIS16209_SUPPLY_OUT_REG, ADIS16209_SCAN_SUPPLY, - 0, 14), - ADIS_TEMP_CHAN(ADIS16209_TEMP_OUT_REG, ADIS16209_SCAN_TEMP, 0, 12), - ADIS_ACCEL_CHAN(X, ADIS16209_XACCL_OUT_REG, ADIS16209_SCAN_ACC_X, - BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), - ADIS_ACCEL_CHAN(Y, ADIS16209_YACCL_OUT_REG, ADIS16209_SCAN_ACC_Y, - BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), - ADIS_AUX_ADC_CHAN(ADIS16209_AUX_ADC_REG, ADIS16209_SCAN_AUX_ADC, 0, 12), - ADIS_INCLI_CHAN(X, ADIS16209_XINCL_OUT_REG, ADIS16209_SCAN_INCLI_X, - 0, 0, 14), - ADIS_INCLI_CHAN(Y, ADIS16209_YINCL_OUT_REG, ADIS16209_SCAN_INCLI_Y, - 0, 0, 14), - ADIS_ROT_CHAN(X, ADIS16209_ROT_OUT_REG, ADIS16209_SCAN_ROT, 0, 0, 14), - IIO_CHAN_SOFT_TIMESTAMP(8) -}; - -static const struct iio_info adis16209_info = { - .read_raw = adis16209_read_raw, - .write_raw = adis16209_write_raw, - .update_scan_mode = adis_update_scan_mode, -}; - -static const char * const adis16209_status_error_msgs[] = { - [ADIS16209_STAT_SELFTEST_FAIL_BIT] = "Self test failure", - [ADIS16209_STAT_SPI_FAIL_BIT] = "SPI failure", - [ADIS16209_STAT_FLASH_UPT_FAIL_BIT] = "Flash update failed", - [ADIS16209_STAT_POWER_HIGH_BIT] = "Power supply above 3.625V", - [ADIS16209_STAT_POWER_LOW_BIT] = "Power supply below 3.15V", -}; - -static const struct adis_data adis16209_data = { - .read_delay = 30, - .msc_ctrl_reg = ADIS16209_MSC_CTRL_REG, - .glob_cmd_reg = ADIS16209_CMD_REG, - .diag_stat_reg = ADIS16209_STAT_REG, - - .self_test_mask = ADIS16209_MSC_CTRL_SELF_TEST_EN, - .self_test_no_autoclear = true, - .startup_delay = ADIS16209_STARTUP_DELAY_MS, - - .status_error_msgs = adis16209_status_error_msgs, - .status_error_mask = BIT(ADIS16209_STAT_SELFTEST_FAIL_BIT) | - BIT(ADIS16209_STAT_SPI_FAIL_BIT) | - BIT(ADIS16209_STAT_FLASH_UPT_FAIL_BIT) | - BIT(ADIS16209_STAT_POWER_HIGH_BIT) | - BIT(ADIS16209_STAT_POWER_LOW_BIT), -}; - -static int adis16209_probe(struct spi_device *spi) -{ - struct iio_dev *indio_dev; - struct adis *st; - int ret; - - indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); - if (!indio_dev) - return -ENOMEM; - - st = iio_priv(indio_dev); - spi_set_drvdata(spi, indio_dev); - - indio_dev->name = spi->dev.driver->name; - indio_dev->dev.parent = &spi->dev; - indio_dev->info = &adis16209_info; - indio_dev->channels = adis16209_channels; - indio_dev->num_channels = ARRAY_SIZE(adis16209_channels); - indio_dev->modes = INDIO_DIRECT_MODE; - - ret = adis_init(st, indio_dev, spi, &adis16209_data); - if (ret) - return ret; - - ret = adis_setup_buffer_and_trigger(st, indio_dev, NULL); - if (ret) - return ret; - - ret = adis_initial_startup(st); - if (ret) - goto error_cleanup_buffer_trigger; - ret = iio_device_register(indio_dev); - if (ret) - goto error_cleanup_buffer_trigger; - - return 0; - -error_cleanup_buffer_trigger: - adis_cleanup_buffer_and_trigger(st, indio_dev); - return ret; -} - -static int adis16209_remove(struct spi_device *spi) -{ - struct iio_dev *indio_dev = spi_get_drvdata(spi); - struct adis *st = iio_priv(indio_dev); - - iio_device_unregister(indio_dev); - adis_cleanup_buffer_and_trigger(st, indio_dev); - - return 0; -} - -static struct spi_driver adis16209_driver = { - .driver = { - .name = "adis16209", - }, - .probe = adis16209_probe, - .remove = adis16209_remove, -}; -module_spi_driver(adis16209_driver); - -MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); -MODULE_DESCRIPTION("Analog Devices ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("spi:adis16209"); -- 2.7.4