From nobody Sun Apr 5 19:43:22 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.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 7859527FB18 for ; Mon, 23 Feb 2026 14:33:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857233; cv=none; b=P9GonJvBPg3Zt8ZZZpumRtUfIlxUv21XkjrecGg84GMpmWCpT6UhaJByzlrGSQebj3CjvBfyLD7JzRruPLsW2lut9kUkEHZeQaJlUoVritJMRPd6emYMK5neZWrJcCV0sU+oJm7M2GVwDtwUfj4Wt6D96FfO8blczTpNCiLr10o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857233; c=relaxed/simple; bh=koxBCehUmN3RuwVhQnNS8zqbXgiVP6LXVx/A/SkLKJU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ILZ/rCcj0Z5uNR2lDNOJsOPSaIE+2WNeMKUrWPLfCqnZ46sfdQUSB5gidAtiThTQh+Wp2ckskFb3XI/aml7w9z8AmVzP7trHFJyXHHtqbCrGSCAyHh0ZBaJc/QsHI1BVKcvuwRRTimhbJqkYq8ACLUlbTDAzTVhvAdexB5NeFcU= 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=HMjfayva; arc=none smtp.client-ip=209.85.167.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="HMjfayva" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-59de0b7c28aso5127340e87.1 for ; Mon, 23 Feb 2026 06:33:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771857229; x=1772462029; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=/ZXG84vOT5vo62fVrV4g27oZ8qKjWT76ti4NF1pkRLs=; b=HMjfayva2bCxl+G9QhT/u2KesxdhiGSp82hQ0ct5VtkLpISoCFFRVu9TfBK9OmUUtT lLzH4FU39qFQ/0zwG5dTe59xip0ZQ55q1vn6JTMIPYhm/pWvdYAMv67JLhQhIXMwVmeV mXc6v8Lq4diXbQ0ZgFgGg+eRV62fCTvDc/kXn/7mK/NCBQTmuB+EwJraNCJ51TgrYEFt b0z6LxjtDGG4yZB5aidWW2XrWHYTI13NG8nn846KHKgdQYeyZsPSPXVlVDkLEkWUT+v+ grGyJC2qZUXNRUhQnL3E/IuzqyF6ToaU51LkrL7dTJT7z610jLvKPvpGjeIWVn7ywWrZ g+mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771857229; x=1772462029; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=/ZXG84vOT5vo62fVrV4g27oZ8qKjWT76ti4NF1pkRLs=; b=riwIi42iGYTYBVKw1NSJNCEazqXOjWS315mW/lPd4XXzRY5XCh4HgYICZS6DLMR1w+ XS5mgqWNbYFVBNfDVfAJZOGISHC3Vf2e8E57iIXoglKWIIIgGCQMwLPTRG059J2EhCnD 77u5V9Io6pqz8gMVtPCwN7BNH1019wHYoTGPGDuTmD3RN+wnUZcjtVZDbfuvMX8RSL/1 s3/l8+u5DCKlYkJT4fuMmvxW2JKFdF6Q/9Fcx/Y4QXGR6qE/7oM6JD0aWVh5zr1jkO/3 a8ml3nAZdvBfS1QIdv8WK91W8r2T6D1JmCBqOONu82rwzUgYb4cU8I+382LudV/3w/4b twDg== X-Forwarded-Encrypted: i=1; AJvYcCUk7PtfRYyqKHdNUdWKYkqa437LIezX1Qoz3MZHH99xGO6mGkAHL7t4GII/PdmlXgdIloIDBU9TEt32GV8=@vger.kernel.org X-Gm-Message-State: AOJu0YyX73bYWxVGr45lYKyI+354yWb0V+sCmZjHt6X02eXyyxd8OWPr RbyZkyesIXZ7JXAb/QUmnbj2MWKF5BvkLikJxoHbf2YqRm6VfomjHsUE X-Gm-Gg: AZuq6aK29pf7z1K6NfVGg1fiKKcvXOzalqdsYVqqZHevN8CnMk2nygDzBpnkSHXlTrj sjpnFfEQGjW5iniA4w6GXJafdrBXj70nDYFL5YxrZ5ypIptMSLWRlbnrLrbXJF/+i4l5wH/ONA6 1izBoi2Ouw0ZBa3HNgnNgFmLlXxabsGU9aIwpWD0Xc4EHFRMkmKou9TIm4/zwHTT4qUF51vGX1a plXa7UwhDhgGcqOvh44rReQKSw0nHUMl2FqofyVTPe9Zn2H+eZQnZbkYdxW+4XsvUblDMSoD3ub 4rEm7zmyBdc+1wTWaR+3E49isb3+sN1FsNuNSLgqNV2+suaIJsx/pxIUIoo8dFKZTTxPfklf+wT aqQxdyh3F5CeX67iwe0/3OJPEOm/XgWJJSNF1jP1mUOrGfiD2VF4hxOV0gBap3lFCWYin4DMP6Y g2NxyNoPoqpvLWQnL5S4aa05hc79jNAgTLKxcR8KMe8/+/5yPyIjkuSog4rJisKSk5GWWJ X-Received: by 2002:a05:6512:3091:b0:59f:6c3b:6d3c with SMTP id 2adb3069b0e04-5a0ed8a0556mr2804029e87.29.1771857228506; Mon, 23 Feb 2026 06:33:48 -0800 (PST) Received: from [192.168.1.135] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5a0eeb16344sm1631709e87.37.2026.02.23.06.33.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 06:33:47 -0800 (PST) From: Marcus Folkesson Date: Mon, 23 Feb 2026 15:33:50 +0100 Subject: [PATCH v7 1/5] i2c: core: add callback to change bus frequency 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 Message-Id: <20260223-i2c-mux-v7-1-ec75b214718a@gmail.com> References: <20260223-i2c-mux-v7-0-ec75b214718a@gmail.com> In-Reply-To: <20260223-i2c-mux-v7-0-ec75b214718a@gmail.com> To: Wolfram Sang , Peter Rosin , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2473; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=koxBCehUmN3RuwVhQnNS8zqbXgiVP6LXVx/A/SkLKJU=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpnGVU3pImY+NWazZLlexByac0kY/hMMlKtqzJv e9xVfT04j6JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZxlVAAKCRCIgE5vWV1S MhosD/0XnbcAzCIPj1635aCrdLCtY5TJLNP8ObSXOAaHcIKi3jRWMFcPXPmuEYnvcHxyZrQtThM gVckS2NTcVX+3Cj0fblydVNv70lOKxRPlYjnXNkjXF7N27AvOb2A5eY5URJ2bYNOMLFftfWOhkE QREkYMV5eSG/PJuTDkdgg87uy3FjuLlYxzrYTAzr5Dkzlfq9QM+2gYNrcNMzIbcEwpGAIDHAgcW STCAV325YoV0LVvczNkH+4MwSnjM5GBIPHvry/wFKppUwjsWphoPWYMXBIYWn3AW2pmuI4n5gbI NQmoRzcphKsMKFTmtF68krmuqEqO6BagZKhsG7BmEXLPIQQRuNvpd8/IKGuFTH98zLkYULRIBhx SrvfgNqKRrqtEtI+FjstCJxw7knWC3jIF9kSYNKyjgLbXIXqZkIf3capDa2uZTgzkKSRxrZWdkB s05Qxa65bq1RyNzVEkFL5tpbOwXLprRFJ7+lLL+/JoNhMkXihwy+rBeQjABrHIttue9u7jnI7Bz cILhNd+Il6GTNL5czhX3PbBI4VMt9U7yCUylUgTLJMrWOWeb6nfYrpuMoB+KEOFoHSZ2VXIdGyD bilSw+JZ0VvDLxOK+SazGOYHERiYfMwtpJWM5znhM7XJlvIRNMYePCr5cvCwLbdTN9UfqWYaLir AMnPiXBBEk5N6Sw== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 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 to tolarate that clock rate. IOW, the bus speed must be set for the slowest attached device. With I2C multiplexers/switches on the other hand, it would be possible to have different "domains" that runs with different speeds. Prepare for such a feature by provide an optional callback function to 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. Signed-off-by: Marcus Folkesson --- include/linux/i2c.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 20fd41b51d5c..f81decb3f1f7 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -742,6 +742,8 @@ struct i2c_adapter { struct rt_mutex mux_lock; =20 int timeout; /* in jiffies */ + u32 clock_hz; /* bus clock speed */ + int (*set_clk_freq)(struct i2c_adapter *adap, u32 clock_hz); /* Optional = */ int retries; struct device dev; /* the adapter device */ unsigned long locked_flags; /* owned by the I2C core */ @@ -835,6 +837,38 @@ i2c_unlock_bus(struct i2c_adapter *adapter, unsigned i= nt flags) adapter->lock_ops->unlock_bus(adapter, flags); } =20 +static inline int +__i2c_adapter_set_clk_freq(struct i2c_adapter *adapter, u32 clock_hz) +{ + if (adapter->set_clk_freq) + return adapter->set_clk_freq(adapter, clock_hz); + + /* + * If the adapter is a root adapter without set_clk_freq implemented, thi= s feature is not + * supported + */ + if (!i2c_parent_is_i2c_adapter(adapter)) + return -EOPNOTSUPP; + + /* Update the clock_hz for non-root adapters, even if set_clk_freq is not= implemented, + * to allow * the clock frequency to be propagated to root adapters that = do support it. + */ + adapter->clock_hz =3D clock_hz; + return 0; +} + +static inline int +i2c_adapter_set_clk_freq(struct i2c_adapter *adapter, u32 clock_hz) +{ + int ret; + + i2c_lock_bus(adapter, I2C_LOCK_SEGMENT); + ret =3D __i2c_adapter_set_clk_freq(adapter, clock_hz); + i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT); + + return ret; +} + /** * i2c_mark_adapter_suspended - Report suspended state of the adapter to t= he core * @adap: Adapter to mark as suspended --=20 2.52.0