From: Yassine Oudjana <y.oudjana@protonmail.com>
To: Jonathan Cameron <jic23@kernel.org>
Cc: "Lars-Peter Clausen" <lars@metafoo.de>,
"Bjorn Andersson" <andersson@kernel.org>,
"Konrad Dybcio" <konradybcio@kernel.org>,
"Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Simon Horman" <horms@kernel.org>,
"Masahiro Yamada" <masahiroy@kernel.org>,
"Nathan Chancellor" <nathan@kernel.org>,
"Nicolas Schier" <nicolas.schier@linux.dev>,
"Alexander Sverdlin" <alexander.sverdlin@gmail.com>,
"Sean Nyekjaer" <sean@geanix.com>,
"Javier Carrasco" <javier.carrasco.cruz@gmail.com>,
"Matti Vaittinen" <mazziesaccount@gmail.com>,
"Antoniu Miclaus" <antoniu.miclaus@analog.com>,
"Ramona Gradinariu" <ramona.gradinariu@analog.com>,
"Yo-Jung (Leo) Lin" <0xff07@gmail.com>,
"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Barnabás Czémán" <barnabas.czeman@mainlining.org>,
"Danila Tikhonov" <danila@jiaxyga.com>,
"Antoni Pokusinski" <apokusinski01@gmail.com>,
"Vasileios Amoiridis" <vassilisamir@gmail.com>,
"Petar Stoykov" <pd.pstoykov@gmail.com>,
"shuaijie wang" <wangshuaijie@awinic.com>,
"Yasin Lee" <yasin.lee.x@gmail.com>,
"Borislav Petkov (AMD)" <bp@alien8.de>,
"Dave Hansen" <dave.hansen@linux.intel.com>,
"Tony Luck" <tony.luck@intel.com>,
"Pawan Gupta" <pawan.kumar.gupta@linux.intel.com>,
"Ingo Molnar" <mingo@kernel.org>,
"Yassine Oudjana" <yassine.oudjana@gmail.com>,
linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
linux-arm-msm@vger.kernel.org, netdev@vger.kernel.org,
linux-kbuild@vger.kernel.org
Subject: Re: [PATCH 3/3] iio: Add Qualcomm Sensor Manager drivers
Date: Thu, 10 Apr 2025 12:31:20 +0000 [thread overview]
Message-ID: <fc9af95b-abbf-454c-97e1-b884baa5317c@protonmail.com> (raw)
In-Reply-To: <20250406172904.1521881e@jic23-huawei>
On 06/04/2025 7:29 pm, Jonathan Cameron wrote:
> On Sun, 06 Apr 2025 14:08:03 +0000
> Yassine Oudjana <y.oudjana@protonmail.com> wrote:
>
>> Add drivers for sensors exposed by the Qualcomm Sensor Manager service,
>> which is provided by SLPI or ADSP on Qualcomm SoCs. Supported sensors
>> include accelerometers, gyroscopes, pressure sensors, proximity sensors
>> and magnetometers.
>>
>> Signed-off-by: Yassine Oudjana <y.oudjana@protonmail.com>
>> ---
>> MAINTAINERS | 18 +
>> drivers/iio/accel/Kconfig | 10 +
>> drivers/iio/accel/Makefile | 2 +
>> drivers/iio/accel/qcom_smgr_accel.c | 138 ++++
>> drivers/iio/common/Kconfig | 1 +
>> drivers/iio/common/Makefile | 1 +
>> drivers/iio/common/qcom_smgr/Kconfig | 16 +
>> drivers/iio/common/qcom_smgr/Makefile | 8 +
>> drivers/iio/common/qcom_smgr/qcom_smgr.c | 589 ++++++++++++++++
>> drivers/iio/common/qcom_smgr/qmi/Makefile | 3 +
>> drivers/iio/common/qcom_smgr/qmi/sns_smgr.c | 711 ++++++++++++++++++++
>> drivers/iio/common/qcom_smgr/qmi/sns_smgr.h | 163 +++++
>> drivers/iio/gyro/Kconfig | 10 +
>> drivers/iio/gyro/Makefile | 2 +
>> drivers/iio/gyro/qcom_smgr_gyro.c | 138 ++++
>> drivers/iio/magnetometer/Kconfig | 9 +
>> drivers/iio/magnetometer/Makefile | 2 +
>> drivers/iio/magnetometer/qcom_smgr_mag.c | 138 ++++
>> drivers/iio/pressure/Kconfig | 10 +
>> drivers/iio/pressure/Makefile | 1 +
>> drivers/iio/pressure/qcom_smgr_pressure.c | 106 +++
>> drivers/iio/proximity/Kconfig | 10 +
>> drivers/iio/proximity/Makefile | 1 +
>> drivers/iio/proximity/qcom_smgr_prox.c | 106 +++
>> include/linux/iio/common/qcom_smgr.h | 64 ++
>> 25 files changed, 2257 insertions(+)
> Split this up. Common library code first, then
> individual drivers making use of it.
Ack.
>
>
>> create mode 100644 drivers/iio/accel/qcom_smgr_accel.c
>> create mode 100644 drivers/iio/common/qcom_smgr/Kconfig
>> create mode 100644 drivers/iio/common/qcom_smgr/Makefile
>> create mode 100644 drivers/iio/common/qcom_smgr/qcom_smgr.c
>> create mode 100644 drivers/iio/common/qcom_smgr/qmi/Makefile
>> create mode 100644 drivers/iio/common/qcom_smgr/qmi/sns_smgr.c
>> create mode 100644 drivers/iio/common/qcom_smgr/qmi/sns_smgr.h
>> create mode 100644 drivers/iio/gyro/qcom_smgr_gyro.c
>> create mode 100644 drivers/iio/magnetometer/qcom_smgr_mag.c
>> create mode 100644 drivers/iio/pressure/qcom_smgr_pressure.c
>> create mode 100644 drivers/iio/proximity/qcom_smgr_prox.c
>> create mode 100644 include/linux/iio/common/qcom_smgr.h
>
>
>> diff --git a/drivers/iio/accel/qcom_smgr_accel.c b/drivers/iio/accel/qcom_smgr_accel.c
>> new file mode 100644
>> index 000000000000..ce854312d1d9
>> --- /dev/null
>> +++ b/drivers/iio/accel/qcom_smgr_accel.c
>> @@ -0,0 +1,138 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * Qualcomm Sensor Manager accelerometer driver
>> + *
>> + * Copyright (c) 2022, Yassine Oudjana <y.oudjana@protonmail.com>
> Given ongoing work, a range on that date to go up to this year
> probably makes sense!
Yeah
>
>> + */
>> +
>> +#include <linux/mod_devicetable.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/iio/buffer.h>
>> +#include <linux/iio/common/qcom_smgr.h>
>> +#include <linux/iio/iio.h>
>> +#include <linux/iio/kfifo_buf.h>
>> +
>> +static const struct iio_chan_spec qcom_smgr_accel_iio_channels[] = {
>> + {
>> + .type = IIO_ACCEL,
>> + .modified = true,
>> + .channel2 = IIO_MOD_X,
>> + .scan_index = 0,
>> + .scan_type = {
>> + .sign = 's',
>> + .realbits = 32,
>> + .storagebits = 32,
>> + .endianness = IIO_LE,
>> + },
>> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
>> + BIT(IIO_CHAN_INFO_SAMP_FREQ),
>> + .ext_info = qcom_smgr_iio_ext_info
>> + },
>> + {
>> + .type = IIO_ACCEL,
>> + .modified = true,
>> + .channel2 = IIO_MOD_Y,
>> + .scan_index = 1,
>> + .scan_type = {
>> + .sign = 's',
>> + .realbits = 32,
>> + .storagebits = 32,
>> + .endianness = IIO_LE,
>> + },
>> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
>> + BIT(IIO_CHAN_INFO_SAMP_FREQ),
>> + .ext_info = qcom_smgr_iio_ext_info
>> + },
>> + {
>> + .type = IIO_ACCEL,
>> + .modified = true,
>> + .channel2 = IIO_MOD_Z,
>> + .scan_index = 2,
>> + .scan_type = {
>> + .sign = 's',
>> + .realbits = 32,
>> + .storagebits = 32,
>> + .endianness = IIO_LE,
>> + },
>> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |
>> + BIT(IIO_CHAN_INFO_SAMP_FREQ),
>> + .ext_info = qcom_smgr_iio_ext_info
>> + },
>> + {
>> + .type = IIO_TIMESTAMP,
>> + .channel = -1,
>> + .scan_index = 3,
>> + .scan_type = {
>> + .sign = 'u',
>> + .realbits = 32,
>> + .storagebits = 64,
>> + .endianness = IIO_LE,
>> + },
>> + },
>> +};
>> +
>> +static int qcom_smgr_accel_probe(struct platform_device *pdev)
>> +{
>> + struct iio_dev *iio_dev;
>> + struct qcom_smgr_iio_priv *priv;
>> + int ret;
>> +
>> + iio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv));
>> + if (!iio_dev)
>> + return -ENOMEM;
>> +
>> + priv = iio_priv(iio_dev);
>> + priv->sensor = *(struct qcom_smgr_sensor **)pdev->dev.platform_data;
>> + priv->sensor->iio_dev = iio_dev;
>> +
>> + iio_dev->name = "qcom-smgr-accel";
>> + iio_dev->info = &qcom_smgr_iio_info;
>> + iio_dev->channels = qcom_smgr_accel_iio_channels;
>> + iio_dev->num_channels = ARRAY_SIZE(qcom_smgr_accel_iio_channels);
>> +
>> + ret = devm_iio_kfifo_buffer_setup(&pdev->dev, iio_dev,
>> + &qcom_smgr_buffer_ops);
>> + if (ret) {
>> + dev_err(&pdev->dev, "Failed to setup buffer: %pe\n",
>> + ERR_PTR(ret));
> For all error message in probe() use
> return dev_err_probe(&pdev->dev, ERR_PTR(ret), "Failed to setup buffer\n")
> etc.
Ack.
>
>> + return ret;
>> + }
>> +
>> + ret = devm_iio_device_register(&pdev->dev, iio_dev);
>> + if (ret) {
>> + dev_err(&pdev->dev, "Failed to register IIO device: %pe\n",
>> + ERR_PTR(ret));
>> + return ret;
>> + }
>> +
>> + platform_set_drvdata(pdev, priv->sensor);
>> +
>> + return 0;
>> +}
>> +
>> +static void qcom_smgr_accel_remove(struct platform_device *pdev)
>
> I'm surprised to see a platform device here - will read on but I
> doubt that is the way to go. Maybe an auxbus or similar or
> just squashing this all down to be registered directly by
> the parent driver.
I got the idea from cros_ec_sensors which also deals with a similar
sensor hub paradigm.
>
>
>> +{
>> + struct qcom_smgr_sensor *sensor = platform_get_drvdata(pdev);
>> +
>> + sensor->iio_dev = NULL;
>> +}
>> +
>> +static const struct platform_device_id qcom_smgr_accel_ids[] = {
>> + { .name = "qcom-smgr-accel" },
>> + { /* sentinel */ }
>> +};
>> +MODULE_DEVICE_TABLE(platform, qcom_smgr_accel_ids);
>> +
>> +static struct platform_driver qcom_smgr_accel_driver = {
>> + .probe = qcom_smgr_accel_probe,
>> + .remove = qcom_smgr_accel_remove,
>> + .driver = {
>> + .name = "qcom_smgr_accel",
>> + },
>> + .id_table = qcom_smgr_accel_ids,
>> +};
>> +module_platform_driver(qcom_smgr_accel_driver);
>> +
>> +MODULE_AUTHOR("Yassine Oudjana <y.oudjana@protonmail.com>");
>> +MODULE_DESCRIPTION("Qualcomm Sensor Manager accelerometer driver");
>> +MODULE_LICENSE("GPL");
>
>> diff --git a/drivers/iio/common/qcom_smgr/qcom_smgr.c b/drivers/iio/common/qcom_smgr/qcom_smgr.c
>> new file mode 100644
>> index 000000000000..8d46be11d5b6
>> --- /dev/null
>> +++ b/drivers/iio/common/qcom_smgr/qcom_smgr.c
>> @@ -0,0 +1,589 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * Qualcomm Sensor Manager core driver
>> + *
>> + * Copyright (c) 2021, Yassine Oudjana <y.oudjana@protonmail.com>
>
> As above, I'd add a date range to reflect that this is ongoing.
Ack.
>
>> + */
>> +
>> +#include <linux/iio/buffer.h>
>> +#include <linux/iio/common/qcom_smgr.h>
>> +#include <linux/iio/iio.h>
>
> Be consistent with ordering. Above you have iio as a separate block.
> Either option is fine, but not a mixture.
Ack.
>
>> +#include <linux/math64.h>
>> +#include <linux/module.h>
>> +#include <linux/of.h>
> Unless there are very strong reasons for of specific code please
> use property.h and the generic firmware accessors.
Ack.
>
>> +#include <linux/platform_device.h>
>> +#include <linux/remoteproc/qcom_rproc.h>
>> +#include <linux/soc/qcom/qmi.h>
>> +#include <linux/soc/qcom/qrtr.h>
>> +#include <linux/types.h>
>> +#include <net/sock.h>
>
>
>> +static void qcom_smgr_buffering_report_handler(struct qmi_handle *hdl,
>> + struct sockaddr_qrtr *sq,
>> + struct qmi_txn *txn,
>> + const void *data)
>> +{
>> + struct qcom_smgr *smgr =
>> + container_of(hdl, struct qcom_smgr, sns_smgr_hdl);
>> + struct sns_smgr_buffering_report_ind *ind =
>> + (struct sns_smgr_buffering_report_ind *)data;
>
> Casting away a const isn't a good sign. Why do you need to do that?
> const struct sns_smg_buffer_repor_ind *ind = data;
> should be fine I think.
The casted struct was previously not const so I was only casting from
void *. I made it const lately but didn't notice this cast. Will change it.
>
>
>> + struct qcom_smgr_sensor *sensor;
>> + u8 i;
>> +
>> + for (i = 0; i < smgr->sensor_count; ++i) {
>> + sensor = &smgr->sensors[i];
>> +
>> + /* Find sensor matching report */
>> + if (sensor->id != ind->report_id)
>> + continue;
>> +
>> + if (!sensor->iio_dev)
>> + /* Corresponding driver was unloaded. Ignore remaining reports. */
>> + return;
>> +
>> + /*
>> + * Since we are matching report rate with sample rate, we only
>> + * get a single sample in every report.
>> + */
>> + iio_push_to_buffers_with_timestamp(sensor->iio_dev,
>> + ind->samples[0].values,
>> + ind->metadata.timestamp);
> You are using a 64 bit timestamp writer that doesn't know about the endianness of
> that timestamp. I'd not do this. Just write the timestamp in like any normal
> channel and call iio_push_to_buffers().
Will look into it.
>
>> +
>> + break;
>
> return;
>
>> + }
>> +}
>> +
>> +static const struct qmi_msg_handler qcom_smgr_msg_handlers[] = {
>> + {
>> + .type = QMI_INDICATION,
>> + .msg_id = SNS_SMGR_BUFFERING_REPORT_MSG_ID,
>> + .ei = sns_smgr_buffering_report_ind_ei,
>> + .decoded_size = sizeof(struct sns_smgr_buffering_report_ind),
>> + .fn = qcom_smgr_buffering_report_handler,
>> + },
>> + {}
> { }
>
> given it's in IIO and I get to pick silly formatting rules.
> More seriously I wanted this consistent so picked a choice mostly at random.
No objections on my side.
>
>> +};
>
>> +
>> +static int qcom_smgr_iio_write_raw(struct iio_dev *iio_dev,
>> + struct iio_chan_spec const *chan, int val,
>> + int val2, long mask)
>> +{
>> + struct qcom_smgr_iio_priv *priv = iio_priv(iio_dev);
>> +
>> + switch (mask) {
>> + case IIO_CHAN_INFO_SAMP_FREQ:
>> + priv->sensor->data_types[0].cur_sample_rate = val;
>> +
>> + /*
>> + * Send new SMGR buffering request with updated rates
>> + * if buffer is enabled
>> + */
>> + if (iio_buffer_enabled(iio_dev))
>> + return iio_dev->setup_ops->postenable(iio_dev);
>
> Generally we'd just refuse to set the sampling frequency.
> This is racy as nothing holds the buffer enabled.
> So I'd do
> if (!iio_device_claim_direct(iio_dev);
> return -EBUSY;
>
> priv->sensor->data_types[0].cur_sample_rate = val;
> iio_device_release_diect(iio_dev);
>
> Change sampling frequency when doing buffered capture is really confusing
> anyway for userspace software as it has no way to know when the
> change occurred so just don't bother supporting that.
Makes sense.
>
>> +
>> + return 0;
>> + }
>> +
>> + return -EINVAL;
> Put this in a default in the switch. That makes it clear we don't
> expect to see anything else.
> Same for other similar cases above.
Ack.
>
>> +}
>> +
>> +static int qcom_smgr_iio_read_avail(struct iio_dev *iio_dev,
>> + struct iio_chan_spec const *chan,
>> + const int **vals, int *type, int *length,
>> + long mask)
>> +{
>> + struct qcom_smgr_iio_priv *priv = iio_priv(iio_dev);
>> + const int samp_freq_vals[3] = {
>> + 1, 1, priv->sensor->data_types[0].cur_sample_rate
>> + };
>
> Lifetime of this needs to last beyond the end of this call as some users
> or read_avail hang on to it. Embed the storage in your priv
> structure rather than local in this function.
Ack.
> I'm also a little confused how the maximum comes from something called cur_sample_rate.
This was max_sample_rate previously but at some point while trying to
understand how the sampling rate works on the SMGR side I removed
max_sample_rate and replaced it here with cur_sample_rate without
understanding what I was changing. When I brought back max_sample_rate I
missed this change. Will change it back.
>
>> +
>> + switch (mask) {
>> + case IIO_CHAN_INFO_SAMP_FREQ:
>> + *type = IIO_VAL_INT;
>> + *vals = samp_freq_vals;
>> + *length = ARRAY_SIZE(samp_freq_vals);
>> + return IIO_AVAIL_RANGE;
>> + }
>> +
>> + return -EINVAL;
>> +}
>
> ...
>
>> +const struct iio_chan_spec_ext_info qcom_smgr_iio_ext_info[] = {
>> + IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, qcom_smgr_iio_get_mount_matrix),
>> + {}
> trivial but I'm trying to standardize on
> { }
> for this in IIO.
Ack.
>
>> +};
>> +EXPORT_SYMBOL_GPL(qcom_smgr_iio_ext_info);
>> +
>> +static int qcom_smgr_probe(struct qrtr_device *qdev)
>> +{
>> + struct qcom_smgr *smgr;
>> + int i, j;
>> + int ret;
>> +
>> + smgr = devm_kzalloc(&qdev->dev, sizeof(*smgr), GFP_KERNEL);
>> + if (!smgr)
>> + return -ENOMEM;
>> +
>> + smgr->dev = &qdev->dev;
>> +
>> + smgr->sns_smgr_info.sq_family = AF_QIPCRTR;
>> + smgr->sns_smgr_info.sq_node = qdev->node;
>> + smgr->sns_smgr_info.sq_port = qdev->port;
>> +
>> + dev_set_drvdata(&qdev->dev, smgr);
>> +
>> + ret = qmi_handle_init(&smgr->sns_smgr_hdl,
>> + SNS_SMGR_SINGLE_SENSOR_INFO_RESP_MAX_LEN, NULL,
>> + qcom_smgr_msg_handlers);
> On error this handle doesn't seem to be released.
Will fix.
>
>> + if (ret < 0) {
>> + dev_err(smgr->dev,
>> + "Failed to initialize sensor manager handle: %d\n",
>> + ret);
>> + return ret;
>
> return dev_err_probe()
> Same in all other similar cases that are only called from probe.
Ack.
>
>> + }
>> +
>> + ret = qcom_smgr_request_all_sensor_info(smgr, &smgr->sensors);
>> + if (ret < 0) {
>> + dev_err(smgr->dev, "Failed to get available sensors: %pe\n",
>> + ERR_PTR(ret));
>> + return ret;
>> + }
>> + smgr->sensor_count = ret;
>> +
>> + /* Get primary and secondary sensors from each sensor ID */
>> + for (i = 0; i < smgr->sensor_count; i++) {
>> + ret = qcom_smgr_request_single_sensor_info(smgr,
>> + &smgr->sensors[i]);
>> + if (ret < 0) {
>> + dev_err(smgr->dev,
>> + "Failed to get sensors from ID 0x%02x: %pe\n",
>> + smgr->sensors[i].id, ERR_PTR(ret));
>> + return ret;
>> + }
>> +
>> + for (j = 0; j < smgr->sensors[i].data_type_count; j++) {
>> + /* Default to maximum sample rate */
>> + smgr->sensors[i].data_types->cur_sample_rate =
>> + smgr->sensors[i].data_types->max_sample_rate;
>> +
>> + dev_dbg(smgr->dev, "0x%02x,%d: %s %s\n",
>> + smgr->sensors[i].id, j,
>> + smgr->sensors[i].data_types[j].vendor,
>> + smgr->sensors[i].data_types[j].name);
>> + }
>> +
>> + qcom_smgr_register_sensor(smgr, &smgr->sensors[i]);
> Above I suggest that maybe you should just skip the platform devices and register
> directly with IIO as you find the sensors. So have the struct iio_dev->device
> parent directly off this one.
As I said previously I followed the model used in cros_ec_sensors, and
it made sense to me since I always see platform devices used to
represent firmware-backed devices like this.
>
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static void qcom_smgr_remove(struct qrtr_device *qdev)
>> +{
>> + struct qcom_smgr *smgr = dev_get_drvdata(&qdev->dev);
>> +
>> + qmi_handle_release(&smgr->sns_smgr_hdl);
> If that is all you have, use a devm_add_action_or_reset() to
> register a handler and drop this remove entirely.
Ack.
>
>> +}
>> +
>> +static const struct qrtr_device_id qcom_smgr_qrtr_match[] = {
>> + {
>> + .service = SNS_SMGR_QMI_SVC_ID,
>> + .instance = QRTR_INSTANCE(SNS_SMGR_QMI_SVC_V1,
>> + SNS_SMGR_QMI_INS_ID)
>> + },
>> + {},
> { }
>
> for IIO terminating entries like this.
Ack.
>
>> +};
>> +MODULE_DEVICE_TABLE(qrtr, qcom_smgr_qrtr_match);
next prev parent reply other threads:[~2025-04-10 12:31 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-06 14:07 [PATCH 0/3] QRTR bus and Qualcomm Sensor Manager IIO drivers Yassine Oudjana
2025-04-06 14:07 ` [PATCH 1/3] net: qrtr: Turn QRTR into a bus Yassine Oudjana
2025-04-06 16:01 ` Jonathan Cameron
2025-04-10 12:10 ` Yassine Oudjana
2025-04-12 10:58 ` Jonathan Cameron
2025-04-10 12:44 ` Yassine Oudjana
2025-04-12 10:59 ` Jonathan Cameron
2025-06-25 22:20 ` Yassine Oudjana
2025-04-06 14:07 ` [PATCH 2/3] net: qrtr: Define macro to convert QMI version and instance to QRTR instance Yassine Oudjana
2025-04-09 14:54 ` Konrad Dybcio
2025-07-05 18:29 ` Yassine Oudjana
2025-07-07 17:06 ` Simon Horman
2025-07-09 7:44 ` Yassine Oudjana
2025-07-09 11:52 ` Simon Horman
2025-04-06 14:08 ` [PATCH 3/3] iio: Add Qualcomm Sensor Manager drivers Yassine Oudjana
2025-04-06 16:29 ` Jonathan Cameron
2025-04-10 12:31 ` Yassine Oudjana [this message]
2025-04-12 11:21 ` Jonathan Cameron
2025-06-18 19:19 ` Luca Weiss
2025-06-25 17:09 ` Yassine Oudjana
2025-04-08 10:27 ` [PATCH 0/3] QRTR bus and Qualcomm Sensor Manager IIO drivers Luca Weiss
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fc9af95b-abbf-454c-97e1-b884baa5317c@protonmail.com \
--to=y.oudjana@protonmail.com \
--cc=0xff07@gmail.com \
--cc=alexander.sverdlin@gmail.com \
--cc=andersson@kernel.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=antoniu.miclaus@analog.com \
--cc=apokusinski01@gmail.com \
--cc=barnabas.czeman@mainlining.org \
--cc=bp@alien8.de \
--cc=danila@jiaxyga.com \
--cc=dave.hansen@linux.intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=javier.carrasco.cruz@gmail.com \
--cc=jic23@kernel.org \
--cc=konradybcio@kernel.org \
--cc=kuba@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=masahiroy@kernel.org \
--cc=mazziesaccount@gmail.com \
--cc=mingo@kernel.org \
--cc=nathan@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=netdev@vger.kernel.org \
--cc=nicolas.schier@linux.dev \
--cc=pabeni@redhat.com \
--cc=pawan.kumar.gupta@linux.intel.com \
--cc=pd.pstoykov@gmail.com \
--cc=ramona.gradinariu@analog.com \
--cc=sean@geanix.com \
--cc=tony.luck@intel.com \
--cc=vassilisamir@gmail.com \
--cc=wangshuaijie@awinic.com \
--cc=yasin.lee.x@gmail.com \
--cc=yassine.oudjana@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).