Thread (18 messages) 18 messages, 2 authors, 4d ago

Re: [PATCH v12 1/7] i2c: core: add callback to change bus frequency

From: Peter Rosin <peda@lysator.liu.se>
Date: 2026-07-23 11:04:04
Also in: linux-i2c, lkml

Hi!

On 2026-07-19 16:59, Marcus Folkesson wrote:
All devices on the same I2C bus share the same clock line and the bus
frequency has therefor be chosen so that all attached devices are able
Perhaps one of:

has therefore got to be
must therefore be
to tolarate that clock rate. IOW, the bus speed must be set for the
tolerate
slowest attached device.

With I2C multiplexers/switches on the other hand, it would be possible
to have different "domains" that runs with different speeds.
that run
Prepare for such a feature by provide an optional callback function to
providing
quoted hunk ↗ jump to hunk
change bus frequency.

As a side effect, several bus drivers keep the bus speed in a
private structure and can now have this value stored in a uniform way
instead.

Reviewed-by: Andy Shevchenko <redacted>
Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
---
  include/linux/i2c.h | 5 +++++
  1 file changed, 5 insertions(+)
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index 20fd41b51d5c..b3b0d16b4ddd 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -729,6 +729,9 @@ struct i2c_adapter_quirks {
  /*
   * i2c_adapter is the structure used to identify a physical i2c bus along
   * with the access algorithms necessary to access it.
+ *
+ * @set_clk_freq: Set clock frequency for the adapter. Returns the actual set frequency.
+ *      This function is optional.
   */
  struct i2c_adapter {
  	struct module *owner;
@@ -742,6 +745,8 @@ struct i2c_adapter {
  	struct rt_mutex mux_lock;
  
  	int timeout;			/* in jiffies */
+	u32 clock_Hz;			/* bus clock speed */
+	int (*set_clk_freq)(struct i2c_adapter *adap, u32 clock_Hz); /* Optional */
To expand on the comment from v9 by Wolfram [1], I too think it
would be good if this function pointer did not live directly in
i2c_adapter but instead in some other struct so that the actual
pointer could live in read-only memory. I.e. if i2c_algorithm
does not fit for some reason, a new function pointer struct might
be called for?

Also, returning int instead of unsigned hints that the function
might return a negative error code, but the new code in 3/7 does
not handle errors. So, either change to unsigned int, or update
the support code in 3/7 to handle errors. I think the latter is
the better approach.

Cheers,
Peter

[1] https://lore.kernel.org/all/ahX44_rzaRlTLSLU@shikoro/ (local)
  	int retries;
  	struct device dev;		/* the adapter device */
  	unsigned long locked_flags;	/* owned by the I2C core */
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help