From: Eddie James <eajames@linux.ibm.com>
To: linux-i2c@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
jic23@kernel.org, lars@metafoo.de, wsa@kernel.org,
milton@us.ibm.com, peda@axentia.se,
Eddie James <eajames@linux.ibm.com>
Subject: [RFC 1/2] i2c: core: Add adapter transfer callback
Date: Wed, 18 May 2022 15:41:18 -0500 [thread overview]
Message-ID: <20220518204119.38943-2-eajames@linux.ibm.com> (raw)
In-Reply-To: <20220518204119.38943-1-eajames@linux.ibm.com>
Add a callback function pointer to be executed after the adapter
performs a transfer. The purpose of such a callback is for a client
to execute some code while "owning" the bus entirely. Holding the
adapter lock is insufficient in the case where the client is behind a
mux, as the mux driver could perform mux selection operations on the
bus while locked.
Signed-off-by: Eddie James <eajames@linux.ibm.com>
---
drivers/i2c/i2c-core-base.c | 3 +++
include/linux/i2c.h | 25 +++++++++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index d43db2c3876e..a46bfee2d845 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -2128,6 +2128,9 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
trace_i2c_result(adap, num, ret);
}
+ if (adap->xfer_callback)
+ adap->xfer_callback(adap->xfer_data, ret);
+
return ret;
}
EXPORT_SYMBOL(__i2c_transfer);
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index fbda5ada2afc..ea773f2ee9c8 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -747,6 +747,9 @@ struct i2c_adapter {
struct irq_domain *host_notify_domain;
struct regulator *bus_regulator;
+
+ void (*xfer_callback)(void *data, int xfer_rc);
+ void *xfer_data;
};
#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
@@ -814,6 +817,7 @@ i2c_trylock_bus(struct i2c_adapter *adapter, unsigned int flags)
static inline void
i2c_unlock_bus(struct i2c_adapter *adapter, unsigned int flags)
{
+ adapter->xfer_callback = NULL;
adapter->lock_ops->unlock_bus(adapter, flags);
}
@@ -849,6 +853,27 @@ static inline void i2c_mark_adapter_resumed(struct i2c_adapter *adap)
i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER);
}
+/**
+ * i2c_adapter_xfer_callback - Register a callback function that is executed
+ * when a transfer completes.
+ * @adap: Adapter to which the callback function will be registered
+ * @cb: The callback function pointer
+ * @data: The data to pass to the callback function
+ *
+ * This function should be called with the adapter locked with
+ * I2C_LOCK_ROOT_ADAPTER to ensure that the whole bus is idle while the
+ * callback executes.
+ * The callback is automatically removed when the bus is unlocked to avoid
+ * spurious executions of the callback.
+ */
+static inline void i2c_adapter_xfer_callback(struct i2c_adapter *adap,
+ void (*cb)(void *data, int rc),
+ void *data)
+{
+ adap->xfer_callback = cb;
+ adap->xfer_data = data;
+}
+
/* i2c adapter classes (bitmask) */
#define I2C_CLASS_HWMON (1<<0) /* lm_sensors, ... */
#define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */
--
2.27.0
next prev parent reply other threads:[~2022-05-18 20:41 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-18 20:41 [RFC 0/2] i2c: core and si7020: Add adapter transfer callback Eddie James
2022-05-18 20:41 ` Eddie James [this message]
2022-05-20 11:42 ` [RFC 1/2] i2c: core: " Peter Rosin
2022-05-18 20:41 ` [RFC 2/2] iio: humidity: si7020: Use core transfer callback to sleep after reset Eddie James
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=20220518204119.38943-2-eajames@linux.ibm.com \
--to=eajames@linux.ibm.com \
--cc=jic23@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=milton@us.ibm.com \
--cc=peda@axentia.se \
--cc=wsa@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.