From nobody Sun Apr 5 18:18:40 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 From nobody Sun Apr 5 18:18:40 2026 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.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 4A14E34D391 for ; Mon, 23 Feb 2026 14:33:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857233; cv=none; b=KnM6+TksOQJ2ylRt9yNcDlrBClIgLqQxmuBuDshRjtzfjqyHf/1SFlpB8WYDMFDnKGlDaCacnVMnuSJY48iCtdi1E46aDE7U+8lWDKJMR9dCqFRXj4JI0hWLIqDhho2LsDDzCxuGoBOwr3ATgxJleKsCySU76/rHu1w6/f1xIrg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857233; c=relaxed/simple; bh=T1ZRGejY53iNiPMBXm4VnJeMfnzHH7k7DvyBHsdYhe0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nRyfNv7ZyD9nMJuYJ/7m0gYq1haQWF9bNAfbpyoi3wHBzvjWegeT6hpFB53PTb5npcPZmwVQsFycwAebHz8jZizVyxMLQsR4sSSgxn1L2dLhtY8+95Mq2hB0ShWb/lDCE3QCzGovsQAdl0NtGfC+YL4Yot5UOvyCzgwpnly9Qa8= 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=ed0iEA2Y; arc=none smtp.client-ip=209.85.167.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="ed0iEA2Y" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-59e0d5c446cso5020023e87.0 for ; Mon, 23 Feb 2026 06:33:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771857230; x=1772462030; 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=bdwzVEey6I7USs7waZMdzZIVAgnmK4BTn29UGHk3ryw=; b=ed0iEA2YFSBitYXeS029S/mtcuSbSzbSMj3fHL3AiU+X+FLZEbgIJMDBw2xeJT1p2N rLTlGOnlLD7NZBZCr330PVcKQfnKUVAEQMJpZporWCrhR6hHe+NBxbAU5FiRGQNyjfe5 iXBaaZ5eCEZNNZWSbdoJSOZb/DoPhLA2riqjuxsLJD9lZGfVhAtYvtZVk2zNpTjtm0kO 8ey/jtmUV+Dmv+9Arz0XN/Fsytku0N8hO7xgRsGUgbmkMAgLRS/i9Shohc5nfaUzRKu3 EVw7awpMbwDSrfLd8BHqzWILj7fJtLoQdZV51Fr6+70113Py3TFRvmS/6rxPh89OYnoh KJnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771857230; x=1772462030; 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=bdwzVEey6I7USs7waZMdzZIVAgnmK4BTn29UGHk3ryw=; b=H8w7QxYqRbAO8LYylEfh0hKivUbPT9lKTOcbseuEatOEQtFuphFUYpm+b9heQDkPr3 0p0PWg4DVsofr1cpB2dZHgtgBvVR/WyKWlm5Iqo4XebGWPCcjBL8zaRfi92VrVpzS8uC +qrEzqa+5LwOwXI1z9k2nsE0UTc/NWYn2F5SP7+qIL/QSU+R1dV0kIPrZozLMxUd+y0X e2kjYd2ZfsAAWrdedA7Dn2cTeV0joC+ct021t2PYRMClsdB5oI0bdStQ+ceyK5QwkNUP bifggv8Lrga58i3RNqWT6SDseDHNrhjjWUSRnU8wtwp4+1nZcxR0lMVmnn0KjUu/Tku3 7nXQ== X-Forwarded-Encrypted: i=1; AJvYcCWN9uoTEAYLiaDW+okPyaxEKwvFuJxwpWT4duj4t0f45QgSDOw19ePg2ef8mX5jKJBciGyw+iYpuVBl0yk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywah5PGimO1wHNlYxdIuJ9ynLgtdk4fkXo3KnDQMZviZt8+hcB6 QcW+iws8nJc9MiFZnPlr7H0CYZwW0eFx/KbS3qZR7STaHz4RXgl3pftc X-Gm-Gg: AZuq6aIafcI9uf/2Cc/V9/Zh2pdm60Vs+jVepmMFiYQmgkJcE2WvhdM0qEQVN8a9dve 65N0HWW1rb/n1qy00llizTEq9jnjmxsT8eASPAuCXox63nuzYlIpDhkZTgnkmYO7ufwLCCBiPFm nDq3aV9OHSukFrnjyOPMuQNMhVKWjLe8ZAsEMrlqOnI7zkbFLtD5KmeKfTpjisRBXA0POi9plCX dCIp9JXHKflNTZBPoL9Fx754OQK2B3rtMMJYEmoRUgBYSXcHBtpVBpgIVNk0AsGPq5hPRLX/QiX mKUpQDzH6syt2EHbA9mz3UcHkc6vMipfL0D0G5ca2LvcbNUBoQDrjECkOmRLzBPQDi+PkWRGzHM Y8UyKRrE/ffdLguQt73polaJHTKZVIHvDO3WYQS59g51u0MIo5RF2EpsyfEA1QNScE95Tu/lisP TeYQZ7BBntQ7AAqAb7to+RQT0PIKr0H69usqI3Q38yqZc7UECLnDpX/pSudGn2cb3PXXTZ X-Received: by 2002:a05:6512:3b88:b0:59e:2242:fbc with SMTP id 2adb3069b0e04-5a0ed89aaf1mr2837745e87.22.1771857230118; Mon, 23 Feb 2026 06:33:50 -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.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 06:33:49 -0800 (PST) From: Marcus Folkesson Date: Mon, 23 Feb 2026 15:33:51 +0100 Subject: [PATCH v7 2/5] i2c: mux: add support for per channel 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-2-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=7623; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=T1ZRGejY53iNiPMBXm4VnJeMfnzHH7k7DvyBHsdYhe0=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpnGVYCPqM91GgwZmF9aiuRWi3kupzj47baPEtT DDralVjMaKJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZxlWAAKCRCIgE5vWV1S MofrD/9GqYIqO2Mb3oj/ExjXYNRw4CPXDesKMiydZsbTYzy/0s1Iosvhblktu/xEAiziD8mYldP JnntcUhFXTn1pIfGg/oZ/QHx49ZPAnVJdnzgu0U5UEoKE5pPomoIdRjs3bgIKiOUWeoPBjaHcK+ lHmySCknIiKLafDQnlTH7MPJAcOKNCYy75nNEC4b2bT38T9ujKvFiwlNiax0qKWuSn8KGjYKZu8 PtSFwvnNqK3GOLSdoBMCkSgvVLPzRRBHH3G7GHC6V+nNFpv57vlM93tLm3lD7+pa/fX9KCW2zvl sQ1g4XPoZ3hQclD7XhLRRLY2SQpCMBukenUjjysClTZzEY0bJ0jBcU1Y/2fQYKEsbMl0+er9ebJ GUeewjvEtKJ6gAKUgJ7TB3yy4mW7IP2It2JtfzCxjelNfl18gNpaKtnw6WXtfSbpSLLIkPFK98E jGkSNO06Mn4c3M94+ohA5db/O+WdOMFNZM4d6OXRfVfG5dxXrJdA6590srMDl8fS2yPuRrHYO8j u9dNCOiLyJ6CJ22pSXak4GBLKcEH6nwtM/93isyTZxjpYDhd7bgnFTklIHHeBYOQE3KeRAxQ/xk 7Kxwl2SHt0ZTLDynJ3LKdEN0wvnR52pNaZBxYKQhFQOO5L2odiR1khuTMAweoU1wdnPHm01mx8V IRfl5jMG7k/p2+w== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 There may be several reasons why you may need to use a certain speed on an I2C bus. E.g. - When several devices are attached to the bus, the speed must be selected according to the slowest device. - Electrical conditions may limit the usuable speed on the bus for different reasons. With an I2C multiplexer, it is possible to group the attached devices after their preferred speed by e.g. put all "slow" devices on a separate channel on the multiplexer. Consider the following topology: .----------. 100kHz .--------. .--------. 400kHz | |--------| dev D1 | | root |--+-----| I2C MUX | '--------' '--------' | | |--. 400kHz .--------. | '----------' '-------| dev D2 | | .--------. '--------' '--| dev D3 | '--------' One requirement with this design is that a multiplexer may only use the same or lower bus speed as its parent. Otherwise, if the multiplexer would have to increase the bus frequency, then all siblings (D3 in this case) would run into a clock speed it may not support. The bus frequency for each channel is set in the devicetree. As the i2c-mux bindings import the i2c-controller schema, the clock-frequency property is already allowed. If no clock-frequency property is set, the channel inherit their parent bus speed. The following example uses dt bindings to illustrate the topology above: i2c { clock-frequency =3D <400000>; i2c-mux { i2c@0 { clock-frequency =3D <100000>; D1 { ... }; }; i2c@1 { D2 { ... }; }; }; D3 { ... } }; Signed-off-by: Marcus Folkesson --- drivers/i2c/i2c-mux.c | 107 ++++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 95 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index d59644e50f14..df18930d6ed4 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -36,21 +36,75 @@ struct i2c_mux_priv { u32 chan_id; }; =20 +static int i2c_mux_select_chan(struct i2c_adapter *adap, u32 chan_id, u32 = *oldclock) +{ + struct i2c_mux_priv *priv =3D adap->algo_data; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_adapter *parent =3D muxc->parent; + int ret; + + if (priv->adap.clock_hz && priv->adap.clock_hz < parent->clock_hz) { + *oldclock =3D parent->clock_hz; + + if (muxc->mux_locked) + ret =3D i2c_adapter_set_clk_freq(parent, priv->adap.clock_hz); + else + ret =3D __i2c_adapter_set_clk_freq(parent, priv->adap.clock_hz); + + dev_dbg(&adap->dev, "Set clock frequency %dHz on %s\n", + priv->adap.clock_hz, parent->name); + + if (ret) + dev_err(&adap->dev, + "Failed to set clock frequency %dHz on adapter %s: %d\n", + *oldclock, parent->name, ret); + } + + return muxc->select(muxc, priv->chan_id); +} + +static void i2c_mux_deselect_chan(struct i2c_adapter *adap, u32 chan_id, u= 32 oldclock) +{ + struct i2c_mux_priv *priv =3D adap->algo_data; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_adapter *parent =3D muxc->parent; + int ret; + + if (muxc->deselect) + muxc->deselect(muxc, priv->chan_id); + + if (oldclock && oldclock !=3D priv->adap.clock_hz) { + if (muxc->mux_locked) + ret =3D i2c_adapter_set_clk_freq(parent, oldclock); + else + ret =3D __i2c_adapter_set_clk_freq(parent, oldclock); + + dev_dbg(&adap->dev, "Restored clock frequency %dHz on %s\n", + oldclock, parent->name); + + if (ret) + dev_err(&adap->dev, + "Failed to set clock frequency %dHz on adapter %s: %d\n", + oldclock, parent->name, ret); + } +} + static int __i2c_mux_master_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) { struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Switch to the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D __i2c_transfer(parent, msgs, num); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -61,15 +115,16 @@ static int i2c_mux_master_xfer(struct i2c_adapter *ada= p, struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Switch to the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D i2c_transfer(parent, msgs, num); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -82,16 +137,17 @@ static int __i2c_mux_smbus_xfer(struct i2c_adapter *ad= ap, struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Select the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D __i2c_smbus_xfer(parent, addr, flags, read_write, command, size, data); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -104,16 +160,17 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *ada= p, struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Select the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D i2c_smbus_xfer(parent, addr, flags, read_write, command, size, data); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -362,6 +419,32 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc, } } =20 + of_property_read_u32(child, "clock-frequency", &priv->adap.clock_hz); + + /* If the mux adapter has no clock-frequency property, inherit from pare= nt */ + if (!priv->adap.clock_hz) + priv->adap.clock_hz =3D parent->clock_hz; + + /* + * Warn if the mux adapter is not parent-locked as + * this may cause issues for some hardware topologies. + */ + if ((priv->adap.clock_hz < parent->clock_hz) && muxc->mux_locked) + dev_warn(muxc->dev, + "channel %u is slower than parent on a non parent-locked mux\n", + chan_id); + + /* We don't support mux adapters faster than their parent */ + if (priv->adap.clock_hz > parent->clock_hz) { + dev_err(muxc->dev, + "channel (%u) is faster (%u) than parent (%u)\n", + chan_id, priv->adap.clock_hz, parent->clock_hz); + + of_node_put(mux_node); + ret =3D -EINVAL; + goto err_free_priv; + } + priv->adap.dev.of_node =3D child; of_node_put(mux_node); } --=20 2.52.0 From nobody Sun Apr 5 18:18:40 2026 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.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 EFD64354AE3 for ; Mon, 23 Feb 2026 14:33:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857235; cv=none; b=q/lW/B9L/QURBCWsNoI+35msQzxUyM/opu/niBCYafSRb1B2x/0zB+eH3KsLu2z58BAH3GCu8c/jIMYHWpj+2k6/SF3e9cYmjBNwTjRkLNyz+IkED6ErHIrUYYi4cTP/lsCncoLcVs2pUhlcBdqS4oEI6QXxjZZVBz8UvCeCzqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857235; c=relaxed/simple; bh=ZEEqeaCS8i/fQh/ydJoSPQSgfBIk2Lb7weS4NuofoIc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JiC5BzrRdz6GGWtk1gokugdvhY40ITQPS2ENeso3kFpEXPzi+nDyYUy+3e6/S34lrH0/AL3vM/pXLHUj/Y0m7lOzxDS5ZikScd3wv7ZJzayivCpnOqVOycgsOttVQ4xVNbH04pFWWHthCeSwDR3fNPZOi+GvfuB1EmCSFAxCBMI= 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=Yz6CTIor; arc=none smtp.client-ip=209.85.167.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="Yz6CTIor" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-59de66fda55so4933132e87.3 for ; Mon, 23 Feb 2026 06:33:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771857232; x=1772462032; 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=NlHpayBYcqc/iH584SrkLhfCupAvJIo+BPnQtA6Sgno=; b=Yz6CTIorcgR/lnCcZ8EEnN5cEh9gOtAUQvzhgnrWQw2IcjNe9qFupSvhQXoDSE9Tv5 WMxGAHUTjSsFc+Cu1s27JhKqvmYouKNxDShCOCtzNvL0fxrkoYRPvYu8OFTK12ut1aeF MOojGsQbtjk8sXebZt87BYKm7q4uZiEnVz0KDivQIHZ8jKPT9e53xoBDpxP/fmYnwiWT 9KZE88MnIthRZRthbxiKCyAHGtJudduol5zUzgcoqvKygKzp6PrJ+BkgmxSHQvyRSYOQ u4LI7CQoEeoQtghys8szUZZp4/Pc+vAq7iFYDG991UrSYBpuXqffYpgh8FiJU/kCoPJC NOlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771857232; x=1772462032; 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=NlHpayBYcqc/iH584SrkLhfCupAvJIo+BPnQtA6Sgno=; b=aE49qO82qmus5wUZHsjCDPfnle5cTZV7ejHW2sbEF5WKFbMo/K8RZR4NxZUX48Mrg1 SERxbOrxlaaJOMNUzhPysTgtC5e9GQOWc9bldSzcNAP3ya01FsMhmNKHgafD/jjcf53K tQ5LDIRsvlyG2lXfT+SH01XFM9opiagi8/NbYUEUUpBbMwwFTQgHlJJNYsdiUR6Wz36y 7t0Uh84HyVvRGCWb3iDDfJ0vMTJ4PmT38Z4PE8bJAQkEzz1sILXKQx9FRDv80UKew6In WqhozkYT5rOkYpTBMSROxNNpApp6ClCP8AMffvoRY0gn381jIQx2AQ1RGexB94AYZcsC a+iQ== X-Forwarded-Encrypted: i=1; AJvYcCVST9vVqRfFozjY1rZrTGGORYOh+8JVwiOEjGrelEwxFTmlZPqq+97SYzMeDnDFz2XfxFPHZ6QBZPab1gg=@vger.kernel.org X-Gm-Message-State: AOJu0Ywmr39CuQIbQBmAinYDOy2i093BSQiUBDawRqNJWfPUTzEvo+cM fZU2DS/iJ7+wYLUurC47HutgBiVaiNHd8FzKugzLh7BiL/NHF3PXLoTa X-Gm-Gg: AZuq6aLMJUBbiGbs57HJsItrbs2YyUQcKQ2RK1GV6M6xA7hzRRJ6EtW6m6p/VHCh0XY 1ixFPDugHUZXNdqP911Gg8PqkV41Dttqwkst2Ft6P7uS5Ol+5TvGWqMIoj/gV4h5bCAv0XIso4C FRN2PGjh/uepaNTEn56jJxNEquFTZmXGrwwKemv3cxHZU3I43zDYr6eHbVp1XWRkvSJES8VANoq 9srJ0NhwStcy6PNVS9oWY0oscim8/2crYPC43o3bWvT/Lh784pCPVbfpH59d9j0V+/be/cDG8ZQ f7sMrwIfLzGsj/5iCoi3BWBApxLwKGGdvMRqyABHCFlEsWTc0+iRDm3X1hORNQ1ILQudrqbzB4/ VeLRJ29yyS4YRyg2fszkE9HOedPXoV7VLRh6fY/6M3mad8bMQiOaanDEvDjTjqiNYi0zYZB6Jds rTKINIbSRXSmcmOsrn3ISnfe5kQpOgJVV+ACFnTb7AGscdCR0UVi7EuEST9RTg9tIdU+vdiZOyg pujs64= X-Received: by 2002:a05:6512:b05:b0:59f:71b7:4850 with SMTP id 2adb3069b0e04-5a0ed9b12a2mr2729556e87.49.1771857232010; Mon, 23 Feb 2026 06:33:52 -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.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 06:33:50 -0800 (PST) From: Marcus Folkesson Date: Mon, 23 Feb 2026 15:33:52 +0100 Subject: [PATCH v7 3/5] i2c: davinci: calculate bus freq from Hz instead of kHz 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-3-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 , Bartosz Golaszewski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2864; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=ZEEqeaCS8i/fQh/ydJoSPQSgfBIk2Lb7weS4NuofoIc=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpnGVdlhV+iSt5NluQ7dVjtjXvoIJaeUg0f+eo0 AqUwP+2YXiJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZxlXQAKCRCIgE5vWV1S MmINEAC5kZvmViAk8BONTPcbB5SK2etSLrO/aaqbtq9S801JoBGC+bUGSqLUbTRFbjMEbU7lXDs e9lj5kcKnupgjtUm2s33OJv0jnNeoAM/A7nk4485z35RDLF3DKJ1Ys2Fuk5jZnf5mHnFEjR0Rx3 d2CakuaiCutPI8iEbaeKnivoiXYEZi45aCE1CIKoCN3OnWZa9KEPGOoxORg8x1/ZXNgDpF3FvNi 4Tkm+CYfcA/jCfxe0FUv8me8RuZkqCi5mTr9pAk8NUMTelNOhdQQst6u3pCc/w6xYkxzCVrDcMo 5lJFYyRpbbB4Uz+THhyTK4S6mRG7s+uku57/IzsfZDuuIcs/D0TpOu9OSfXO7OKyR2+c8u6PwoW wm5D9MpHBXpsHpSOU/EIvStAyo6jUWG0tovc+BORJwrc7fraWfj9AQENmNv/Nr0HofHVoap7TwO VoxOcShSKptyQjOburpGIFXjTXtKXThbTiMkRIsodWdV2vOslifczyEYbpFraopHfgaydkIUTlA rPqy6ndq0hAExeJDrhl9V4vCEUrZRWWxBO95IxhDhT04bPqPGH2yNE31w5Fr6/i/Pa04FtoKNg+ OfWAWsV7DcHhaDYRPh4xnCG/OnGZd5PfsPEpikLYVS9DXiDeP68fcD39sZ0K1d2zdSwJ7nU8qt5 yWtGr1duEV6RazA== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 The bus frequency is unnecessarily converted between Hz and kHz in several places. This is probably an old legacy from the old times (pre-devicetrees) when the davinci_i2c_platform_data took the bus_freq in kHz. Stick to Hz. Reviewed-by: Bartosz Golaszewski Signed-off-by: Marcus Folkesson --- drivers/i2c/busses/i2c-davinci.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index a773ba082321..a2b578e0a534 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -117,8 +117,6 @@ /* timeout for pm runtime autosuspend */ #define DAVINCI_I2C_PM_TIMEOUT 1000 /* ms */ =20 -#define DAVINCI_I2C_DEFAULT_BUS_FREQ 100 - struct davinci_i2c_dev { struct device *dev; void __iomem *base; @@ -134,8 +132,8 @@ struct davinci_i2c_dev { #ifdef CONFIG_CPU_FREQ struct notifier_block freq_transition; #endif - /* standard bus frequency (kHz) */ - unsigned int bus_freq; + /* standard bus frequency */ + unsigned int bus_freq_hz; /* Chip has a ICPFUNC register */ bool has_pfunc; }; @@ -209,16 +207,16 @@ static void i2c_davinci_calc_clk_dividers(struct davi= nci_i2c_dev *dev) if (device_is_compatible(dev->dev, "ti,keystone-i2c")) d =3D 6; =20 - clk =3D ((input_clock / (psc + 1)) / (dev->bus_freq * 1000)); + clk =3D ((input_clock / (psc + 1)) / (dev->bus_freq_hz)); /* Avoid driving the bus too fast because of rounding errors above */ - if (input_clock / (psc + 1) / clk > dev->bus_freq * 1000) + if (input_clock / (psc + 1) / clk > dev->bus_freq_hz) clk++; /* * According to I2C-BUS Spec 2.1, in FAST-MODE LOW period should be at * least 1.3uS, which is not the case with 50% duty cycle. Driving HIGH * to LOW ratio as 1 to 2 is more safe. */ - if (dev->bus_freq > 100) + if (bus_freq_hz > I2C_MAX_STANDARD_MODE_FREQ) clkl =3D (clk << 1) / 3; else clkl =3D (clk >> 1); @@ -269,7 +267,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKL_REG)); dev_dbg(dev->dev, "CLKH =3D %d\n", davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKH_REG)); - dev_dbg(dev->dev, "bus_freq =3D %dkHz\n", dev->bus_freq); + dev_dbg(dev->dev, "bus_freq_hz =3D %dHz\n", dev->bus_freq_hz); =20 =20 /* Take the I2C module out of reset: */ @@ -760,9 +758,9 @@ static int davinci_i2c_probe(struct platform_device *pd= ev) =20 r =3D device_property_read_u32(&pdev->dev, "clock-frequency", &prop); if (r) - prop =3D DAVINCI_I2C_DEFAULT_BUS_FREQ; + prop =3D I2C_MAX_STANDARD_MODE_FREQ; =20 - dev->bus_freq =3D prop / 1000; + dev->bus_freq_hz =3D prop; =20 dev->has_pfunc =3D device_property_present(&pdev->dev, "ti,has-pfunc"); =20 --=20 2.52.0 From nobody Sun Apr 5 18:18:40 2026 Received: from mail-lj1-f177.google.com (mail-lj1-f177.google.com [209.85.208.177]) (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 74E2F35CB7B for ; Mon, 23 Feb 2026 14:33:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857237; cv=none; b=FNRKyJ45j0JhSZsGQq5o9Pinslht38Nx2GhliGn+478XNXCz2zU2qCFwTuyh/0B+O7e/H60IIZEPHC4C86XK9g6mXSXK5CsGzUE1fXegZt1J55q757omccJ3XBOfEy+ZJxR8cR6HfAuzhj4cmiymha/0YIEj6zno5StKFtt9Iyk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857237; c=relaxed/simple; bh=Rjlezx60T8d1CxFV2XLRaRAysWKBz62yOQI2I7gCYFM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kD3UGzSYdFBAf/MVFF0qNB1XuAENAnRG1heCPPD6NXv9tMbcLBhzxWO96I9dytlzLwhFOuf5pidO/j97Vz6uWCO7ze8V78JshQkbATCIVA4MhT6W3bIRlo7vEWEnna1bOLCbzazpIMpTYuvk+blpf+Pzyk9FGajZTnG11Al82i4= 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=dMPJz1D3; arc=none smtp.client-ip=209.85.208.177 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="dMPJz1D3" Received: by mail-lj1-f177.google.com with SMTP id 38308e7fff4ca-38709eaf012so37614601fa.0 for ; Mon, 23 Feb 2026 06:33:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771857234; x=1772462034; 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=ML132/96OtzaPEHr0g2FW3hc1YN90nAUiFVEwcI9LI0=; b=dMPJz1D3s4ZqU7KKoHIykVVAJ+lpsFKjoXSUfLnxh6vDhqqWKFYc08Gp4q7pM/MKBw UNtbF4bJIXt21+68sPmtbnua3z2wdfxiepTfUxxSu/YI/Icg0Qu2byqvTbHdSAypf4CT oRKF9LVwiNRtrYdRsQmZml8nvc12bVzo/SSmOsDecYZCxVF1dXxh1a8kQJr8+MmCTZEP ZVCyeVOm81II6L1vnHjaOK+/gDr4XQf9a1KNGNRcrVo57276t3q//DJ+hRlbKygo3Ecz wQUObKZVehiCu/tGeBZOJAbpsVf33CRpl9RFRo8TQLRBZybR3H/+ZVQOyTLayACqMJ9F vIuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771857234; x=1772462034; 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=ML132/96OtzaPEHr0g2FW3hc1YN90nAUiFVEwcI9LI0=; b=Qan/6eHEggGN1w92gUqBaP7Ewhy4VJ4RXlUCeA5K+RidFakoFAf3hm3gW49FY3CAyy HzewXbyr7Voynyl8koy0ManYhMlRuc0DZZ7aKiLVTXhOHCpAjceLisyhNFTuk+kIXClu +nsdPoY/AFYeF/tnYcOmoe6jjz5oVuqtP4B66ByY5MgSJESLDcu38IGeZUooRTVvfCsl svB4qQ6PG+loMw+4GhHpI+ez9teagKYo3DI/Y3dAbCnrBXtg7wYPjzjPV5znaCUB/sW+ xav58Nyjq+fMu90JIz0zlVVoNdMdLBMO0bRe17NK83iKkMg63AqBcAP7QAXq4FnRpqNg HVpQ== X-Forwarded-Encrypted: i=1; AJvYcCXYReTnOtFWVSnIO9G0hCZhtYoEon1Vu+Z1zMW9Zyue0vdzizlc4k8itJQVUPc8LTLKCRHaaMDVjvzNObA=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8qwWQzK9yDAn3/JDxsOm9/3eU5gMgMWLJvvAo8V+q/AvF9y+i 3reijYOLM1C72ujUI8Zz1lZgFvqEC85bLPaGw+HAqMjRrtIAz0b2t+Hc X-Gm-Gg: AZuq6aIrroawj7COlZykEyIs7oA89ikbSNDSaCcy1WvHURfiFRM3h9EHLmt+diYrPzW dJ/lm3Ybpjp7uCMpF8Sf5H/supU93DhpvTe0MJxEcy8jk2ORUmmbt6xSWI0FP0c8xPhOoElBlzR IGSR1CVhgSL3kQo5iWTH4+53H3kJt5gba5qyVMiiTN3HdgJ53KsNVHUCgbpeSWJq3k/BDniv8aD /sAwgL6wWytXndsPzZGK68NuYunKTMxXSWSZ1z8kQKNIetuzb/UToJ9ipg7OV/MrzyzVveUGDKw gRn4BA0EETJKyzS95Xi+aQrfxUeKRYWKiRyBA5kZPEnNfAAFOmpGnc1rohHOsHUP8yTMOSKq0gd plX95/LGfQ8QjN5G767asn3hO2l+oeu19BM69CiXXcB5vNNatdaEX5zxsrzSlQ2QDGC0w5N1i9W giLYx/cWDKTlO4Q6aqMG1eB/pzunzkruiUOyehmIp8SMfTyBsMKqBjRujpKuOKx5EhnfYrrbotj htBJgw= X-Received: by 2002:a05:6512:68e:b0:59f:6b45:84cd with SMTP id 2adb3069b0e04-5a0ed89c965mr2597861e87.22.1771857233501; Mon, 23 Feb 2026 06:33:53 -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.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 06:33:52 -0800 (PST) From: Marcus Folkesson Date: Mon, 23 Feb 2026 15:33:53 +0100 Subject: [PATCH v7 4/5] i2c: davinci: add support for setting 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-4-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 , Bartosz Golaszewski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3886; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=Rjlezx60T8d1CxFV2XLRaRAysWKBz62yOQI2I7gCYFM=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpnGVhzIZ66cT2UEVAdWdoZR6qcWocMoWj6ZvKn hmeycXUtVKJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZxlYQAKCRCIgE5vWV1S MivUEACBk2EPV07U5h65ZnqBjP+Cy+p4X5YZKG6D4zgckGExFXmlEdcRGt7E62qoatNghWgmKzR lggqGF7c+SWIuyG5yZ+EkmViPiiumjqxdVjoP5vAd9X/ntfLcZkeC7+foO8svMqfwa9h9tylvsq he/CgCc+SUT6ou9I2FiwTCiRIPVnGzE0scsXQFbv90PZ4HfIGwRITiVXpaA3Fax2JEM4ha4lt1F Wwa3sqycWdmKpNqnhrIn9cJYN1Edht2beIk26F058Tyni7LrdOchQAlDZMS3f83erTCecv5ycIT BMJnBvxXQuqYN77I7Yl4kcJ3V0eZNQN0RrWrAjH2lNiDhD1O6/gItq9XkTzTDPNDM12qMZ/8ri0 fy/38HH6WhovvX1ddnvk75EGwk9iSaF4aET3+VSe1fxNi1PGm95uySm3ZoAlyjmZC1hzLZwWOv3 awfbuw9yYTbwTD0QsHvbxMztkYYG+f/bwOJI5lRzN4QOp5A50NO91eDPx/uvcYjGRmPcXHWkLQg QRbeoEbSC+bv+3QebrLbUwIbBIQe9Yd8unvHDCrP2SgDLamMfi9RzmdNI5FQY8UCs4gaA1+MV0a 1db9GZAsypspQweAv+J5BWwoLZpuSSCugLu8I98gvX4QZrCr8jlCErAKq1gWwkZfKqlWWbPBs4l 74DcwBD1h5jtkzg== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 Populate adapter with clock_hz and set_clk_freq to enable support for dynamic bus frequency. Remove bus_freq_hz entirely and only use clock_hz instead. Acked-by: Bartosz Golaszewski Signed-off-by: Marcus Folkesson --- drivers/i2c/busses/i2c-davinci.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index a2b578e0a534..96b78014aa51 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -132,8 +132,6 @@ struct davinci_i2c_dev { #ifdef CONFIG_CPU_FREQ struct notifier_block freq_transition; #endif - /* standard bus frequency */ - unsigned int bus_freq_hz; /* Chip has a ICPFUNC register */ bool has_pfunc; }; @@ -171,6 +169,8 @@ static void i2c_davinci_calc_clk_dividers(struct davinc= i_i2c_dev *dev) u32 clkh; u32 clkl; u32 input_clock =3D clk_get_rate(dev->clk); + u32 bus_freq_hz =3D dev->adapter.clock_hz; + =20 /* NOTE: I2C Clock divider programming info * As per I2C specs the following formulas provide prescaler @@ -207,9 +207,9 @@ static void i2c_davinci_calc_clk_dividers(struct davinc= i_i2c_dev *dev) if (device_is_compatible(dev->dev, "ti,keystone-i2c")) d =3D 6; =20 - clk =3D ((input_clock / (psc + 1)) / (dev->bus_freq_hz)); + clk =3D ((input_clock / (psc + 1)) / (bus_freq_hz)); /* Avoid driving the bus too fast because of rounding errors above */ - if (input_clock / (psc + 1) / clk > dev->bus_freq_hz) + if (input_clock / (psc + 1) / clk > bus_freq_hz) clk++; /* * According to I2C-BUS Spec 2.1, in FAST-MODE LOW period should be at @@ -267,7 +267,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKL_REG)); dev_dbg(dev->dev, "CLKH =3D %d\n", davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKH_REG)); - dev_dbg(dev->dev, "bus_freq_hz =3D %dHz\n", dev->bus_freq_hz); + dev_dbg(dev->dev, "bus_freq_hz =3D %dHz\n", dev->adapter.clock_hz); =20 =20 /* Take the I2C module out of reset: */ @@ -279,6 +279,27 @@ static int i2c_davinci_init(struct davinci_i2c_dev *de= v) return 0; } =20 +static int davinci_i2c_set_clk(struct i2c_adapter *adap, u32 clock_hz) +{ + struct davinci_i2c_dev *dev =3D i2c_get_adapdata(adap); + + if (adap->clock_hz =3D=3D clock_hz) + return 0; + + adap->clock_hz =3D clock_hz; + + /* put I2C into reset */ + davinci_i2c_reset_ctrl(dev, 0); + + /* compute clock dividers */ + i2c_davinci_calc_clk_dividers(dev); + + /* Take the I2C module out of reset: */ + davinci_i2c_reset_ctrl(dev, 1); + + return 0; +} + /* * This routine does i2c bus recovery by using i2c_generic_scl_recovery * which is provided by I2C Bus recovery infrastructure. @@ -755,12 +776,13 @@ static int davinci_i2c_probe(struct platform_device *= pdev) dev->dev =3D &pdev->dev; dev->irq =3D irq; platform_set_drvdata(pdev, dev); + adap =3D &dev->adapter; =20 r =3D device_property_read_u32(&pdev->dev, "clock-frequency", &prop); if (r) prop =3D I2C_MAX_STANDARD_MODE_FREQ; =20 - dev->bus_freq_hz =3D prop; + adap->clock_hz =3D prop; =20 dev->has_pfunc =3D device_property_present(&pdev->dev, "ti,has-pfunc"); =20 @@ -800,7 +822,6 @@ static int davinci_i2c_probe(struct platform_device *pd= ev) goto err_unuse_clocks; } =20 - adap =3D &dev->adapter; i2c_set_adapdata(adap, dev); adap->owner =3D THIS_MODULE; adap->class =3D I2C_CLASS_DEPRECATED; @@ -809,6 +830,7 @@ static int davinci_i2c_probe(struct platform_device *pd= ev) adap->dev.parent =3D &pdev->dev; adap->timeout =3D DAVINCI_I2C_TIMEOUT; adap->dev.of_node =3D dev_of_node(&pdev->dev); + adap->set_clk_freq =3D davinci_i2c_set_clk; =20 if (dev->has_pfunc) adap->bus_recovery_info =3D &davinci_i2c_scl_recovery_info; --=20 2.52.0 From nobody Sun Apr 5 18:18:40 2026 Received: from mail-lf1-f47.google.com (mail-lf1-f47.google.com [209.85.167.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 B56BF364EB1 for ; Mon, 23 Feb 2026 14:33:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857240; cv=none; b=eQ8aNsV2Q9ygLq6HHX9evf/gi2sj4gEoTQJ+yKoPBOEvoj3cApxg+auoGUoo5dYosJXwtpE613GujsLlH19b2bl+8PS1UmTNBvsPoGRPbcMRvNynWsTcP0vkVMP6TP/KzxCGowG/1eiInEsfXEZoc/9F9BPnWaq7oaqzh/4mDpI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771857240; c=relaxed/simple; bh=srHk2JrYne2Lr9S+OWYkWWOBdPBDjyWH8AYFfVb4WM4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Mu8WtzIvrrpUww0GTOsTHmgIBskCHAP/kyC4KAiaK1On/ndbc9yId7yxTcKXVxaL8M62CV8HGFtMnEbBZtvFWv5h/04vKD2y4IeajByLGcCj+8GQJhoUkIp0awWkER/8qJ7UhE6XN657OoAH1+/pgDtsHYaAZ5bkoCRagOAUKOw= 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=m61Nxfem; arc=none smtp.client-ip=209.85.167.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="m61Nxfem" Received: by mail-lf1-f47.google.com with SMTP id 2adb3069b0e04-59f850cdeafso4688795e87.2 for ; Mon, 23 Feb 2026 06:33:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771857236; x=1772462036; 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=yxYzimuJUPEidRiJMQ+HmOdyz4ofi/9h4aHUin0J/KI=; b=m61Nxfemp6sF6YS6F0753erC+o+atsdnmywXWd0AVN1h55TS4UROvuE/1rnkkBHb58 sEaYuQySoItDPvdqmi/wLjndjaijGS0vligDws5KDH69th9Wl3+J+dDfntSvhxICl31M 4NZSmc+eW4KYctIRFO5s69R2RCI5fQFnX+j3vYyeLMMcj/a5xVhdNyewJvdIpA4O6ulZ 0ccadgreEEHScHUzy5Y2x8Vu1QuptknAd5GzflXSiBHEozvKNHY2GWRaJnxk7Oz5En05 OLSIOtHUYJw9fzAk30FJRMaIYtyot6d3Mp4T0XAo/WwzFVwKE+3buh9DyP1EyOXOXBkY KfYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771857236; x=1772462036; 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=yxYzimuJUPEidRiJMQ+HmOdyz4ofi/9h4aHUin0J/KI=; b=UqJ47jus7ZEjYQhEvA7Nr1qf8RlVcfdHuTwxThCum154IkRyKcGlG9c7uoHAcP+f20 XKfI8bjAr08gNvJmjQKneNrGIVEzE1Mk+ShECiVFPp2do5/cYXJKzyXEOaSq3nMCHIdx /GPhE2d3/qxHm54w1dZujiJbrGM3w5eoi3ETfCn/CN04dsqULhSCbxJ0UqDrPzff63w3 7JkxwO+ulctoler8acBuIRlyN4tk4LMPflLJamE281CtLF0vMPTRfSOAzFKjHc76HI/0 8oUTrsK9R1hmtyXVwfBkmp6Ih2SKe9CDDstA/LCuM+MKzpZ37C1O/4yShm3X5nHVLl8R Ud6g== X-Forwarded-Encrypted: i=1; AJvYcCU+omOHFQc0ADEv7FIeZVWK/Bq8zJjHmIk/Cm/omLGEy4UwlenRCYWVJhqqNemLj9SDINd3Y3k9v0kD8Bw=@vger.kernel.org X-Gm-Message-State: AOJu0YywaCRWfZ4lgS2rx7yWWYwYtjd6rvSMW3R8F13NpAb/O3lnkPlp OKZtY4pAQEffoJjV0rg9bVPxohZEVJhd2lRXsaT58JwYNU8ACmlODAjj X-Gm-Gg: AZuq6aIXsjLrNrrWO/ORUsvBw8DgCIoOucJ/KzWXJsRq3QMp8aM+u+UKPC24dD8xuvb 0Rr2T3dXxGOW1RFikg5e9ILyXdkQJfQFIfA+J9RlPTyDHalYuHF8mHvmnj70ZCDbPonx4U1ktdR xxGUlhEsZ8mP7bsa9kqHCr8n+kMTfo/fZRqdNa/Na5UqQKnHiCXgANlWvRQEdhFxRpMw7JV5Hyo +SQ1sR9Eu9puomAzlNKMJFG5MS1iYeg6U3UhHZSdtuWNK5MkvDpBtl4FFIeC6EHK2cVBX5pL+sY Skjw29Hr545z86412RXPisi0NnQsWTZhm1BKwBHbGfOYHeSBzZmGgF/nRY4Ci0bmSZG/aACq+/f rIy3928WY599KqbDgbpy2dWcTSKEl1ZR7kkSlYhipMoG24c4AFynJR9apQIAeRe7qeoyxh8Re3K ZNGdn8hOnNUg3n7Gudz6XpsBnacniqMwshCLHts3RuPcx3WpGVdCahjOoDII66TRNyEN2l X-Received: by 2002:ac2:51cb:0:b0:5a0:f49d:1802 with SMTP id 2adb3069b0e04-5a0f49d183emr741484e87.46.1771857235661; Mon, 23 Feb 2026 06:33:55 -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.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Feb 2026 06:33:54 -0800 (PST) From: Marcus Folkesson Date: Mon, 23 Feb 2026 15:33:54 +0100 Subject: [PATCH v7 5/5] docs: i2c: i2c-topology: add section about bus speed 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-5-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=8169; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=srHk2JrYne2Lr9S+OWYkWWOBdPBDjyWH8AYFfVb4WM4=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpnGVmfI/iyqEJtwfCGjYa/ktan0zKU2eHHY9M/ DYuLBGkY9GJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZxlZgAKCRCIgE5vWV1S Mlc3EACpRNiY/EUkVtCG0Oc8jRcpzfZewydd3Pz0EzMarqemaE2gMsPLgbfI+prQTxPZ2aakp+L QOv9D+zAwYy0RexyT1ybojEaz3BQ3c75MgcPoVQdQbjhOpyfmlbc+97v2mMgmcufuUjrHxIGoBT PLR+ZRy4qBkGajDojKJAnsnX+lQGQ1xH9oIqjbTh4LHZhWARX5IIH39rOMkelfY5S6cW6X7SSzv 3oshi3OlLkEKLo1FUSeuV2Z4wENVRq7J7S76CWuU9Xcs8aSar6vWcnAMm+uxbZkIq58OBBBVrml r4iurrVgAUz1W6CRbmMzk6V1WhcH9rPPvlnj3akBQ3Xv6aUW1lfTzuxN4rNJ5iY+eCNS2JF1Vyc fpXEDBdn4SobypFJyGp9MVYX64TWAEiFMADEvyIMKKP0eKJ1+H+eK4NN7Nrx25igLN9OrS/L2pM DND6r00lETYp8iE7SCF7sEMftYmC3pgvgu3y2vedZ89IK02fnIgCWNBGb5X6CyN3udrRHcK3zZA ySeDhBTYm9zlNzvOnaTTn2cfJfB88Ch99KxpeK6yoikS/8tJPuLNlAatUlCut0JIc9HKYYg+UpA D2ymIlyEJVGUb4NdPniZG6HR52uNPWYzetampZjleNZuj0y8fKwnanbwgIwifzZ8x4szb3XFk4v xwm+Kysr7HfX4vQ== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 Describe what needs to be consideraed and taken into account when using different bus speeds for different mux channels. Signed-off-by: Marcus Folkesson --- Documentation/i2c/i2c-topology.rst | 178 +++++++++++++++++++++++++++++++++= ++++ 1 file changed, 178 insertions(+) diff --git a/Documentation/i2c/i2c-topology.rst b/Documentation/i2c/i2c-top= ology.rst index 48fce0f7491b..24df553ca8c7 100644 --- a/Documentation/i2c/i2c-topology.rst +++ b/Documentation/i2c/i2c-topology.rst @@ -367,6 +367,184 @@ When D1 or D2 are accessed, accesses to D3 and D4 are= locked out while accesses to D5 may interleave. When D3 or D4 are accessed, accesses to all other devices are locked out. =20 +Bus Speed and I2C Multiplexers +=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=3D=3D + +I2C bus multiplexers allow multiple downstream channels to be exposed +as separate I2C adapters which also could set their own bus speed. + +The multiplexer itself cannot change the bus speed as it use the upstream +clock and data lines to communicate with the downstream devices. The speed +is therefore changed in the root adapter resulting in that the whole bus is +affected. + +This increases the complexity of the topology and some considerations must +be taken into account. + +Bus speed +---------- + +Downstream channels of an I2C multiplexer can only operate at the same or +lower bus speed as the upstream bus. This is because the upstream bus may +have devices that cannot operate at higher speeds and those will be affect= ed +by the speed change. + +The example below illustrates the problem. +The root adapter is operating at 100kHz. D2 can only operate with 100kHz, +but D1 can operate at 400kHz. When D1 is selected, the bus speed of the +root adapter would have to be set to 400kHz, a speed that D2 may not suppo= rt. + +This topology is therefor not allowed: :: + + .----------. 400kHz .--------. + .--------. 100kHz | mux- |--------| dev D1 | + | root |--+-----| locked | '--------' + '--------' | | mux M1 | + | '----------' + | .--------. + '--| dev D2 | + '--------' + + +This topology is allowed: :: + + .----------. 100kHz .--------. + .--------. 400kHz | mux- |--------| dev D2 | + | root |--+-----| locked | '--------' + '--------' | mux M1 |--. 400kHz .--------. + '----------' '--------| dev D1 | + '--------' + +Preferred topology +------------------- + +The preferred topology when using different bus speeds is to have the mult= iplexer +connected directly to the root adapter without any devices as siblings. +By this arrangement, the bus speed can be changed without affecting any ot= her devices +and many of the caveats are avoided. + +Other multiplexers in parallel is still okay as those are locked out durin= g transfers. + +This is the preferred topology: :: + + .----------. 100kHz .--------. + .--------. 400kHz | mux- |--------| dev D2 | + | root |--+-----| locked | '--------' + '--------' | mux M1 |--. 400kHz .--------. + '----------' '--------| dev D1 | + '--------' + +Locking +-------- + +If the multiplexer is mux-locked, transfers to D3 may interleave between t= he +select-transfer-deselect to D1 or D2. +This results in a situation where the bus speed to D3 may be lower than it +is supposed to be. This is usually not a problem. + +This topology is allowed but some transfers to D3 may be at 100kHz: :: + + .----------. 100kHz .--------. + .--------. 400kHz | mux- |--------| dev D1 | + | root |--+-----| locked | '--------' + '--------' | | mux M1 |--. 400kHz .--------. + | '----------' '--------| dev D2 | + | .--------. '--------' + '--| dev D3 | + '--------' + +Multiple muxes in series +-------------------------- + +When multiple muxes are used in series the same rules applies. + +Transfers to D3 may interleave between select-transfer-deselect to D1, whi= ch +results that the bus speed to D2 or D3 will be at 100KHz. + +Transfers to D2 may interleave between select-transfer-deselect to D1, whi= ch +results in that the bus speed to D1 may be at 400kHz as the transfer to D2 +will set the bus speed to before the transfer to D1 starts. + +This is probably a bad topology :: + + .----------. 400kHz .----------. 100kHz .--------. + .--------.400kHz | mux- |--------| mux- |--------| dev D1 | + | root |--+----| locked | 400kHz | locked | '--------' + '--------' | | mux M1 |--. | mux M2 | + | '----------' | '----------' + | .--------. | .--------. + '--| dev D3 | '--| dev D2 | + '--------' '--------' + +Multiple muxes in parallel +---------------------------- + +When multiple muxes are used in parallel all access to other muxes are loc= ked out +so this is not a problem. + +If the muxes are mux-locked, access to D3 may still interleave though. + +In the example below, D3 may not interleave between select-transfer-desele= ct for D1 +or D2 as both muxes are parent-locked: :: + + + .----------. 100kHz .--------. + | parent- |----------| dev D1 | + .--| locked | '--------' + | | mux M1 | + | '----------' + | .----------. 400KHz .--------. + .--------. 400kHz | parent- |---------| dev D2 | + | root |--+------| locked | '--------' + '--------' | | mux M2 | + | '----------' + | .--------. + '--| dev D3 | + '--------' + +Idle state +----------- + +Muxes have an idle state, which is the state the channels are put into whe= n no channel +is active. The state is typically one of the following: + +- All channels are disconnected +- The last selected channel is left as-is +- A predefined channel is selected + +Muxes that support an idle state where all channels are disconnected are p= referred when using +different bus speeds. Otherwise high bus speeds may "leak" through to devi= ces that +may not support that higher speed. + +Consider the following example: :: + + .----------. 100kHz .--------. + .--------. 400kHz | mux- |--------| dev D1 | + | root |--+-----| locked | '--------' + '--------' | | mux M1 |--. 400kHz .--------. + | '----------' '--------| dev D2 | + | .--------. '--------' + '--| dev D3 | + '--------' + +If the idle state of M1 is: + +- All channels disconnected: No problem, D1 and D2 are not affected by com= munication + to D3. +- Last selected channel: Problem if D1 was the last selected channel. High= speed + communication to D3 will be "leaked" to D1. +- Predefined channel: Problem if the predefined channel D1. Set predefined= channel + to D2 as D2 may handle 400kHz. + +Supported controllers +----------------------- + +Not all I2C controllers support setting the bus speed dynamically. +At the time of writing, the following controllers have support: + +=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=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=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +i2c-davinci Supports dynamic bus speed +=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=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=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Mux type of existing device drivers =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=3D=3D=3D=3D=3D --=20 2.52.0