From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A12F14437C; Sun, 1 Jun 2025 17:21:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798513; cv=none; b=eVHPC6mrsumtn1NIIcEaEzcWa8DnOyZBKMJGeE7KkY5CMlhPdGC7RfPF6sMhhisL0p04KP0n8fmrttDvglweqBzL/RAGk8e2/wN6z7TacSVkahOXor0frhc+CEoh+aYCb5XDml/q+bsV31zQhZDqsZPkxLW+jn5kfN1SqzkiJaw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798513; c=relaxed/simple; bh=cKE0WSkFCIF9Brh/SnNokfm5fFpy6Et8C8/qKo9CJEg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KkIdG+aZWhXwN3woqxSxJC+izG2YCpzpq0LhJRK20qqAQAs6F0P9VfVZlMJa80LaSwuzGmsAjRLhvH+2YFCrJfFlHcpA/hop5hWvNc50Ed9w5RW80Q0nCrICe0RKjxOIsBZqvoiGSmiX4zNqPNsYV8mU61/2WxNb/5m52aCkKC4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IoAXjKFo; arc=none smtp.client-ip=209.85.221.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IoAXjKFo" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-3a4f7865b22so391140f8f.0; Sun, 01 Jun 2025 10:21:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798510; x=1749403310; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=V6DN8I6oWq/48UPwKEfQAdQXXD2jU/KNfzvJAEFs5pM=; b=IoAXjKFoFx9NlooSN5LfXb6QEfcWLP+MO3NzIM0Kef/GetvG+MaNbZr0WRqoAKhklT YtoXFCxUrw+mdC/Jju/iNMCd4waDXzLPcpO3u3u861ESkUGMOZcprbdX49rw3G7m3Rla 1oXOwv+vIYZMwzfihhgQ9r81HGD8dd7NIq8dxu3lQ2XjqzUR9o6LeG4mWK+4MLx51I41 5gzMO6sjAO4seD6BjTN3aXKZaPoOwAYRCZ2XhfLuIl7jO//7CKOgg9RHNGjx7N6paIvm J7rnXjhT6Wj3Zo6VBQrA6R9Zp0wXiLo+CvNUv4cvg+dtle3P7TDUTYrdtvde8cAoRyRs IlRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798510; x=1749403310; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=V6DN8I6oWq/48UPwKEfQAdQXXD2jU/KNfzvJAEFs5pM=; b=DkVC/D8b/a6XESYvqLGfAdQi0aUEbCGo0/rIMEKqHQMPEwxy9PNYCuU38djcoS1CZ2 A9ytYxAW+Jsp5dLIJdc5+FrfZRdFA+FaNxn3AGDzk3nY51lSkOgbUmu9Kgb4Y8mAbvcC 6qLqcBLEAB8QcGsVJfQ8tIUt6VIVkjx5SkpEvwzfByubtdhCcdQZvLyt66JzpYDHwJnO kPnIR1ABDaei4YEXDZJa8KWSM2jx1j5SIgxQbR9lPxUCD1+muQlCETLDhzATRvRJIuvG uYUHcFFWufA9CkxveYAyp2QY3BtoRlqyxyBHsqvttXb4pqqgceG4zE8Yi+KhA1BBZ8oT SqUA== X-Forwarded-Encrypted: i=1; AJvYcCUPCfHDKZiaPj0U51vpw2G0swMoQx+YY0q+ANYX9vDPyVQWiNtlmtR8YNNnEIqfcLTfKH+pGAR303g=@vger.kernel.org, AJvYcCUSGBhODq/eSi0jzO9MrHABaPrSJtxN6cmb5lg2EQvAP86t3GCbhE6J0RnH/EeehBe4BEUE0RizBWWc@vger.kernel.org, AJvYcCVnXyjDjmZ4rjW/pcYkTnASyc0hZVzhC1FHJb82kWTK1oZTonan1yyTVGmIYRBCdirAXbZHVd7W8h4zF++C@vger.kernel.org X-Gm-Message-State: AOJu0YwXHlLIle4QV+2N1sdxzw6yuy3lowcC56pmqzxWIWUhkWB4vjGF JSPYh+ZzjcFcVoMjdUVHgQ33hbdk0lvml60ODTTWHZOBDl1yIhV8MBdB X-Gm-Gg: ASbGncsXTTb2rfyxFwtjiCESf35DU7EYl7BLHBnupk+QlTLKN+EAD3/BuPvy7yxZf0C fDb+09ZliWBAmP4GhuLrJ5UzZjAUFD6Ld96o3Khr1jjZcYjLzh7aBA8RJgSyQvaTLezI4XWVYKM 6NBg3/lEY6cFlXoXYHPgSdOjVDyONgxy1O+glpWgaxZaRjHQC+8m9E0zNSpLVKyXCIkfMFgOH3h OakJn/K6HuwoOuevP74yWWmLgT7/3lQrii5YG453qJOZ+10YvSf8htnHzzP1+wOuTaPcwwHiuql QZFzZS9Q17yZvnfUcdT2fZQOerGFt2Bc4oMSkq6LSRyGotU4R1J9lL1fuoKApLMPaB1m7IBy4+5 /YOwXZuE8WGfvpzr48zE77Q== X-Google-Smtp-Source: AGHT+IHbetBQOQhpBX6BXtD//MtmozuLRi+eqXCmjws/whkFRmCPljcO8Jf/IxUtNarEKFitZpR4fw== X-Received: by 2002:a05:6000:2c12:b0:3a4:dc42:a09e with SMTP id ffacd0b85a97d-3a4f8961347mr2639870f8f.5.1748798509699; Sun, 01 Jun 2025 10:21:49 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:49 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 01/11] iio: accel: adxl313: add debug register Date: Sun, 1 Jun 2025 17:21:29 +0000 Message-Id: <20250601172139.59156-2-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add iio debug register for general sensor debugging. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313_core.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 4de0a41bd679..2f26da5857d4 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -321,10 +321,21 @@ static int adxl313_write_raw(struct iio_dev *indio_de= v, } } =20 +static int adxl313_reg_access(struct iio_dev *indio_dev, unsigned int reg, + unsigned int writeval, unsigned int *readval) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + + if (readval) + return regmap_read(data->regmap, reg, readval); + return regmap_write(data->regmap, reg, writeval); +} + static const struct iio_info adxl313_info =3D { .read_raw =3D adxl313_read_raw, .write_raw =3D adxl313_write_raw, .read_avail =3D adxl313_read_freq_avail, + .debugfs_reg_access =3D &adxl313_reg_access, }; =20 static int adxl313_setup(struct device *dev, struct adxl313_data *data, --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E1CB81DE8A6; Sun, 1 Jun 2025 17:21:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798514; cv=none; b=DDflt3Atzpy6fq6achPMcAaRTeUvJsQAGtIdJU9/QPYAFk/pINNpDEq5J9RCLNxO06eEYfLJ9p2WY9GwjurQt0GaWKQsz8ajv2KLX7vZ3Ea79saOmj8+Glt4WtKHiJfaaAM2sNALl1C1znyI3gTm5gcjW397lwL4RqH4L/kDcws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798514; c=relaxed/simple; bh=PlgOYthuh6JtMI4CL9QQOMMKFCb6fUJ+OzltwhdNM0c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rw092BIZ8Yt7MJHPyt6uQ8PSb/QbtbOsJvlqEGAX+OfXoC5rNkaefh0J+TkwHaQ5ye8J2XG5b6XG99H9mzc8F4X8KBtTPr8Xy3gwzKSwWEwSCDYiupN1T+eNrpqyhiWdjhb6JMch+wnJSi85nQi7JEZk5Ks1y3sGef7f3aV8Zho= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gbyc9/16; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gbyc9/16" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-3a4ebfaa623so514629f8f.1; Sun, 01 Jun 2025 10:21:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798511; x=1749403311; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lsJz4ZlJcyUxy6ajB/i4TEWppNdFHS1iZ8mtjoDs8Js=; b=gbyc9/16aqe0f4u5wSe8xX5/h2Bl+jznJ4lN8h21wY+Tl6OvqGSDF7IT5TV2J3kh7z Z8N91V6sMxFibsQ6irC67xSX3cwloaKgSicvkzZKoqQDYYeW7Hm7I5Avo21mEK3f5Rmi TqoYCcUuYJ2eiWRJuzmynG1a64lIUJGC+NwjHsSco2PV7eGXKwMx+Et+MXIP5Ln6tLI0 Ez1Who64xyu4rKxIuWi4G9aTDm0niIYWN85Sg7xw0SGaJA3CG8JNLvBNteUZMiO0vFQG PFRGjnK0oljWBsHvGC/kS04nQMxqMkmXhgZV0tOSFiAf/iyO7VWxHnE9/nNGoiQr5Mby qvVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798511; x=1749403311; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lsJz4ZlJcyUxy6ajB/i4TEWppNdFHS1iZ8mtjoDs8Js=; b=Lzl+FxoMKWLQCjAntw2dhTRhIBWsM9ecDCpipVb5L1assLQSWPImxB7F/ItooGvlAi m89wllbhSlkTpFXdSg0RdTkQQJaze5I0ZiGLOhBJ6A4evKmyotR+hdrGisyOa7ZW7BAg MgrCyNOjKQaYS7sRl351x5xkn9olWDxyzUqti6QVS4SvQA3YD/Eyv/H0EjZbmfxCqRnO V+KWbu5d6Y8/MqkO9dIdSsLiBrEu5Sr9EJKjUhDDWGG2hvjbJ93/OsJHFQ9y3gDoDF8G SKlCDQtKIZp1wQuq1W4m5IK4UZyPtWd9rL97XbZi3f4Z5A2eMQUyOLbOroAC44hPk9l5 EfZA== X-Forwarded-Encrypted: i=1; AJvYcCVeeXHzf+IzUEcWDjCoZdp+GAaKPLBS41Q6fYCo0PXrD68G+Kmtkpz5beSDlnVW5T/w3Vz4OPxfsPrHxiKY@vger.kernel.org, AJvYcCW6kGFW6uCTU5vDOJlMwLoUiyFAqy/3VvTCQUtRl4fP+XLl7WA6BQUxUNgkAfSdFddHyQQ7MkSNNWc=@vger.kernel.org, AJvYcCXzlqEp5BTl1GzTlG1gphIE4HucnRx/Ft4mXORiQWSGc49eFUi4gE79qSzdbnhUvLeckE9JT5DEWStG@vger.kernel.org X-Gm-Message-State: AOJu0YwQECc8g9LzPjS+08YU7PBOTxhulfv0JyhiYV2uRr9JIrexOeCn qerw3GC6mC0Ve0DdNxMMM1Pr9tUily+u/adFsmuNWr8+YUzWaifpfiPp X-Gm-Gg: ASbGncuCIfen8JuVUEuUYE+36qH4DftUQvfCGGZZD7WLaB1rB7PXDX6XpxSSVa18dkG AnWNKEB14BOdc2vwAtq/GgMj5Oucc0WXZz8mX5CBFLX4aziwlEwLbH002npuWKItoWkNQzRv2up 3soXfYjuA27FMvtzAGHNU7iK+CAx09usx8ShafclEuORxITj4iSqY/eGIXb2ASrk7gofKNC80By JEl+lfy1RpNKE6746aWQdbikK1N0qAS8gPPoW/FobCPS8g1uGgzPRqUljvzRfKr4ev9Svc3y8VF SuhpApTbLymN3a7DTVQADn+IiB4d/qp0koAJASyzLy8/85Akn1jHaTtX1T4CW9OKFhwZBqCSp6w xmlijIgl1RM+lRuxcE9INEWeLDxXG7VET X-Google-Smtp-Source: AGHT+IF1AvTaJe1O9b5lihFPu2eJzBrgV1pPhUgQpxpSoVRp6SPW6aynJPcd+nIGXHmN9iYnl12l2A== X-Received: by 2002:a05:600c:4fc9:b0:450:d5ed:3c20 with SMTP id 5b1f17b1804b1-450d7bb5709mr29013875e9.6.1748798510834; Sun, 01 Jun 2025 10:21:50 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:50 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 02/11] iio: accel: adxl313: introduce channel buffer Date: Sun, 1 Jun 2025 17:21:30 +0000 Message-Id: <20250601172139.59156-3-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a scan_mask and scan_index to the iio channel. The scan_index prepares the buffer usage. According to the datasheet, the ADXL313 uses 13 bit in full resolution. Add signedness, storage bits and endianness. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313_core.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 2f26da5857d4..06a771bb4726 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -171,9 +171,10 @@ static const int adxl313_odr_freqs[][2] =3D { [9] =3D { 3200, 0 }, }; =20 -#define ADXL313_ACCEL_CHANNEL(index, axis) { \ +#define ADXL313_ACCEL_CHANNEL(index, reg, axis) { \ .type =3D IIO_ACCEL, \ - .address =3D index, \ + .scan_index =3D (index), \ + .address =3D (reg), \ .modified =3D 1, \ .channel2 =3D IIO_MOD_##axis, \ .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | \ @@ -183,14 +184,26 @@ static const int adxl313_odr_freqs[][2] =3D { .info_mask_shared_by_type_available =3D \ BIT(IIO_CHAN_INFO_SAMP_FREQ), \ .scan_type =3D { \ + .sign =3D 's', \ .realbits =3D 13, \ + .storagebits =3D 16, \ + .endianness =3D IIO_BE, \ }, \ } =20 +enum adxl313_chans { + chan_x, chan_y, chan_z, +}; + static const struct iio_chan_spec adxl313_channels[] =3D { - ADXL313_ACCEL_CHANNEL(0, X), - ADXL313_ACCEL_CHANNEL(1, Y), - ADXL313_ACCEL_CHANNEL(2, Z), + ADXL313_ACCEL_CHANNEL(0, chan_x, X), + ADXL313_ACCEL_CHANNEL(1, chan_y, Y), + ADXL313_ACCEL_CHANNEL(2, chan_z, Z), +}; + +static const unsigned long adxl313_scan_masks[] =3D { + BIT(chan_x) | BIT(chan_y) | BIT(chan_z), + 0 }; =20 static int adxl313_set_odr(struct adxl313_data *data, @@ -419,6 +432,7 @@ int adxl313_core_probe(struct device *dev, indio_dev->modes =3D INDIO_DIRECT_MODE; indio_dev->channels =3D adxl313_channels; indio_dev->num_channels =3D ARRAY_SIZE(adxl313_channels); + indio_dev->available_scan_masks =3D adxl313_scan_masks; =20 ret =3D adxl313_setup(dev, data, setup); if (ret) { --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB1CB1F151D; Sun, 1 Jun 2025 17:21:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798516; cv=none; b=ZeBiz93Amea+VI0A/nNWX9uSSo95qigyx/iuS+nvrLCeEZdpzYqgG4Z5ueCEP2GdOc5q/GsNfFiekNr5GrCAs59ihFMdXm9oA7StvJAvyC2Zy8Z5ywqobXGgPVQYnW+u9RWa/0BCejwrK5SSTvdWWj8hbHrEfu1LwWexwcPVpv0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798516; c=relaxed/simple; bh=/p9vBRUZH5DSs8sEgpgj+vVFu1JVSWMfF5ad2iZj84c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=gb8jyyfsHjner6NfGZ0sM0ZZKcDhKqbK61mWNYUeBRX/sWkKoCFrPY2H+AiKL6rHbds090lK99KttzaPrpghDZBAPuBU9MzlM2+QDENAPCVFwsXUt76YsluD2wuBBrqSHXZMiOwSLSNUjB+0CCISsYVNDkbUVCf8rKmgd000Jp4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=RMhVIBwB; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RMhVIBwB" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-450ddb35583so424065e9.1; Sun, 01 Jun 2025 10:21:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798513; x=1749403313; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nkC+i/O09kqU1WcdP/dP2GnoPIaaTxjblb2LNGEDcpA=; b=RMhVIBwByxcbPlVMreb+0y3tMJ3+rlnatFL1vcWxZDC3YKE/oyyv4UyxdMde8Udjw1 xUcDJdbpopXUV3K9E7njDL0TsYw8bv7IBsUGs6cSv1UW331jT+kBKLwQTFj+s7tGhvgm Yx9094T/m3CBqkkD+14FhFe2QIIo25YtDTbBZebGweIh75D7CGAv3VxWJhI+iblXkXUF fk3IEH0NDW6rERHHPjmmhD5LFo/sFBSeLt3+zyKLMSeUe9WZCHpCxt/iPIQx5ks9pjUb r4g7ycPIJKPn2L5/HlPQCaeBOBdGmXTcP9GHX/a9deQNm0IZTYrT8UE/pC02Lt3a/2HX GLmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798513; x=1749403313; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nkC+i/O09kqU1WcdP/dP2GnoPIaaTxjblb2LNGEDcpA=; b=CqJCc1++qkutghuKTsLtqv1/iAmsGn2Rz1hOwDcDKI8kVk/6GKu8QUcI6ip/Va7aL/ Nz5PLAMRJ2prdDB4yFmKESjfOq0QUs04jCyFfCK18BBHw2HfEqYbRnxcp26FKnxs4SCc 4DZVNHBHfk5ImYNP+3lXQhSp6MP69zOGvl8Nocxre5nE54t5XTvPm2s2tcGV9qXTbYKa xfgkFvrV+vIVvPD2uofh5j36F2QjpbeONx3AUFKY3Ythsen8+euM5HAE3YdUm0JZZKUd tZku905r8ILk28yruhagZB2Lm+YUxdbtFb2OTkSVifFf3Mzzu+0uwV0/D4nO4HO88p/S TWQA== X-Forwarded-Encrypted: i=1; AJvYcCVX2d4fvbEoGTYYOfdfSVjCaRQRmDSAch4ULYY66jITgcgdChEz/RH1HZLhrah1hw+dqDPeHLTNCUAaGKZi@vger.kernel.org, AJvYcCVzS4rDHp0DfJv66vgTsgv+4NzVu42WgRGg9IlNKH/0mpWva5+foXxMA27rfzDk8Ex4V0j41/WdSio=@vger.kernel.org, AJvYcCW1bor65hSan3wji1Ka45YRUpFsZnf2TBYEhTyLs+RkfP0Of4ZoKIyOPylUnz+74uOFRcZJrf52Jqi4@vger.kernel.org X-Gm-Message-State: AOJu0YwjlWlpU4/+plySTgvKICGdbGpoERzpPealy3zOWyH5iElzvCcN T5f+AAj5JZILBL06ODcwayJ1dlfWOURPh2hRmdBVYaUZq5ZeG+Ro7Q2a X-Gm-Gg: ASbGncsk4XxJOIi3wQVVmoO0Bp28aLjUl+zHJ9fjI9WIRRZ8LqN862iVMpih/kDv2sI FLQPrySGHz9znDTws59P0+QbVL9icNIW4/k3YrnN1EIi9F6o+w3PP1YPfksllZbV/LhMhJWxBcA VFAKdvcKi/E8acnGp9JFpCa5Ne5X1C6NcCKkD9CViW2+tQ5OciyY19CfT+LmDdTfRX7bUjlwGGO SGeFXP2g6R6FV90tHquwdWnhFN9NcZnczH+T320e/x12kdt4/aSy4dRfIAFfmzWiieIVSXhANfl 2WDUT2U3MFjW/RAAyxaJjpD4QBAotfb9lm7nq7a3virRG9yfftw8OmjW19eQqVihv10vT8xMH7Z Q0xlbC1oapiU2k8UQqPzMr7JSK1gIsMxq X-Google-Smtp-Source: AGHT+IHe7Kisg2praPSQBOkCJl+bv+Fx/s+RyYm8WqvftkcBFip3pjX8j+chvpOJkHEcQiP+1AMqhQ== X-Received: by 2002:a05:600c:1c8d:b0:43b:c0fa:f9c4 with SMTP id 5b1f17b1804b1-450d7bae255mr27584565e9.4.1748798513065; Sun, 01 Jun 2025 10:21:53 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:52 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 03/11] iio: accel: adxl313: make use of regmap cache Date: Sun, 1 Jun 2025 17:21:31 +0000 Message-Id: <20250601172139.59156-4-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Setup regmap cache to cache register configuration. This is a preparatory step for follow up patches. Using cached settings will help at inerrupt handling, to generate activity and inactivity events. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313.h | 2 ++ drivers/iio/accel/adxl313_core.c | 17 +++++++++++++++++ drivers/iio/accel/adxl313_i2c.c | 6 ++++++ drivers/iio/accel/adxl313_spi.c | 6 ++++++ 4 files changed, 31 insertions(+) diff --git a/drivers/iio/accel/adxl313.h b/drivers/iio/accel/adxl313.h index 72f624af4686..fc937bdf83b6 100644 --- a/drivers/iio/accel/adxl313.h +++ b/drivers/iio/accel/adxl313.h @@ -54,6 +54,8 @@ extern const struct regmap_access_table adxl312_writable_= regs_table; extern const struct regmap_access_table adxl313_writable_regs_table; extern const struct regmap_access_table adxl314_writable_regs_table; =20 +bool adxl313_is_volatile_reg(struct device *dev, unsigned int reg); + enum adxl313_device_type { ADXL312, ADXL313, diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 06a771bb4726..0c893c286017 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -46,6 +46,23 @@ const struct regmap_access_table adxl314_readable_regs_t= able =3D { }; EXPORT_SYMBOL_NS_GPL(adxl314_readable_regs_table, IIO_ADXL313); =20 +bool adxl313_is_volatile_reg(struct device *dev, unsigned int reg) +{ + switch (reg) { + case ADXL313_REG_DATA_AXIS(0): + case ADXL313_REG_DATA_AXIS(1): + case ADXL313_REG_DATA_AXIS(2): + case ADXL313_REG_DATA_AXIS(3): + case ADXL313_REG_DATA_AXIS(4): + case ADXL313_REG_DATA_AXIS(5): + case ADXL313_REG_FIFO_STATUS: + return true; + default: + return false; + } +} +EXPORT_SYMBOL_NS_GPL(adxl313_is_volatile_reg, "IIO_ADXL313"); + static int adxl312_check_id(struct device *dev, struct adxl313_data *data) { diff --git a/drivers/iio/accel/adxl313_i2c.c b/drivers/iio/accel/adxl313_i2= c.c index a4cf0cf2c5aa..e8636e8ab14f 100644 --- a/drivers/iio/accel/adxl313_i2c.c +++ b/drivers/iio/accel/adxl313_i2c.c @@ -21,6 +21,8 @@ static const struct regmap_config adxl31x_i2c_regmap_conf= ig[] =3D { .rd_table =3D &adxl312_readable_regs_table, .wr_table =3D &adxl312_writable_regs_table, .max_register =3D 0x39, + .volatile_reg =3D adxl313_is_volatile_reg, + .cache_type =3D REGCACHE_MAPLE, }, [ADXL313] =3D { .reg_bits =3D 8, @@ -28,6 +30,8 @@ static const struct regmap_config adxl31x_i2c_regmap_conf= ig[] =3D { .rd_table =3D &adxl313_readable_regs_table, .wr_table =3D &adxl313_writable_regs_table, .max_register =3D 0x39, + .volatile_reg =3D adxl313_is_volatile_reg, + .cache_type =3D REGCACHE_MAPLE, }, [ADXL314] =3D { .reg_bits =3D 8, @@ -35,6 +39,8 @@ static const struct regmap_config adxl31x_i2c_regmap_conf= ig[] =3D { .rd_table =3D &adxl314_readable_regs_table, .wr_table =3D &adxl314_writable_regs_table, .max_register =3D 0x39, + .volatile_reg =3D adxl313_is_volatile_reg, + .cache_type =3D REGCACHE_MAPLE, }, }; =20 diff --git a/drivers/iio/accel/adxl313_spi.c b/drivers/iio/accel/adxl313_sp= i.c index 9a16b40bff34..68e323e81aeb 100644 --- a/drivers/iio/accel/adxl313_spi.c +++ b/drivers/iio/accel/adxl313_spi.c @@ -24,6 +24,8 @@ static const struct regmap_config adxl31x_spi_regmap_conf= ig[] =3D { .max_register =3D 0x39, /* Setting bits 7 and 6 enables multiple-byte read */ .read_flag_mask =3D BIT(7) | BIT(6), + .volatile_reg =3D adxl313_is_volatile_reg, + .cache_type =3D REGCACHE_MAPLE, }, [ADXL313] =3D { .reg_bits =3D 8, @@ -33,6 +35,8 @@ static const struct regmap_config adxl31x_spi_regmap_conf= ig[] =3D { .max_register =3D 0x39, /* Setting bits 7 and 6 enables multiple-byte read */ .read_flag_mask =3D BIT(7) | BIT(6), + .volatile_reg =3D adxl313_is_volatile_reg, + .cache_type =3D REGCACHE_MAPLE, }, [ADXL314] =3D { .reg_bits =3D 8, @@ -42,6 +46,8 @@ static const struct regmap_config adxl31x_spi_regmap_conf= ig[] =3D { .max_register =3D 0x39, /* Setting bits 7 and 6 enables multiple-byte read */ .read_flag_mask =3D BIT(7) | BIT(6), + .volatile_reg =3D adxl313_is_volatile_reg, + .cache_type =3D REGCACHE_MAPLE, }, }; =20 --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A02E01F866A; Sun, 1 Jun 2025 17:21:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798518; cv=none; b=HgHK4ImcVPgRoUuhh9nPFMVlzFwxNU5M1DQdihWihrKiamKYPw23Q5A0ni9oBD2iGd7C3/6irOasm+vVgMyfoe3Linxqc/5K05eokTSn34+49822uuKO9dGhPhJ+WVImDN5NDfoFJX9WH4lj0WOSxfjPmKoF/Tpav15XdYfsh6Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798518; c=relaxed/simple; bh=kFiMkvCOIRVqtMWYXPd/AZpWgNM2n4LnCr36yt29o30=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qTutpkMbdRZ5JyH1tmigEtW8TRL4DRKVG+mAVlkOL/Z/7OIH2dViKIndZzjnxnX/N+udk0MWWkr/4u8Zer7mjKb4Hf/DnN6QLnQGO0uZxyKt1yKsVce/YLc7RpUoYYP3QSyWBeNNUsJN60AsIgTNNVh/jD5bo9/3TcaQHEEsE2M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IQefAsly; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IQefAsly" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-44069f5f3aaso1111595e9.2; Sun, 01 Jun 2025 10:21:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798515; x=1749403315; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UeYCG8HkXRXIHHGQ9W/UCo5tolHvwhv1GUMJTmxb+OQ=; b=IQefAslyGk3gHf4HMoxErihVsuotvqXq9GhD6+7ToLL9f8ei3YM/LzRVHka6RkpErv YO7Gy4GGj2FURa5EailVYNYXYsWd3XYhJXsnFmD+89vFWyoAoiN43drbE+ZYznpBykp0 y3QlobOIJ5hi1tZdEJw9sjQh/1loc43tpdqnaYeEb+RyJhX9U4ftF0GMYesHnsmTazZP lNa6HXCRjh5zmq5Fo/qr35WR279HLodQGQ+k/zCkuDTlhSruAihNNgbSl74l27MNstSM OvVsyjIqmfzFpM56G86P40nehCiXNQ2jpN6XQRdVhQODq81M9Ey1kfFjQPQcb9keC/4T hBSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798515; x=1749403315; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UeYCG8HkXRXIHHGQ9W/UCo5tolHvwhv1GUMJTmxb+OQ=; b=Q8pu0CbvClc8RZ2TYWDGrZfn+se+5K05bCp3kUPhr99D2hdVqqzLrpcIYEbqCIT9Kt QPnHHNHvis+txe1lnbHQIlwAozJbN6BEIPRAue8MTaGdNOLyDQe5R0hhXktmOIYbD6Cu 4vw3yyMSj+v9uUIPqyJNuDFLFCXc91xVq5fqCR8C1e2IYIlMVPKG8JliBc+Ko5jmaxkO cr9mS30eQiGGuWX79RvkXojAHa8u9tihr/syznQO8BAoUlBz4pyD1rYaWS/PofjPK8sG yByW8Id+crP+uVMIYx5nB+tH4bMFODwO5r56BdB5aqvgemsX0cjDv47kxY2LwLUyXTK0 +fmg== X-Forwarded-Encrypted: i=1; AJvYcCUodlEW/BqEYjNAP11PMghoWNx2U28Znf6JfR5JZWYLbpUfGXLizxGPPQENXv1x9beQaWADqBE2K7n2rgY6@vger.kernel.org, AJvYcCWHS5ErlCa1Dj/LVR09zZF6AycDkaQxTYiAFfbnzvy0V5H1rv2XKlboJFBGmkj3x147k1WBHEJ1huo=@vger.kernel.org, AJvYcCWarUznIJzMtiSrOsj+Dd4ytfmH58NU8URS0zfKcP7a+BMx0GvXCMwKI9JeOSDH+Z1PKvHLDIR/tfEL@vger.kernel.org X-Gm-Message-State: AOJu0YynBC0gQOg6hUyP6ypmi4DCSkinhlPjFWkmZAdebIRZtaCcpOyz xWwM4q9lXFHmPrxKUMY22nTVOCXdI8hvN7TphoREVXxNXaQ94W78GqYU X-Gm-Gg: ASbGncvxp/5dG+Pffp8Uv5OxawAc8mFvaO6W7adAPmvJHuRZHgYcG9hlXgT6W/hWY3t NVI/jrYWI7uHldD+LmZEGujiY8ZnYtZuBi+gbeFke39nEwmw5zsQbDGGAq2cAzlM7dGEFQ4Kuxo jbtuU44fGI+t0bksAGzz+OXFvgaXBx1mLwzpmIgE6yTrF1S4KZx9Lu2VJLcHLrhhVjmkCDYGksE gJG2FbUPAeKzwGu/xqz+dwgZVxH9YbEfckx/kFYrj54OZYx3RyjqgdR66teaF22fAIWd9Kyd5nD kUXCeO5Mnxb/S25TtWhy7y7h681cmmizOgy+IdSld5pe807WzB6rNBwndGPjgUB+A68PHXPa6sm 0V7XiX9FPw5logmxvIPqumwHw/fVCKjblR6GmPvB7W2A= X-Google-Smtp-Source: AGHT+IF2r0NjGU9pE0kv12DokvhTwolUZYq7BDqrmPlf0MhtFJnppJPFP9mEYSivSkVn8OUjjoeT8A== X-Received: by 2002:a05:600c:1c8d:b0:43b:c0fa:f9c4 with SMTP id 5b1f17b1804b1-450d7bae255mr27584685e9.4.1748798514739; Sun, 01 Jun 2025 10:21:54 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:54 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 04/11] iio: accel: adxl313: add function to enable measurement Date: Sun, 1 Jun 2025 17:21:32 +0000 Message-Id: <20250601172139.59156-5-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework controlling measurement and standby of the sensor. Therefore, replace writing the register directly by encapsulating this and dealing with the return value in a separte function to enable and disable measurement. This will help to avoid redundant code in all locations where the sensor configuration needs to be adjusted, thus measurement will be set to standby, in follow up patches. Further, reduce the control mask to only the measurement bit. The sleep bit actually controls a different behavior (not just putting the sensor to standby for configuration, but turning it into sleep mode) and it is not used so far. In consequence, there is no need to cover sleep bit and measurement with the same mask. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313.h | 3 +-- drivers/iio/accel/adxl313_core.c | 10 +++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/iio/accel/adxl313.h b/drivers/iio/accel/adxl313.h index fc937bdf83b6..9bf2facdbf87 100644 --- a/drivers/iio/accel/adxl313.h +++ b/drivers/iio/accel/adxl313.h @@ -36,8 +36,7 @@ #define ADXL313_RATE_MSK GENMASK(3, 0) #define ADXL313_RATE_BASE 6 =20 -#define ADXL313_POWER_CTL_MSK GENMASK(3, 2) -#define ADXL313_MEASUREMENT_MODE BIT(3) +#define ADXL313_POWER_CTL_MSK BIT(3) =20 #define ADXL313_RANGE_MSK GENMASK(1, 0) #define ADXL313_RANGE_MAX 3 diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 0c893c286017..6170c9daa30f 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -63,6 +63,12 @@ bool adxl313_is_volatile_reg(struct device *dev, unsigne= d int reg) } EXPORT_SYMBOL_NS_GPL(adxl313_is_volatile_reg, "IIO_ADXL313"); =20 +static int adxl313_set_measure_en(struct adxl313_data *data, bool en) +{ + return regmap_assign_bits(data->regmap, ADXL313_REG_POWER_CTL, + ADXL313_POWER_CTL_MSK, en); +} + static int adxl312_check_id(struct device *dev, struct adxl313_data *data) { @@ -410,9 +416,7 @@ static int adxl313_setup(struct device *dev, struct adx= l313_data *data, } =20 /* Enables measurement mode */ - return regmap_update_bits(data->regmap, ADXL313_REG_POWER_CTL, - ADXL313_POWER_CTL_MSK, - ADXL313_MEASUREMENT_MODE); + return adxl313_set_measure_en(data, true); } =20 /** --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BBE301FDE14; Sun, 1 Jun 2025 17:21:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798519; cv=none; b=LaDx67Qio4YeJemAKMh6UVYkG3xUXZQr1fMYo8nUT2NLYn8AFhqZhRkjlTg/IQxeBWvCBSMBZC9cIEaNKLGjTKJprIn5Vvbb7LwtP0POAIN9R7sujsbl1JudLA2y5q4P9y54dQGIZfiyagUPIHYqNVfkc8MOeiKaxz06gLRNVYk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798519; c=relaxed/simple; bh=FLCiNFEJhCBqsS4uuQy/IOw+OqzT68jylHnSa8SjyoE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GimZ+W/Ssb/kGCFdATbHdGGPgtgHsqawh7WvOo2Ndg14CWXwbD8W8Ga+qtHM8aNvsOMaKqhhLARjWQoF9tClpGYu5m3KCE7KCGO2oyCCEWItEqJj6G+K69ivIOuiCLTnXOOIOmzm6vGMTl5CvQrGsQLK9zarkS99Sn6riTS0M1E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WfbQ6fxo; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WfbQ6fxo" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-3a4e6a0c274so469722f8f.2; Sun, 01 Jun 2025 10:21:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798516; x=1749403316; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=blweJXXwwSLiO3JnYOJAL6xAeYpzVKObXYLqYlzkNr0=; b=WfbQ6fxoIy1N9H4O1EnuJLc+S8/x9sec/hE7PhyoPOzlxK7KJLNKmC9JpIk1aKRYRP 6IU1nrsYWfSF5P4XGUwO5tXq1gOkc8+0qHQwPSVA8i3Xd8bqnckAWicM0Hd92gbfC5FE 1tFh8pkBBe+EtMzgaJiene+7omYkUMjw+iG5Yoek4ynAaNRhy7jOpMGVqADlb5unrq5U 85kBCamM2BbhAl4E89t3TgNqOd/SswgiiUViYsFBsS4pBuw4LIP7kS49nab7M49w/kDf m3Zv9u1TDF+w9r3Te1zNWfSm7JnwIjm0/MeiWcRlKOtkhRPyJoG4r3nFSIKKle54V6N/ Ooow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798516; x=1749403316; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=blweJXXwwSLiO3JnYOJAL6xAeYpzVKObXYLqYlzkNr0=; b=FHsz7fqM16QkwzKndtgozNMAziqOo2t/BTpNDbVY7hcDlaB1RtCjGchs6b+z1vsaxZ 7EG/7UCpim7Euu+oCms9bgdSQyIAnxe42iXObp7ISnJ2oWJF0l6fAfXkSt0P+1xPaTg9 BsiV7inNsUL1DOSwqThk5WdwCHL72Z7ogWp+BxVeFFTzUWx1QeNs/ri6cyDqhzxwBqCe KcA394+bHB15pWwZhBXFHEc3FxQOmrlev1YzpoIy/oRVV6N5IyBF0M6wdhZYwk8ab4YJ oGX5nU/hHFZlBAtJeID/V6HDwx/qsnfwclC1lfa9wHkwKQKe8BD9SHq8BFv8XVsF0LWP 5Ruw== X-Forwarded-Encrypted: i=1; AJvYcCUG6tc4C8FYlcjxUuDuO7QriN+HzZ3l0/iD53iLFZRtEf/8QttG+oHaj4iIYm7Vxwy2XlD3LV2sGJI=@vger.kernel.org, AJvYcCWgRP38jocqgUX9DA762FQDRwWU5A0XUe/Icb3QqN8f6WIzGZL8vMPiUITuIeiO9bUxlo0G7lm4R0/NXLB/@vger.kernel.org, AJvYcCXV5v/da1vY+iRaP2dXzs1rAVFKQ33GjiSUo63u3Q5SgY85gu2tL3VgmvMWmXCsrtynI1HqB8yyjkRO@vger.kernel.org X-Gm-Message-State: AOJu0YyBrx3T1ZofxukC9gRb8WXOLmawivkGEb+s4jzik77UW7FXQbkr APluJ4o0nBf5XjW60Mho6O8avq0oAp5YakjXpDYTQmHu9HLQclnF/DNJ X-Gm-Gg: ASbGncv/iWW03WOpsDfApE6aQ1WuY+zrCDaBwpzTtV3OQQeI7FMhydeMX58OxZ0zYii BE2TywGZvD/fOauF/9uReIjQabVt7tGA4n9iksxfKCazkl907vVaPE4pJKe5BhHr5F1o5bMwlXw nDC6h1GXewUAImLlIphiFiOeCmr3QEfbgrmrGUnMtB5KUWIy24cwTlkG+rOUUExPNjVlLhIN24I 36FB6JAcPiRmF3VpzF2Iy16pnP4KIg78E++d+HSjssEnxbQvntLazb4Gs08AunnkDl0XihESwM1 A2uIBKgQdLiMSrW6oc/69JRWumqnXrjMPAAV9K68lvPkD6THE34C0RlcB18bInIulmE9S4FPyCM 9JGgA1DpF470HyR+LQq/LpA== X-Google-Smtp-Source: AGHT+IFMHynzR/JIyE0nXoBYpaMteY30D9dIfPggxHAsSAKB+ojoT4LJ60VB700RM2TBXmo6bGrzrw== X-Received: by 2002:a05:6000:3113:b0:3a3:6ab0:8863 with SMTP id ffacd0b85a97d-3a4f7ac570amr2931587f8f.16.1748798515835; Sun, 01 Jun 2025 10:21:55 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:55 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 05/11] iio: accel: adxl313: prepare interrupt handling Date: Sun, 1 Jun 2025 17:21:33 +0000 Message-Id: <20250601172139.59156-6-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Evaluate the devicetree property for an optional interrupt line, and configure the interrupt mapping accordingly. When no interrupt line is defined in the devicetree, keep the FIFO in bypass mode as before. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313.h | 13 +++++++++ drivers/iio/accel/adxl313_core.c | 49 +++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/drivers/iio/accel/adxl313.h b/drivers/iio/accel/adxl313.h index 9bf2facdbf87..ab6b9e11fde4 100644 --- a/drivers/iio/accel/adxl313.h +++ b/drivers/iio/accel/adxl313.h @@ -21,7 +21,9 @@ #define ADXL313_REG_ACT_INACT_CTL 0x27 #define ADXL313_REG_BW_RATE 0x2C #define ADXL313_REG_POWER_CTL 0x2D +#define ADXL313_REG_INT_ENABLE 0x2E #define ADXL313_REG_INT_MAP 0x2F +#define ADXL313_REG_INT_SOURCE 0x30 #define ADXL313_REG_DATA_FORMAT 0x31 #define ADXL313_REG_DATA_AXIS(index) (0x32 + ((index) * 2)) #define ADXL313_REG_FIFO_CTL 0x38 @@ -45,6 +47,17 @@ #define ADXL313_SPI_3WIRE BIT(6) #define ADXL313_I2C_DISABLE BIT(6) =20 +#define ADXL313_INT_OVERRUN BIT(0) +#define ADXL313_INT_WATERMARK BIT(1) +#define ADXL313_INT_INACTIVITY BIT(3) +#define ADXL313_INT_ACTIVITY BIT(4) +#define ADXL313_INT_DREADY BIT(7) + +#define ADXL313_REG_FIFO_CTL_MODE_MSK GENMASK(7, 6) + +#define ADXL313_FIFO_BYPASS 0 +#define ADXL313_FIFO_STREAM 2 + extern const struct regmap_access_table adxl312_readable_regs_table; extern const struct regmap_access_table adxl313_readable_regs_table; extern const struct regmap_access_table adxl314_readable_regs_table; diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 6170c9daa30f..31ce1b218488 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -8,11 +8,17 @@ */ =20 #include +#include #include +#include #include =20 #include "adxl313.h" =20 +#define ADXL313_INT_NONE U8_MAX +#define ADXL313_INT1 1 +#define ADXL313_INT2 2 + static const struct regmap_range adxl312_readable_reg_range[] =3D { regmap_reg_range(ADXL313_REG_DEVID0, ADXL313_REG_DEVID0), regmap_reg_range(ADXL313_REG_OFS_AXIS(0), ADXL313_REG_OFS_AXIS(2)), @@ -436,7 +442,9 @@ int adxl313_core_probe(struct device *dev, { struct adxl313_data *data; struct iio_dev *indio_dev; - int ret; + u8 int_line; + u8 int_map_msk; + int irq, ret; =20 indio_dev =3D devm_iio_device_alloc(dev, sizeof(*data)); if (!indio_dev) @@ -461,6 +469,45 @@ int adxl313_core_probe(struct device *dev, return ret; } =20 + int_line =3D ADXL313_INT1; + irq =3D fwnode_irq_get_byname(dev_fwnode(dev), "INT1"); + if (irq < 0) { + int_line =3D ADXL313_INT2; + irq =3D fwnode_irq_get_byname(dev_fwnode(dev), "INT2"); + if (irq < 0) + int_line =3D ADXL313_INT_NONE; + } + + if (int_line !=3D ADXL313_INT_NONE) { + /* FIFO_STREAM mode */ + int_map_msk =3D ADXL313_INT_DREADY | ADXL313_INT_ACTIVITY | + ADXL313_INT_INACTIVITY | ADXL313_INT_WATERMARK | + ADXL313_INT_OVERRUN; + ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_INT_MAP, + int_map_msk, int_line =3D=3D ADXL313_INT2); + if (ret) + return ret; + } else { + /* + * FIFO_BYPASSED mode + * + * When no interrupt lines are specified, the driver falls back + * to use the sensor in FIFO_BYPASS mode. This means turning off + * internal FIFO and interrupt generation (since there is no + * line specified). Unmaskable interrupts such as overrun or + * data ready won't interfere. Even that a FIFO_STREAM mode w/o + * connected interrupt line might allow for obtaining raw + * measurements, a fallback to disable interrupts when no + * interrupt lines are connected seems to be the cleaner + * solution. + */ + ret =3D regmap_write(data->regmap, ADXL313_REG_FIFO_CTL, + FIELD_PREP(ADXL313_REG_FIFO_CTL_MODE_MSK, + ADXL313_FIFO_BYPASS)); + if (ret) + return ret; + } + return devm_iio_device_register(dev, indio_dev); } EXPORT_SYMBOL_NS_GPL(adxl313_core_probe, IIO_ADXL313); --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 044E5201034; Sun, 1 Jun 2025 17:21:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798520; cv=none; b=otJVdT+yYlBptBm3planjdVMxTj/JBSwlxqZ5XihwV8gQBrr0mdvbPKdTs096ist8myN5mr8osJ/V//+LkIOCJ30HFk7q1POvymRQYjZo7neJy5dFNksAEAQirs9vUM/dtU4jcwedTaAe7wCl8g+KfKPxkPzD3+5Mm3rS21e3VA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798520; c=relaxed/simple; bh=/sOc9fTkJnyXISGbgO7H++cvOaIUVU1TXCPxM9nLBYo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CTl9u6bpZtMv7AZp9htghGZF0g9IHjeJw+m5ek+j7rlfd/O2NAQK3vFgoY11bqTmse0dIGY8CvSjpOShEGP9/2nY4VfzJiw0MGtUBMsmoHX7wMefwhji4sIqLX2Z5+CZcoii8ZVWeIPs5RW6Ew7L892s8G48O/xDN7oPBq3j+ok= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Zq9g9Smr; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Zq9g9Smr" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-43d4ff56136so957335e9.3; Sun, 01 Jun 2025 10:21:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798517; x=1749403317; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=n238sgCw6wcL+GgmAKal3WeJnfpIGHYNLmJxhnga+i8=; b=Zq9g9SmrjS6p4zMeEs0HLUlgnd5fwnWNSZEUmZq2ixMZtIqLgp1CZy0ZrCni4oP1Vl aFN5srW+x+KqgjxfSM1AVjwmB8Td1jmB8hH0YzSVhX3+pRuH0m0m4r47n1J7VeN9Qxmg roYJ1Ko9T1WcgCvosWta5JR8o+lG3MSr/yCV77880W/dj23lYTIYPFMAxBbl2NH2sBQ0 nGSUud/Tk4c2D5I1tswshNVgiTFi1M8m/mBGSx0HfbmdWoLBFfW9Qf9ZSMXvPQICLmqs xArFhLNDLRZvnmxx8evHHYb47yuAQv1xNIYgXpJ/D8nG5oT+bqhf+DBtIp9YOIztXo5Y r8+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798517; x=1749403317; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=n238sgCw6wcL+GgmAKal3WeJnfpIGHYNLmJxhnga+i8=; b=BTCRQJ6jFu5dIhnpQJtXQyq1dKSK4qmgRnr2k39Gg3S+sh6vYCZJOMVl2XkHUB0j8+ n9wJsd1N9Ell0lME8T8BCOV5MW5rklbzj5rKaJpeKeFKZh7xXHXHC5U8amMq+Wzg3r73 g23XQ4jjoaby5wuDI+TDDAj/to+7C7dCc2qtVr2WCDYFETSajnGIpWN2NADLLeTR1Q7t xJKUSOmiH45n2o39PHxAzHVxM4stvL3i9NQ7QkP8oAlZ/LINHGJ5pvJ7/q95PTDrve7a 55a9M2DKwIvuYmpGafP9k4NWCpevkDtjPg5JA411rh7DKmf+OTfR7dfKc5U/YwlBwdm8 sQTw== X-Forwarded-Encrypted: i=1; AJvYcCUZsaTp78x2Ju1jz93UJojIRQxRi/KWx/XvO8tObmiduJf8f4zchHk4lvucwxgnVRwWoHHfqe8gHM8=@vger.kernel.org, AJvYcCVW5806xtborkyxVF75zhlCu980q8AwLNQTwjyORP8Hm6Hh00TogXfygp8EkSqWNkR5MhWxwAuZOKqT@vger.kernel.org, AJvYcCW727kjPKn0hqng8pH3vzASSKYNGYHAkVpc+FNQalnv6ujA3BhihFrJe1MsVqmSWTwlKmxTF7UMDt49ebXZ@vger.kernel.org X-Gm-Message-State: AOJu0Yw1rG0ZZsH8GVuKUiUqqnM0R/PAuOp2KmjPNtvHhOtw9FUBrQF1 eZ56zCv9Nz5NubUrq9bEMT3wvENOlUAqDn7gwyv5Fz4p6ZF/yoJm2hdFCxUewQ== X-Gm-Gg: ASbGncuNBtFFL+NR09IFwqsyktbtGhYXPdjUmT9Nln6wredOuOwSJPusv7elfYfj/j9 BacyAuuDByJl9w9v3MjxmTfONYTutYkCmclO3F2fi7ZgI9DNv4zHAB8Q7Tk9vge3dENylZffjl2 wwl7tBlq77YUe2fprMtEgdnro6HCesPfwHs0t6sKKW+zrDsjgWuzGUX5DdDIKbGUmLMaNg/yFm/ ruRQxN8Ar8rjN0G+/nInloJ06hvVsvW3B6VAknZlsbmD4cQoDm/283E9vdd4uRagm+cabf2nPwv Q16kJl5KuTQhkwvVS3TOBDsgyOuvgFRFD7smNzqTFZ62We5o2gMuU7mKpp3xq1YaqlV2IFwRvT1 Pf1YR4a2cLzhJ0iEdAiP9qw== X-Google-Smtp-Source: AGHT+IEcKoL7Ca4GfQfrQmw1dzgsMg68OQtuZaP2xa0aOHt/jZUFmbZsPsIhT5JWDtqfdQp/K/t+MA== X-Received: by 2002:a05:600c:444b:b0:439:9a40:aa1a with SMTP id 5b1f17b1804b1-450d6556cd1mr31440305e9.6.1748798517044; Sun, 01 Jun 2025 10:21:57 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:56 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 06/11] iio: accel: adxl313: add basic interrupt handling for FIFO watermark Date: Sun, 1 Jun 2025 17:21:34 +0000 Message-Id: <20250601172139.59156-7-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Prepare the interrupt handler. Add register entries to evaluate the incoming interrupt. Add functions to clear status registers and reset the FIFO. Add FIFO watermark configuration and evaluation. Let a watermark to be configured. Evaluate the interrupt accordingly. Read out the FIFO content and push the values to the IIO channel. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313.h | 10 ++ drivers/iio/accel/adxl313_core.c | 190 +++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) diff --git a/drivers/iio/accel/adxl313.h b/drivers/iio/accel/adxl313.h index ab6b9e11fde4..4f4a9fd39f6d 100644 --- a/drivers/iio/accel/adxl313.h +++ b/drivers/iio/accel/adxl313.h @@ -53,11 +53,19 @@ #define ADXL313_INT_ACTIVITY BIT(4) #define ADXL313_INT_DREADY BIT(7) =20 +/* FIFO entries: how many values are stored in the FIFO */ +#define ADXL313_REG_FIFO_STATUS_ENTRIES_MSK GENMASK(5, 0) +/* FIFO samples: number of samples needed for watermark (FIFO mode) */ +#define ADXL313_REG_FIFO_CTL_SAMPLES_MSK GENMASK(4, 0) #define ADXL313_REG_FIFO_CTL_MODE_MSK GENMASK(7, 6) =20 #define ADXL313_FIFO_BYPASS 0 #define ADXL313_FIFO_STREAM 2 =20 +#define ADXL313_FIFO_SIZE 32 + +#define ADXL313_NUM_AXIS 3 + extern const struct regmap_access_table adxl312_readable_regs_table; extern const struct regmap_access_table adxl313_readable_regs_table; extern const struct regmap_access_table adxl314_readable_regs_table; @@ -78,7 +86,9 @@ struct adxl313_data { struct regmap *regmap; const struct adxl313_chip_info *chip_info; struct mutex lock; /* lock to protect transf_buf */ + u8 watermark; __le16 transf_buf __aligned(IIO_DMA_MINALIGN); + __le16 fifo_buf[ADXL313_NUM_AXIS * ADXL313_FIFO_SIZE + 1]; }; =20 struct adxl313_chip_info { diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 31ce1b218488..8a0b5542fb40 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -10,15 +10,21 @@ #include #include #include +#include #include #include =20 +#include +#include + #include "adxl313.h" =20 #define ADXL313_INT_NONE U8_MAX #define ADXL313_INT1 1 #define ADXL313_INT2 2 =20 +#define ADXL313_REG_XYZ_BASE ADXL313_REG_DATA_AXIS(0) + static const struct regmap_range adxl312_readable_reg_range[] =3D { regmap_reg_range(ADXL313_REG_DEVID0, ADXL313_REG_DEVID0), regmap_reg_range(ADXL313_REG_OFS_AXIS(0), ADXL313_REG_OFS_AXIS(2)), @@ -62,6 +68,7 @@ bool adxl313_is_volatile_reg(struct device *dev, unsigned= int reg) case ADXL313_REG_DATA_AXIS(4): case ADXL313_REG_DATA_AXIS(5): case ADXL313_REG_FIFO_STATUS: + case ADXL313_REG_INT_SOURCE: return true; default: return false; @@ -363,6 +370,176 @@ static int adxl313_write_raw(struct iio_dev *indio_de= v, } } =20 +static int adxl313_set_watermark(struct iio_dev *indio_dev, unsigned int v= alue) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + const unsigned int fifo_mask =3D 0x1f, interrupt_mask =3D 0x02; + int ret; + + value =3D min(value, ADXL313_FIFO_SIZE - 1); + + ret =3D regmap_update_bits(data->regmap, ADXL313_REG_FIFO_CTL, + fifo_mask, value); + if (ret) + return ret; + + data->watermark =3D value; + + return regmap_update_bits(data->regmap, ADXL313_REG_INT_ENABLE, + interrupt_mask, ADXL313_INT_WATERMARK); +} + +static int adxl313_get_samples(struct adxl313_data *data) +{ + unsigned int regval =3D 0; + int ret; + + ret =3D regmap_read(data->regmap, ADXL313_REG_FIFO_STATUS, ®val); + if (ret) + return ret; + + return FIELD_GET(ADXL313_REG_FIFO_STATUS_ENTRIES_MSK, regval); +} + +static int adxl313_fifo_transfer(struct adxl313_data *data, int samples) +{ + unsigned int i; + int ret; + + for (i =3D 0; i < samples; i++) { + ret =3D regmap_bulk_read(data->regmap, ADXL313_REG_XYZ_BASE, + data->fifo_buf + (i * ADXL313_NUM_AXIS), + 2 * ADXL313_NUM_AXIS); + if (ret) + return ret; + } + + return 0; +} + +/** + * adxl313_fifo_reset() - Reset the FIFO and interrupt status registers. + * @data: The device data. + * + * Reset the FIFO status registers. Reading out status registers clears the + * FIFO and interrupt configuration. Thus do not evaluate regmap return va= lues. + * Ignore particular read register content. Register content is not proces= sed + * any further. Therefore the function returns void. + */ +static void adxl313_fifo_reset(struct adxl313_data *data) +{ + unsigned int regval; + int samples; + + adxl313_set_measure_en(data, false); + + samples =3D adxl313_get_samples(data); + if (samples > 0) + adxl313_fifo_transfer(data, samples); + + regmap_read(data->regmap, ADXL313_REG_INT_SOURCE, ®val); + + adxl313_set_measure_en(data, true); +} + +static int adxl313_buffer_postenable(struct iio_dev *indio_dev) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + int ret; + + ret =3D adxl313_set_measure_en(data, false); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, ADXL313_REG_FIFO_CTL, + FIELD_PREP(ADXL313_REG_FIFO_CTL_SAMPLES_MSK, data->watermark) | + FIELD_PREP(ADXL313_REG_FIFO_CTL_MODE_MSK, ADXL313_FIFO_STREAM)); + if (ret) + return ret; + + return adxl313_set_measure_en(data, true); +} + +static int adxl313_buffer_predisable(struct iio_dev *indio_dev) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + int ret; + + ret =3D adxl313_set_measure_en(data, false); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, ADXL313_REG_FIFO_CTL, + FIELD_PREP(ADXL313_REG_FIFO_CTL_MODE_MSK, ADXL313_FIFO_BYPASS)); + + ret =3D regmap_write(data->regmap, ADXL313_REG_INT_ENABLE, 0); + if (ret) + return ret; + + return adxl313_set_measure_en(data, true); +} + +static const struct iio_buffer_setup_ops adxl313_buffer_ops =3D { + .postenable =3D adxl313_buffer_postenable, + .predisable =3D adxl313_buffer_predisable, +}; + +static int adxl313_fifo_push(struct iio_dev *indio_dev, int samples) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + unsigned int i; + int ret; + + ret =3D adxl313_fifo_transfer(data, samples); + if (ret) + return ret; + + for (i =3D 0; i < ADXL313_NUM_AXIS * samples; i +=3D ADXL313_NUM_AXIS) + iio_push_to_buffers(indio_dev, &data->fifo_buf[i]); + + return 0; +} + +static int adxl313_push_event(struct iio_dev *indio_dev, int int_stat) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + int samples; + + if (FIELD_GET(ADXL313_INT_WATERMARK, int_stat)) { + samples =3D adxl313_get_samples(data); + if (samples < 0) + return samples; + + return adxl313_fifo_push(indio_dev, samples); + } + + /* Return error if no event data was pushed to the IIO channel. */ + return -ENOENT; +} + +static irqreturn_t adxl313_irq_handler(int irq, void *p) +{ + struct iio_dev *indio_dev =3D p; + struct adxl313_data *data =3D iio_priv(indio_dev); + int int_stat; + + if (regmap_read(data->regmap, ADXL313_REG_INT_SOURCE, &int_stat)) + return IRQ_NONE; + + if (adxl313_push_event(indio_dev, int_stat)) + goto err; + + if (FIELD_GET(ADXL313_INT_OVERRUN, int_stat)) + goto err; + + return IRQ_HANDLED; + +err: + adxl313_fifo_reset(data); + + return IRQ_HANDLED; +} + static int adxl313_reg_access(struct iio_dev *indio_dev, unsigned int reg, unsigned int writeval, unsigned int *readval) { @@ -377,6 +554,7 @@ static const struct iio_info adxl313_info =3D { .read_raw =3D adxl313_read_raw, .write_raw =3D adxl313_write_raw, .read_avail =3D adxl313_read_freq_avail, + .hwfifo_set_watermark =3D adxl313_set_watermark, .debugfs_reg_access =3D &adxl313_reg_access, }; =20 @@ -487,6 +665,18 @@ int adxl313_core_probe(struct device *dev, int_map_msk, int_line =3D=3D ADXL313_INT2); if (ret) return ret; + + ret =3D devm_iio_kfifo_buffer_setup(dev, indio_dev, + &adxl313_buffer_ops); + if (ret) + return ret; + + ret =3D devm_request_threaded_irq(dev, irq, NULL, + &adxl313_irq_handler, + IRQF_SHARED | IRQF_ONESHOT, + indio_dev->name, indio_dev); + if (ret) + return ret; } else { /* * FIFO_BYPASSED mode --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C7C2C2045B5; Sun, 1 Jun 2025 17:22:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798522; cv=none; b=d5UEImEqERPfAJs4d9ImZgK5g3K2AhfFJ4JqcCvnm7CPN7HGzP0OAbE6cntkksVo4acdprXFp5FFkVO2KuNIyx5qyjeTB/hN2Jm163X2JLHTVxiI2s/cYdUow0Fju2pWjXlP/Ltr01PA/WDfe7g5NTjBOXOo/3qJjCVmbFusdnM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798522; c=relaxed/simple; bh=m1BHSldAKTqhZJptWjKeNYnu/UTDyDC/BrQFWOSoVeA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=R8jM5T5vmceIhOhHgH/QAwo/GqoM1a891L2YPGeUPKapFyxi9B45KNf9zHof0f70zL/AvtbRlsEfKXLqWB3/Ly38ZzyjLZEgP2UuJ3cKWq9j68ZlYs3o5JRUbnqbG4KdJqfzbrsqgaCr7iPtth6teWVOG3miY7nseWwZtAwkadc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YPsQ+GGw; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YPsQ+GGw" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-450d61cc409so700175e9.3; Sun, 01 Jun 2025 10:22:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798519; x=1749403319; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JeCK9Gn5gUH10CfxoaZ02nPV2QTvNKzqD5cWKUlNDuY=; b=YPsQ+GGwa7dT0JLvcsFlI7ClwDGfrzxpGGSf0t5vDb0v0c2HkcZ0y3lsrvLYszBaPp hx/tr0/SHjn4gjidIa72yqVDL/LLnoK8vXSKNIJbIUazNgrl2/+WJx4Yx4odCyOalb8I R+iiuudxtq9aZ3WeYDGm2Cix/AT4IHv0Pd0cFwOPE/p8eBUF0THKCVhk/xU44i6ub5Jo OH78qxVi0Emw8HgulczC/29jnAQTvqcUkFVr/+dY6niinatAEFaEObYJdmV2sGlf2Wo9 T2m6spLpEHzB06oMWEnoQ0Dp+CRcKlnxmQYy6KIMLlZ7ki3desflqZdPfLRyqXU26L0c nTPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798519; x=1749403319; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JeCK9Gn5gUH10CfxoaZ02nPV2QTvNKzqD5cWKUlNDuY=; b=WqwBB+Bdb4kw1/tPeoeJy31d59M7Ph+yBJAHyFnRnAqZjX1oQJKbceW8v2LB04BpOD QB8ho5AaX2/QSvYIOrj1v37WlXAft4uNSZHvzsfH19AWxiXdmm4KKC0K2McBAUVPZ0Dk CDobqEWbpBwDGQ1AHYXTdOv6Jz/N/XfmMrnD6N+UAInUyEoBwYURbAjtUsjPvOVESYz0 VIsEV87WIfa0Vk92R3Cnb7ePKZw+xpa70eoAj7Y+nq88NVP7g2YwVOnprIvAO06m7IEY IwEGhGlms0uGL197JEixuk0yX9e6rn6Ws8nbjJBkvWwJqEQ/ZOjzgtukq/DR8CghLGWV lkNA== X-Forwarded-Encrypted: i=1; AJvYcCV52EZy/J59QObORpf3QmXg/PlieGAhvphoXbGWkTVE8LTiYXLj2lzcMirKL8MXXoRwDdk5QbH2q+On4Tv0@vger.kernel.org, AJvYcCX2QPZBYOePhRYR3S5FjGAAcFrRDeykc0YatBDx9R2PBeORslBXleasYm0kSjjaV592asgB8r3YerU=@vger.kernel.org, AJvYcCXbdywi7s0c4kXzDyFqxiw68yN+vODXBjmBMGAHYrUy2qzjgpYGnO83Say6XVY7JGS8wl+tkOEWAry7@vger.kernel.org X-Gm-Message-State: AOJu0YwM6p2qh5TzN+9yQtrxmbGelc1Nt0N1G81NnAAfEfG7y5bSUSBx nlEgOGWTljMyxE6XyX1Ch51b9aO9WHLHTeOq4VTv8MgIbr7oPwFYMIWy X-Gm-Gg: ASbGncuBp+dJgalNxt3yctTwFIiYRP8zVxkGPeSUW3LVjxMwtJc63Mlxnw5pPea7Gl4 Wjzv56IL8kK58nJ0hHhMjfeBEMGiQsacpLUXQCQl61f76o+0QP+UfzDCECoqC6wwUHpCUD2I30D g0E612J82jQ4Aj+vG5bPWYqkfc+wHrwxwPbypVaO4seQnVbLQ06zLwF4GuWp0kQcpYmqRY21kuS qwx9nRNxqbzYtzV3HFODMsPWDqV0QmsTlc/dVAjoGvWYaXhiKwyGFutbFrIKLIhyDbfQ2+AqdH+ ovkF1WhImND1q8DsfV/XGxfOMHItkR3u9jq8ik0t40HFzVnzX4p5rzjCMsIlZA9gjaTY1yf6Nz5 lodVpR3MrqMcfjjDf7zpa4Q== X-Google-Smtp-Source: AGHT+IFwJsWa12fhq9dormBrLU7PF5s3HWdnBAIgd9HfIfTft6VKTL2K3wqsrF2m0k6Yj5yj/UcV8Q== X-Received: by 2002:a05:600c:3595:b0:439:8294:2115 with SMTP id 5b1f17b1804b1-450d7bd5e14mr29797985e9.8.1748798518813; Sun, 01 Jun 2025 10:21:58 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:58 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 07/11] iio: accel: adxl313: add activity sensing Date: Sun, 1 Jun 2025 17:21:35 +0000 Message-Id: <20250601172139.59156-8-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add possibilities to set a threshold for activity sensing. Extend the interrupt handler to process activity interrupts. Provide functions to set the activity threshold and to enable/disable activity sensing. Further add a fake channel for having x, y and z axis anded on the iio channel. This is a preparatory patch. Some of the definitions and functions are supposed to be extended for inactivity later on. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313_core.c | 237 ++++++++++++++++++++++++++++++- 1 file changed, 235 insertions(+), 2 deletions(-) diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 8a0b5542fb40..e647c40575ab 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -13,8 +13,10 @@ #include #include #include +#include =20 #include +#include #include =20 #include "adxl313.h" @@ -25,6 +27,21 @@ =20 #define ADXL313_REG_XYZ_BASE ADXL313_REG_DATA_AXIS(0) =20 +#define ADXL313_ACT_XYZ_EN GENMASK(6, 4) + +/* activity/inactivity */ +enum adxl313_activity_type { + ADXL313_ACTIVITY, +}; + +static const unsigned int adxl313_act_int_reg[] =3D { + [ADXL313_ACTIVITY] =3D ADXL313_INT_ACTIVITY, +}; + +static const unsigned int adxl313_act_thresh_reg[] =3D { + [ADXL313_ACTIVITY] =3D ADXL313_REG_THRESH_ACT, +}; + static const struct regmap_range adxl312_readable_reg_range[] =3D { regmap_reg_range(ADXL313_REG_DEVID0, ADXL313_REG_DEVID0), regmap_reg_range(ADXL313_REG_OFS_AXIS(0), ADXL313_REG_OFS_AXIS(2)), @@ -227,6 +244,15 @@ static const int adxl313_odr_freqs[][2] =3D { }, \ } =20 +static const struct iio_event_spec adxl313_activity_events[] =3D { + { + .type =3D IIO_EV_TYPE_MAG, + .dir =3D IIO_EV_DIR_RISING, + .mask_separate =3D BIT(IIO_EV_INFO_ENABLE), + .mask_shared_by_type =3D BIT(IIO_EV_INFO_VALUE), + }, +}; + enum adxl313_chans { chan_x, chan_y, chan_z, }; @@ -235,6 +261,14 @@ static const struct iio_chan_spec adxl313_channels[] = =3D { ADXL313_ACCEL_CHANNEL(0, chan_x, X), ADXL313_ACCEL_CHANNEL(1, chan_y, Y), ADXL313_ACCEL_CHANNEL(2, chan_z, Z), + { + .type =3D IIO_ACCEL, + .modified =3D 1, + .channel2 =3D IIO_MOD_X_OR_Y_OR_Z, + .scan_index =3D -1, /* Fake channel for axis OR'ing */ + .event_spec =3D adxl313_activity_events, + .num_event_specs =3D ARRAY_SIZE(adxl313_activity_events), + }, }; =20 static const unsigned long adxl313_scan_masks[] =3D { @@ -297,6 +331,68 @@ static int adxl313_read_freq_avail(struct iio_dev *ind= io_dev, } } =20 +static int adxl313_is_act_inact_en(struct adxl313_data *data, + enum adxl313_activity_type type) +{ + unsigned int axis_ctrl; + unsigned int regval; + int axis_en, int_en, ret; + + ret =3D regmap_read(data->regmap, ADXL313_REG_ACT_INACT_CTL, &axis_ctrl); + if (ret) + return ret; + + /* Check if axis for activity are enabled */ + if (type !=3D ADXL313_ACTIVITY) + return 0; + + axis_en =3D FIELD_GET(ADXL313_ACT_XYZ_EN, axis_ctrl); + + /* The axis are enabled, now check if specific interrupt is enabled */ + ret =3D regmap_read(data->regmap, ADXL313_REG_INT_ENABLE, ®val); + if (ret) + return ret; + + int_en =3D adxl313_act_int_reg[type] & regval; + + return axis_en && int_en; +} + +static int adxl313_set_act_inact_en(struct adxl313_data *data, + enum adxl313_activity_type type, + bool cmd_en) +{ + unsigned int axis_ctrl; + unsigned int threshold; + int ret; + + if (type !=3D ADXL313_ACTIVITY) + return 0; + + axis_ctrl =3D ADXL313_ACT_XYZ_EN; + + ret =3D adxl313_set_measure_en(data, false); + if (ret) + return ret; + + ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_ACT_INACT_CTL, + axis_ctrl, cmd_en); + if (ret) + return ret; + + ret =3D regmap_read(data->regmap, adxl313_act_thresh_reg[type], &threshol= d); + if (ret) + return ret; + + ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_INT_ENABLE, + adxl313_act_int_reg[type], + cmd_en && threshold); + if (ret) + return ret; + + return adxl313_set_measure_en(data, true); +} + static int adxl313_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) @@ -370,6 +466,113 @@ static int adxl313_write_raw(struct iio_dev *indio_de= v, } } =20 +static int adxl313_read_event_config(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + + if (type !=3D IIO_EV_TYPE_MAG) + return -EINVAL; + + switch (dir) { + case IIO_EV_DIR_RISING: + return adxl313_is_act_inact_en(data, ADXL313_ACTIVITY); + default: + return -EINVAL; + } +} + +static int adxl313_write_event_config(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir, + bool state) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + + if (type !=3D IIO_EV_TYPE_MAG) + return -EINVAL; + + switch (dir) { + case IIO_EV_DIR_RISING: + return adxl313_set_act_inact_en(data, ADXL313_ACTIVITY, state); + default: + return -EINVAL; + } +} + +static int adxl313_read_event_value(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir, + enum iio_event_info info, + int *val, int *val2) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + unsigned int act_threshold; + int ret; + + /* Measurement stays enabled, reading from regmap cache */ + + if (type !=3D IIO_EV_TYPE_MAG) + return -EINVAL; + + if (info !=3D IIO_EV_INFO_VALUE) + return -EINVAL; + + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_read(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY], + &act_threshold); + if (ret) + return ret; + *val =3D act_threshold * 15625; + *val2 =3D MICRO; + return IIO_VAL_FRACTIONAL; + default: + return -EINVAL; + } +} + +static int adxl313_write_event_value(struct iio_dev *indio_dev, + const struct iio_chan_spec *chan, + enum iio_event_type type, + enum iio_event_direction dir, + enum iio_event_info info, + int val, int val2) +{ + struct adxl313_data *data =3D iio_priv(indio_dev); + unsigned int regval; + int ret; + + ret =3D adxl313_set_measure_en(data, false); + if (ret) + return ret; + + if (type !=3D IIO_EV_TYPE_MAG) + return -EINVAL; + + if (info !=3D IIO_EV_INFO_VALUE) + return -EINVAL; + + /* Scale factor 15.625 mg/LSB */ + regval =3D DIV_ROUND_CLOSEST(MICRO * val + val2, 15625); + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_write(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY], + regval); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); + default: + return -EINVAL; + } +} + static int adxl313_set_watermark(struct iio_dev *indio_dev, unsigned int v= alue) { struct adxl313_data *data =3D iio_priv(indio_dev); @@ -502,19 +705,32 @@ static int adxl313_fifo_push(struct iio_dev *indio_de= v, int samples) =20 static int adxl313_push_event(struct iio_dev *indio_dev, int int_stat) { + s64 ts =3D iio_get_time_ns(indio_dev); struct adxl313_data *data =3D iio_priv(indio_dev); int samples; + int ret =3D -ENOENT; + + if (FIELD_GET(ADXL313_INT_ACTIVITY, int_stat)) { + ret =3D iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_OR_Y_OR_Z, + IIO_EV_TYPE_MAG, + IIO_EV_DIR_RISING), + ts); + if (ret) + return ret; + } =20 if (FIELD_GET(ADXL313_INT_WATERMARK, int_stat)) { samples =3D adxl313_get_samples(data); if (samples < 0) return samples; =20 - return adxl313_fifo_push(indio_dev, samples); + ret =3D adxl313_fifo_push(indio_dev, samples); } =20 /* Return error if no event data was pushed to the IIO channel. */ - return -ENOENT; + return ret; } =20 static irqreturn_t adxl313_irq_handler(int irq, void *p) @@ -553,6 +769,10 @@ static int adxl313_reg_access(struct iio_dev *indio_de= v, unsigned int reg, static const struct iio_info adxl313_info =3D { .read_raw =3D adxl313_read_raw, .write_raw =3D adxl313_write_raw, + .read_event_config =3D adxl313_read_event_config, + .write_event_config =3D adxl313_write_event_config, + .read_event_value =3D adxl313_read_event_value, + .write_event_value =3D adxl313_write_event_value, .read_avail =3D adxl313_read_freq_avail, .hwfifo_set_watermark =3D adxl313_set_watermark, .debugfs_reg_access =3D &adxl313_reg_access, @@ -666,6 +886,19 @@ int adxl313_core_probe(struct device *dev, if (ret) return ret; =20 + /* + * Reset or configure the registers with reasonable default + * values. As having 0 in most cases may result in undesirable + * behavior if the interrupts are enabled. + */ + ret =3D regmap_write(data->regmap, ADXL313_REG_ACT_INACT_CTL, 0x00); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, ADXL313_REG_THRESH_ACT, 0x52); + if (ret) + return ret; + ret =3D devm_iio_kfifo_buffer_setup(dev, indio_dev, &adxl313_buffer_ops); if (ret) --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09E372066CF; Sun, 1 Jun 2025 17:22:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798524; cv=none; b=US+Ax6nNy9iQlyD66Dr/eD3pPbqunjQcNHMqFBU1SMxKfxJu3D3gLAcL85yNJT+susKVd7XpD5uoAxwiXxwk3lSn0n/MXepm3qr49j5veiTq+1q/wVr7a8flhRUxa7RHWnUcdpi1jeM3A2FiS8dLnCFVz1LwibG/J+9rgRD7qB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798524; c=relaxed/simple; bh=a/9cv1A7PsrnaQyeWdhkzMR72y+CP6I3R/R8Vzgx+/o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tnnCrIdC85tTLJbxDzA9Er8r9KheGbV7VMS1TXeugSNoSSY0UAFGM81Z+Obp1as7eKzIl8FczL/uGrkZ6DsN6vRl1voo4qq/cjHKXPkKv00Y5/bE2zdT4VEF52k4Navx/KeEZjVT8joMvAiMH2gGGjTvNoA5bfQLb1QgGQZF3C4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=g0I6WyI2; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="g0I6WyI2" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-3a4ef892ab2so501794f8f.3; Sun, 01 Jun 2025 10:22:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798520; x=1749403320; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZC774zi9wipgE1achXdcOBBubJSX3HwNL15strlYYoI=; b=g0I6WyI2HwfVYzhrck0e+9sLWuJhwQ9AyuAfwtiYHRuEGWhWAhzkKINXKLModsG30G EKS6CUytz03UsrC5oA6+qbKXhkqJ9lNUqbpRQutTVzRuLcSmsxX5ujZsAi2N3KACgq/V H665WxbOHL5awOJSQFbEmqNCBylJwiIvtEVIrj6SLhI4aiLa2CD8aK2zOyA0ftOtr7uf CFTmOUMcssb8k+QI2YlJebvH14Qz7D1qyiGbqTSojXU7fN04nIHof14HGkObWTzZAU6m uit9ihGnUWfmJkgzFzrstizfewRxydl/Xl15VDuepJu4ZoMDAtXbU6FkJdA6MBmaq4jT VUGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798520; x=1749403320; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZC774zi9wipgE1achXdcOBBubJSX3HwNL15strlYYoI=; b=FGeKyKE3+/2S1i1TtaJAqmePm+uNKsQB5pGuR77dBLT9UHKpTCl0A3tj2hdc+HDHPX 1BQ47GM/Txbtn54+r0MKuvO09ERD6x3LB0lTsvqYT1i6jE3S0FVPYdQVZqTHF9kmyrKy GeWsiZdIlU8Cm2kXqId+zh3DtLmGO7hvpEDzh4c4WMHbi8Y3tRLqGaPigANu0s6wV1/U RVnolf5c7hkH66jNFq5rL2vB1cqrsXwOYSJw7P2OPxZW16vcaeNeNEr9LHvfE/gkemyb B9JFyTvRfwvTv32apI3/NvwPzf01/v/1g66hyLJfUDA8KdMUbWVSKNZHXjHdmRncTb+q orIg== X-Forwarded-Encrypted: i=1; AJvYcCUR3XRGVqhTh/J0fh3oImwdmK3v5TtYM+VDDJuZ4GuI2jq22ngj9IYt0oJo+S1h0+kpA0of8Gd0kQc=@vger.kernel.org, AJvYcCWAnrLU/42s9U47d6L0uPPKRx/79jJ2zSWhhBr0oynDW/Zwagrt0R/cKlzpDuSfJBZoHmbjPatG8MIe@vger.kernel.org, AJvYcCWihmPMbdzh3ia+tBM+JtNUAhidYynrcn6TjiixoiRigoKZ06TOHlJWU1Xy/QEGxnjf4a+QR/IlFNAcdLLl@vger.kernel.org X-Gm-Message-State: AOJu0Yyseptff87VOqXcTMb4NIR1h6AETTHw6oTdndXunWGBU6HKkfk/ ZaZXxQJ/uwmbItx7LUfbYbod2fBtExQXZ702nNtZKfOcgBfTZNqeUlS1 X-Gm-Gg: ASbGncsQB52vp7HQhDc/fgEb3t3mtSr2lJFGk5oTA7E3yX01CrdKnR7mDkvRoime6MN aZxYPkAkYv2Dw7b8+SPWblTi/jY78JpRp9dDF+mf0n31g/y8O9zpl50ch0P7jlJWDhTnAiWexdz YNzVL2JaKdgBRlcAFgabnBF5yS6vJD86uP8pbj+S2JcYZqVZYzjPvc8FUBHCPJeK7WJztxLULMD EXkXW0JH3g7D0JNVrTbn7fO1D4Zo/NBo4N/hAbAOJwnMpBMsoouw1PHYYG5N+n0hLpwbXuJADsk KXjlmWSf8x1vIhbctz5XwCwaoiroyTMJ1aK9ZcYA0Z/Ye4wBMEzkmzWVvcSFJJbiSjW9HWe0zMG ds2q410YnT7ON8JcwilljgdYOGb/51aFC X-Google-Smtp-Source: AGHT+IELhI6tkQ4dFmoV1qnDpaZIvxVXs4KR1x6FXnqZYaoSjmeb8Mvj7QJg95614iEtDMVPHL6p7g== X-Received: by 2002:a05:600c:1caa:b0:43d:2318:ed7f with SMTP id 5b1f17b1804b1-450d7a7493dmr29882535e9.0.1748798520018; Sun, 01 Jun 2025 10:22:00 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.21.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:21:59 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 08/11] iio: accel: adxl313: add inactivity sensing Date: Sun, 1 Jun 2025 17:21:36 +0000 Message-Id: <20250601172139.59156-9-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extend the interrupt handler to process interrupts as inactivity events. Add functions to set threshold and period registers for inactivity. Add functions to enable / disable inactivity. Extend the fake iio channel to deal with inactivity events on x, y and z combined with AND. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313.h | 2 + drivers/iio/accel/adxl313_core.c | 159 +++++++++++++++++++++++++------ 2 files changed, 131 insertions(+), 30 deletions(-) diff --git a/drivers/iio/accel/adxl313.h b/drivers/iio/accel/adxl313.h index 4f4a9fd39f6d..d7e8cb44855b 100644 --- a/drivers/iio/accel/adxl313.h +++ b/drivers/iio/accel/adxl313.h @@ -18,6 +18,8 @@ #define ADXL313_REG_SOFT_RESET 0x18 #define ADXL313_REG_OFS_AXIS(index) (0x1E + (index)) #define ADXL313_REG_THRESH_ACT 0x24 +#define ADXL313_REG_THRESH_INACT 0x25 +#define ADXL313_REG_TIME_INACT 0x26 #define ADXL313_REG_ACT_INACT_CTL 0x27 #define ADXL313_REG_BW_RATE 0x2C #define ADXL313_REG_POWER_CTL 0x2D diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index e647c40575ab..c5767d56b0cb 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -28,18 +28,22 @@ #define ADXL313_REG_XYZ_BASE ADXL313_REG_DATA_AXIS(0) =20 #define ADXL313_ACT_XYZ_EN GENMASK(6, 4) +#define ADXL313_INACT_XYZ_EN GENMASK(2, 0) =20 /* activity/inactivity */ enum adxl313_activity_type { ADXL313_ACTIVITY, + ADXL313_INACTIVITY, }; =20 static const unsigned int adxl313_act_int_reg[] =3D { [ADXL313_ACTIVITY] =3D ADXL313_INT_ACTIVITY, + [ADXL313_INACTIVITY] =3D ADXL313_INT_INACTIVITY, }; =20 static const unsigned int adxl313_act_thresh_reg[] =3D { [ADXL313_ACTIVITY] =3D ADXL313_REG_THRESH_ACT, + [ADXL313_INACTIVITY] =3D ADXL313_REG_THRESH_INACT, }; =20 static const struct regmap_range adxl312_readable_reg_range[] =3D { @@ -253,6 +257,16 @@ static const struct iio_event_spec adxl313_activity_ev= ents[] =3D { }, }; =20 +static const struct iio_event_spec adxl313_inactivity_events[] =3D { + { + .type =3D IIO_EV_TYPE_MAG, + .dir =3D IIO_EV_DIR_FALLING, + .mask_separate =3D BIT(IIO_EV_INFO_ENABLE), + .mask_shared_by_type =3D BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_PERIOD), + }, +}; + enum adxl313_chans { chan_x, chan_y, chan_z, }; @@ -269,6 +283,14 @@ static const struct iio_chan_spec adxl313_channels[] = =3D { .event_spec =3D adxl313_activity_events, .num_event_specs =3D ARRAY_SIZE(adxl313_activity_events), }, + { + .type =3D IIO_ACCEL, + .modified =3D 1, + .channel2 =3D IIO_MOD_X_AND_Y_AND_Z, + .scan_index =3D -1, /* Fake channel for axis AND'ing */ + .event_spec =3D adxl313_inactivity_events, + .num_event_specs =3D ARRAY_SIZE(adxl313_inactivity_events), + }, }; =20 static const unsigned long adxl313_scan_masks[] =3D { @@ -331,6 +353,15 @@ static int adxl313_read_freq_avail(struct iio_dev *ind= io_dev, } } =20 +static int adxl313_set_inact_time_s(struct adxl313_data *data, + unsigned int val_s) +{ + unsigned int max_boundary =3D 255; + unsigned int val =3D min(val_s, max_boundary); + + return regmap_write(data->regmap, ADXL313_REG_TIME_INACT, val); +} + static int adxl313_is_act_inact_en(struct adxl313_data *data, enum adxl313_activity_type type) { @@ -343,10 +374,10 @@ static int adxl313_is_act_inact_en(struct adxl313_dat= a *data, return ret; =20 /* Check if axis for activity are enabled */ - if (type !=3D ADXL313_ACTIVITY) - return 0; - - axis_en =3D FIELD_GET(ADXL313_ACT_XYZ_EN, axis_ctrl); + if (type =3D=3D ADXL313_ACTIVITY) + axis_en =3D FIELD_GET(ADXL313_ACT_XYZ_EN, axis_ctrl); + else + axis_en =3D FIELD_GET(ADXL313_INACT_XYZ_EN, axis_ctrl); =20 /* The axis are enabled, now check if specific interrupt is enabled */ ret =3D regmap_read(data->regmap, ADXL313_REG_INT_ENABLE, ®val); @@ -364,12 +395,14 @@ static int adxl313_set_act_inact_en(struct adxl313_da= ta *data, { unsigned int axis_ctrl; unsigned int threshold; + unsigned int inact_time_s; + bool en; int ret; =20 - if (type !=3D ADXL313_ACTIVITY) - return 0; - - axis_ctrl =3D ADXL313_ACT_XYZ_EN; + if (type =3D=3D ADXL313_ACTIVITY) + axis_ctrl =3D ADXL313_ACT_XYZ_EN; + else + axis_ctrl =3D ADXL313_INACT_XYZ_EN; =20 ret =3D adxl313_set_measure_en(data, false); if (ret) @@ -384,9 +417,17 @@ static int adxl313_set_act_inact_en(struct adxl313_dat= a *data, if (ret) return ret; =20 + en =3D cmd_en && threshold; + if (type =3D=3D ADXL313_INACTIVITY) { + ret =3D regmap_read(data->regmap, ADXL313_REG_TIME_INACT, &inact_time_s); + if (ret) + return ret; + + en =3D en && inact_time_s; + } + ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_INT_ENABLE, - adxl313_act_int_reg[type], - cmd_en && threshold); + adxl313_act_int_reg[type], en); if (ret) return ret; =20 @@ -479,6 +520,8 @@ static int adxl313_read_event_config(struct iio_dev *in= dio_dev, switch (dir) { case IIO_EV_DIR_RISING: return adxl313_is_act_inact_en(data, ADXL313_ACTIVITY); + case IIO_EV_DIR_FALLING: + return adxl313_is_act_inact_en(data, ADXL313_INACTIVITY); default: return -EINVAL; } @@ -498,6 +541,8 @@ static int adxl313_write_event_config(struct iio_dev *i= ndio_dev, switch (dir) { case IIO_EV_DIR_RISING: return adxl313_set_act_inact_en(data, ADXL313_ACTIVITY, state); + case IIO_EV_DIR_FALLING: + return adxl313_set_act_inact_en(data, ADXL313_INACTIVITY, state); default: return -EINVAL; } @@ -512,6 +557,8 @@ static int adxl313_read_event_value(struct iio_dev *ind= io_dev, { struct adxl313_data *data =3D iio_priv(indio_dev); unsigned int act_threshold; + unsigned int inact_threshold; + unsigned int inact_time_s; int ret; =20 /* Measurement stays enabled, reading from regmap cache */ @@ -519,19 +566,38 @@ static int adxl313_read_event_value(struct iio_dev *i= ndio_dev, if (type !=3D IIO_EV_TYPE_MAG) return -EINVAL; =20 - if (info !=3D IIO_EV_INFO_VALUE) - return -EINVAL; - - switch (dir) { - case IIO_EV_DIR_RISING: + switch (info) { + case IIO_EV_INFO_VALUE: + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_read(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY], + &act_threshold); + if (ret) + return ret; + *val =3D act_threshold * 15625; + *val2 =3D MICRO; + return IIO_VAL_FRACTIONAL; + case IIO_EV_DIR_FALLING: + ret =3D regmap_read(data->regmap, + adxl313_act_thresh_reg[ADXL313_INACTIVITY], + &inact_threshold); + if (ret) + return ret; + *val =3D inact_threshold * 15625; + *val2 =3D MICRO; + return IIO_VAL_FRACTIONAL; + default: + return -EINVAL; + } + case IIO_EV_INFO_PERIOD: ret =3D regmap_read(data->regmap, - adxl313_act_thresh_reg[ADXL313_ACTIVITY], - &act_threshold); + ADXL313_REG_TIME_INACT, + &inact_time_s); if (ret) return ret; - *val =3D act_threshold * 15625; - *val2 =3D MICRO; - return IIO_VAL_FRACTIONAL; + *val =3D inact_time_s; + return IIO_VAL_INT; default: return -EINVAL; } @@ -555,16 +621,30 @@ static int adxl313_write_event_value(struct iio_dev *= indio_dev, if (type !=3D IIO_EV_TYPE_MAG) return -EINVAL; =20 - if (info !=3D IIO_EV_INFO_VALUE) - return -EINVAL; - - /* Scale factor 15.625 mg/LSB */ - regval =3D DIV_ROUND_CLOSEST(MICRO * val + val2, 15625); - switch (dir) { - case IIO_EV_DIR_RISING: - ret =3D regmap_write(data->regmap, - adxl313_act_thresh_reg[ADXL313_ACTIVITY], - regval); + switch (info) { + case IIO_EV_INFO_VALUE: + /* Scale factor 15.625 mg/LSB */ + regval =3D DIV_ROUND_CLOSEST(MICRO * val + val2, 15625); + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_write(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY], + regval); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); + case IIO_EV_DIR_FALLING: + ret =3D regmap_write(data->regmap, + adxl313_act_thresh_reg[ADXL313_INACTIVITY], + regval); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); + default: + return -EINVAL; + } + case IIO_EV_INFO_PERIOD: + ret =3D adxl313_set_inact_time_s(data, val); if (ret) return ret; return adxl313_set_measure_en(data, true); @@ -721,6 +801,17 @@ static int adxl313_push_event(struct iio_dev *indio_de= v, int int_stat) return ret; } =20 + if (FIELD_GET(ADXL313_INT_INACTIVITY, int_stat)) { + ret =3D iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_AND_Y_AND_Z, + IIO_EV_TYPE_MAG, + IIO_EV_DIR_FALLING), + ts); + if (ret) + return ret; + } + if (FIELD_GET(ADXL313_INT_WATERMARK, int_stat)) { samples =3D adxl313_get_samples(data); if (samples < 0) @@ -895,6 +986,14 @@ int adxl313_core_probe(struct device *dev, if (ret) return ret; =20 + ret =3D regmap_write(data->regmap, ADXL313_REG_TIME_INACT, 5); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, ADXL313_REG_THRESH_INACT, 0x4f); + if (ret) + return ret; + ret =3D regmap_write(data->regmap, ADXL313_REG_THRESH_ACT, 0x52); if (ret) return ret; --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0914C20B7F4; Sun, 1 Jun 2025 17:22:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798524; cv=none; b=ZEAIXELtZpVzlww3PNJ7LIJGPNu97BFnr+0prVP+DjlmtLXeWEEygFCC/ISXHbRdZWh+qHY8axXxbLIfl1DSqOeAVYzF/6DLrYSykWTKyBg/SDNxPFk7/LBlEX1FACJMPDu4nNDMMoyxiaDk3w7D6ALnl4Yw2JyIhThs/cMoWlg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798524; c=relaxed/simple; bh=Ub1aTeGFAJDvduLbmc5NBo57Tq59dAFTDft49ZVNtRo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JP7hmlm62bqEsJfeM0bQ4FeLUbHNpVKy0ljUsLeaC3wo6sVD8VH108XOp0E1zoekF6+HsD32oYUfXEwGOrm9lBfg9vF4+KjunmKtMcahyuJ3rRpEg6zcOWNK7+6phGivpIhZxiMYv1SNY/CosF3r78JtScijPPI1GZCXDQ0vEgI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=UUebaWGV; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UUebaWGV" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-3a4e575db1aso630826f8f.2; Sun, 01 Jun 2025 10:22:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798521; x=1749403321; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=C/p00xxeKrW18DxqZlr6+EJZ+MYsLVPR4xd0nxDfQhA=; b=UUebaWGVMlI+6elyJ29HvcSCEr44cA7PFlJoUheBEJgWW87i3bnkzSGHWqSGvCGjf8 SVeYjs6MjzXVdGhKlrWBMjZfAnDliTAiLozat7Rmum1Q23sOm25D+5RdH//veH5Qxmhh PvjFQihzs/pfPkGPABRZKAnxsD1ZHmPA/CgJwnvD9r8lJf/X56oU5xiFwmlSTylJ4niO BGdRmb0qIaXpwRTnO3ioDxbxBcUBROxaeKZkA8v3MhyCRzWcSRRtDoSAOx9WUh3sBeZs BE8lQbZIoYtBZ2XBOG69th83Ou6JC6+2eGNjQX+oi2Lf4YpbScpUhNTLLKT1KsmcbbV0 9DMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798521; x=1749403321; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C/p00xxeKrW18DxqZlr6+EJZ+MYsLVPR4xd0nxDfQhA=; b=dcpUi+UEke8u74EZjA9f2uUaJKAxucZRW/hLafExUQ6QoEzk8jZr9KicOK/MEAzH/8 zx3B1hVj48m90nEJ++Sh0FxQurGLWhJcJ7ZnDxe67SSOWtbX+QLTac6wksN8UyO4JlNT bhn4Ty27ikVr7DI9VEtUEjtx5OCOmrEDzY47Jwaau7RBZoT6YRu5KctMoP0zJIeq+KS1 yyEWxWhw4/Q60OfxmVPnAQF6/WytZZhcJsC/lAO5lzjm4L+2f4I0cdt5uKUmmEktGz82 b8Y3HOCZJSmkfV35K4uUJPPJRuThpcvEfauIP2g5mpa0tLluxQLQxtDd9H5+WA6fcx/R n9Kg== X-Forwarded-Encrypted: i=1; AJvYcCU9/KokxSeXx5u5hhHSG2plJe9dav2onqdJygKGtWbgjnHyvPtW/ZEnRnLOK/HLGqxvSPFBjPGPQTDN@vger.kernel.org, AJvYcCVfYCpRFHPhu397tkIC4VWz0/SxVmCDW5X9HfqGllZfdQgyIXHyMYNSRwhsvFPjySa5YNM0CK3NUg8=@vger.kernel.org, AJvYcCWN7wzKBAUaeEzMokJIBFESLTdIRbULoHBVxigD/LCA0pbptYglu4B2MNIk6JRV+PbOHZteyneKaZYkzox7@vger.kernel.org X-Gm-Message-State: AOJu0YxIoJdG/fE0s7weVSoRFm0lEjgHG3hwz3HCuSE2jyuXGSD9XYkH hqisNcxAPLgKMOtoF82Q6JQ81H/UzHg16p7QHYox6GLhVstgGxpaxpZ9 X-Gm-Gg: ASbGncsgebxG1GfPWIYwHoSzlvLBekj95mnxXEQPt5UMliS//RbxnMHTXeEISjC8/Pr fg0avg+iNEaaBbi/Z6vEa7bDs1/WUR0rXrVmnXcsEUmtasupTJQWZ9QkDtVvoe+R8fX3MKGfRED 80jotNT1lHkjKxi6Z9/BVR0pGaK+/EzbFoiv7N/4JEyo0F05bcXaatvYaIg4qfEuijrHRSEBJyk KnP6NbXVs0fGnzWfLvyQ7xSbsCkvwqxJ7VTQ+wJKrV0ZCLsa1w4+mAVngAb2CRTflZrWqHSWjEQ LYyjNyOjN48fNcQXl0fLATJ4Op3T3T9pBE+Bb+mOWBxSHySGnTZ71Qe5p9wqmLu25soAEK4GDio BU6xKiNS2++CXpN+0S09ePg== X-Google-Smtp-Source: AGHT+IEirR7LYqR+fFzuvvVAzrXNJIleeo4MysPl+cc8TXzPeVFM2JO7Z8qqbWFRgPCVs7yzi1cjPA== X-Received: by 2002:a05:6000:230d:b0:3a0:782e:9185 with SMTP id ffacd0b85a97d-3a4f895f857mr2550777f8f.2.1748798521105; Sun, 01 Jun 2025 10:22:01 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.22.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:22:00 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 09/11] iio: accel: adxl313: implement power-save on inactivity Date: Sun, 1 Jun 2025 17:21:37 +0000 Message-Id: <20250601172139.59156-10-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Link activity and inactivity to indicate the internal power-saving state. Add auto-sleep to be linked to inactivity. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313.h | 3 +++ drivers/iio/accel/adxl313_core.c | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/drivers/iio/accel/adxl313.h b/drivers/iio/accel/adxl313.h index d7e8cb44855b..75ef54b60f75 100644 --- a/drivers/iio/accel/adxl313.h +++ b/drivers/iio/accel/adxl313.h @@ -41,6 +41,9 @@ #define ADXL313_RATE_BASE 6 =20 #define ADXL313_POWER_CTL_MSK BIT(3) +#define ADXL313_POWER_CTL_INACT_MSK GENMASK(5, 4) +#define ADXL313_POWER_CTL_LINK BIT(5) +#define ADXL313_POWER_CTL_AUTO_SLEEP BIT(4) =20 #define ADXL313_RANGE_MSK GENMASK(1, 0) #define ADXL313_RANGE_MAX 3 diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index c5767d56b0cb..1598562a38e2 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -396,6 +396,7 @@ static int adxl313_set_act_inact_en(struct adxl313_data= *data, unsigned int axis_ctrl; unsigned int threshold; unsigned int inact_time_s; + int act_en, inact_en; bool en; int ret; =20 @@ -431,6 +432,25 @@ static int adxl313_set_act_inact_en(struct adxl313_dat= a *data, if (ret) return ret; =20 + /* + * Set sleep and link bit only when ACT and INACT are enabled. + */ + act_en =3D adxl313_is_act_inact_en(data, ADXL313_ACTIVITY); + if (act_en < 0) + return act_en; + + inact_en =3D adxl313_is_act_inact_en(data, ADXL313_INACTIVITY); + if (inact_en < 0) + return inact_en; + + en =3D en && act_en && inact_en; + + ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_POWER_CTL, + (ADXL313_POWER_CTL_AUTO_SLEEP | ADXL313_POWER_CTL_LINK), + en); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); } =20 --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47FCA20CCE5; Sun, 1 Jun 2025 17:22:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798526; cv=none; b=j4xjl9nf4hbnF/kFp3RssMZfrJgfKF8Zwe58b9yPRMiq/dgGD5wkJpL4HwNwpmS6W8tpFYs5VTVtbonjzZi2kZMjd0y85bN9MS2OVQZTBhR9zr0pPXVW5M58Ypw5m74rl7d9M/hGzJGp7cFZf9DU7YCmkK5h2KLoQIpZr5hTzuA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798526; c=relaxed/simple; bh=LsjBoe6ZyEktNfRJriTPpvCiIXrt69gIDTiNDaGWxxs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=bn81kUWQPfxp024KCOSKcn4ZIJJULoigHn94xWi9+Xe8nEYyPqzdq3FFr6Inw0d+xThx8p0YDPMA8Sct/WROMoIAQA+G65jjhbkkilhgrc6Gra8WAOe8zrB94QM8VsxvpNjV5NXfEBLNOWsE8HjUownM57sdhSqDod0kzhIxKbo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TWq2AAT3; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TWq2AAT3" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-3a4ebbfb18fso523705f8f.3; Sun, 01 Jun 2025 10:22:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798522; x=1749403322; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tczmAz3eJqGabRIPtrdIqxnYjMqW/41duQPDLe/7c+I=; b=TWq2AAT3BFU8bnAqMkitN/B34d1uHOilWSBOxU9UxhRFp9kQgCNglidBJ6XcgTp00I CkOb20ChqqO0IJWaDulbRK6/4GF2wjrVX3XqD/e70Itg0xz1BKqbTxGpJOIEbYOZfeIA UNNrvKed1X4i/0MySCs7xXu9Iz+KTl8Yogo3xYuJD87AMyMcLAhdtKbTLYquAJ5+Wzib /v/jui5bruCsjWXFQQ7dQY1hH8U4eV2/NcjXhG7FL1XVRiu+vqEbhlRU19yncGxKFhg5 z6oVm3aQ63RLua+6Nxriq+/8vchCpVQ+cki3nr0dD8i+5d/KzGfnteqB1HuZzQa4Y9SS saFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798522; x=1749403322; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tczmAz3eJqGabRIPtrdIqxnYjMqW/41duQPDLe/7c+I=; b=qD2wKSzlj15UsuiJpJVhK7f5Sy7xHpnIHmv9ezQ7WSpPrtaC4RL86Css4ncNSb4iPt iAcLYVsh+3ZFhElXL/pVisYawlp8wEnMcWs5WX74YhvSC10mTD0jNL2FHgc/ESU478Ld NXslOL+LGZs4/PsrhIgwrdZSUukV7MZcnRt/rda0tZ3D7ivBva2/bw13iuv3iIWlYKsa V7YVY3iMKOF05Bw7GfrDCw8XpL4gV6vG/sMZAx8QNUO5ReLPc9tjRYVk3ruOgakD2tFR aZCSSE7gj/O1NTOEZJ6Nocen+nhTJmdosHzD03kMHIKMd5aM5TYs6NaiaaDo+92z0RNz xjsg== X-Forwarded-Encrypted: i=1; AJvYcCU4J2yGyXWpbRYnbmsSVWCkZBzV6bB/XCJAoO6cR2PRL7Y5B/sldzE25F2OdIdsFIUXit0ACOli5Zg=@vger.kernel.org, AJvYcCUmi3vrg2OcYjCIqaJSrcLK8uFF7XHovRXKoZGtZWbY7znDC/cMyL35zezKJOcsSe+ExUROxroWlv5n@vger.kernel.org, AJvYcCVkKOt4ULfhZCZNjlEQfGbfHIQgqf0mkxbdn6YyKGumZXZGFYX/POBWWlYqe2ksxlfwbsXdz1Ai2AxQrhVM@vger.kernel.org X-Gm-Message-State: AOJu0YzxXNbuUK/azcn8XEOgC1d7LJlbYBHCuq/3u8KJ716o8YyphluU TMgyNb5GCCNjML8tBpbHGNEH/v23tYL/FhDtt6dfiNJrlVBdR+dYFOi1 X-Gm-Gg: ASbGncssc6nO13vcJc+2QycNsj9tu0ippgXcQ1IpjnTfEnqOywjfb65RkJxQKRH7SAW Kvr3TGdfG6diuu+pHwHLtD3QV+8P9qJmHL2euu9kh1xNsjqKKwfv5W44PeJbTrRQZUwDV12fzs9 z1ZC90Ei3LbcWKJu7XVm+pIOb9v3MhmZ4lnqz4+qjvLwrBLK5AfFaDXaQO83yT0gyCqg7dmxsbp /jGZ2vjKVxVLWMdQjvQGJiw9tspBmFT0oVKtxMLWWeMvSCdjqMgLyjNP6BVd1rG7smvz80cSUwp Ah+isaGckHXNkAWMfVrdrRM56OfcwG+iPYY7GF2v1PGWp44Ffbd+BVxKFfSt8cCbF/W8J6EOo5j FJp6jPOStsKpK6GPsg/bckw== X-Google-Smtp-Source: AGHT+IEHYHrfynUs6G5oyxrFukS/SHRJlf0Q4Ln2ha327mjJG0g1OQ8KnwfgH8aHgLTvIE9JAD9F2w== X-Received: by 2002:a05:6000:288c:b0:3a4:f7d9:9617 with SMTP id ffacd0b85a97d-3a4f89310fbmr2819949f8f.0.1748798522263; Sun, 01 Jun 2025 10:22:02 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.22.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:22:01 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 10/11] iio: accel: adxl313: add AC coupled activity/inactivity events Date: Sun, 1 Jun 2025 17:21:38 +0000 Message-Id: <20250601172139.59156-11-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add AC coupling activity and inactivity as MAG_ADAPTIVE events. This adds up an additional set of threshold and period handles, verifies matching disabling functionality and extends setting the link bit to complementary event configurations. This means, e.g. either ACTIVITY or ACTIVITY_AC can be enabled. The most recent set will remain configured. Disabling ACTIVITY where ACTIVITY_AC was enabled is ignored, since it does not match (should be disabling ACTIVITY_AC). When INACTIVITY or INACTIVITY_AC is also enabled, the link bit will be set. Note, having the link bit and auto-sleep in place activity and inactivity indicate the power save state change and thus will only be triggered once a state transition occurs. Since there is a separate AC bit for ACTIVITY and for INACTIVITY, events can be linked independently from each other i.e. ACTIVITY can be linked to INACTIVITY_AC for instance. When one of both is disabled, the link bit will be removed. Hence, the remaining event will not indicate a plain state change anymore, but occur as a periodically triggered inactivity event or for each activity event above the threshold. Signed-off-by: Lothar Rubusch --- drivers/iio/accel/adxl313_core.c | 414 +++++++++++++++++++++++++------ 1 file changed, 333 insertions(+), 81 deletions(-) diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_c= ore.c index 1598562a38e2..9a0905e30de3 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -30,20 +30,38 @@ #define ADXL313_ACT_XYZ_EN GENMASK(6, 4) #define ADXL313_INACT_XYZ_EN GENMASK(2, 0) =20 +#define ADXL313_REG_ACT_ACDC_MSK BIT(7) +#define ADXL313_REG_INACT_ACDC_MSK BIT(3) +#define ADXL313_COUPLING_DC 0 +#define ADXL313_COUPLING_AC 1 + /* activity/inactivity */ enum adxl313_activity_type { ADXL313_ACTIVITY, ADXL313_INACTIVITY, + ADXL313_ACTIVITY_AC, + ADXL313_INACTIVITY_AC, }; =20 static const unsigned int adxl313_act_int_reg[] =3D { [ADXL313_ACTIVITY] =3D ADXL313_INT_ACTIVITY, [ADXL313_INACTIVITY] =3D ADXL313_INT_INACTIVITY, + [ADXL313_ACTIVITY_AC] =3D ADXL313_INT_ACTIVITY, + [ADXL313_INACTIVITY_AC] =3D ADXL313_INT_INACTIVITY, }; =20 static const unsigned int adxl313_act_thresh_reg[] =3D { [ADXL313_ACTIVITY] =3D ADXL313_REG_THRESH_ACT, [ADXL313_INACTIVITY] =3D ADXL313_REG_THRESH_INACT, + [ADXL313_ACTIVITY_AC] =3D ADXL313_REG_THRESH_ACT, + [ADXL313_INACTIVITY_AC] =3D ADXL313_REG_THRESH_INACT, +}; + +static const unsigned int adxl313_act_acdc_msk[] =3D { + [ADXL313_ACTIVITY] =3D ADXL313_REG_ACT_ACDC_MSK, + [ADXL313_INACTIVITY] =3D ADXL313_REG_INACT_ACDC_MSK, + [ADXL313_ACTIVITY_AC] =3D ADXL313_REG_ACT_ACDC_MSK, + [ADXL313_INACTIVITY_AC] =3D ADXL313_REG_INACT_ACDC_MSK, }; =20 static const struct regmap_range adxl312_readable_reg_range[] =3D { @@ -255,6 +273,13 @@ static const struct iio_event_spec adxl313_activity_ev= ents[] =3D { .mask_separate =3D BIT(IIO_EV_INFO_ENABLE), .mask_shared_by_type =3D BIT(IIO_EV_INFO_VALUE), }, + { + /* activity, AC bit set */ + .type =3D IIO_EV_TYPE_MAG_ADAPTIVE, + .dir =3D IIO_EV_DIR_RISING, + .mask_separate =3D BIT(IIO_EV_INFO_ENABLE), + .mask_shared_by_type =3D BIT(IIO_EV_INFO_VALUE), + }, }; =20 static const struct iio_event_spec adxl313_inactivity_events[] =3D { @@ -265,6 +290,14 @@ static const struct iio_event_spec adxl313_inactivity_= events[] =3D { .mask_shared_by_type =3D BIT(IIO_EV_INFO_VALUE) | BIT(IIO_EV_INFO_PERIOD), }, + { + /* inactivity, AC bit set */ + .type =3D IIO_EV_TYPE_MAG_ADAPTIVE, + .dir =3D IIO_EV_DIR_FALLING, + .mask_separate =3D BIT(IIO_EV_INFO_ENABLE), + .mask_shared_by_type =3D BIT(IIO_EV_INFO_VALUE) | + BIT(IIO_EV_INFO_PERIOD), + }, }; =20 enum adxl313_chans { @@ -362,11 +395,58 @@ static int adxl313_set_inact_time_s(struct adxl313_da= ta *data, return regmap_write(data->regmap, ADXL313_REG_TIME_INACT, val); } =20 +/** + * adxl313_is_act_inact_ac() - Check if AC coupling is enabled. + * + * @data: The device data. + * @type: The activity or inactivity type. + * + * Provide a type of activity or inactivity, combined with either AC coupl= ing + * set, or default to DC coupling. This function verifies, if the combinat= ion is + * currently enabled or not. + * + * Return if the provided activity type has AC coupling enabled or a negat= ive + * error value. + */ +static int adxl313_is_act_inact_ac(struct adxl313_data *data, + enum adxl313_activity_type type) +{ + unsigned int regval; + bool coupling; + int ret; + + ret =3D regmap_read(data->regmap, ADXL313_REG_ACT_INACT_CTL, ®val); + if (ret) + return ret; + + coupling =3D adxl313_act_acdc_msk[type] & regval; + + if (type =3D=3D ADXL313_ACTIVITY || type =3D=3D ADXL313_INACTIVITY) + return coupling =3D=3D ADXL313_COUPLING_DC; + else + return coupling =3D=3D ADXL313_COUPLING_AC; +} + +static int adxl313_set_act_inact_ac(struct adxl313_data *data, + enum adxl313_activity_type type) +{ + unsigned int coupling; + + if (type =3D=3D ADXL313_ACTIVITY_AC || type =3D=3D ADXL313_INACTIVITY_AC) + coupling =3D ADXL313_COUPLING_AC; + else + coupling =3D ADXL313_COUPLING_DC; + + return regmap_assign_bits(data->regmap, ADXL313_REG_ACT_INACT_CTL, + adxl313_act_acdc_msk[type], coupling); +} + static int adxl313_is_act_inact_en(struct adxl313_data *data, enum adxl313_activity_type type) { unsigned int axis_ctrl; unsigned int regval; + int coupling; int axis_en, int_en, ret; =20 ret =3D regmap_read(data->regmap, ADXL313_REG_ACT_INACT_CTL, &axis_ctrl); @@ -374,7 +454,7 @@ static int adxl313_is_act_inact_en(struct adxl313_data = *data, return ret; =20 /* Check if axis for activity are enabled */ - if (type =3D=3D ADXL313_ACTIVITY) + if (type =3D=3D ADXL313_ACTIVITY || type =3D=3D ADXL313_ACTIVITY_AC) axis_en =3D FIELD_GET(ADXL313_ACT_XYZ_EN, axis_ctrl); else axis_en =3D FIELD_GET(ADXL313_INACT_XYZ_EN, axis_ctrl); @@ -386,7 +466,12 @@ static int adxl313_is_act_inact_en(struct adxl313_data= *data, =20 int_en =3D adxl313_act_int_reg[type] & regval; =20 - return axis_en && int_en; + /* Return true if configured coupling matches provided type */ + coupling =3D adxl313_is_act_inact_ac(data, type); + if (coupling < 0) + return coupling; + + return axis_en && int_en && coupling; } =20 static int adxl313_set_act_inact_en(struct adxl313_data *data, @@ -396,15 +481,26 @@ static int adxl313_set_act_inact_en(struct adxl313_da= ta *data, unsigned int axis_ctrl; unsigned int threshold; unsigned int inact_time_s; - int act_en, inact_en; - bool en; + int act_en, inact_en, act_ac_en, inact_ac_en; + bool en, act_inact_ac; int ret; =20 - if (type =3D=3D ADXL313_ACTIVITY) + /* + * In case of turning off, assure turning off a correspondent coupling + * event. In case of not matching coupling, simply return. + */ + if (!cmd_en) { + /* Expected positive true if coupling matches coupling type */ + if (adxl313_is_act_inact_ac(data, type) <=3D 0) + return 0; + } + + if (type =3D=3D ADXL313_ACTIVITY || type =3D=3D ADXL313_ACTIVITY_AC) axis_ctrl =3D ADXL313_ACT_XYZ_EN; else axis_ctrl =3D ADXL313_INACT_XYZ_EN; =20 + /* Start modifying configuration registers */ ret =3D adxl313_set_measure_en(data, false); if (ret) return ret; @@ -414,12 +510,16 @@ static int adxl313_set_act_inact_en(struct adxl313_da= ta *data, if (ret) return ret; =20 + act_inact_ac =3D type =3D=3D ADXL313_ACTIVITY_AC || ADXL313_INACTIVITY_AC; + ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_ACT_INACT_CTL, + adxl313_act_acdc_msk[type], act_inact_ac); + ret =3D regmap_read(data->regmap, adxl313_act_thresh_reg[type], &threshol= d); if (ret) return ret; =20 en =3D cmd_en && threshold; - if (type =3D=3D ADXL313_INACTIVITY) { + if (type =3D=3D ADXL313_INACTIVITY || type =3D=3D ADXL313_INACTIVITY_AC) { ret =3D regmap_read(data->regmap, ADXL313_REG_TIME_INACT, &inact_time_s); if (ret) return ret; @@ -427,6 +527,10 @@ static int adxl313_set_act_inact_en(struct adxl313_dat= a *data, en =3D en && inact_time_s; } =20 + ret =3D adxl313_set_act_inact_ac(data, type); + if (ret) + return ret; + ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_INT_ENABLE, adxl313_act_int_reg[type], en); if (ret) @@ -439,10 +543,22 @@ static int adxl313_set_act_inact_en(struct adxl313_da= ta *data, if (act_en < 0) return act_en; =20 + act_ac_en =3D adxl313_is_act_inact_en(data, ADXL313_ACTIVITY_AC); + if (act_ac_en < 0) + return act_ac_en; + + act_en =3D act_en || act_ac_en; + inact_en =3D adxl313_is_act_inact_en(data, ADXL313_INACTIVITY); if (inact_en < 0) return inact_en; =20 + inact_ac_en =3D adxl313_is_act_inact_en(data, ADXL313_INACTIVITY_AC); + if (inact_ac_en < 0) + return inact_ac_en; + + inact_en =3D inact_en || inact_ac_en; + en =3D en && act_en && inact_en; =20 ret =3D regmap_assign_bits(data->regmap, ADXL313_REG_POWER_CTL, @@ -534,14 +650,25 @@ static int adxl313_read_event_config(struct iio_dev *= indio_dev, { struct adxl313_data *data =3D iio_priv(indio_dev); =20 - if (type !=3D IIO_EV_TYPE_MAG) - return -EINVAL; - - switch (dir) { - case IIO_EV_DIR_RISING: - return adxl313_is_act_inact_en(data, ADXL313_ACTIVITY); - case IIO_EV_DIR_FALLING: - return adxl313_is_act_inact_en(data, ADXL313_INACTIVITY); + switch (type) { + case IIO_EV_TYPE_MAG: + switch (dir) { + case IIO_EV_DIR_RISING: + return adxl313_is_act_inact_en(data, ADXL313_ACTIVITY); + case IIO_EV_DIR_FALLING: + return adxl313_is_act_inact_en(data, ADXL313_INACTIVITY); + default: + return -EINVAL; + } + case IIO_EV_TYPE_MAG_ADAPTIVE: + switch (dir) { + case IIO_EV_DIR_RISING: + return adxl313_is_act_inact_en(data, ADXL313_ACTIVITY_AC); + case IIO_EV_DIR_FALLING: + return adxl313_is_act_inact_en(data, ADXL313_INACTIVITY_AC); + default: + return -EINVAL; + } default: return -EINVAL; } @@ -555,14 +682,33 @@ static int adxl313_write_event_config(struct iio_dev = *indio_dev, { struct adxl313_data *data =3D iio_priv(indio_dev); =20 - if (type !=3D IIO_EV_TYPE_MAG) - return -EINVAL; - - switch (dir) { - case IIO_EV_DIR_RISING: - return adxl313_set_act_inact_en(data, ADXL313_ACTIVITY, state); - case IIO_EV_DIR_FALLING: - return adxl313_set_act_inact_en(data, ADXL313_INACTIVITY, state); + switch (type) { + case IIO_EV_TYPE_MAG: + switch (dir) { + case IIO_EV_DIR_RISING: + return adxl313_set_act_inact_en(data, + ADXL313_ACTIVITY, + state); + case IIO_EV_DIR_FALLING: + return adxl313_set_act_inact_en(data, + ADXL313_INACTIVITY, + state); + default: + return -EINVAL; + } + case IIO_EV_TYPE_MAG_ADAPTIVE: + switch (dir) { + case IIO_EV_DIR_RISING: + return adxl313_set_act_inact_en(data, + ADXL313_ACTIVITY_AC, + state); + case IIO_EV_DIR_FALLING: + return adxl313_set_act_inact_en(data, + ADXL313_INACTIVITY_AC, + state); + default: + return -EINVAL; + } default: return -EINVAL; } @@ -583,41 +729,79 @@ static int adxl313_read_event_value(struct iio_dev *i= ndio_dev, =20 /* Measurement stays enabled, reading from regmap cache */ =20 - if (type !=3D IIO_EV_TYPE_MAG) - return -EINVAL; - - switch (info) { - case IIO_EV_INFO_VALUE: - switch (dir) { - case IIO_EV_DIR_RISING: + switch (type) { + case IIO_EV_TYPE_MAG: + switch (info) { + case IIO_EV_INFO_VALUE: + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_read(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY], + &act_threshold); + if (ret) + return ret; + *val =3D act_threshold * 15625; + *val2 =3D MICRO; + return IIO_VAL_FRACTIONAL; + case IIO_EV_DIR_FALLING: + ret =3D regmap_read(data->regmap, + adxl313_act_thresh_reg[ADXL313_INACTIVITY], + &inact_threshold); + if (ret) + return ret; + *val =3D inact_threshold * 15625; + *val2 =3D MICRO; + return IIO_VAL_FRACTIONAL; + default: + return -EINVAL; + } + case IIO_EV_INFO_PERIOD: ret =3D regmap_read(data->regmap, - adxl313_act_thresh_reg[ADXL313_ACTIVITY], - &act_threshold); + ADXL313_REG_TIME_INACT, + &inact_time_s); if (ret) return ret; - *val =3D act_threshold * 15625; - *val2 =3D MICRO; - return IIO_VAL_FRACTIONAL; - case IIO_EV_DIR_FALLING: + *val =3D inact_time_s; + return IIO_VAL_INT; + default: + return -EINVAL; + } + case IIO_EV_TYPE_MAG_ADAPTIVE: + switch (info) { + case IIO_EV_INFO_VALUE: + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_read(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY_AC], + &act_threshold); + if (ret) + return ret; + *val =3D act_threshold * 15625; + *val2 =3D MICRO; + return IIO_VAL_FRACTIONAL; + case IIO_EV_DIR_FALLING: + ret =3D regmap_read(data->regmap, + adxl313_act_thresh_reg[ADXL313_INACTIVITY_AC], + &inact_threshold); + if (ret) + return ret; + *val =3D inact_threshold * 15625; + *val2 =3D MICRO; + return IIO_VAL_FRACTIONAL; + default: + return -EINVAL; + } + case IIO_EV_INFO_PERIOD: ret =3D regmap_read(data->regmap, - adxl313_act_thresh_reg[ADXL313_INACTIVITY], - &inact_threshold); + ADXL313_REG_TIME_INACT, + &inact_time_s); if (ret) return ret; - *val =3D inact_threshold * 15625; - *val2 =3D MICRO; - return IIO_VAL_FRACTIONAL; + *val =3D inact_time_s; + return IIO_VAL_INT; default: return -EINVAL; } - case IIO_EV_INFO_PERIOD: - ret =3D regmap_read(data->regmap, - ADXL313_REG_TIME_INACT, - &inact_time_s); - if (ret) - return ret; - *val =3D inact_time_s; - return IIO_VAL_INT; default: return -EINVAL; } @@ -638,36 +822,69 @@ static int adxl313_write_event_value(struct iio_dev *= indio_dev, if (ret) return ret; =20 - if (type !=3D IIO_EV_TYPE_MAG) - return -EINVAL; - - switch (info) { - case IIO_EV_INFO_VALUE: - /* Scale factor 15.625 mg/LSB */ - regval =3D DIV_ROUND_CLOSEST(MICRO * val + val2, 15625); - switch (dir) { - case IIO_EV_DIR_RISING: - ret =3D regmap_write(data->regmap, - adxl313_act_thresh_reg[ADXL313_ACTIVITY], - regval); + switch (type) { + case IIO_EV_TYPE_MAG: + switch (info) { + case IIO_EV_INFO_VALUE: + /* Scale factor 15.625 mg/LSB */ + regval =3D DIV_ROUND_CLOSEST(MICRO * val + val2, 15625); + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_write(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY], + regval); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); + case IIO_EV_DIR_FALLING: + ret =3D regmap_write(data->regmap, + adxl313_act_thresh_reg[ADXL313_INACTIVITY], + regval); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); + default: + return -EINVAL; + } + case IIO_EV_INFO_PERIOD: + ret =3D adxl313_set_inact_time_s(data, val); if (ret) return ret; return adxl313_set_measure_en(data, true); - case IIO_EV_DIR_FALLING: - ret =3D regmap_write(data->regmap, - adxl313_act_thresh_reg[ADXL313_INACTIVITY], - regval); + default: + return -EINVAL; + } + case IIO_EV_TYPE_MAG_ADAPTIVE: + switch (info) { + case IIO_EV_INFO_VALUE: + /* Scale factor 15.625 mg/LSB */ + regval =3D DIV_ROUND_CLOSEST(MICRO * val + val2, 15625); + switch (dir) { + case IIO_EV_DIR_RISING: + ret =3D regmap_write(data->regmap, + adxl313_act_thresh_reg[ADXL313_ACTIVITY_AC], + regval); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); + case IIO_EV_DIR_FALLING: + ret =3D regmap_write(data->regmap, + adxl313_act_thresh_reg[ADXL313_INACTIVITY_AC], + regval); + if (ret) + return ret; + return adxl313_set_measure_en(data, true); + default: + return -EINVAL; + } + case IIO_EV_INFO_PERIOD: + ret =3D adxl313_set_inact_time_s(data, val); if (ret) return ret; return adxl313_set_measure_en(data, true); default: return -EINVAL; } - case IIO_EV_INFO_PERIOD: - ret =3D adxl313_set_inact_time_s(data, val); - if (ret) - return ret; - return adxl313_set_measure_en(data, true); default: return -EINVAL; } @@ -807,29 +1024,64 @@ static int adxl313_push_event(struct iio_dev *indio_= dev, int int_stat) { s64 ts =3D iio_get_time_ns(indio_dev); struct adxl313_data *data =3D iio_priv(indio_dev); + unsigned int regval; int samples; int ret =3D -ENOENT; =20 if (FIELD_GET(ADXL313_INT_ACTIVITY, int_stat)) { - ret =3D iio_push_event(indio_dev, - IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, - IIO_MOD_X_OR_Y_OR_Z, - IIO_EV_TYPE_MAG, - IIO_EV_DIR_RISING), - ts); + ret =3D regmap_read(data->regmap, ADXL313_REG_ACT_INACT_CTL, ®val); if (ret) return ret; + + if (FIELD_GET(ADXL313_REG_ACT_ACDC_MSK, regval)) { + /* AC coupled */ + ret =3D iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_OR_Y_OR_Z, + IIO_EV_TYPE_MAG_ADAPTIVE, + IIO_EV_DIR_RISING), + ts); + if (ret) + return ret; + } else { + /* DC coupled, relying on THRESH */ + ret =3D iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_OR_Y_OR_Z, + IIO_EV_TYPE_MAG, + IIO_EV_DIR_RISING), + ts); + if (ret) + return ret; + } } =20 if (FIELD_GET(ADXL313_INT_INACTIVITY, int_stat)) { - ret =3D iio_push_event(indio_dev, - IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, - IIO_MOD_X_AND_Y_AND_Z, - IIO_EV_TYPE_MAG, - IIO_EV_DIR_FALLING), - ts); + ret =3D regmap_read(data->regmap, ADXL313_REG_ACT_INACT_CTL, ®val); if (ret) return ret; + + if (FIELD_GET(ADXL313_REG_INACT_ACDC_MSK, regval)) { + /* AC coupled */ + ret =3D iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_AND_Y_AND_Z, + IIO_EV_TYPE_MAG_ADAPTIVE, + IIO_EV_DIR_FALLING), + ts); + if (ret) + return ret; + } else { + /* DC coupled, relying on THRESH */ + ret =3D iio_push_event(indio_dev, + IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, + IIO_MOD_X_AND_Y_AND_Z, + IIO_EV_TYPE_MAG, + IIO_EV_DIR_FALLING), + ts); + if (ret) + return ret; + } } =20 if (FIELD_GET(ADXL313_INT_WATERMARK, int_stat)) { --=20 2.39.5 From nobody Mon Feb 9 07:22:02 2026 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7644C1EF08F; Sun, 1 Jun 2025 17:22:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798528; cv=none; b=O/uNlxiqExN+VdJTmZzEa/MUlKeMRnNCgMqc7+AbR/QGqxMWEisQNZhk3y4D+LQ6IUmQPHwaMd1p5TzVNpwK7v+mynIOGVPgiS/zYny4zamIE5Sqoj3vBKAlXYNQabjUxnr4nHMKbb3wFUu45ao7bFZgUK/EZiLUHOA/BQZUsKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748798528; c=relaxed/simple; bh=8g8ar4cXeCDAjuhnBvH3litFaqOrDIOGy2VHEcQ+BLg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=FQbz40rIBwJVpdBdELESeuyk7HQRmCAtI0trnvXGQMI6R3SAZ2mtJ7d/+S+X/s9mXVH0o2iYbcapmV7A2Vtfnwyw7ry0Q01VKrdK4Y9wNA1RkzbjdIWgo3CWn82O6HB8CfLR0ERfNz+aKoEpfHgF8CjDiYQCrdgoIYXZ5t6fWD4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Dzymt3sX; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Dzymt3sX" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-3a362e099cfso616425f8f.2; Sun, 01 Jun 2025 10:22:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748798524; x=1749403324; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VWA6wADXu/RjEXUhFzdmubhVXmp7xexU+rNJAOzndxQ=; b=Dzymt3sX1Gi929vowAvTf+LtFCMHEzMIXeUm4fARxJg8m/1aUMMYKBWoftaoOPlLwl B3Z3eYBTac4PZKH1Bh/ImySLc84q4foB3syFxEDDqg1mTe4PYsrtxrciosB2VYXLqddg MxA9767PqWzQfXEn9JwU4ZebFJR709Y0paBh5HQ7pEvo7rPeb0e164N7ev1qg+vcWo7P VOv1Juojc+kXj5bEZpAQLwi5Y7jAlAmMc/BqVMhgTg+NVz5eDSSYKjlzIDueGWwOkRBX ZZQiX6DMO1LED7c3GwMO1+BLPHrb6Oc9CRpclHd/LsYFvN87HQFutCHAsh2CcveBHCfm /jmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748798524; x=1749403324; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VWA6wADXu/RjEXUhFzdmubhVXmp7xexU+rNJAOzndxQ=; b=lUR3b/YmrxtcvGVwvSeXwT7SUWzFNEQB5VfAEhYbQsHWbDNDgP3CJspwWKHZJ86TWn QCXvBTp8f+ZTQjeysWVxsnO7q7skXZoUHCJafhyGprO1R0fSFGYcrrYdHJEFl9lxwdw1 PtsJWA0Wk0yg2M9aoOsZew8vdEbIwsb0/C20FW+NAMVf/PTgEQi9u+yc/zgNJfaPjAyb SzUOVYv+OXMWWkjXQ8rv8NekgLCk/FkR1RqMYw1V467NdJyTDNBvAgqOqSiG7hVVVGsI tYJoji4bQwmQ8idEKSJKlCpq0ikjfHXJ+y4qrKs5+7fqcAWDD72Pceq0UnsMfaH+DqKq x2zQ== X-Forwarded-Encrypted: i=1; AJvYcCVSNraCEeG7Y5BUVJ6OMQ4YThB3QPLr8b9cLzQ+VlkmJoQDLqIU7jE76csuAfuV0DuL/wNilyb6OMH+Xw0O@vger.kernel.org, AJvYcCXd7JoZDR53Y0jFDdnOYnLjuEwkpm/R6XSixTAqjkg3622i6LHhGQbGYHABqJibiFZL07cyy3xzEkTs@vger.kernel.org, AJvYcCXwGnf1aLC4fsGzCsi6PzL8NSxY2R0HZf6t6/Ms3EaqA9P5RWPFGPIu+UqO1CrD83YEJsi5q6q17YM=@vger.kernel.org X-Gm-Message-State: AOJu0YweZZujzWlO0GXXIamIY7I4Jk7jKppBQCJNHasLpMcBbajcO5Ul t3SUlm4uoxZ43Ni53kP/U4YkFNUfYkLQ4vVsn8j3SoSpPvlxk0B7WbuE X-Gm-Gg: ASbGncuJ82KO39S77JD1Ck54DcXfG8nVEpkAPachQ3B+UFSpfovPyzRLC47kWgoDq7c +tKdznl3jW9UA79ow7lbH7qB8C+t5szJraWUDqpvqiYFjXXjHbDIWQz3vmQ7AuUhwu0VqZyQShv gCCdQHKCRowGHSMHLwENsRfKMvW68ZNuySPvEfJixGsqFNokfYmbpA4Hun/cZuwYPRNyRd3Pfhr hqEkQ3WBjZvPdEvmygsl/OrZCO9asIbrXeZFo0FVg4H0kBvKm4rUnWzsN8jHiyTu4rIiKDls8SS jJzRyp3/Wis3DIqnaSW/lISsQrJR03pW+EYuBQow/x9j23+q+h7kN6fTCYAU0jwSb2SkIREtxM7 LRoB9JFvhJBoEbBc3qJA6Eg== X-Google-Smtp-Source: AGHT+IFmhya/p+fGO5U2BjFziDYv5Gj+RHnAkaHLV5SPuDfaAwfDsWpZaED4F50eEAXYO08+SglbQg== X-Received: by 2002:a5d:5f52:0:b0:3a4:dcfb:6f98 with SMTP id ffacd0b85a97d-3a4f8984976mr2556941f8f.14.1748798523533; Sun, 01 Jun 2025 10:22:03 -0700 (PDT) Received: from localhost.localdomain (84-72-156-211.dclient.hispeed.ch. [84.72.156.211]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4f009f9d6sm11890444f8f.84.2025.06.01.10.22.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Jun 2025 10:22:03 -0700 (PDT) From: Lothar Rubusch To: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, corbet@lwn.net, lucas.p.stankus@gmail.com, lars@metafoo.de, Michael.Hennerich@analog.com, bagasdotme@gmail.com Cc: l.rubusch@gmail.com, linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 11/11] docs: iio: add ADXL313 accelerometer Date: Sun, 1 Jun 2025 17:21:39 +0000 Message-Id: <20250601172139.59156-12-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250601172139.59156-1-l.rubusch@gmail.com> References: <20250601172139.59156-1-l.rubusch@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Add documentation for the ADXL313 accelerometer driver. Signed-off-by: Lothar Rubusch --- Documentation/iio/adxl313.rst | 289 ++++++++++++++++++++++++++++++++++ Documentation/iio/index.rst | 1 + 2 files changed, 290 insertions(+) create mode 100644 Documentation/iio/adxl313.rst diff --git a/Documentation/iio/adxl313.rst b/Documentation/iio/adxl313.rst new file mode 100644 index 000000000000..e67171513f4a --- /dev/null +++ b/Documentation/iio/adxl313.rst @@ -0,0 +1,289 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +ADXL313 driver +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +This driver supports Analog Device's ADXL313 on SPI/I2C bus. + +1. Supported devices +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +* `ADXL313 `_ + +The ADXL313is a low noise density, low power, 3-axis accelerometer with +selectable measurement ranges. The ADXL313 supports the =C2=B10.5 g, =C2= =B11 g, =C2=B12 g and +=C2=B14 g ranges. + +2. Device attributes +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Accelerometer measurements are always provided. + +Each IIO device, has a device folder under ``/sys/bus/iio/devices/iio:devi= ceX``, +where X is the IIO index of the device. Under these folders reside a set of +device files, depending on the characteristics and features of the hardware +device in questions. These files are consistently generalized and document= ed in +the IIO ABI documentation. + +The following tables show the adxl313 related device files, found in the +specific device folder path ``/sys/bus/iio/devices/iio:deviceX``. + ++---------------------------------------------------+---------------------= -------------------------------------+ +| 3-Axis Accelerometer related device files | Description = | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_scale | Scale for the accele= rometer channels. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_x_calibbias | Calibration offset f= or the X-axis accelerometer channel. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_x_raw | Raw X-axis accelerom= eter channel value. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_y_calibbias | y-axis acceleration = offset correction | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_y_raw | Raw Y-axis accelerom= eter channel value. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_z_calibbias | Calibration offset f= or the Z-axis accelerometer channel. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_z_raw | Raw Z-axis accelerom= eter channel value. | ++---------------------------------------------------+---------------------= -------------------------------------+ + ++---------------------------------------+---------------------------------= -------------+ +| Miscellaneous device files | Description = | ++---------------------------------------+---------------------------------= -------------+ +| name | Name of the IIO device. = | ++---------------------------------------+---------------------------------= -------------+ +| in_accel_sampling_frequency | Currently selected sample rate. = | ++---------------------------------------+---------------------------------= -------------+ +| in_accel_sampling_frequency_available | Available sampling frequency con= figurations. | ++---------------------------------------+---------------------------------= -------------+ + +The iio event related settings, found in ``/sys/bus/iio/devices/iio:device= X/events``. + ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_mag_adaptive_falling_period | AC coupled inactivit= y time. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_mag_adaptive_falling_value | AC coupled inactivit= y threshold. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_mag_adaptive_rising_value | AC coupled activity = threshold. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_mag_falling_period | Inactivity time. = | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_mag_falling_value | Inactivity threshold= . | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_mag_rising_value | Activity threshold. = | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_x\&y\&z_mag_adaptive_falling_en | Enable or disable AC= coupled inactivity events. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_x\|y\|z_mag_adaptive_rising_en | Enable or disable AC= coupled activity events. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_x\&y\&z_mag_falling_en | Enable or disable in= activity events. | ++---------------------------------------------------+---------------------= -------------------------------------+ +| in_accel_x\|y\|z_mag_rising_en | Enable or disable ac= tivity events. | ++---------------------------------------------------+---------------------= -------------------------------------+ + +The default coupling is DC coupled events. In this case the threshold will +be in place as such, where for the AC coupled case an adaptive threshold +(described in the datasheet) will be applied by the sensor. In general act= ivity, +i.e. ``ACTIVITY`` or ``ACTIVITY_AC`` and inactivity i.e. ``INACTIVITY`` or +``INACTIVITY_AC``, will be linked with auto-sleep enabled when both are en= abled. +This means in particular ``ACTIVITY`` can also be linked to ``INACTIVITY_A= C`` +and vice versa, without problem. + +Note here, that ``ACTIVITY`` and ``ACTIVITY_AC`` are mutually exclusive. T= his +means, that the most recent configuration will be set. For instance, if +``ACTIVITY`` is enabled, and ``ACTIVITY_AC`` will be enabled, the sensor d= river +will have ``ACTIVITY`` disabled, but ``ACTIVITY_AC`` enabled. The same is = valid +for inactivity. In case of turning off an event, it has to match to what is +actually enabled, i.e. enabling ``ACTIVITY_AC`` and then disabling ``ACTIV= ITY`` +is simply ignored as it is already disabled. Or, as if it was any other not +enabled event, too. + +Channels processed values +------------------------- + +A channel value can be read from its _raw attribute. The value returned is= the +raw value as reported by the devices. To get the processed value of the ch= annel, +apply the following formula: + +.. code-block:: + + processed value =3D (_raw + _offset) * _scale + +Where _offset and _scale are device attributes. If no _offset attribute is +present, simply assume its value is 0. + +The ADXL313 driver offers data for a single types of channels, the table b= elow +shows the measurement units for the processed value, which are defined by = the +IIO framework: + ++-------------------------------------+---------------------------+ +| Channel type | Measurement unit | ++-------------------------------------+---------------------------+ +| Acceleration on X, Y, and Z axis | Meters per Second squared | ++-------------------------------------+---------------------------+ + +Usage examples +-------------- + +Show device name: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> cat name + adxl313 + +Show accelerometer channels value: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> cat in_accel_x_raw + 2 + root:/sys/bus/iio/devices/iio:device0> cat in_accel_y_raw + -57 + root:/sys/bus/iio/devices/iio:device0> cat in_accel_z_raw + 2 + root:/sys/bus/iio/devices/iio:device0> cat in_accel_scale + 0.009576806 + +The accelerometer values will be: + +- X-axis acceleration =3D in_accel_x_raw * in_accel_scale =3D 0.0191536 m/= s^2 +- Y-axis acceleration =3D in_accel_y_raw * in_accel_scale =3D -0.5458779 m= /s^2 +- Z-axis acceleration =3D in_accel_z_raw * in_accel_scale =3D 0.0191536 m/= s^2 + +Set calibration offset for accelerometer channels. Note, that the calibrat= ion +will be rounded according to the graduation of LSB units: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> cat in_accel_x_calibbias + 0 + + root:/sys/bus/iio/devices/iio:device0> echo 50 > in_accel_x_calibb= ias + root:/sys/bus/iio/devices/iio:device0> cat in_accel_x_calibbias + 48 + +Set sampling frequency: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> cat in_accel_sampling_frequ= ency + 100.000000 + root:/sys/bus/iio/devices/iio:device0> cat in_accel_sampling_frequ= ency_available + 6.250000 12.500000 25.000000 50.000000 100.000000 200.000000 400.0= 00000 800.000000 1600.000000 3200.000000 + + root:/sys/bus/iio/devices/iio:device0> echo 400 > in_accel_samplin= g_frequency + root:/sys/bus/iio/devices/iio:device0> cat in_accel_sampling_frequ= ency + 400.000000 + +3. Device buffers and triggers +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D + +This driver supports IIO buffers. + +All devices support retrieving the raw acceleration measurements using buf= fers. + +Usage examples +-------------- + +Select channels for buffer read: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_a= ccel_x_en + root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_a= ccel_y_en + root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_a= ccel_z_en + +Set the number of samples to be stored in the buffer: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> echo 10 > buffer/length + +Enable buffer readings: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> echo 1 > buffer/enable + +Obtain buffered data: + +.. code-block:: bash + + root:/sys/bus/iio/devices/iio:device0> hexdump -C /dev/iio\:device0 + ... + 000000d0 01 fc 31 00 c7 ff 03 fc 31 00 c7 ff 04 fc 33 00 |..1..= ...1.....3.| + 000000e0 c8 ff 03 fc 32 00 c5 ff ff fc 32 00 c7 ff 0a fc |....2= .....2.....| + 000000f0 30 00 c8 ff 06 fc 33 00 c7 ff 01 fc 2f 00 c8 ff |0....= .3...../...| + 00000100 02 fc 32 00 c6 ff 04 fc 33 00 c8 ff 05 fc 33 00 |..2..= ...3.....3.| + 00000110 ca ff 02 fc 31 00 c7 ff 02 fc 30 00 c9 ff 09 fc |....1= .....0.....| + 00000120 35 00 c9 ff 08 fc 35 00 c8 ff 02 fc 31 00 c5 ff |5....= .5.....1...| + 00000130 03 fc 32 00 c7 ff 04 fc 32 00 c7 ff 02 fc 31 00 |..2..= ...2.....1.| + 00000140 c7 ff 08 fc 30 00 c7 ff 02 fc 32 00 c5 ff ff fc |....0= .....2.....| + 00000150 31 00 c5 ff 04 fc 31 00 c8 ff 03 fc 32 00 c8 ff |1....= .1.....2...| + 00000160 01 fc 31 00 c7 ff 05 fc 31 00 c3 ff 04 fc 31 00 |..1..= ...1.....1.| + 00000170 c5 ff 04 fc 30 00 c7 ff 03 fc 31 00 c9 ff 03 fc |....0= .....1.....| + ... + +Enabling activity detection: + +.. code-block:: bash + root:/sys/bus/iio/devices/iio:device0> echo 1.28125 > ./events/in_= accel_mag_rising_value + root:/sys/bus/iio/devices/iio:device0> echo 1 > ./events/in_accel_= x\|y\|z_mag_rising_en + + root:/sys/bus/iio/devices/iio:device0> iio_event_monitor adxl313 + Found IIO device with name adxl313 with device number 0 + + Event: time: 1748795762298351281, type: accel(x|y|z), channel: 0, = evtype: mag, direction: rising + Event: time: 1748795762302653704, type: accel(x|y|z), channel: 0, = evtype: mag, direction: rising + Event: time: 1748795762304340726, type: accel(x|y|z), channel: 0, = evtype: mag, direction: rising + ... + +Disabling activity detection: + +.. code-block:: bash + root:/sys/bus/iio/devices/iio:device0> echo 0 > ./events/in_accel_= x\|y\|z_mag_rising_en + root:/sys/bus/iio/devices/iio:device0> iio_event_monitor adxl313 + + +Enabling inactivity detection: + +.. code-block:: bash + root:/sys/bus/iio/devices/iio:device0> echo 1.234375 > ./events/in= _accel_mag_falling_value + root:/sys/bus/iio/devices/iio:device0> echo 5 > ./events/in_accel_= mag_falling_period + root:/sys/bus/iio/devices/iio:device0> echo 1 > ./events/in_accel_= x\&y\&z_mag_falling_en + + root:/sys/bus/iio/devices/iio:device0> iio_event_monitor adxl313 + Found IIO device with name adxl313 with device number 0 + Event: time: 1748796324115962975, type: accel(x&y&z), channel: 0, = evtype: mag, direction: falling + Event: time: 1748796329329981772, type: accel(x&y&z), channel: 0, = evtype: mag, direction: falling + Event: time: 1748796334543399706, type: accel(x&y&z), channel: 0, = evtype: mag, direction: falling + ... + + +Now, enabling activity, e.g. the AC coupled counter-part ``ACTIVITY_AC`` + +.. code-block:: bash + root:/sys/bus/iio/devices/iio:device0> echo 1.28125 > ./events/in_= accel_mag_rising_value + root:/sys/bus/iio/devices/iio:device0> echo 1 > ./events/in_accel_= x\|y\|z_mag_rising_en + + root:/sys/bus/iio/devices/iio:device0> iio_event_monitor adxl313 + Found IIO device with name adxl313 with device number 0 + + Event: time: 1748796880354686777, type: accel(x|y|z), channel: 0, = evtype: mag_adaptive, direction: rising + <5s of inactivity, then> + Event: time: 1748796885543252017, type: accel(x&y&z), channel: 0, = evtype: mag, direction: falling + + Event: time: 1748796887756634678, type: accel(x|y|z), channel: 0, = evtype: mag_adaptive, direction: rising + + Event: time: 1748796892964368352, type: accel(x&y&z), channel: 0, = evtype: mag, direction: falling + + +Note, when AC coupling is in place, the event type will be of ``mag_adapti= ve``. +AC- or DC-coupled (the default) events are used similiarly. + +4. IIO Interfacing Tools +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +See Documentation/iio/iio_tools.rst for the description of the available I= IO +interfacing tools. diff --git a/Documentation/iio/index.rst b/Documentation/iio/index.rst index 2d6afc5a8ed5..c106402a91f7 100644 --- a/Documentation/iio/index.rst +++ b/Documentation/iio/index.rst @@ -31,6 +31,7 @@ Industrial I/O Kernel Drivers adis16475 adis16480 adis16550 + adxl313 adxl380 bno055 ep93xx_adc --=20 2.39.5