From patchwork Tue Mar 19 10:59:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Miguel Silva X-Patchwork-Id: 160561 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp3725108jad; Tue, 19 Mar 2019 03:59:46 -0700 (PDT) X-Google-Smtp-Source: APXvYqyW6h5VCUKGcb656tcHVLHoacJZLzy8b4XyEoKCfGgjwgoYebsPoiY3YZca+icBnQzieqEg X-Received: by 2002:a17:902:442:: with SMTP id 60mr17686883ple.107.1552993186418; Tue, 19 Mar 2019 03:59:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552993186; cv=none; d=google.com; s=arc-20160816; b=PbsTNZkQPkVZEVctHFpq9Je8amek4Rb8qaegz3vIV0mtgpd8jOrcVVEjd0ZLqy/8gb 9kSCXiP4a66qjQ83z0XT8wD2CH/fcxeRGTKwRoFAOIiuTExo+tf80gy5qbqaHO5j4w5L DONw8atlitWN+/F49xQHyjUy735H2GhqV6rLEWrtxr6rY4QGd2bKkifG8DuJGfBxQKry +SK/dFKyCQ7PZQjpglV++QK+6UmdMkytKaLQVxhmwZNHHc4zgUmPfS7ZUSvUT562LtMq D9x6fuLEVsP30B084Kv4ZG+l3Kjcez0rIefsUEb072u2ORW+j2h8Ta/+tS6ykwxSKvCI M1vA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=hsHbm6H4k3Rr7SoTD7ilcig3tjV30GukFS8w5W/eA04=; b=JHQGwCpmtZ5lMNUo4pJ8bwAej5xt4sHrpOUlzRwKzlJ/9fBfz6hX/Rovve408PKliK OrLdwXVXrZNcQnbVHmaNF2j8tkHkqF7H8BrL+v7XgITCTTTPvTbid3EfeYUN6i0gKGyk OPqECfyUjNi40MFCcUbYhTD3DMauKUzQtb0qJTezrrLaUHjpN2Iryp42uUiwOFtuPe95 qDm4TmtJrd+1oWWLFdeVlz15DG5Au0hlga1m5Cdu48j5EWf6FDUG5lJp4P5yRYN4DVm0 /0LuT/J++pjX/vYij8GENZ2H8sJq75hkMY+CjDRJ2MimXskcK7e7dNIKmx4iTW0ehb9+ q2JQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=pH5Qp7zL; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id gn10si11377812plb.94.2019.03.19.03.59.46; Tue, 19 Mar 2019 03:59:46 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-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=@linaro.org header.s=google header.b=pH5Qp7zL; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727243AbfCSK7p (ORCPT + 7 others); Tue, 19 Mar 2019 06:59:45 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:46490 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727418AbfCSK7p (ORCPT ); Tue, 19 Mar 2019 06:59:45 -0400 Received: by mail-wr1-f68.google.com with SMTP id o1so1147838wrs.13 for ; Tue, 19 Mar 2019 03:59:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hsHbm6H4k3Rr7SoTD7ilcig3tjV30GukFS8w5W/eA04=; b=pH5Qp7zL/iXdaa5T2jrHsR1bzlX0r9p8UliiyUdXNylEQESCOTMzD8LgxtgkrDUdpR 63FidAy8VGyBzQ9MiT9Dc3crSnGQOR4YV4PZOHhzcaU3rkrQ6dGcw6E6SBYFmS1jEabI 7o3d+6d+C533nprCk2gotpPEtKpWCzp8khsUjTHPQBKoJxj4R2SSOdz789s3wtt96SHi WtOdxVfLZawku3wVNoFa2kFiYcbnTWkFfYIF41AtlqRw4BUuoTIaZpg6H/ISbTdA6xiG 3H32f1h4O1k4QYMmcsnork0/RdytO4vvGakhcFZv0Wq/zMA0E/6OOgICz79UZow7CBuw tI9w== 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:mime-version:content-transfer-encoding; bh=hsHbm6H4k3Rr7SoTD7ilcig3tjV30GukFS8w5W/eA04=; b=Yb4ZwWW+MMgsPzjSq/88U+R8QxHPtthLt2aCrp0UF5PnBRBMGOyimczXt+xJ4kXclB 8+Hch3MZVwlonP0DWvEGEv57WWCGPZ3WKKQbPkYy8y2Il6PyC5VvEOtyifuOV8eYbHRa GkkNq9pukn8xlIbSZYSPNA+qzqu+B7fjSvS9t02GGDbzqNhCiQsyp+6f4cnENNM4yxpX a2X+qktPO6I+K7zaB7mBbxO4dDOuV+C6pW9CCU7KluvMFf4LyFfhqE1PD4/4WgiPW7bm xQKFMGGHTHs3RyiptWeU/Xn7sOk/dVBiyulrz5rQ4qGLxh7FtJzlHYVULd8ObNLswkdQ Ti7A== X-Gm-Message-State: APjAAAXFRuSNTvPiIgcY8XRdTkJEC09NKPThZ0K2YAi9/M2B4XmiAEgE I4AgSDpj8QLyjOkLyJzS63L6iA== X-Received: by 2002:adf:8367:: with SMTP id 94mr17274311wrd.46.1552993184059; Tue, 19 Mar 2019 03:59:44 -0700 (PDT) Received: from arch-late.local (a109-49-46-234.cpe.netcabo.pt. [109.49.46.234]) by smtp.gmail.com with ESMTPSA id h10sm4120052wmf.2.2019.03.19.03.59.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 03:59:43 -0700 (PDT) From: Rui Miguel Silva To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Shawn Guo , Rob Herring , Fabio Estevam Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rui Miguel Silva Subject: [PATCH v4 1/6] iio: gyro: add DT bindings to fxas21002c Date: Tue, 19 Mar 2019 10:59:20 +0000 Message-Id: <20190319105925.25863-2-rui.silva@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319105925.25863-1-rui.silva@linaro.org> References: <20190319105925.25863-1-rui.silva@linaro.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add device tree bindings for the FXAS21002C gyroscope. Signed-off-by: Rui Miguel Silva --- .../bindings/iio/gyroscope/nxp,fxas21002c.txt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/gyroscope/nxp,fxas21002c.txt -- 2.21.0 diff --git a/Documentation/devicetree/bindings/iio/gyroscope/nxp,fxas21002c.txt b/Documentation/devicetree/bindings/iio/gyroscope/nxp,fxas21002c.txt new file mode 100644 index 000000000000..465e104bbf14 --- /dev/null +++ b/Documentation/devicetree/bindings/iio/gyroscope/nxp,fxas21002c.txt @@ -0,0 +1,31 @@ +* NXP FXAS21002C Gyroscope device tree bindings + +http://www.nxp.com/products/sensors/gyroscopes/3-axis-digital-gyroscope:FXAS21002C + +Required properties: + - compatible : should be "nxp,fxas21002c" + - reg : the I2C address of the sensor or SPI chip select number for the + device. + - vdd-supply: phandle to the regulator that provides power to the sensor. + - vddio-supply: phandle to the regulator that provides power to the bus. + +Optional properties: + - reset-gpios : gpio used to reset the device, see gpio/gpio.txt + - interrupts : device support 2 interrupts, INT1 and INT2, + the interrupts can be triggered on rising or falling edges. + See interrupt-controller/interrupts.txt + - interrupt-names: should contain "INT1" or "INT2", the gyroscope interrupt + line in use. + - drive-open-drain: the interrupt/data ready line will be configured + as open drain, which is useful if several sensors share + the same interrupt line. This is a boolean property. + (This binding is taken from pinctrl/pinctrl-bindings.txt) + +Example: + +gyroscope@20 { + compatible = "nxp,fxas21002c"; + reg = <0x20>; + vdd-supply = <®_peri_3p15v>; + vddio-supply = <®_peri_3p15v>; +}; From patchwork Tue Mar 19 10:59:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Miguel Silva X-Patchwork-Id: 160563 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp3725197jad; Tue, 19 Mar 2019 03:59:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqw9In7KDUvq/p/08UANf2syATiO5NEnSUptFwm+/lebW3lzVg/ydzxglLM4Nb6CNdC2OwDH X-Received: by 2002:a63:5c66:: with SMTP id n38mr1219319pgm.15.1552993192654; Tue, 19 Mar 2019 03:59:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552993192; cv=none; d=google.com; s=arc-20160816; b=jTUcCC0SXVjdy6CO8f933nt2BUQVfE76KN5HZYhDauyJ9piJjRuuky7fvv4qe7PwAq N/zm28UDHbCrO+IFeJCpWqGJ1VNb1cQwJnW3/8QuUr7AksUARTVuRCIW8E9g12cWL919 R8L4bBoUAwNpqUT18DQ14o/nyCU4R489fRAL1BMbc2LkniV5lkEiN/i5MwAodtC1il2D pwB2BrbLcwKXUTBl2jCNJqwNI6CK+pzp9QOLUHK0HsIjvLzRzhikVPlGaG65meIDub+6 AiZ149+3VEVMr/My9lvhT+VizIgFVbmnwlKYfuYCNPMAeQ+8zqjZpK8HwaQ29hgpVLVE CqGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=691zDUiNQD1dB68gtVE9jNKi74ejhrvKtnsOsX1CacQ=; b=0p1d7DZt7LhQmVBPwa85jtSXIsh1G1BKUUEJcdrDhV/5Wvv2FLU0oj1Y9p7cDoP6aZ IJVohitZd9PXxUIvBOQ5QKFEJqMHUL+x1YJig/TnG5qSsE37PZKlnr6wKcHST2lgtMoE v60AF6Fu0BvtdO90RmXMxwtTy/Bxgqv+lHwUVC/hdTjRFwIzjbt9Asgwl4Aj3jw/CuYG n7LkjiDLYlA2x1kfUbWWqjxmnhlFbMajK9V4HK0sBoh/4WM2TRURcN2wH2Ld6Aav4uUT u8iVH6oafh6LLu98gmFkJWI/CitDLdNAQN9NNDMiD7ah7JpRNj4EtG4zmPlxzXUseWEb Dx4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=pZSBy4sY; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id gn10si11377812plb.94.2019.03.19.03.59.52; Tue, 19 Mar 2019 03:59:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-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=@linaro.org header.s=google header.b=pZSBy4sY; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727194AbfCSK7w (ORCPT + 7 others); Tue, 19 Mar 2019 06:59:52 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:42875 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727418AbfCSK7v (ORCPT ); Tue, 19 Mar 2019 06:59:51 -0400 Received: by mail-wr1-f68.google.com with SMTP id n9so16415135wrr.9 for ; Tue, 19 Mar 2019 03:59:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=691zDUiNQD1dB68gtVE9jNKi74ejhrvKtnsOsX1CacQ=; b=pZSBy4sYlE8KHtQWFMa2v/VlSBUPlYEqYD4am6FFJiR8nKFslOc4A5Rba8Siwlouxb /qxO3fgBbxFwuCoeghCod6xMJuDsQz1lPtw4WMLAnLchW3ursv9Is7b9lE3516hNwaGu 8gMUsweY/oUSwbONK1BOSYo0NT7FF25pAACM0hhCQcLTawFerCy0sED6JM4TQU4cU1p2 Rjw8Y2SS9qswlT7Xofi7wh9M9xhLi5i90VikJUOXpg55YfQRXNli1X/gdgd6xEi/4vJt 17IK7kMJoqhs/6m/isww7l9imBVbBgGic3ahNnBxjyjDJY0yS92PEAULAdBvKN9S2NB7 d6Tw== 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:mime-version:content-transfer-encoding; bh=691zDUiNQD1dB68gtVE9jNKi74ejhrvKtnsOsX1CacQ=; b=jKitmmbw1nLmiyNgLsDDagbmhWeGy/2tXwDgm685Pe9xNlMuahHGFrp5L66F8F5CcI ivX6bB/rQTKDvkXNH+/4tRltnlrxG4Dfgt7Q7fi4qK5iKsKhOT6i+etc7DwJliquotEB kl2BCBgmdI9aSs7dznSXYVsRdcT1G6I6qe7cqwLuE0hEQvWUonbdzF0CpbXttS5zHTR5 /FgJBUp8nrt721Zp0RZrnfNp3yGSQgZHWFVibe8teHpxGGVRNwTnQl0aVJsqhN8PrFUL +VWFLFCTU2RpoJcxMon7wFrYfFvg/KleIfXvaSx0oTjCrPASibmes/8RtbpvKw0DiATv 9U+A== X-Gm-Message-State: APjAAAWFqRFp5gjmg5fhcbfB+E7yFDl9zUqhjY+mKMlL/CZcuDgKX6fZ w3PMYJU7ZBcmCbJyCw4mLs1g9Q== X-Received: by 2002:adf:f846:: with SMTP id d6mr17163429wrq.53.1552993186951; Tue, 19 Mar 2019 03:59:46 -0700 (PDT) Received: from arch-late.local (a109-49-46-234.cpe.netcabo.pt. [109.49.46.234]) by smtp.gmail.com with ESMTPSA id h10sm4120052wmf.2.2019.03.19.03.59.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 03:59:46 -0700 (PDT) From: Rui Miguel Silva To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Shawn Guo , Rob Herring , Fabio Estevam Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rui Miguel Silva Subject: [PATCH v4 2/6] iio: gyro: add core driver for fxas21002c Date: Tue, 19 Mar 2019 10:59:21 +0000 Message-Id: <20190319105925.25863-3-rui.silva@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319105925.25863-1-rui.silva@linaro.org> References: <20190319105925.25863-1-rui.silva@linaro.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add core support for the NXP fxas21002c Tri-axis gyroscope, using the iio subsystem. It supports PM operations, axis reading, temperature, scale factor of the axis, high pass and low pass filtering, and sampling frequency selection. It will have extras modules to support the communication over i2c and spi. Signed-off-by: Rui Miguel Silva --- drivers/iio/gyro/Kconfig | 11 + drivers/iio/gyro/Makefile | 1 + drivers/iio/gyro/fxas21002c.h | 151 +++++ drivers/iio/gyro/fxas21002c_core.c | 987 +++++++++++++++++++++++++++++ 4 files changed, 1150 insertions(+) create mode 100644 drivers/iio/gyro/fxas21002c.h create mode 100644 drivers/iio/gyro/fxas21002c_core.c -- 2.21.0 diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig index 3126cf05e6b9..cfd2cf44bac8 100644 --- a/drivers/iio/gyro/Kconfig +++ b/drivers/iio/gyro/Kconfig @@ -73,6 +73,17 @@ config BMG160_SPI tristate select REGMAP_SPI +config FXAS21002C + tristate "NXP FXAS21002C Gyro Sensor" + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER + help + Say yes here to build support for NXP FXAS21002C Tri-axis Gyro + Sensor driver connected via I2C or SPI. + + This driver can also be built as a module. If so, the module + will be called fxas21002c_i2c or fxas21002c_spi. + config HID_SENSOR_GYRO_3D depends on HID_SENSOR_HUB select IIO_BUFFER diff --git a/drivers/iio/gyro/Makefile b/drivers/iio/gyro/Makefile index 295ec780c4eb..247dc600a602 100644 --- a/drivers/iio/gyro/Makefile +++ b/drivers/iio/gyro/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_ADXRS450) += adxrs450.o obj-$(CONFIG_BMG160) += bmg160_core.o obj-$(CONFIG_BMG160_I2C) += bmg160_i2c.o obj-$(CONFIG_BMG160_SPI) += bmg160_spi.o +obj-$(CONFIG_FXAS21002C) += fxas21002c_core.o obj-$(CONFIG_HID_SENSOR_GYRO_3D) += hid-sensor-gyro-3d.o diff --git a/drivers/iio/gyro/fxas21002c.h b/drivers/iio/gyro/fxas21002c.h new file mode 100644 index 000000000000..e21fd410950c --- /dev/null +++ b/drivers/iio/gyro/fxas21002c.h @@ -0,0 +1,151 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Driver for NXP FXAS21002C Gyroscope - Header + * + * Copyright (C) 2019 Linaro Ltd. + * + */ + +#ifndef FXAS21002C_H_ +#define FXAS21002C_H_ + +#include + +#define FXAS21002C_REG_STATUS 0x00 +#define FXAS21002C_REG_OUT_X_MSB 0x01 +#define FXAS21002C_REG_OUT_X_LSB 0x02 +#define FXAS21002C_REG_OUT_Y_MSB 0x03 +#define FXAS21002C_REG_OUT_Y_LSB 0x04 +#define FXAS21002C_REG_OUT_Z_MSB 0x05 +#define FXAS21002C_REG_OUT_Z_LSB 0x06 +#define FXAS21002C_REG_DR_STATUS 0x07 +#define FXAS21002C_REG_F_STATUS 0x08 +#define FXAS21002C_REG_F_SETUP 0x09 +#define FXAS21002C_REG_F_EVENT 0x0A +#define FXAS21002C_REG_INT_SRC_FLAG 0x0B +#define FXAS21002C_REG_WHO_AM_I 0x0C +#define FXAS21002C_REG_CTRL0 0x0D +#define FXAS21002C_REG_RT_CFG 0x0E +#define FXAS21002C_REG_RT_SRC 0x0F +#define FXAS21002C_REG_RT_THS 0x10 +#define FXAS21002C_REG_RT_COUNT 0x11 +#define FXAS21002C_REG_TEMP 0x12 +#define FXAS21002C_REG_CTRL1 0x13 +#define FXAS21002C_REG_CTRL2 0x14 +#define FXAS21002C_REG_CTRL3 0x15 + +enum fxas21002c_fields { + F_DR_STATUS, + F_OUT_X_MSB, + F_OUT_X_LSB, + F_OUT_Y_MSB, + F_OUT_Y_LSB, + F_OUT_Z_MSB, + F_OUT_Z_LSB, + /* DR_STATUS */ + F_ZYX_OW, F_Z_OW, F_Y_OW, F_X_OW, F_ZYX_DR, F_Z_DR, F_Y_DR, F_X_DR, + /* F_STATUS */ + F_OVF, F_WMKF, F_CNT, + /* F_SETUP */ + F_MODE, F_WMRK, + /* F_EVENT */ + F_EVENT, FE_TIME, + /* INT_SOURCE_FLAG */ + F_BOOTEND, F_SRC_FIFO, F_SRC_RT, F_SRC_DRDY, + /* WHO_AM_I */ + F_WHO_AM_I, + /* CTRL_REG0 */ + F_BW, F_SPIW, F_SEL, F_HPF_EN, F_FS, + /* RT_CFG */ + F_ELE, F_ZTEFE, F_YTEFE, F_XTEFE, + /* RT_SRC */ + F_EA, F_ZRT, F_ZRT_POL, F_YRT, F_YRT_POL, F_XRT, F_XRT_POL, + /* RT_THS */ + F_DBCNTM, F_THS, + /* RT_COUNT */ + F_RT_COUNT, + /* TEMP */ + F_TEMP, + /* CTRL_REG1 */ + F_RST, F_ST, F_DR, F_ACTIVE, F_READY, + /* CTRL_REG2 */ + F_INT_CFG_FIFO, F_INT_EN_FIFO, F_INT_CFG_RT, F_INT_EN_RT, + F_INT_CFG_DRDY, F_INT_EN_DRDY, F_IPOL, F_PP_OD, + /* CTRL_REG3 */ + F_WRAPTOONE, F_EXTCTRLEN, F_FS_DOUBLE, + /* MAX FIELDS */ + F_MAX_FIELDS, +}; + +static const struct reg_field fxas21002c_reg_fields[] = { + [F_DR_STATUS] = REG_FIELD(FXAS21002C_REG_STATUS, 0, 7), + [F_OUT_X_MSB] = REG_FIELD(FXAS21002C_REG_OUT_X_MSB, 0, 7), + [F_OUT_X_LSB] = REG_FIELD(FXAS21002C_REG_OUT_X_LSB, 0, 7), + [F_OUT_Y_MSB] = REG_FIELD(FXAS21002C_REG_OUT_Y_MSB, 0, 7), + [F_OUT_Y_LSB] = REG_FIELD(FXAS21002C_REG_OUT_Y_LSB, 0, 7), + [F_OUT_Z_MSB] = REG_FIELD(FXAS21002C_REG_OUT_Z_MSB, 0, 7), + [F_OUT_Z_LSB] = REG_FIELD(FXAS21002C_REG_OUT_Z_LSB, 0, 7), + [F_ZYX_OW] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 7, 7), + [F_Z_OW] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 6, 6), + [F_Y_OW] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 5, 5), + [F_X_OW] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 4, 4), + [F_ZYX_DR] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 3, 3), + [F_Z_DR] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 2, 2), + [F_Y_DR] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 1, 1), + [F_X_DR] = REG_FIELD(FXAS21002C_REG_DR_STATUS, 0, 0), + [F_OVF] = REG_FIELD(FXAS21002C_REG_F_STATUS, 7, 7), + [F_WMKF] = REG_FIELD(FXAS21002C_REG_F_STATUS, 6, 6), + [F_CNT] = REG_FIELD(FXAS21002C_REG_F_STATUS, 0, 5), + [F_MODE] = REG_FIELD(FXAS21002C_REG_F_SETUP, 6, 7), + [F_WMRK] = REG_FIELD(FXAS21002C_REG_F_SETUP, 0, 5), + [F_EVENT] = REG_FIELD(FXAS21002C_REG_F_EVENT, 5, 5), + [FE_TIME] = REG_FIELD(FXAS21002C_REG_F_EVENT, 0, 4), + [F_BOOTEND] = REG_FIELD(FXAS21002C_REG_INT_SRC_FLAG, 3, 3), + [F_SRC_FIFO] = REG_FIELD(FXAS21002C_REG_INT_SRC_FLAG, 2, 2), + [F_SRC_RT] = REG_FIELD(FXAS21002C_REG_INT_SRC_FLAG, 1, 1), + [F_SRC_DRDY] = REG_FIELD(FXAS21002C_REG_INT_SRC_FLAG, 0, 0), + [F_WHO_AM_I] = REG_FIELD(FXAS21002C_REG_WHO_AM_I, 0, 7), + [F_BW] = REG_FIELD(FXAS21002C_REG_CTRL0, 6, 7), + [F_SPIW] = REG_FIELD(FXAS21002C_REG_CTRL0, 5, 5), + [F_SEL] = REG_FIELD(FXAS21002C_REG_CTRL0, 3, 4), + [F_HPF_EN] = REG_FIELD(FXAS21002C_REG_CTRL0, 2, 2), + [F_FS] = REG_FIELD(FXAS21002C_REG_CTRL0, 0, 1), + [F_ELE] = REG_FIELD(FXAS21002C_REG_RT_CFG, 3, 3), + [F_ZTEFE] = REG_FIELD(FXAS21002C_REG_RT_CFG, 2, 2), + [F_YTEFE] = REG_FIELD(FXAS21002C_REG_RT_CFG, 1, 1), + [F_XTEFE] = REG_FIELD(FXAS21002C_REG_RT_CFG, 0, 0), + [F_EA] = REG_FIELD(FXAS21002C_REG_RT_SRC, 6, 6), + [F_ZRT] = REG_FIELD(FXAS21002C_REG_RT_SRC, 5, 5), + [F_ZRT_POL] = REG_FIELD(FXAS21002C_REG_RT_SRC, 4, 4), + [F_YRT] = REG_FIELD(FXAS21002C_REG_RT_SRC, 3, 3), + [F_YRT_POL] = REG_FIELD(FXAS21002C_REG_RT_SRC, 2, 2), + [F_XRT] = REG_FIELD(FXAS21002C_REG_RT_SRC, 1, 1), + [F_XRT_POL] = REG_FIELD(FXAS21002C_REG_RT_SRC, 0, 0), + [F_DBCNTM] = REG_FIELD(FXAS21002C_REG_RT_THS, 7, 7), + [F_THS] = REG_FIELD(FXAS21002C_REG_RT_SRC, 0, 6), + [F_RT_COUNT] = REG_FIELD(FXAS21002C_REG_RT_COUNT, 0, 7), + [F_TEMP] = REG_FIELD(FXAS21002C_REG_TEMP, 0, 7), + [F_RST] = REG_FIELD(FXAS21002C_REG_CTRL1, 6, 6), + [F_ST] = REG_FIELD(FXAS21002C_REG_CTRL1, 5, 5), + [F_DR] = REG_FIELD(FXAS21002C_REG_CTRL1, 2, 4), + [F_ACTIVE] = REG_FIELD(FXAS21002C_REG_CTRL1, 1, 1), + [F_READY] = REG_FIELD(FXAS21002C_REG_CTRL1, 0, 0), + [F_INT_CFG_FIFO] = REG_FIELD(FXAS21002C_REG_CTRL2, 7, 7), + [F_INT_EN_FIFO] = REG_FIELD(FXAS21002C_REG_CTRL2, 6, 6), + [F_INT_CFG_RT] = REG_FIELD(FXAS21002C_REG_CTRL2, 5, 5), + [F_INT_EN_RT] = REG_FIELD(FXAS21002C_REG_CTRL2, 4, 4), + [F_INT_CFG_DRDY] = REG_FIELD(FXAS21002C_REG_CTRL2, 3, 3), + [F_INT_EN_DRDY] = REG_FIELD(FXAS21002C_REG_CTRL2, 2, 2), + [F_IPOL] = REG_FIELD(FXAS21002C_REG_CTRL2, 1, 1), + [F_PP_OD] = REG_FIELD(FXAS21002C_REG_CTRL2, 0, 0), + [F_WRAPTOONE] = REG_FIELD(FXAS21002C_REG_CTRL3, 3, 3), + [F_EXTCTRLEN] = REG_FIELD(FXAS21002C_REG_CTRL3, 2, 2), + [F_FS_DOUBLE] = REG_FIELD(FXAS21002C_REG_CTRL3, 0, 0), +}; + +extern const struct dev_pm_ops fxas21002c_pm_ops; + +int fxas21002c_core_probe(struct device *dev, struct regmap *regmap, int irq, + const char *name); +void fxas21002c_core_remove(struct device *dev); +#endif diff --git a/drivers/iio/gyro/fxas21002c_core.c b/drivers/iio/gyro/fxas21002c_core.c new file mode 100644 index 000000000000..32d70a31a6e1 --- /dev/null +++ b/drivers/iio/gyro/fxas21002c_core.c @@ -0,0 +1,987 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Driver for NXP FXAS21002C Gyroscope - Core + * + * Copyright (C) 2019 Linaro Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "fxas21002c.h" + +#define FXAS21002C_CHIP_ID_1 0xD6 +#define FXAS21002C_CHIP_ID_2 0xD7 + +enum fxas21002c_mode_state { + FXAS21002C_MODE_STANDBY, + FXAS21002C_MODE_READY, + FXAS21002C_MODE_ACTIVE, +}; + +#define FXAS21002C_STANDBY_ACTIVE_TIME_MS 62 +#define FXAS21002C_READY_ACTIVE_TIME_MS 7 + +#define FXAS21002C_ODR_LIST_MAX 10 + +#define FXAS21002C_SCALE_FRACTIONAL 32 +#define FXAS21002C_RANGE_LIMIT_DOUBLE 2000 + +#define FXAS21002C_AXIS_TO_REG(axis) (FXAS21002C_REG_OUT_X_MSB + ((axis) * 2)) + +static const int fxas21002c_odr_values[] = { + 800, 400, 200, 100, 50, 25, 12, 12 +}; + +/* + * These values are taken from the low-pass filter cutoff frequency calculated + * ODR * 0.lpf_values. So, for ODR = 800Hz with a lpf value = 0.32 + * => LPF cutoff frequency = 800 * 0.32 = 256 Hz + */ +static const int fxas21002c_lpf_values[] = { + 32, 16, 8 +}; + +/* + * These values are taken from the high-pass filter cutoff frequency calculated + * ODR * 0.0hpf_values. So, for ODR = 800Hz with a hpf value = 0.018750 + * => HPF cutoff frequency = 800 * 0.018750 = 15 Hz + */ +static const int fxas21002c_hpf_values[] = { + 18750, 9625, 4875, 2475 +}; + +static const int fxas21002c_range_values[] = { + 4000, 2000, 1000, 500, 250 +}; + +struct fxas21002c_data { + u8 chip_id; + enum fxas21002c_mode_state mode; + enum fxas21002c_mode_state prev_mode; + + struct mutex lock; /* serialize data access */ + struct regmap *regmap; + struct regmap_field *regmap_fields[F_MAX_FIELDS]; + struct iio_trigger *dready_trig; + int irq; + + struct regulator *vdd; + struct regulator *vddio; + + /* + * DMA (thus cache coherency maintenance) requires the + * transfer buffers to live in their own cache lines. + */ + s16 buffer[8] ____cacheline_aligned; +}; + +enum fxas21002c_channel_index { + CHANNEL_SCAN_INDEX_X, + CHANNEL_SCAN_INDEX_Y, + CHANNEL_SCAN_INDEX_Z, + CHANNEL_SCAN_MAX, +}; + +static int fxas21002c_odr_hz_from_value(struct fxas21002c_data *data, u8 value) +{ + int odr_value_max = ARRAY_SIZE(fxas21002c_odr_values) - 1; + + value = min_t(u8, value, odr_value_max); + + return fxas21002c_odr_values[value]; +} + +static int fxas21002c_odr_value_from_hz(struct fxas21002c_data *data, + unsigned int hz) +{ + int odr_table_size = ARRAY_SIZE(fxas21002c_odr_values); + int i; + + for (i = 0; i < odr_table_size; i++) + if (fxas21002c_odr_values[i] == hz) + return i; + + return -EINVAL; +} + +static int fxas21002c_lpf_bw_from_value(struct fxas21002c_data *data, u8 value) +{ + int lpf_value_max = ARRAY_SIZE(fxas21002c_lpf_values) - 1; + + value = min_t(u8, value, lpf_value_max); + + return fxas21002c_lpf_values[value]; +} + +static int fxas21002c_lpf_value_from_bw(struct fxas21002c_data *data, + unsigned int hz) +{ + int lpf_table_size = ARRAY_SIZE(fxas21002c_lpf_values); + int i; + + for (i = 0; i < lpf_table_size; i++) + if (fxas21002c_lpf_values[i] == hz) + return i; + + return -EINVAL; +} + +static int fxas21002c_hpf_sel_from_value(struct fxas21002c_data *data, u8 value) +{ + int hpf_value_max = ARRAY_SIZE(fxas21002c_hpf_values) - 1; + + value = min_t(u8, value, hpf_value_max); + + return fxas21002c_hpf_values[value]; +} + +static int fxas21002c_hpf_value_from_sel(struct fxas21002c_data *data, + unsigned int hz) +{ + int hpf_table_size = ARRAY_SIZE(fxas21002c_hpf_values); + int i; + + for (i = 0; i < hpf_table_size; i++) + if (fxas21002c_hpf_values[i] == hz) + return i; + + return -EINVAL; +} + +static int fxas21002c_range_fs_from_value(struct fxas21002c_data *data, + u8 value) +{ + int range_value_max = ARRAY_SIZE(fxas21002c_range_values) - 1; + unsigned int fs_double; + int ret; + + /* We need to check if FS_DOUBLE is enabled to offset the value */ + ret = regmap_field_read(data->regmap_fields[F_FS_DOUBLE], &fs_double); + if (ret < 0) + return ret; + + if (!fs_double) + value += 1; + + value = min_t(u8, value, range_value_max); + + return fxas21002c_range_values[value]; +} + +static int fxas21002c_range_value_from_fs(struct fxas21002c_data *data, + unsigned int range) +{ + int range_table_size = ARRAY_SIZE(fxas21002c_range_values); + bool found = false; + int fs_double = 0; + int ret; + int i; + + for (i = 0; i < range_table_size; i++) + if (fxas21002c_range_values[i] == range) { + found = true; + break; + } + + if (!found) + return -EINVAL; + + if (range > FXAS21002C_RANGE_LIMIT_DOUBLE) + fs_double = 1; + + ret = regmap_field_write(data->regmap_fields[F_FS_DOUBLE], fs_double); + if (ret < 0) + return ret; + + return i; +} + +static int fxas21002c_mode_get(struct fxas21002c_data *data) +{ + unsigned int active; + unsigned int ready; + int ret; + + ret = regmap_field_read(data->regmap_fields[F_ACTIVE], &active); + if (ret < 0) + return ret; + if (active) + return FXAS21002C_MODE_ACTIVE; + + ret = regmap_field_read(data->regmap_fields[F_READY], &ready); + if (ret < 0) + return ret; + if (ready) + return FXAS21002C_MODE_READY; + + return FXAS21002C_MODE_STANDBY; +} + +static int fxas21002c_mode_set(struct fxas21002c_data *data, + enum fxas21002c_mode_state mode) +{ + int ret; + + if (mode == data->mode) + return 0; + + if (mode == FXAS21002C_MODE_READY) + ret = regmap_field_write(data->regmap_fields[F_READY], 1); + else + ret = regmap_field_write(data->regmap_fields[F_READY], 0); + if (ret < 0) + return ret; + + if (mode == FXAS21002C_MODE_ACTIVE) + ret = regmap_field_write(data->regmap_fields[F_ACTIVE], 1); + else + ret = regmap_field_write(data->regmap_fields[F_ACTIVE], 0); + if (ret < 0) + return ret; + + /* if going to active wait the setup times */ + if (mode == FXAS21002C_MODE_ACTIVE && + data->mode == FXAS21002C_MODE_STANDBY) + msleep_interruptible(FXAS21002C_STANDBY_ACTIVE_TIME_MS); + + if (data->mode == FXAS21002C_MODE_READY) + msleep_interruptible(FXAS21002C_READY_ACTIVE_TIME_MS); + + data->prev_mode = data->mode; + data->mode = mode; + + return ret; +} + +static int fxas21002c_write(struct fxas21002c_data *data, + enum fxas21002c_fields field, int bits) +{ + int actual_mode; + int ret; + + mutex_lock(&data->lock); + + actual_mode = fxas21002c_mode_get(data); + if (actual_mode < 0) { + ret = actual_mode; + goto out_unlock; + } + + ret = fxas21002c_mode_set(data, FXAS21002C_MODE_READY); + if (ret < 0) + goto out_unlock; + + ret = regmap_field_write(data->regmap_fields[field], bits); + if (ret < 0) + goto out_unlock; + + ret = fxas21002c_mode_set(data, data->prev_mode); + +out_unlock: + mutex_unlock(&data->lock); + + return ret; +} + +static int fxas21002c_pm_get(struct fxas21002c_data *data) +{ + struct device *dev = regmap_get_device(data->regmap); + int ret; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) + pm_runtime_put_noidle(dev); + + return ret; +} + +static int fxas21002c_pm_put(struct fxas21002c_data *data) +{ + struct device *dev = regmap_get_device(data->regmap); + + pm_runtime_mark_last_busy(dev); + + return pm_runtime_put_autosuspend(dev); +} + +static int fxas21002c_temp_get(struct fxas21002c_data *data, int *val) +{ + struct device *dev = regmap_get_device(data->regmap); + unsigned int temp; + int ret; + + mutex_lock(&data->lock); + ret = fxas21002c_pm_get(data); + if (ret < 0) + goto data_unlock; + + ret = regmap_field_read(data->regmap_fields[F_TEMP], &temp); + if (ret < 0) { + dev_err(dev, "failed to read temp: %d\n", ret); + goto data_unlock; + } + + *val = sign_extend32(temp, 7); + + ret = fxas21002c_pm_put(data); + if (ret < 0) + goto data_unlock; + + ret = IIO_VAL_INT; + +data_unlock: + mutex_unlock(&data->lock); + + return ret; +} + +static int fxas21002c_axis_get(struct fxas21002c_data *data, + int index, int *val) +{ + struct device *dev = regmap_get_device(data->regmap); + __be16 axis_be; + int ret; + + mutex_lock(&data->lock); + ret = fxas21002c_pm_get(data); + if (ret < 0) + goto data_unlock; + + ret = regmap_bulk_read(data->regmap, FXAS21002C_AXIS_TO_REG(index), + &axis_be, sizeof(axis_be)); + if (ret < 0) { + dev_err(dev, "failed to read axis: %d: %d\n", index, ret); + goto data_unlock; + } + + *val = sign_extend32(be16_to_cpu(axis_be), 15); + + ret = fxas21002c_pm_put(data); + if (ret < 0) + goto data_unlock; + + ret = IIO_VAL_INT; + +data_unlock: + mutex_unlock(&data->lock); + + return ret; +} + +static int fxas21002c_odr_get(struct fxas21002c_data *data, int *odr) +{ + unsigned int odr_bits; + int ret; + + mutex_lock(&data->lock); + ret = regmap_field_read(data->regmap_fields[F_DR], &odr_bits); + if (ret < 0) + goto data_unlock; + + *odr = fxas21002c_odr_hz_from_value(data, odr_bits); + + ret = IIO_VAL_INT; + +data_unlock: + mutex_unlock(&data->lock); + + return ret; +} + +static int fxas21002c_odr_set(struct fxas21002c_data *data, int odr) +{ + int odr_bits; + + odr_bits = fxas21002c_odr_value_from_hz(data, odr); + if (odr_bits < 0) + return odr_bits; + + return fxas21002c_write(data, F_DR, odr_bits); +} + +static int fxas21002c_lpf_get(struct fxas21002c_data *data, int *val2) +{ + unsigned int bw_bits; + int ret; + + mutex_lock(&data->lock); + ret = regmap_field_read(data->regmap_fields[F_BW], &bw_bits); + if (ret < 0) + goto data_unlock; + + *val2 = fxas21002c_lpf_bw_from_value(data, bw_bits) * 10000; + + ret = IIO_VAL_INT_PLUS_MICRO; + +data_unlock: + mutex_unlock(&data->lock); + + return ret; +} + +static int fxas21002c_lpf_set(struct fxas21002c_data *data, int bw) +{ + int bw_bits; + int odr; + int ret; + + bw_bits = fxas21002c_lpf_value_from_bw(data, bw); + if (bw_bits < 0) + return bw_bits; + + /* + * From table 33 of the device spec, for ODR = 25Hz and 12.5 value 0.08 + * is not allowed and for ODR = 12.5 value 0.16 is also not allowed + */ + ret = fxas21002c_odr_get(data, &odr); + if (ret < 0) + return -EINVAL; + + if ((odr == 25 && bw_bits > 0x01) || (odr == 12 && bw_bits > 0)) + return -EINVAL; + + return fxas21002c_write(data, F_BW, bw_bits); +} + +static int fxas21002c_hpf_get(struct fxas21002c_data *data, int *val2) +{ + unsigned int sel_bits; + int ret; + + mutex_lock(&data->lock); + ret = regmap_field_read(data->regmap_fields[F_SEL], &sel_bits); + if (ret < 0) + goto data_unlock; + + *val2 = fxas21002c_hpf_sel_from_value(data, sel_bits); + + ret = IIO_VAL_INT_PLUS_MICRO; + +data_unlock: + mutex_unlock(&data->lock); + + return ret; +} + +static int fxas21002c_hpf_set(struct fxas21002c_data *data, int sel) +{ + int sel_bits; + + sel_bits = fxas21002c_hpf_value_from_sel(data, sel); + if (sel_bits < 0) + return sel_bits; + + return fxas21002c_write(data, F_SEL, sel_bits); +} + +static int fxas21002c_scale_get(struct fxas21002c_data *data, int *val) +{ + int fs_bits; + int scale; + int ret = 0; + + mutex_lock(&data->lock); + ret = regmap_field_read(data->regmap_fields[F_FS], &fs_bits); + if (ret < 0) + goto data_unlock; + + scale = fxas21002c_range_fs_from_value(data, fs_bits); + if (scale < 0) { + ret = scale; + goto data_unlock; + } + + *val = scale; + +data_unlock: + mutex_unlock(&data->lock); + + return ret; +} + +static int fxas21002c_scale_set(struct fxas21002c_data *data, int range) +{ + int fs_bits; + + fs_bits = fxas21002c_range_value_from_fs(data, range); + if (fs_bits < 0) + return fs_bits; + + return fxas21002c_write(data, F_FS, fs_bits); +} + +static int fxas21002c_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int *val, + int *val2, long mask) +{ + struct fxas21002c_data *data = iio_priv(indio_dev); + int ret; + + switch (mask) { + case IIO_CHAN_INFO_RAW: + switch (chan->type) { + case IIO_TEMP: + return fxas21002c_temp_get(data, val); + case IIO_ANGL_VEL: + return fxas21002c_axis_get(data, chan->scan_index, val); + default: + return -EINVAL; + } + case IIO_CHAN_INFO_SCALE: + switch (chan->type) { + case IIO_ANGL_VEL: + *val2 = FXAS21002C_SCALE_FRACTIONAL; + ret = fxas21002c_scale_get(data, val); + if (ret < 0) + return ret; + + return IIO_VAL_FRACTIONAL; + default: + return -EINVAL; + } + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + *val = 0; + return fxas21002c_lpf_get(data, val2); + case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: + *val = 0; + return fxas21002c_hpf_get(data, val2); + case IIO_CHAN_INFO_SAMP_FREQ: + *val2 = 0; + return fxas21002c_odr_get(data, val); + default: + return -EINVAL; + } +} + +static int fxas21002c_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, int val, + int val2, long mask) +{ + struct fxas21002c_data *data = iio_priv(indio_dev); + int range; + + switch (mask) { + case IIO_CHAN_INFO_SAMP_FREQ: + if (val2) + return -EINVAL; + + return fxas21002c_odr_set(data, val); + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + if (val) + return -EINVAL; + + val2 = val2 / 10000; + return fxas21002c_lpf_set(data, val2); + case IIO_CHAN_INFO_SCALE: + switch (chan->type) { + case IIO_ANGL_VEL: + range = (((val * 1000 + val2 / 1000) * + FXAS21002C_SCALE_FRACTIONAL) / 1000); + return fxas21002c_scale_set(data, range); + default: + return -EINVAL; + } + case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: + return fxas21002c_hpf_set(data, val2); + default: + return -EINVAL; + } +} + +static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("12.5 25 50 100 200 400 800"); + +static IIO_CONST_ATTR(in_anglvel_filter_low_pass_3db_frequency_available, + "0.32 0.16 0.08"); + +static IIO_CONST_ATTR(in_anglvel_filter_high_pass_3db_frequency_available, + "0.018750 0.009625 0.004875 0.002475"); + +static IIO_CONST_ATTR(in_anglvel_scale_available, + "125.0 62.5 31.25 15.625 7.8125"); + +static struct attribute *fxas21002c_attributes[] = { + &iio_const_attr_sampling_frequency_available.dev_attr.attr, + &iio_const_attr_in_anglvel_filter_low_pass_3db_frequency_available.dev_attr.attr, + &iio_const_attr_in_anglvel_filter_high_pass_3db_frequency_available.dev_attr.attr, + &iio_const_attr_in_anglvel_scale_available.dev_attr.attr, + NULL, +}; + +static const struct attribute_group fxas21002c_attrs_group = { + .attrs = fxas21002c_attributes, +}; + +#define FXAS21002C_CHANNEL(_axis) { \ + .type = IIO_ANGL_VEL, \ + .modified = 1, \ + .channel2 = IIO_MOD_##_axis, \ + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) | \ + BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY) | \ + BIT(IIO_CHAN_INFO_SAMP_FREQ), \ + .scan_index = CHANNEL_SCAN_INDEX_##_axis, \ + .scan_type = { \ + .sign = 's', \ + .realbits = 16, \ + .storagebits = 16, \ + .endianness = IIO_BE, \ + }, \ +} + +static const struct iio_chan_spec fxas21002c_channels[] = { + { + .type = IIO_TEMP, + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), + .scan_index = -1, + }, + FXAS21002C_CHANNEL(X), + FXAS21002C_CHANNEL(Y), + FXAS21002C_CHANNEL(Z), +}; + +static const struct iio_info fxas21002c_info = { + .attrs = &fxas21002c_attrs_group, + .read_raw = &fxas21002c_read_raw, + .write_raw = &fxas21002c_write_raw, +}; + +static irqreturn_t fxas21002c_trigger_handler(int irq, void *p) +{ + struct iio_poll_func *pf = p; + struct iio_dev *indio_dev = pf->indio_dev; + struct fxas21002c_data *data = iio_priv(indio_dev); + int ret; + + mutex_lock(&data->lock); + ret = regmap_bulk_read(data->regmap, FXAS21002C_REG_OUT_X_MSB, + data->buffer, CHANNEL_SCAN_MAX * sizeof(s16)); + mutex_unlock(&data->lock); + if (ret < 0) + goto notify_done; + + iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, + pf->timestamp); + +notify_done: + iio_trigger_notify_done(indio_dev->trig); + + return IRQ_HANDLED; +} + +static int fxas21002c_chip_init(struct fxas21002c_data *data) +{ + struct device *dev = regmap_get_device(data->regmap); + unsigned int chip_id; + int ret; + + ret = regmap_field_read(data->regmap_fields[F_WHO_AM_I], &chip_id); + if (ret < 0) + return ret; + + if (chip_id != FXAS21002C_CHIP_ID_1 && + chip_id != FXAS21002C_CHIP_ID_2) { + dev_err(dev, "chip id 0x%02x is not supported\n", chip_id); + return -EINVAL; + } + + data->chip_id = chip_id; + + ret = fxas21002c_mode_set(data, FXAS21002C_MODE_STANDBY); + if (ret < 0) + return ret; + + /* Set ODR to 200HZ as default */ + ret = fxas21002c_odr_set(data, 200); + if (ret < 0) + dev_err(dev, "failed to set ODR: %d\n", ret); + + return ret; +} + +static int fxas21002c_data_rdy_trigger_set_state(struct iio_trigger *trig, + bool state) +{ + struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); + struct fxas21002c_data *data = iio_priv(indio_dev); + + return regmap_field_write(data->regmap_fields[F_INT_EN_DRDY], state); +} + +static const struct iio_trigger_ops fxas21002c_trigger_ops = { + .set_trigger_state = &fxas21002c_data_rdy_trigger_set_state, +}; + +static irqreturn_t fxas21002c_data_rdy_trig_poll(int irq, void *private) +{ + struct iio_dev *indio_dev = private; + struct fxas21002c_data *data = iio_priv(indio_dev); + unsigned int data_ready; + int ret; + + ret = regmap_field_read(data->regmap_fields[F_SRC_DRDY], &data_ready); + if (ret < 0) + return IRQ_NONE; + + if (!data_ready) + return IRQ_NONE; + + iio_trigger_poll(data->dready_trig); + + return IRQ_HANDLED; +} + +static int fxas21002c_trigger_probe(struct fxas21002c_data *data) +{ + struct device *dev = regmap_get_device(data->regmap); + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct device_node *np = indio_dev->dev.of_node; + unsigned long irq_trig; + bool irq_open_drain; + int irq1; + int ret; + + if (!data->irq) + return 0; + + irq1 = of_irq_get_byname(np, "INT1"); + + if (irq1 == data->irq) { + dev_info(dev, "using interrupt line INT1\n"); + ret = regmap_field_write(data->regmap_fields[F_INT_CFG_DRDY], + 1); + if (ret < 0) + return ret; + } + + dev_info(dev, "using interrupt line INT2\n"); + + irq_open_drain = of_property_read_bool(np, "drive-open-drain"); + + data->dready_trig = devm_iio_trigger_alloc(dev, "%s-dev%d", + indio_dev->name, + indio_dev->id); + if (!data->dready_trig) + return -ENOMEM; + + irq_trig = irqd_get_trigger_type(irq_get_irq_data(data->irq)); + + if (irq_trig == IRQF_TRIGGER_RISING) { + ret = regmap_field_write(data->regmap_fields[F_IPOL], 1); + if (ret < 0) + return ret; + } + + if (irq_open_drain) + irq_trig |= IRQF_SHARED; + + ret = devm_request_irq(dev, data->irq, fxas21002c_data_rdy_trig_poll, + irq_trig, "fxas21002c_data_ready", + data->dready_trig); + if (ret < 0) + return ret; + + data->dready_trig->dev.parent = dev; + data->dready_trig->ops = &fxas21002c_trigger_ops; + iio_trigger_set_drvdata(data->dready_trig, indio_dev); + + return devm_iio_trigger_register(dev, data->dready_trig); +} + +static int fxas21002c_power_enable(struct fxas21002c_data *data) +{ + int ret; + + ret = regulator_enable(data->vdd); + if (ret < 0) + return ret; + + ret = regulator_enable(data->vddio); + if (ret < 0) { + regulator_disable(data->vdd); + return ret; + } + + return 0; +} + +static void fxas21002c_power_disable(struct fxas21002c_data *data) +{ + regulator_disable(data->vdd); + regulator_disable(data->vddio); +} + +static void fxas21002c_power_disable_action(void *_data) +{ + struct fxas21002c_data *data = _data; + + fxas21002c_power_disable(data); +} + +static int fxas21002c_regulators_get(struct fxas21002c_data *data) +{ + struct device *dev = regmap_get_device(data->regmap); + + data->vdd = devm_regulator_get(dev->parent, "vdd"); + if (IS_ERR(data->vdd)) + return PTR_ERR(data->vdd); + + data->vddio = devm_regulator_get(dev->parent, "vddio"); + if (IS_ERR(data->vddio)) + return PTR_ERR(data->vddio); + + return 0; +} + +int fxas21002c_core_probe(struct device *dev, struct regmap *regmap, int irq, + const char *name) +{ + struct fxas21002c_data *data; + struct iio_dev *indio_dev; + struct regmap_field *f; + int i; + int ret; + + indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); + if (!indio_dev) + return -ENOMEM; + + data = iio_priv(indio_dev); + dev_set_drvdata(dev, indio_dev); + data->irq = irq; + data->regmap = regmap; + + for (i = 0; i < F_MAX_FIELDS; i++) { + f = devm_regmap_field_alloc(dev, data->regmap, + fxas21002c_reg_fields[i]); + if (IS_ERR(f)) + return PTR_ERR(f); + + data->regmap_fields[i] = f; + } + + mutex_init(&data->lock); + + ret = fxas21002c_regulators_get(data); + if (ret < 0) + return ret; + + ret = fxas21002c_power_enable(data); + if (ret < 0) + return ret; + + ret = devm_add_action_or_reset(dev, fxas21002c_power_disable_action, + data); + if (ret < 0) + return ret; + + ret = fxas21002c_chip_init(data); + if (ret < 0) + return ret; + + indio_dev->dev.parent = dev; + indio_dev->channels = fxas21002c_channels; + indio_dev->num_channels = ARRAY_SIZE(fxas21002c_channels); + indio_dev->name = name; + indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->info = &fxas21002c_info; + + ret = fxas21002c_trigger_probe(data); + if (ret < 0) + return ret; + + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, + iio_pollfunc_store_time, + fxas21002c_trigger_handler, NULL); + if (ret < 0) + return ret; + + ret = pm_runtime_set_active(dev); + if (ret) + return ret; + + pm_runtime_enable(dev); + pm_runtime_set_autosuspend_delay(dev, 2000); + pm_runtime_use_autosuspend(dev); + + ret = devm_iio_device_register(dev, indio_dev); + if (ret < 0) + return ret; + + return 0; +} +EXPORT_SYMBOL_GPL(fxas21002c_core_probe); + +void fxas21002c_core_remove(struct device *dev) +{ + struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev)); + + pm_runtime_disable(dev); + pm_runtime_set_suspended(dev); + pm_runtime_put_noidle(dev); + + fxas21002c_mode_set(data, FXAS21002C_MODE_STANDBY); + fxas21002c_power_disable(data); +} +EXPORT_SYMBOL_GPL(fxas21002c_core_remove); + +static int __maybe_unused fxas21002c_suspend(struct device *dev) +{ + struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev)); + + fxas21002c_mode_set(data, FXAS21002C_MODE_STANDBY); + fxas21002c_power_disable(data); + + return 0; +} + +static int __maybe_unused fxas21002c_resume(struct device *dev) +{ + struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev)); + int ret; + + ret = fxas21002c_power_enable(data); + if (ret < 0) + return ret; + + return fxas21002c_mode_set(data, data->prev_mode); +} + +static int __maybe_unused fxas21002c_runtime_suspend(struct device *dev) +{ + struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev)); + + return fxas21002c_mode_set(data, FXAS21002C_MODE_READY); +} + +static int __maybe_unused fxas21002c_runtime_resume(struct device *dev) +{ + struct fxas21002c_data *data = iio_priv(dev_get_drvdata(dev)); + + return fxas21002c_mode_set(data, FXAS21002C_MODE_ACTIVE); +} + +const struct dev_pm_ops fxas21002c_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(fxas21002c_suspend, fxas21002c_resume) + SET_RUNTIME_PM_OPS(fxas21002c_runtime_suspend, + fxas21002c_runtime_resume, NULL) +}; +EXPORT_SYMBOL_GPL(fxas21002c_pm_ops); + +MODULE_AUTHOR("Rui Miguel Silva "); +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("FXAS21002C Gyro driver"); From patchwork Tue Mar 19 10:59:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Miguel Silva X-Patchwork-Id: 160562 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp3725209jad; Tue, 19 Mar 2019 03:59:53 -0700 (PDT) X-Google-Smtp-Source: APXvYqwYOehIToSaqguN2p42HMsIENffnbxqTIMeVDYMSO4CU/+rGvBAXFYHJ55vRtxDCO2M9NxA X-Received: by 2002:a17:902:1125:: with SMTP id d34mr1423921pla.75.1552993193615; Tue, 19 Mar 2019 03:59:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552993193; cv=none; d=google.com; s=arc-20160816; b=rPazjYH3cNBM50bpOsKQFAak7yYo+ZDlggjuO/YneYug+yin8a0B8HmszaVUMe2zRi 2bdFqTcZNnBmhVG9r8Rx2+t8bYGRLBn7YrMwcLzg8p4dK2UWgsSSZitmXxNRTqyiAtn+ 8zMuaBV3KQfkKbvJvFPFhMaXiPVEzMby/JWWi4D2I7XgNvHcmxZnntCSWfj7do04smZM Irz7mlPw+088vaf0VI01+8nvzJm/loJO8T/dmn6etakHu/oNjBl50bs83fL9DsnpfQOE 2qj6XDXo/YewPQ06OPGKWGNDuf3Kx7rg/pWZcX5oQQC6KGzMI8mPy8cyop08awDr+Il3 nN2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3FuoTdxdgrSIz8LEOIAnwc6QDsOzlUpwDf9yyB40/K0=; b=vTIgCDbWDiZYkgyDKnpxRXHruxcuK1/dVrNDmu4LDj3KZVWgO/Q3lqhTIjxjIYL1MW Aw8rUMWiKNa0pG5zx39x2vGvcpfUIT08tpMviZ79ITPRLcvqFrunzULfudovTrzdDxJP qRvhtkSRJkjBeEW0RNLbWHCfcKUiMJZVHh2IjZBEIFuV8JLAFSYhXEK3dQgRB7mEMO6C 0VjwqduXpSAOYUxInHmKINdXcwKX+ES0vjwmbkKAloGAxzRkmGC3YUi26mUjhvWewOdi Xwq4H7RD/KdaDUDVnwU3Uj0CurXsfbXGKujjt459YpYkGfabgswKZoRDUse6WNcDMJVB BYow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KBiiRVBM; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id gn10si11377812plb.94.2019.03.19.03.59.53; Tue, 19 Mar 2019 03:59:53 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-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=@linaro.org header.s=google header.b=KBiiRVBM; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727418AbfCSK7w (ORCPT + 7 others); Tue, 19 Mar 2019 06:59:52 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:44938 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726782AbfCSK7w (ORCPT ); Tue, 19 Mar 2019 06:59:52 -0400 Received: by mail-wr1-f67.google.com with SMTP id w2so20465514wrt.11 for ; Tue, 19 Mar 2019 03:59:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3FuoTdxdgrSIz8LEOIAnwc6QDsOzlUpwDf9yyB40/K0=; b=KBiiRVBMzX7YnnVXt6C0Niu01mvBLYCYdT21ZEpbB0j5onsDjqV+imrAxQtoNdQqPT wfD2tCIHvBMMqWyHhmlSafyRhSKOjGq0GYRA3rp66zkDfl1920cNfqSNyjx0vPQ54+3T 4jX6NhdfmTEMwbcdEWlEShmzaxhy4EA6XewnmQEMFnIiQQW9WseH8t+56NpspZ66aLTw blQyNCYN+iRLfSDL23J8rD5n61LqJWTkI+cR+WB/RdQeZ99rMXKYpo3tQMZPM1+2u51X aE61j+scSVxdPV3UhqwMf9LkFgOLo4kMf4YqL7cEW6fyFSedaitYau80gS96V5tGVVCo drmA== 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:mime-version:content-transfer-encoding; bh=3FuoTdxdgrSIz8LEOIAnwc6QDsOzlUpwDf9yyB40/K0=; b=PvCuwGIpgLPSU+dTnQnmho8SZM0uIZ2uC9DYaCPohQic6Uk+M7by1l88SXEoc1krdY STPcakMhQYMzrXvPQT+xD1TJkZmmVU01zJERusK/gkfZOkJ/DFd9ljXGaxSOnWkJ3198 ecj7P7d75GdYDTX0LYqnHKTY2qqJXRV8rL1Yhycw+gzZGuklRLumEIg0okXimxVA3AD2 34fWMINdwD+RiXnkUoxOyxnaypLlr+wYj4FpM05vVZwu32QpnRylUq45/yJdchOSreLo XnOamVvb478IQgF2CxJ0XQ2ONZd/7khQKdE7IDDSwwp/ZiNySFCvbwVSpETtqveVVKhN JBkw== X-Gm-Message-State: APjAAAXIrB4nV0gLH22mArUWafIxP+JwKXO6JfhXY9TPY3EvT3x4wWZ3 OTInrJqdhtSZrjy/aHNbeh35Xw== X-Received: by 2002:adf:f14f:: with SMTP id y15mr17119700wro.223.1552993190854; Tue, 19 Mar 2019 03:59:50 -0700 (PDT) Received: from arch-late.local (a109-49-46-234.cpe.netcabo.pt. [109.49.46.234]) by smtp.gmail.com with ESMTPSA id h10sm4120052wmf.2.2019.03.19.03.59.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 03:59:50 -0700 (PDT) From: Rui Miguel Silva To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Shawn Guo , Rob Herring , Fabio Estevam Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rui Miguel Silva Subject: [PATCH v4 3/6] iio: gyro: fxas21002c: add i2c driver Date: Tue, 19 Mar 2019 10:59:22 +0000 Message-Id: <20190319105925.25863-4-rui.silva@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319105925.25863-1-rui.silva@linaro.org> References: <20190319105925.25863-1-rui.silva@linaro.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add the real driver to talk over i2c and use the fxas21002c core for the main tasks. Signed-off-by: Rui Miguel Silva --- drivers/iio/gyro/Kconfig | 6 +++ drivers/iio/gyro/Makefile | 1 + drivers/iio/gyro/fxas21002c_i2c.c | 69 +++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 drivers/iio/gyro/fxas21002c_i2c.c -- 2.21.0 diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig index cfd2cf44bac8..71b6552ee06b 100644 --- a/drivers/iio/gyro/Kconfig +++ b/drivers/iio/gyro/Kconfig @@ -77,6 +77,8 @@ config FXAS21002C tristate "NXP FXAS21002C Gyro Sensor" select IIO_BUFFER select IIO_TRIGGERED_BUFFER + select FXAS21002C_I2C if (I2C) + depends on I2C help Say yes here to build support for NXP FXAS21002C Tri-axis Gyro Sensor driver connected via I2C or SPI. @@ -84,6 +86,10 @@ config FXAS21002C This driver can also be built as a module. If so, the module will be called fxas21002c_i2c or fxas21002c_spi. +config FXAS21002C_I2C + tristate + select REGMAP_I2C + config HID_SENSOR_GYRO_3D depends on HID_SENSOR_HUB select IIO_BUFFER diff --git a/drivers/iio/gyro/Makefile b/drivers/iio/gyro/Makefile index 247dc600a602..adc18a5eb283 100644 --- a/drivers/iio/gyro/Makefile +++ b/drivers/iio/gyro/Makefile @@ -13,6 +13,7 @@ obj-$(CONFIG_BMG160) += bmg160_core.o obj-$(CONFIG_BMG160_I2C) += bmg160_i2c.o obj-$(CONFIG_BMG160_SPI) += bmg160_spi.o obj-$(CONFIG_FXAS21002C) += fxas21002c_core.o +obj-$(CONFIG_FXAS21002C_I2C) += fxas21002c_i2c.o obj-$(CONFIG_HID_SENSOR_GYRO_3D) += hid-sensor-gyro-3d.o diff --git a/drivers/iio/gyro/fxas21002c_i2c.c b/drivers/iio/gyro/fxas21002c_i2c.c new file mode 100644 index 000000000000..a7807fd97483 --- /dev/null +++ b/drivers/iio/gyro/fxas21002c_i2c.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Driver for NXP FXAS21002C Gyroscope - I2C + * + * Copyright (C) 2018 Linaro Ltd. + */ + +#include +#include +#include +#include +#include + +#include "fxas21002c.h" + +static const struct regmap_config fxas21002c_regmap_i2c_conf = { + .reg_bits = 8, + .val_bits = 8, + .max_register = FXAS21002C_REG_CTRL3, +}; + +static int fxas21002c_i2c_probe(struct i2c_client *i2c) +{ + struct regmap *regmap; + + regmap = devm_regmap_init_i2c(i2c, &fxas21002c_regmap_i2c_conf); + if (IS_ERR(regmap)) { + dev_err(&i2c->dev, "Failed to register i2c regmap: %ld\n", + PTR_ERR(regmap)); + return PTR_ERR(regmap); + } + + return fxas21002c_core_probe(&i2c->dev, regmap, i2c->irq, i2c->name); +} + +static int fxas21002c_i2c_remove(struct i2c_client *i2c) +{ + fxas21002c_core_remove(&i2c->dev); + + return 0; +} + +static const struct i2c_device_id fxas21002c_i2c_id[] = { + { "fxas21002c", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, fxas21002c_i2c_id); + +static const struct of_device_id fxas21002c_i2c_of_match[] = { + { .compatible = "nxp,fxas21002c", }, + { } +}; +MODULE_DEVICE_TABLE(of, fxas21002c_i2c_of_match); + +static struct i2c_driver fxas21002c_i2c_driver = { + .driver = { + .name = "fxas21002c_i2c", + .pm = &fxas21002c_pm_ops, + .of_match_table = fxas21002c_i2c_of_match, + }, + .probe_new = fxas21002c_i2c_probe, + .remove = fxas21002c_i2c_remove, + .id_table = fxas21002c_i2c_id, +}; +module_i2c_driver(fxas21002c_i2c_driver); + +MODULE_AUTHOR("Rui Miguel Silva "); +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("FXAS21002C I2C Gyro driver"); From patchwork Tue Mar 19 10:59:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Miguel Silva X-Patchwork-Id: 160564 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp3725288jad; Tue, 19 Mar 2019 03:59:57 -0700 (PDT) X-Google-Smtp-Source: APXvYqwhZTEqTB5R6Gl8zcp36QpguvAttdKV5v16Anw8556r8L/GxOzFixnlgTSO9Fnc+ddOQWAK X-Received: by 2002:a63:5515:: with SMTP id j21mr1320478pgb.244.1552993197913; Tue, 19 Mar 2019 03:59:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552993197; cv=none; d=google.com; s=arc-20160816; b=jN27laNVJ5xbes3Rl0oR1ZNLhjuKAYiTFNKuWadIk5eH3vV3gqePC1QdjqQx3k/U87 3CA9a6xWnaXQOas9TADT/WysO0czrFapCGn12hBUHt4TEeZO24HoT3jLjDFUz295+nXX faEMBgW+U0K8qORz4r8VgXzt15GFp9RNVATOytNS9ao/G06v7TNiM7ybaXsc6UO2tQ8H tTMZ0J5aTvN+4/0MEUY3Wl1HpvhXCN2GcFlswRMAoG+XU9W9FSuOiJjWiSdEkEJGoqQC Zqyx9jKIqW16d3pMkJvtfoaMeS1XSexWYh7pDIhynr36k0Sky4i0aKs+y6JmM+eJGWLa bgGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=WAPVaWgzUO2VZ+rDT4jNyOi+EGyhB4RKVLvR+cRCnoQ=; b=N+5bZcNDBzrcFp6dJ0WNwCDLYn0zfqP4jjbWjdCuj/reamVr6KpYCS6eesJxwBZ6Kf Cc3QHTilLN/Rz/GXnTwQBE+ZNVpthn9bkz2Wlq1g2W4trimXriWrWv/A6mWghTsmAsIJ vtNunGBsahaiwFeBz01tJpWI/ClRHLo7C8nhYO6IiSRk4Rnc0c+o8nqEp0PGiKY9CxVi HnO7UXbT/Auichd4abclF+gRBr6IiZyKFxGp2YPy2i5tkTmz3uEiPWEr32zpVFFTd/kx 3fJbCD79t/eMEWfZN7rOtVNpeh4FBmAO0iwaYZ8v5d6l4Uj+lgN1ExmZwI5TbDzegbf2 IqNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ZK0bER4J; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1si5822908plw.390.2019.03.19.03.59.57; Tue, 19 Mar 2019 03:59:57 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-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=@linaro.org header.s=google header.b=ZK0bER4J; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726782AbfCSK74 (ORCPT + 7 others); Tue, 19 Mar 2019 06:59:56 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:35627 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727577AbfCSK7z (ORCPT ); Tue, 19 Mar 2019 06:59:55 -0400 Received: by mail-wr1-f65.google.com with SMTP id w1so14570463wrp.2 for ; Tue, 19 Mar 2019 03:59:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=WAPVaWgzUO2VZ+rDT4jNyOi+EGyhB4RKVLvR+cRCnoQ=; b=ZK0bER4J/u7RRymXQPj4+N3LvqniAm0y17c579VgMKwwU2LWzulF7U39S9LiJrAKCQ 3I2uavxGAJkKIhvAPTXf95t0rCMPWXrzP0HU4ZdC+12RtHwc4IhRz/fNtI3WrjfDLZqb Hl8hiyS7BiGihuAOrZvIEsTzGa71hOG9UbZNBgN0gz/qk+3QQi6TaUS1OP94BLjp9sEt r1tfgCWBU/Eemd/w2HjHe1j2FjNLwtJuTCDfmYQfGxogVil7GLk/3hVmBhMljbR1BGzd D/eftN2PWX5bkRk9b9no1/kifQ+ybeLNdllDVqXp8kqVNZ9JRi5oNqJvyyQpbQePcYwL E2gA== 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:mime-version:content-transfer-encoding; bh=WAPVaWgzUO2VZ+rDT4jNyOi+EGyhB4RKVLvR+cRCnoQ=; b=kWNuTYakQvrAC9SlMVo6D7+ky02IgYPXviPuaG3Ce1XyAGDmH+HH7B0ZCw3uJ2r9N8 TWohGA6neABM+2kt3MVxCEfCWU5DsnIEmU/e0SB9BlDp9eYNkmcJXSW1G0bGdKaaan9A +FXNYmgcHott78yCZcGvamoDPQLEtLWparuuWniLESA4q7OM/UB8INtJOUvlep2pcIoz wNirLL23vwcZbVMzhAZZ7X/8MNOmQwht4If4L9i04dKfSPRu1cEB6PXH3U5Yst9gX4Dp GWplyzLdGoVBkBuxu9WBarxhMIVheYfoBICVPD/IcMyP1AahCmWJpU+GYPVxaQEff+Q3 erXw== X-Gm-Message-State: APjAAAVXGZt1Ysw6q3P9fctEOpcY7ZQdVZcIiwhAOkLYd0JK8s4N3N9M UBJKO32xRwZRGcA5/LJYvZ/rmQ== X-Received: by 2002:a5d:4081:: with SMTP id o1mr10506173wrp.241.1552993193292; Tue, 19 Mar 2019 03:59:53 -0700 (PDT) Received: from arch-late.local (a109-49-46-234.cpe.netcabo.pt. [109.49.46.234]) by smtp.gmail.com with ESMTPSA id h10sm4120052wmf.2.2019.03.19.03.59.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 03:59:52 -0700 (PDT) From: Rui Miguel Silva To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Shawn Guo , Rob Herring , Fabio Estevam Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rui Miguel Silva Subject: [PATCH v4 4/6] iio: gyro: fxas21002c: add spi driver Date: Tue, 19 Mar 2019 10:59:23 +0000 Message-Id: <20190319105925.25863-5-rui.silva@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319105925.25863-1-rui.silva@linaro.org> References: <20190319105925.25863-1-rui.silva@linaro.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add driver to talk over spi to a fxas21002c gyroscope device and use the core as main controller. Signed-off-by: Rui Miguel Silva --- drivers/iio/gyro/Kconfig | 7 +++- drivers/iio/gyro/Makefile | 1 + drivers/iio/gyro/fxas21002c_spi.c | 70 +++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 drivers/iio/gyro/fxas21002c_spi.c -- 2.21.0 diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig index 71b6552ee06b..61c00cee037d 100644 --- a/drivers/iio/gyro/Kconfig +++ b/drivers/iio/gyro/Kconfig @@ -78,7 +78,8 @@ config FXAS21002C select IIO_BUFFER select IIO_TRIGGERED_BUFFER select FXAS21002C_I2C if (I2C) - depends on I2C + select FXAS21002C_SPI if (SPI) + depends on (I2C || SPI_MASTER) help Say yes here to build support for NXP FXAS21002C Tri-axis Gyro Sensor driver connected via I2C or SPI. @@ -90,6 +91,10 @@ config FXAS21002C_I2C tristate select REGMAP_I2C +config FXAS21002C_SPI + tristate + select REGMAP_SPI + config HID_SENSOR_GYRO_3D depends on HID_SENSOR_HUB select IIO_BUFFER diff --git a/drivers/iio/gyro/Makefile b/drivers/iio/gyro/Makefile index adc18a5eb283..45cbd5dc644e 100644 --- a/drivers/iio/gyro/Makefile +++ b/drivers/iio/gyro/Makefile @@ -14,6 +14,7 @@ obj-$(CONFIG_BMG160_I2C) += bmg160_i2c.o obj-$(CONFIG_BMG160_SPI) += bmg160_spi.o obj-$(CONFIG_FXAS21002C) += fxas21002c_core.o obj-$(CONFIG_FXAS21002C_I2C) += fxas21002c_i2c.o +obj-$(CONFIG_FXAS21002C_SPI) += fxas21002c_spi.o obj-$(CONFIG_HID_SENSOR_GYRO_3D) += hid-sensor-gyro-3d.o diff --git a/drivers/iio/gyro/fxas21002c_spi.c b/drivers/iio/gyro/fxas21002c_spi.c new file mode 100644 index 000000000000..77ceebef4e34 --- /dev/null +++ b/drivers/iio/gyro/fxas21002c_spi.c @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Driver for NXP Fxas21002c Gyroscope - SPI + * + * Copyright (C) 2019 Linaro Ltd. + */ + +#include +#include +#include +#include +#include + +#include "fxas21002c.h" + +static const struct regmap_config fxas21002c_regmap_spi_conf = { + .reg_bits = 8, + .val_bits = 8, + .max_register = FXAS21002C_REG_CTRL3, +}; + +static int fxas21002c_spi_probe(struct spi_device *spi) +{ + const struct spi_device_id *id = spi_get_device_id(spi); + struct regmap *regmap; + + regmap = devm_regmap_init_spi(spi, &fxas21002c_regmap_spi_conf); + if (IS_ERR(regmap)) { + dev_err(&spi->dev, "Failed to register spi regmap: %ld\n", + PTR_ERR(regmap)); + return PTR_ERR(regmap); + } + + return fxas21002c_core_probe(&spi->dev, regmap, spi->irq, id->name); +} + +static int fxas21002c_spi_remove(struct spi_device *spi) +{ + fxas21002c_core_remove(&spi->dev); + + return 0; +} + +static const struct spi_device_id fxas21002c_spi_id[] = { + { "fxas21002c", 0 }, + { } +}; +MODULE_DEVICE_TABLE(spi, fxas21002c_spi_id); + +static const struct of_device_id fxas21002c_spi_of_match[] = { + { .compatible = "nxp,fxas21002c", }, + { } +}; +MODULE_DEVICE_TABLE(of, fxas21002c_spi_of_match); + +static struct spi_driver fxas21002c_spi_driver = { + .driver = { + .name = "fxas21002c_spi", + .pm = &fxas21002c_pm_ops, + .of_match_table = fxas21002c_spi_of_match, + }, + .probe = fxas21002c_spi_probe, + .remove = fxas21002c_spi_remove, + .id_table = fxas21002c_spi_id, +}; +module_spi_driver(fxas21002c_spi_driver); + +MODULE_AUTHOR("Rui Miguel Silva "); +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("FXAS21002C SPI Gyro driver"); From patchwork Tue Mar 19 10:59:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Miguel Silva X-Patchwork-Id: 160565 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp3725327jad; Tue, 19 Mar 2019 03:59:59 -0700 (PDT) X-Google-Smtp-Source: APXvYqz1IFl3o4iBSFvnZZp+oGX8t5hvS52PRMrqWsFPh01sQLgzmFeEwcWQfD8FvoxckqjCLXaZ X-Received: by 2002:a63:5325:: with SMTP id h37mr11722485pgb.353.1552993199440; Tue, 19 Mar 2019 03:59:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552993199; cv=none; d=google.com; s=arc-20160816; b=SC141YTZODILVXK+sbsd5fixOPv7qTLcpkT10eog9P0U3p0CdvZs92Ctz6utUuhEqo 2scgv87qJfR8sj7KMSBhbD2o1mpFeVggu/0eNGpSHARZFqG0DxN4tFF33LsYIn49zxwW b0xlwUr0OYovYIQ4Bbx0Lq5JDimuHrSDZjiLyUwmBDk2Z/tOq2uKPjIjpFKwR4j4Rfoh NdJCDdMB7GOP9rBlYAyQsCerZn/L1TcUYaIwFskewGKe3SycWvmEAU9FNnqamy6SKO8h UZS7yokM60ZynatIlD6kutWcamS/0Nnb+xpOyGz1S34h5dsgJwz+Bd0oQXkTrk6edwru Xe3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=4UAQGf80mGcL4LT+JY+W46Q4J+EAzJLCXffApvYs8RU=; b=VkDEPIWqLsTXint/QfEuccUaEQxxerxqI8JHwTfV6VdUwRYiup6HA1BWZ5owQTFGcP A3MI6FVK2XP/0dzRa+sRPMOYCLFbu65j3z8eLMVzmsi/w+fRJ0uXivIppOFXSKlkUcMd A2NJL+oP50b6FOHsodNoGbQhtBXmSpenPVVvi5SQojqELe5etfUJMP4OPzfpaOrCHLUs QAlqnwWf01Kt+GgyyOOsrfBDC2KGrzx8S07y4EHYSCkW79VkjsUUfMp80Es607AoIkRe PKg9pTuSrLJrjDYUcVRYtn5XdZKLPvysqdbe8qdHanijxOPBH44GTLcxdS7nsYtlgGCV +QTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="TH/n/JsW"; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1si5822908plw.390.2019.03.19.03.59.59; Tue, 19 Mar 2019 03:59:59 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-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=@linaro.org header.s=google header.b="TH/n/JsW"; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727570AbfCSK76 (ORCPT + 7 others); Tue, 19 Mar 2019 06:59:58 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:36534 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727606AbfCSK75 (ORCPT ); Tue, 19 Mar 2019 06:59:57 -0400 Received: by mail-wm1-f66.google.com with SMTP id h18so7521291wml.1 for ; Tue, 19 Mar 2019 03:59:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4UAQGf80mGcL4LT+JY+W46Q4J+EAzJLCXffApvYs8RU=; b=TH/n/JsW8zNpWIDNhjpvdEIPCJxj2V9fzZEFBbss3EuMcg/6rDmJ3TXA7YNMU1LS3S gbC08qqr59W12YWN6BirxNSehR4LsZPi7M28yfdf0IzQuS7JYtGY+A8a1y0acoaVV++e SXTE2ZIR4LeQMHZmvzY7ppno/LIuukmc7t1vzcN9tzIu20Kxykxc63vwY/lNAMigY98X jmcKSGortQiTuk4NXg33ZDYRvr6r1AqPx0OfRsuLV/tDGn5xCqz4sT6BXfD9jvC6C7EN mYYww5IUhZi4ERMRUMsBr1PE800JtRKcmPQY9qGk3OHEORONqgb0YHAwPdHrz+2FTspw WZTg== 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:mime-version:content-transfer-encoding; bh=4UAQGf80mGcL4LT+JY+W46Q4J+EAzJLCXffApvYs8RU=; b=H6ZrYKkzTt/09mG65IfUZfrp+Bzxx4y1R+wyfJYA5YE4J2den99HFlOcFpyGF+cLSY 3tA5BGli+aHzrbDZMTb7CfwYbf8hoK5lEHFmPgBiRxLv/m77w2NVEt/hnE3wT7h/9Nce /x7qYsTtKsGOrzLvc6o9DoMMmA4E5bByZQNAlJ0is2+wj92IBm0ljWSdX6AtrChpxN2h srjnMQ7WvK+C+Lcbe16+LPez+oHHZwLnrKY8iRdAxs8QgD+4t/G5hy/3cvxe+cJAQIhy kDznlX2VjWm8+CRPjt8DqMLjKn5rRgOUXNQuUKkJyuWh+RXwXVtZ3eeuY0Zz4I6EJQGK 3BSg== X-Gm-Message-State: APjAAAXePDuQlVURNZp8ICccsRun0IjvVGFxJiBaIDZ9kh9NHfXBodgy dcYQj8x9odwEJ6pE1WbqbGJ5Xw== X-Received: by 2002:a1c:7e51:: with SMTP id z78mr3063746wmc.82.1552993195766; Tue, 19 Mar 2019 03:59:55 -0700 (PDT) Received: from arch-late.local (a109-49-46-234.cpe.netcabo.pt. [109.49.46.234]) by smtp.gmail.com with ESMTPSA id h10sm4120052wmf.2.2019.03.19.03.59.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 03:59:55 -0700 (PDT) From: Rui Miguel Silva To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Shawn Guo , Rob Herring , Fabio Estevam Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rui Miguel Silva Subject: [PATCH v4 5/6] ARM: dts: imx7s-warp: add fxas21002c gyroscope Date: Tue, 19 Mar 2019 10:59:24 +0000 Message-Id: <20190319105925.25863-6-rui.silva@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319105925.25863-1-rui.silva@linaro.org> References: <20190319105925.25863-1-rui.silva@linaro.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add entry to enable the fxas21002c gyroscope in the warp7 board. Signed-off-by: Rui Miguel Silva --- arch/arm/boot/dts/imx7s-warp.dts | 7 +++++++ 1 file changed, 7 insertions(+) -- 2.21.0 diff --git a/arch/arm/boot/dts/imx7s-warp.dts b/arch/arm/boot/dts/imx7s-warp.dts index 23431faecaf4..c7dd66828a90 100644 --- a/arch/arm/boot/dts/imx7s-warp.dts +++ b/arch/arm/boot/dts/imx7s-warp.dts @@ -209,6 +209,13 @@ compatible = "fsl,mpl3115"; reg = <0x60>; }; + + gyroscope@20 { + compatible = "nxp,fxas21002c"; + reg = <0x20>; + vdd-supply = <®_peri_3p15v>; + vddio-supply = <®_peri_3p15v>; + }; }; &sai1 { From patchwork Tue Mar 19 10:59:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rui Miguel Silva X-Patchwork-Id: 160566 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp3725354jad; Tue, 19 Mar 2019 04:00:00 -0700 (PDT) X-Google-Smtp-Source: APXvYqz8X/4bu7dO9xmE7dbjf+VujSyEwix22PTFUx4A9GVbqjBlXT8XPjxdhFy9SLBwW28I48uU X-Received: by 2002:a65:6548:: with SMTP id a8mr1238962pgw.103.1552993200833; Tue, 19 Mar 2019 04:00:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552993200; cv=none; d=google.com; s=arc-20160816; b=O4VpyQ/wGJONYsvxome0MDvEXovxGWWA2gv06vVgbZ4ArUC9/OFDLuvotCazQx1Hsn iVp/YksCUEKrnOUGAv8ZZVT6g+J1754yPhxOMDQnT1TJgg6dzPHNMUOgkcrxk5l/efXO 9Sp/pMHM7n98cP9CKXku6HUK7GOhcWvzRNdYKPIPSc2Cz/5Q5uWZOWnOBNnYLRZPpsS6 tjQ+B0AJstL2QyKA1ggD3stYgcOVjRofImspTbnWJwBiq73s3KEAAL83mRC9ROW01E7N 8PjYquGwVvo41VY2N6NvX9w7cMmt//5ytXu9KwojvMQkOSnEuUEAnYCEtBq5x8XF5vs/ z2BA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=noA5hGizQDXl6ah278hgp2vxbvOexc3UizaRJQT0CyA=; b=x4dNLOP1Y1vJXDteVgowLfrFu/I7Vt4eSr+knbcLplQfhJKa1McdPdo+Vdjf3Sz2eb o849Cii5XLs5UuiL4xjpFsnjrzxVSmYkAC+fqkvXQx6qtMgrXqg4iSpN+bllBwpryNFa hgUhaLrBaaMy+Ja8XNlGw2z0T9FF6I6N7EABeD1EGZdv2GVb1tL9ksXiv67Yf0gIVb6/ M8PPYtTlVvjFUu02++PfqMtFMiaGKD0hBqv2lzeNVX/x3Blis2MxKQaObTbT/dGYo4Qq fyjEJ0K/aDI8ml+kfy3xOn1kpfSKmV5FE5vpsG7Me7saWhP2bYdBAxgwn7tYnTF9BDTD PyqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=rc4zmp6N; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 1si5822908plw.390.2019.03.19.04.00.00; Tue, 19 Mar 2019 04:00:00 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-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=@linaro.org header.s=google header.b=rc4zmp6N; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727610AbfCSLAA (ORCPT + 7 others); Tue, 19 Mar 2019 07:00:00 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:39691 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727380AbfCSK77 (ORCPT ); Tue, 19 Mar 2019 06:59:59 -0400 Received: by mail-wm1-f65.google.com with SMTP id t124so15903861wma.4 for ; Tue, 19 Mar 2019 03:59:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=noA5hGizQDXl6ah278hgp2vxbvOexc3UizaRJQT0CyA=; b=rc4zmp6NMzSIwBTu2wZcbZwvnYlvKick7B7OrJTGIqB0wvYTfbXQFBXnrrPKNUfEep cWxvl+oJYCBOOlxf9E9SrON4VdMx4QCMobRc4fS2fcHsV/ODiCaIe1RdylIcdcGkAuJt FD2sXBh1pEDb3KGIG5pCAom5mcJxkkMyVsMNlefTTQLI3akNMNBLaBszuWfEyDDTggKe Dsn28WzjuXn7PLDGBINPjES+AHOO6vHvEqDCO8XcMRz6EclxrJJaZUZCSr5I7XlQp38k sQEQ22G92u0OyCxPNs44k2RyzJJoF//hsFyuSLX2yXJbrgZquRcH4RIcws8hOvCgwnZ7 X8WA== 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:mime-version:content-transfer-encoding; bh=noA5hGizQDXl6ah278hgp2vxbvOexc3UizaRJQT0CyA=; b=I/PrhE8jl7qsLNIFDX15zt7hBYiLS1Z4MrZslzOqjoaZBvqKQ8AtlBKKN5snZKIfHo mYohR9XZCC6BYsCFLhtER2i7ch6AD8PAX7YuXYkDphmlWWrYH405Nh0VCELFFlmWPQg9 53UKB/43kK3U7P5M0cdNrUHh+q6O0Bga7K1r0DJSLbsGhROm7+KLkXRtvNNzDObu2iSb wHRqWxdZNNXC7Bu35xmO60cjg4QOjvRImyrqBjyhe4kqPOKB1FeVQKeBCNCpxANMpqJw XoZlwEDM8kWQeuH2ifBa0lQ/aObPLsPTw3uhMRfDcPC8E73lB0m9cjpZW4pYpuVy7VgN ptBQ== X-Gm-Message-State: APjAAAWxJRNy4i+9tCEUvqle+arOq88PkmahZNElgt74xPG/F6EUCMMu YjRe/AA9RXUdJPxljOfWDwpw7Q== X-Received: by 2002:a1c:e185:: with SMTP id y127mr1701423wmg.76.1552993198128; Tue, 19 Mar 2019 03:59:58 -0700 (PDT) Received: from arch-late.local (a109-49-46-234.cpe.netcabo.pt. [109.49.46.234]) by smtp.gmail.com with ESMTPSA id h10sm4120052wmf.2.2019.03.19.03.59.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 03:59:57 -0700 (PDT) From: Rui Miguel Silva To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Shawn Guo , Rob Herring , Fabio Estevam Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rui Miguel Silva Subject: [PATCH v4 6/6] MAINTAINERS: add entry for fxas21002c gyro driver Date: Tue, 19 Mar 2019 10:59:25 +0000 Message-Id: <20190319105925.25863-7-rui.silva@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319105925.25863-1-rui.silva@linaro.org> References: <20190319105925.25863-1-rui.silva@linaro.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add me as maintainer of the nxp fxas21002c gyroscope driver. Signed-off-by: Rui Miguel Silva --- MAINTAINERS | 10 ++++++++++ 1 file changed, 10 insertions(+) -- 2.21.0 diff --git a/MAINTAINERS b/MAINTAINERS index dce5c099f43c..13e229d4a425 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -10905,6 +10905,16 @@ F: Documentation/ABI/stable/sysfs-bus-nvmem F: include/linux/nvmem-consumer.h F: include/linux/nvmem-provider.h +NXP FXAS21002C DRIVER +M: Rui Miguel Silva +L: linux-iio@vger.kernel.org +S: Maintained +F: Documentation/devicetree/bindings/iio/gyroscope/fxas21002c.txt +F: drivers/iio/gyro/fxas21002c_core.c +F: drivers/iio/gyro/fxas21002c.h +F: drivers/iio/gyro/fxas21002c_i2c.c +F: drivers/iio/gyro/fxas21002c_spi.c + NXP SGTL5000 DRIVER M: Fabio Estevam L: alsa-devel@alsa-project.org (moderated for non-subscribers)