From nobody Thu Mar 19 02:06:36 2026 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (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 9576B1DB375 for ; Mon, 16 Feb 2026 12:38:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245517; cv=none; b=OUvkfgmc6sf+CGyrjTS53hart2KXfia05HntDbJRE0Ec939CeI//f1SPlE+7D9t3mNcFwC3tCwxlj6osyAOlDXR14alKGvHkuM+AfJzbAnKLBQJnCbTpQfLJuC9rwe1UQvsgEG7DNfhWZSYFSvKW8A0TwcHxbXDiNVJYUVODvjM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245517; c=relaxed/simple; bh=WkfZrlH2rNxO52cLVhBbxQV4YB4czTBtNoYoTszUuMI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O4lxnpWc3jHit2ofgNoI5MTpIOcOmY99Ykq8W18AWcY6ss2+3v2EPDJbh5RT4qTVdK9ZUsuFrFTcs8/BgOabdMNm1OlSX76n5eErwDi9x4ntB1+Z0SA9SxyMBXBy13E2b9MS1cx0xgR8DAHP1/jx0yuT/9Z2AmM5bhD6O0CqbxA= 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=SRskJvEo; arc=none smtp.client-ip=209.85.167.44 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="SRskJvEo" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-59dcdf60427so3074046e87.3 for ; Mon, 16 Feb 2026 04:38:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771245513; x=1771850313; 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=JbwGPJS9piP3D1IROOiA3tAkFtRzDUpcLnnixg8UsRc=; b=SRskJvEo+A8t/LZIWyd9rZ8tWUYQHovHlhCTKeETdl2HftZnhqg2dmd+2S0LVoI9w0 N7G/NkQloUuCGQsbH4tYy7ojZIDO+0AgIaqd/ptjKcqrxr8PVtIIFjRMpnZCJejz9/ao A06j+VK69gITf6Bz0oVGl7Ivur3/e2X4eQc3zRflDnogYhjRWQXcdeENCGbkUPOj4ckC KW6KX9oU2eHX7Qp+eF3c6+A+fSmyvnTMsAW92qDy3HlwkBnGlbWEt3SE2PXe00YLTQIm HneuHhPhdo7N6YnSGppULDpxoHme8Suk0ODIgakdm8rl/pXtN1TVpDdGdz7alkWGD/fy tQMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771245513; x=1771850313; 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=JbwGPJS9piP3D1IROOiA3tAkFtRzDUpcLnnixg8UsRc=; b=I2/oEzlPgB5aBQPGEBB4whxYbutM6SyAEFAT2UXUFAMrDv2tZmUC4d7jcC5ld346dx Lr9/fOZ6+ePj0O696wee+ZDmdltydGwNZTIx9Cx6EoT68KirBijizHCFFFIFZ9lQawuZ HBV8aImpwJDZhp8lQwuvR0VYGJUUNezUlwsCWThixEX8rfwKA6fL4yg9a7dOqFBWyqQt +f/6dEoXjNHjobm4xfA+N8rjrQDUJIIcLM7VwBuZJBeIhzPkjM/amlLRTZO0i2LtIdmU iH/+b5FNT+OTc7p9ms8i9OSBRGb98/6GZQIrA8LKtx6x3bZfAq9Dj+2MArXDDy5zpP7t sGgg== X-Forwarded-Encrypted: i=1; AJvYcCWrWt8G4SyqUVZL5b48c1ZAk0+f2Puta8yJfovljWXGGvJkMr1JCQ25fho1s4I+8L/WogloWhE8d/Z9lyI=@vger.kernel.org X-Gm-Message-State: AOJu0YwViS33XJbkHkBEMPeFTGh/X/U9f74tt1G64TvJriAHKt4K7/36 VIG001KmWCZqPD3o1h4Wj9wg5P1nIBSichn3nr0SP9Qdb0n8UAGxyr8t X-Gm-Gg: AZuq6aI5pRgwa2wM4KO98FsXxSD4jLwXZnPaGDoxZfP1jpQk9gdQuhXRPcNf9fggYWN W0cTJ8XEQOwNkCGOc55CePMuMJPD10uXcMR1yXN0UYPUnITXiUsBPoPYoiP3y4lPf4i3y6Vu5bC Dp9CALcFgInsCE31bgSmdneZnMk84tvnPQYioyeFgz5sZI7Y5gVrNOfDHKl3vhL0C3wp8BgiyrT +E8jMGWqmZ9Vr39Q8T6gHaxUa3PAXlhcMriJniuPHpeRPCF1RkzQyBtHSnqT0xcDYl+OUSAFnBZ GZmJJUobOR2EgaBZa3s7MOwvi7L7Hdk/FONNfl6JUs8wU001bDAKLcq452pzT2WfULG5N95Z/+U K1o9ETGzwDqp+ybmzaJv7T8yxZBLizqzTcn8IB/01IH+eDqFsGH8l+EYWZDKxNxykVHQ+XgLeqc DkZWPv3qI3/FOPwSASj/4ob/0SJjU4AXOR04yXd+IZQKYIeXpUFN4tcbgKfMa95Uomay60 X-Received: by 2002:a05:6512:304e:b0:59e:4f92:5df3 with SMTP id 2adb3069b0e04-59f69c3e23bmr3523627e87.10.1771245512608; Mon, 16 Feb 2026 04:38:32 -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-59e5f5b0577sm3175920e87.71.2026.02.16.04.38.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 04:38:31 -0800 (PST) From: Marcus Folkesson Date: Mon, 16 Feb 2026 13:38:13 +0100 Subject: [PATCH v6 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: <20260216-i2c-mux-v6-1-9be28ecfd7e3@gmail.com> References: <20260216-i2c-mux-v6-0-9be28ecfd7e3@gmail.com> In-Reply-To: <20260216-i2c-mux-v6-0-9be28ecfd7e3@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=1764; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=WkfZrlH2rNxO52cLVhBbxQV4YB4czTBtNoYoTszUuMI=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpkw/D8XNVBduW5ufUR8JhzXfBil47yj9Ci1zpG 4/9/BCAdEiJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZMPwwAKCRCIgE5vWV1S MgXrEACCHJ+y+6aLdIWIBMz34AfkkMC771/Z6hrN3cqelZgrb9vN0zqBmObTMGEu3VadlDCSYc/ 2G7HIhieoPs4fGw6lFRrCCZJIasm5dYdjtijFatEYNAzBbBAESjBkgnZ5FQMPeBcN4UgzyqkXoa aVgxbBUkmyI8D/ogiGbk4GPxj9Jo0nPjIA8M+L1qmzQnErkUfcAGLPujf4XS2gmHeP3p3iOkuq5 vCwvoDF8rGxxg1+afj2qFcHyOmxG5RBoACtOPqjgF5lsCH6CQLLMuS9JzhBZLR7266zwVy0iw0u RSf2j5WG/a92luoD7bYTsNgk00OT/ui8Jp3OtDEm9Ymz9han/CMpIBgguDihueQTfT94s0bkuyb ARzbB3lbgtUzbykrepTWPBnW2HnotrzpQkp/sNkylvmGy1iCxbQHNrkvB8EUL9RIRHaZxvGCaX7 6F/fsdYJ+zYJrdPD4VfX/ZG63BGYDP6TkbgpLjsC8BA2LL5uu5jLY/d6YuZ9MpKZw/qjIQ+nykV DeXke1t1sMW2KzlP/2I3LPb2k4LT1x6GDXKEfLo3DW3wBrp6/12xuKlGJ0GaKiJxtpuZdUG2jru 1LADLtBvuP5IbfTuWWsEbUW3vhOQAhQ0iKTcZcyQv3Xx8ef1U23u3jSa1gnk1IL797zh4O9nHM1 f47YQotq9GW+u2g== 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 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 20fd41b51d5c..87654fab2f1b 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,15 @@ 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); + + return -EOPNOTSUPP; +} + /** * 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 Thu Mar 19 02:06:36 2026 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (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 DFDA3231836 for ; Mon, 16 Feb 2026 12:38:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245517; cv=none; b=a8Fvcuzs2aMAC1ssx6Hk77suP58Gdqs6NsnqIsUAmn/y3NTF4tMcb/BzdoR3MZpa9Vf+3L/0PIJsLLA8U5cD0wGVDn0rYEqs4Fl8KafU1MrTY5lmZvirkASI2tmORFtV4SWiR/idoF62u3clGUFD1+WZeG6pVxK+BTCvC1uwoHc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245517; c=relaxed/simple; bh=/bBzf2R/gDr+xFsEvUjSSz9V/1X475MKmehIdfO82S0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aztjxQfFI0RrKsJa3PLo4ZVjH2VCAz/lYLCCZtkbV24jgJFwcGDxsZ609VMHoJRSgHBGAGZOcLC+u2vc0hZSWViwkTwRF/+gEJrFkhKl4szwyN9cLP/zMfFehQHKk2sKg0+U+UvZCSn2iXg1P+s60I3FepQa1tF2K9wAd++CyRA= 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=QpuvhoMk; arc=none smtp.client-ip=209.85.167.49 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="QpuvhoMk" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-59e60925251so3647959e87.3 for ; Mon, 16 Feb 2026 04:38:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771245514; x=1771850314; 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=KaNXPqSzXRni0/7DZfH0pXrm0ku9rx2g9K/sQobHHbo=; b=QpuvhoMkb2B+RqoayeEDpjilHlYjPWF7ut7ct3iY+Lc6Wx90egN//aTXjzF5rFujSs JPSDKBeTskqaa30Nu10q/jfv+741zBx8gVSaVQwouMzZjeUDw8TtgG0K+vrKAucl7R/r eQqfs0sQKpCgGXaOvfVtYZtkLDmN4ZO5oE7XYaBtDqpbjnmHveU4b79KmoM6mFg7SxhM 4wL4JSYhRlMfjqk0kmlBVGb5yHcB0Am5/C4z5Kodfvcg8/ycaWR/82D3hPGvLvqai8dh +V5z8M5BbZErntIyMwoZZfo0I2xUtYSa4nun6YHUqRqMfobmoHsCDZOOQGawldx2mbEY kyRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771245514; x=1771850314; 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=KaNXPqSzXRni0/7DZfH0pXrm0ku9rx2g9K/sQobHHbo=; b=NtLt0XQrjV64Y6UfwY6ypAUwfXa7qTrl3sDz8TbkHUZt3GkyBRgs3C7BFSxy32LUaS C9BpH0Car+kOU13+AeHyvq5hm6xgsBAJFAJkcoUcqoz1V/VDxZEgKCRbAtSdHBRFKSL7 8P594+n4SjsN/S5BTN6715DJPRzzDhYnS49/KCdVoBcWL57JmlGj0xbnH9JOSw8isspP NqYWrsvPQOGMcOPtb3M9UrhzHwbHd7OP33Q/DnohBXKRMlF+zeNNvRgWTaBIrcDAvig/ /VbIWOlBf1we06jatPbq8ZP3eCjigDMVLYhYAt+Blf5B0yXNvXbu9uazAKc86qxXeiA1 1wBA== X-Forwarded-Encrypted: i=1; AJvYcCXdngZauxkAKRjlsTt0lxbvMcJf/X/mgTsfTl5qLNsoC25/2SIL9fS1YORs1pKgSe4qBozGAHtDG5aPo9s=@vger.kernel.org X-Gm-Message-State: AOJu0YyZcppYtSw/B2loNi0EAkuVa86XPPbG5ZW4j+352fwU4a2+gg23 45LcKMl/KUdYxs+5nCZgJGMBAZt+Sf9Ay5OaGbr2uHIvGAHEM/xw4qI8 X-Gm-Gg: AZuq6aLi7AUCzcqMZk0pmCdMODM9n+yyrcjMZQ/nzN0OGi0p55vmK/u9sWdnFj5qMFf EsIMltVVHtTRlzH5M4ja9MuZCDwz1W1PqbUu3QsCv3QDMEoqUFQc2DM0bHuohOwQMUalxOgpB4p PjGVAGXXB5CTlbt7OvpOBWxi1NsLp9N4cn3qZPr7tCbfmA1usz9zwE8tPYLPy2psEFI4k6mZCN7 VqSBLZygg/sdSOgYPs20gnI5p05LhVWCIuof0gczAYttw4YJ6uGdzRhv8QFm5oeGEEpEI1P6Nzn xtQZ1J+FQIWdhcn4671/HwjvAFlWFa4dLkXajM3edumGb4LWW3/APIm76P1/Lrkk/9y2odHYkP1 zATS00SGrn4WHC2Z9/NhocZkilcMlhX9tYu6jQ6FccsLqvQ+kkJIQKCu1ZH4l9froBdi0XNAxVO BDEFFN+Vo8FbyutGNoM8WMPXoHl3AJp5N80c2+QKXWLp/a2QcLFbZ9JUiMsxinq0vmhF+O X-Received: by 2002:ac2:4f04:0:b0:59e:459c:15f7 with SMTP id 2adb3069b0e04-59f69c23b4fmr2689862e87.14.1771245513793; Mon, 16 Feb 2026 04:38:33 -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-59e5f5b0577sm3175920e87.71.2026.02.16.04.38.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 04:38:33 -0800 (PST) From: Marcus Folkesson Date: Mon, 16 Feb 2026 13:38:14 +0100 Subject: [PATCH v6 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: <20260216-i2c-mux-v6-2-9be28ecfd7e3@gmail.com> References: <20260216-i2c-mux-v6-0-9be28ecfd7e3@gmail.com> In-Reply-To: <20260216-i2c-mux-v6-0-9be28ecfd7e3@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=8944; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=/bBzf2R/gDr+xFsEvUjSSz9V/1X475MKmehIdfO82S0=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpkw/IPz4xzOf0GygzsdQUR9jYSoA8MYUX8kYSp CwhsOUu8/KJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZMPyAAKCRCIgE5vWV1S MhlBEACRSkI9YUbj+XI6UXMYW3BF06vIgS/RBysjCddJxOIXqoFXdLXo+HvGzpMSfsebQ662nor yMP/mDH/4JANEiwR/QgPu2K8FanwF9u4vhC9lyc810zQPOjtIvvh/2DWQCXuPJsjbY0ktw2I80Y vApTtlcrnhdGPyF0I7rUe8cCPqjz8Ghwk/Esf1zc2xGlglsGXK+9TyeUOqffP/BwnJ3SB1p1L/p rALCgYGrvki5sK1Ep/AZ/f4dj5PnIpN1COZtWuoD22KgYFq665psaZeTteuxHeDKKV5U3GMLwaV 9ONe5HrK4g0CXpfsv7Y19cS+N93MMzRbE+sF/X0jXbgfJaLz0KQwACwJdJTCAQaIdIJ7k4rkCHu cAgOyyuR25Mx1uh501QQaheYBAFAc5n2iKtC3tAbgumsd5oDNuWRsa4UmneGTTjDGUGkzVO4SGG 99k76a4jH4G8XRr1lPYjjiaimtzZ1EsJlcyilUzBIZpcWwRzcoQa9q5iBIcKdzaYeHWGJNblt7l 4vxpPEAFn2ZvwtniWSPzofj8iWOf2rGE4hq585/6tRMKt0e0ni0bFRkFxbeG9S2JGOkx5alYp// 6dOUIoZeXUmk3K9yVNUbObftrCg0J+ifKpkfbQ6sFohpuZHCO/zwxt0M2d4lgYhRBj5WkH8fLb6 n6/Z9zCHfqQ9SUQ== 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 | 145 +++++++++++++++++++++++++++++++++++++++++++++-= ---- 1 file changed, 133 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index d59644e50f14..f125b4b8ae58 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -36,21 +36,113 @@ struct i2c_mux_priv { u32 chan_id; }; =20 +static struct i2c_mux_core *i2c_mux_first_mux_locked(struct i2c_adapter *a= dap) +{ + struct i2c_adapter *parent; + + while ((parent =3D i2c_parent_is_i2c_adapter(adap)) !=3D NULL) { + struct i2c_mux_priv *priv =3D adap->algo_data; + + if (priv && priv->muxc && priv->muxc->mux_locked) + return priv->muxc; + + adap =3D parent; + } + + return NULL; +} + +static int i2c_mux_select_chan(struct i2c_adapter *adap, u32 chan_id, u32 = *oldclock) +{ + struct i2c_adapter *root =3D i2c_root_adapter(&adap->dev); + struct i2c_mux_priv *priv =3D adap->algo_data; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_mux_core *mux_locked_ancestor; + int ret; + + if (priv->adap.clock_hz && priv->adap.clock_hz < root->clock_hz) { + mux_locked_ancestor =3D i2c_mux_first_mux_locked(adap); + *oldclock =3D root->clock_hz; + + /* + * If there's a mux-locked mux in our ancestry, lock the parent + * of the first one. When locked with I2C_LOCK_ROOT_ADAPTER, + * this will recurse through all intermediate muxes (both mux-locked + * and parent-locked) up to the root adapter, ensuring the entire + * chain is locked. + */ + if (mux_locked_ancestor) + i2c_lock_bus(mux_locked_ancestor->parent, I2C_LOCK_ROOT_ADAPTER); + + ret =3D i2c_adapter_set_clk_freq(root, priv->adap.clock_hz); + + if (mux_locked_ancestor) + i2c_unlock_bus(mux_locked_ancestor->parent, I2C_LOCK_ROOT_ADAPTER); + + if (ret) + dev_err(&adap->dev, + "Failed to set clock frequency %dHz on root adapter %s: %d\n", + priv->adap.clock_hz, root->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 *mux_locked_ancestor; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_adapter *parent =3D muxc->parent; + struct i2c_adapter *root; + int ret; + + if (muxc->deselect) + muxc->deselect(muxc, priv->chan_id); + + if (oldclock && oldclock !=3D priv->adap.clock_hz) { + mux_locked_ancestor =3D i2c_mux_first_mux_locked(adap); + root =3D i2c_root_adapter(&parent->dev); + + /* + * If there's a mux-locked mux in our ancestry, lock the parent + * of the first one. When locked with I2C_LOCK_ROOT_ADAPTER, + * this will recurse through all intermediate muxes (both mux-locked + * and parent-locked) up to the root adapter, ensuring the entire + * chain is locked. + */ + if (mux_locked_ancestor) + i2c_lock_bus(mux_locked_ancestor->parent, I2C_LOCK_ROOT_ADAPTER); + + ret =3D i2c_adapter_set_clk_freq(root, oldclock); + + if (mux_locked_ancestor) + i2c_unlock_bus(mux_locked_ancestor->parent, I2C_LOCK_ROOT_ADAPTER); + + if (ret) + dev_err(&adap->dev, + "Failed to set clock frequency %dHz on root adapter %s: %d\n", + oldclock, root->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 +153,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 +175,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 +198,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 +457,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 Thu Mar 19 02:06:36 2026 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (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 F122D72634 for ; Mon, 16 Feb 2026 12:38:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245519; cv=none; b=SMfXPz3ptVy2vg3NldaBrTJ7r1aDQEoKzTeRzJDLF1Daol3MQYz+sqIC0NlalUkCwDGJphpAEDuaBk/C4BDVN3yUszPR7Lzv1U1BDKUG+aZGa09WZ4DSPyXFK4rJdjZzTXMHurYuFdYv5/al8gp9NqxA03nS7YALseX7ROxyVCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245519; c=relaxed/simple; bh=NgWDqx3izSY9aW9W75gFytkLHJndTcTMdemaHAZbfa4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cODAKaOpOkR2KGWywyjVxQNsti6PoujuGDw9TIrxTIlhIcUSIR35WfhUY2YL/R++Ne7+gtv2wTWMhvCWMmTlGczbSnJE9Ur9SJ95ZGnnvR3MdHi/5BX7RlD+l0XR3/ya/oXmpRiN3hsQm8eqd3FgwZUkbJXv9ctaGkQSmfE+uTc= 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=Ng3KgqJK; arc=none smtp.client-ip=209.85.167.44 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="Ng3KgqJK" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-59e5c540b9cso2603649e87.0 for ; Mon, 16 Feb 2026 04:38:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771245516; x=1771850316; 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=hgLydv0OAbPSYmy/7mtUdSMM6gy3g70cS63c1sKd/bM=; b=Ng3KgqJKFzpVn3u+jDb5S+tMn1MCQHaR/PfN1mkCKfY9yGLTkiJmDHYjTjmCVfLkPU bL++ja3rXSAKpvRwdhvwAfe1CZBkVURJP6lg5AUAGFlPffKnhHG9vFzYDoDquETgRWsh CYgBB5z2NJJ5rNbMXzzsAMpRE2esVosAxgy08+/gmvufIGgcxUl4JYbq8AsLqXMyfZ2U 9gMu0iUCYNd9JF2MS09Le/UTXrmmj6Q40sX9y+sjHbFqoaggpBS9PoW01KEfOHhZ0Wwb es1bJuKx0xFPrxJGqhZLFFwOPaddZgWEM+Jn2fQ7hdDqH1QQWfGNuzGwCAOa+EKJiJ7J +T8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771245516; x=1771850316; 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=hgLydv0OAbPSYmy/7mtUdSMM6gy3g70cS63c1sKd/bM=; b=sw4SeZVjpCO54whC+fZiY0hif57DElpINOJjlRlk9xRLigaZRelggtDRR8otLm4Z3w 9AbtqsyClFBZxSTWWi5pJgWbseHWzbuEzvrV68+bExd8aXIwn09O/uFN5IHZ6VFlhN+x ppOeIulxkAqavT5VqFHAq41Jar1pBXesH85P6Ncr/1kE7Ks/OARL/LyJRtPVm9E3+bF9 fh/uYYYIJ3tIHJ44188SbceQhuIRmYtlIK3gOT0NhW33jArweQcnNxN8FU73xSaG25qR cPqFm3aeg0MLOZfOaSkQ8f8+CGqoIa8Ayc9Bzln1VuAnxd/lKVMcYH4rMNhFd3CRtCX0 s36A== X-Forwarded-Encrypted: i=1; AJvYcCWnn35Tk4WOiak2/rAnc5oWbvaKS2ryOl99fQ6MO8D6c+5JzxToHOi7r2FIbf2fiLMWAsWnNO+0rwbabSw=@vger.kernel.org X-Gm-Message-State: AOJu0YzxHZWKvRYVeeKqhC5nJ3pu1Rkqpqz3sBZa67OJIwGbU/nr+n29 hrul8IvGwtr2Qen2mQwIR3EY6dw7IIlmnUSZqhVgu5DGdr48oXX4UuHO X-Gm-Gg: AZuq6aJ07SFR0w5uYMvIheqo6Guj35+W0Kq4Z8aEGeHXaEsSbw8qs1ViXjr/RPc3kS+ ojBEHhYCnDVSKJQQofi1TCccOGRp5pxjLRCmO4/rfDq8CXbzsi5SAXK5SSx8F5vdg7m/QGPVGRg M0HzWKdtdiROXuFoAhyXkqTxpXeYP+S3eNTI2J5lBH/SQmlMFxCk/id4oIBcb0eyllcQzUep4WU NBKVDGyQrATRFLuQXwQUZn0a78FBaJjgEqNzKS9jVN2mE7sx4IdAWrQg5i89C+TwMPXi+W+KSGt VcZNdplsa2/5RbTDQu2dk9z+9zwIZlooo4nHhcPqgZq5OPw4PzGeuy+OQGz+DoxOtlePqzJG3jY k5rvMnnDpxQWflHkKBArySdcJ4ez/7RsmLCezEaO/8CfSlzhTauL/V34QXmE7cQw2SBAivi4AHG pS9XQHJEyeEl9AYUaOkM9uodR/a9NcS+lyypvF+J4aRwQQ4+btFJYicimOdmnR9HHLeuoQ X-Received: by 2002:ac2:5687:0:b0:59f:7ccd:fe96 with SMTP id 2adb3069b0e04-59f7cce0005mr50852e87.28.1771245516024; Mon, 16 Feb 2026 04:38:36 -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-59e5f5b0577sm3175920e87.71.2026.02.16.04.38.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 04:38:35 -0800 (PST) From: Marcus Folkesson Date: Mon, 16 Feb 2026 13:38:15 +0100 Subject: [PATCH v6 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: <20260216-i2c-mux-v6-3-9be28ecfd7e3@gmail.com> References: <20260216-i2c-mux-v6-0-9be28ecfd7e3@gmail.com> In-Reply-To: <20260216-i2c-mux-v6-0-9be28ecfd7e3@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=2849; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=NgWDqx3izSY9aW9W75gFytkLHJndTcTMdemaHAZbfa4=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpkw/NXf7RWEjJ/IHuBDaOR5YxveNI6Lowg3H3U elFFoc1vxCJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZMPzQAKCRCIgE5vWV1S MrLgEACZHJ0+g5pduSJlFU/RbYUHW2lmuku+IK338ZI1j2QH7T1l+cotOX7Ww5+L/OeSUDrwUy6 CE8TXG9ijuh9gBJ8N3b7PYGVFEe2PwqQQsgW1RJpLPxwYm6MseTIm2fIRwPUan44PWCwUVV+AyL VGnahHqu3Qn8mSTbYdD114xuMzR6XWsZ5hThlJyDijmMCj4aSxtBDWVJgxKHFwl8E0rnfa07wCT gYKd/2/18wr61E3xHJXFrhTnSuzIPu8uKRcDVi5hiBfI2LOKnpzluSWqLc8s5nCbPrYyhYne1yO Vpv02/spQssfx9PV9Jm7EiFTFg7AxaBHnVoGrGQrLyMkKUUsFNRVd3YqOLSPwKRQ576hGEs6HrN n9nQpZUt0SFzlLXEdijzT86rjkKt+tytvnQDRtTiqJ/i1t9YY18jJ7TohSAyAw36vbkat46P9f1 DEmknjjVwcp/4dbnEtsflYF/SH63toL6P6ZI4ys4FwS57a8ei40VtZFStSko5K2j3K9TuV/z5ZX ljs2xYiu5/lz1UosoxgYj+xvbWkdULcj7DOqZKcOSMjPfhKbA3af9Hz3NHBnGiWZ/2zi8DCX/n1 uP7xRprEudez2VV4YK+S+1BOwPFpzcCFlQpU/9YK++8/JXDX2QoEq8DVS3oWSTGHlR1Bco0RX/C kgnMaMsoNUiJ67Q== 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..761de5a814df 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 (dev->bus_freq_hz > 100000) 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 Thu Mar 19 02:06:36 2026 Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) (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 4861C25332E for ; Mon, 16 Feb 2026 12:38:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245520; cv=none; b=uw8sdh8S0ag1Lqbs8ohjY1WebO3E0Mch7HSiAN/hA2K8QubfiE7CbyVFSNdz36DvFkqdLEUomSieVr1cjlPsF4/+hvniLCsFSkCg0g9OaRbZ8c4hUT9uwNIlLk66gPlPmCYNnTGzQC4bK/Ifr33D6yZo4nVHS8xbarrYBUwegvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245520; c=relaxed/simple; bh=FZLb5XRyW3qJmkpIPIeOUrGpSdB/lOwxjtGV8G6aT1w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WfGjjSCvcYIbCg5wnY078YOwz/iKTUpHB6idBoy0gZWKwVw4qWMr8HA2arMCt9pE9HSs1JDvr3NrU0mvFG7PHmCi5s2q1WrYP6/8ip3ZVlaDhILdoSK797z3SFswvHYo+MamH35rAvAWTIibYt7ReldLp0UHWc/OpNrT6GAq++Q= 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=QtevYd0C; arc=none smtp.client-ip=209.85.167.54 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="QtevYd0C" Received: by mail-lf1-f54.google.com with SMTP id 2adb3069b0e04-59e4a04f059so3676180e87.2 for ; Mon, 16 Feb 2026 04:38:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771245517; x=1771850317; 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=cGd9MnZZeJn6tPn8V3/jY050merklc3RKXS0iFKCy0A=; b=QtevYd0CGwECo2ucYFbvZz2H1HatKDGqQKFnxHhUFh+gveCLeB6sg229E+7mjYnFII HofqzFs4ITPtdQkTaieFHuzIe+eVrRv71mBgqvpyq2190Y5q3lzEpWP9i8b13aMpY+jT 7GDUlX/WHPLmfwHuKtytx2KtHsz0aV9ndq3H7ALt9ANYhMLhQpcrwCJGsYippmbl1w4y 9OLz78Y6i0bO4P/ke4Fqda38vJXtzqa5X/wWmXM75IgmeoXYvpZSPF3cRsOCVkIQX1Ph efiM1Y5nqpoxqXXWl8K188E/CDZKmqzNDMCU3lLty/6MnSLjm9gm5Llg6FbgNOlIS6F9 uxoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771245517; x=1771850317; 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=cGd9MnZZeJn6tPn8V3/jY050merklc3RKXS0iFKCy0A=; b=rVjSfk4MJJx8kcoSHEpckWgYzBDqgDIFG/6nw2hGSfAJ6oGYWYXY03+QtFPGCo0gtT tpiAKRnVld/6K9QRzZCj+HfkKtysMEna2IY09toVUrn9VoIH225ukh61JXQxJaQJy9ry gI/Y4Z7LgcQDV1vMHu1W/LGC0x6HaXfVgo1h4GhCt7jzT3cN56if7sI5b5fbD1ck7xIt pefBGpsR/TH8AKyr5+jV/IJGxGqeK0e2GYWG5+Ydgx5FkWZ7GHnH5kSp0XB816p7lrmt sAdyABDlsSU4CkxdYN6zoCImI55ds5lwHe5JUlV1uP2den+zSA8C4FibIBwfn+LczYJ6 ki2A== X-Forwarded-Encrypted: i=1; AJvYcCXQ5M/VN5vN6jDsQGU3FcqQDtNFi5gpdPyKO9ZoibHidN3FomTkJEjafPyinLVvNuYVz3uEwj+MNru2Ir0=@vger.kernel.org X-Gm-Message-State: AOJu0YwgYQ3OaB1NA7H1WDosCf6EGXpVHvxc1fWX5TMKLsSzaLoDtx7d ikRYMRmo48X3lcRIWFO/ES94NQB64BZXDuiBKKcpD5BJp27nplr9nZxd X-Gm-Gg: AZuq6aLV64FbxrdQscAJSte2aYv5zt2wbccKnFzM/vKni6oY+OcXTomo0OHmVQM79p4 Aq2pXhqe0uA9TRsWkkB2DUFjG7jICp7HCcIRHfLa6qBi4OWf5u0P55P7BNH8uNwxhAznK9pR4LT LZsJAfymNUXzT475L1ahqJ/SWd7i92jMIJdBqbrPkzSqBMG9aTfJYh3O6hhR0JZzF03K2arTZnr 9FzfXZnJMbqa3SanpnNhjp/pabGhb0xdO4rsLxvl+XFruKA5PelS4Tfuw3HFJJZvE6qpawASK2H l9hd9dzRn1DoTmVvTcz85ayJchulY8CIcIanfsWZu/PbiHYF+3vyQOlYpen63f4j5aM1ddkS+hy QKNSkuOBK+3A9S44+PxWggbCBpCLnfhu6AebXj1NSQrKhxp85k9xTT2K85imLlM8rTqEASriOyU eidSAeobh083iFP3xb2721YIlLmhcuPdDaYi00mGy5CQyU9olISdNM4RvlSy8AOQ7VOW48 X-Received: by 2002:a05:6512:ac9:b0:59e:49f3:657e with SMTP id 2adb3069b0e04-59f6d3590aamr1998626e87.21.1771245517227; Mon, 16 Feb 2026 04:38:37 -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-59e5f5b0577sm3175920e87.71.2026.02.16.04.38.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 04:38:36 -0800 (PST) From: Marcus Folkesson Date: Mon, 16 Feb 2026 13:38:16 +0100 Subject: [PATCH v6 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: <20260216-i2c-mux-v6-4-9be28ecfd7e3@gmail.com> References: <20260216-i2c-mux-v6-0-9be28ecfd7e3@gmail.com> In-Reply-To: <20260216-i2c-mux-v6-0-9be28ecfd7e3@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=4136; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=FZLb5XRyW3qJmkpIPIeOUrGpSdB/lOwxjtGV8G6aT1w=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpkw/SjhxPbOdl6PzzFXxkG7V00Yfw6LrO32v8G AJ5G3J/oZaJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZMP0gAKCRCIgE5vWV1S MuWAD/sEgcqRDjfv4dBtPGn2rMygDHEQ/WhM8LZZY/ZsUdTu9IEazfaetDhsq19yVFasDasuKDN DsYRv1P0iG0tx5+MlZkmLfN/5UETYd/30vekBJhObSat5hw6ipvIhKzQG9pPCIJ+T5K5yhRhITn KU1Bt0hFa+0TF4vhsVUfP0pgEEsdTUDu/b7b0LZIv5hCUbk1pv56Y0uM65puMV8FuIh+4MH1Pkl 8q4lVmWLYnbUEevmJTy3eEHw+BTKzwAf6NnpVAZL8MZd8e8+jdZkZbGMUdTfmIsMKb+GQZ/9Y3h rArQXnWUk/5sOPLjlwlMe5hBpv16OmHWtjkJ6e0U3mUBzEHYtlNpZ/T1Mmh8JYVMwIyA4QJAJdM dWrqg9RbU8x+499vybmgDvEaDqG/4O916z0m1G4mXHJ3cus79TG2Mt3Px8821pcBdxEoA/5QRPE dMmaylJHuhoBgEgAOkufNDCMbbFWI/xF/lXnN5QFUlOKsR5c3BI7OZ8F/q9gF0x4uEGRtEnkYjl SmtX+sYiLL/WDiNd+tTD/4Q0W3vbS7c7sGjeAlLk9tv5nR9Cj2kMz8qi3jHLFtQtcy+CRzm3Ij9 R3K6H+G6lIuuHpi/0pBxr13dJSVrUk8cTbSJWAU00Yi0MNC6zTaBMcg8nmqx9yDLb88ehl1xQAZ 7m+FV3jxrMt5h7Q== 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 | 38 ++++++++++++++++++++++++++++++------= -- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index 761de5a814df..ca41e6d6b623 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,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_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 * 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_hz > 100000) + if (bus_freq_hz > 100000) clkl =3D (clk << 1) / 3; else clkl =3D (clk >> 1); @@ -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 Thu Mar 19 02:06:36 2026 Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) (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 90B8429E0F6 for ; Mon, 16 Feb 2026 12:38:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245522; cv=none; b=U5Dm2QcWAUnGMjyXyYGfLO4yetlhbwD8wMJWBPbkQU3Rs0V6CJ++SRU9Om9gBRk8wd0UKj5hnNR214n+q9x8C4I/MMlmWUn4+VtOp4FSWBPV4yQxs+aWmhXd3+/OgV5efADY+WXMnkUiy15nMwkQxUFss3Z+E8WSGvUCR5p+584= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771245522; c=relaxed/simple; bh=srHk2JrYne2Lr9S+OWYkWWOBdPBDjyWH8AYFfVb4WM4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tXdiUuDbonI+wVZlFYq48ZaMsDsFqRxe3nYh5lC3zU6u2dDWwiApLG4fHl6syTgQ4Yzs+WkpJ0UTP/VQZdcyyKFyikrdraTwjZHwkXSLc5ToKkulfxziiNg0FusyEX0PTbNJv3XgpZv9eYx5jGuFJ5/OBXNuPExsBvPOSLmPHRM= 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=YwrLouyb; arc=none smtp.client-ip=209.85.208.181 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="YwrLouyb" Received: by mail-lj1-f181.google.com with SMTP id 38308e7fff4ca-385e7cafef9so26268521fa.0 for ; Mon, 16 Feb 2026 04:38:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771245519; x=1771850319; 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=YwrLouybHT4dfq/CeGyOwir3iuaA47SjjoUOxsLplbqujF2WzIRCKgNQdVzIsqpPXa jQpjb59lhaVFvHj4KYCDwnpzKZzYYW8YLVtxpn29yR8qFJ8fsG0S3sfzeG/xe5OiEXq9 BZoc2UoGjbGDcYPtA9Zp5h5zV+WoDWYwXMxH8A9JBSDOihLmC6EXAPgR6X7lf15gVXKH hmwiwkKvDpWzlJdGZRXKOxMo90OL9TX28Bx7jGpSPw+NpnlZrXjYr+iPV6G9m12v4F8x 6ZLuzL7ur9oFdox+pd9zUJXAe/5WlZ3fx9DBipHZHtW6H+Fzc5jWdYBMvRHt1zmfkNUX YGlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771245519; x=1771850319; 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=td+8w9X5r8/mzgCYwPwBaqhNFMy/RkA/5qAK9PPT4iT2LkPovwL/vsS1zIRytpBuQr T/K/bdpH3nF4aniFXz2h08yJ6I8sy9C+i8hdc4LdCd6LtUL27wXvvlUSk9QO7Zhqifg1 MkyNAJU7lDtXlL5g1TJRPeHkQwfd3Z/PgopTPbBv8EoNuNP0TyBoWzGRAMEeLiukQdym tIWUQkbK68N12CdNkRz9yUlwETAcd03UA2ifp/M7t9nZmristNPg01BA2G4wYajvT8C7 ONDhj9f5v5XVZhgcBeoi4KpdrU1X2orB+LZUQrIjTIMRWfO14Umxd7FxyK7tFDEytUk3 se3Q== X-Forwarded-Encrypted: i=1; AJvYcCWuNMBCbx116PSPGt25kdT/CWxbrbm0KkCH2DELIVMlWH1qF/tlKEvxJ+OpTBgZipbn/yFpKajekI24GBU=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9NPiYsY0Mj5mOlT9YiGnHVFwGD81q94H9111OtEn9A2hQUshK ur5VytNrimcaZTaNGZlljgP/8JFP6n8/xsyfu3if0V+ku0a1JH2Klz2v X-Gm-Gg: AZuq6aI9pm+W7l7He9zOcP8vy7SixTv8gk1yMrWOvqfExOhppmgC3yRKEfubGW5KJxh uEGqigIAtFbxRHIQ1EqZE/ISwQKjJAsD14643rUbo9qfeTDDzfMpR97JkoRGyHyxn0+LoBpJhZ1 Q+SkGD+0iMVGBf+B32aVZoz7IgagyJmYWaERHMnprQ5fKBia0UknGtfkiic/I6jBagJ6Xnuf6XD sBMGpBBoGBGhX1UtcrK0CTJC/RcgIm3LY1dasjQzVRPa4bo1WlKezka8oe57S868DhfN7ZJICe6 /SzfhOmGdu/OXo1/0azWSRq4wWKpVCcbii4EEZ40ca1Q04fh5VR/RjwxeEI8JhvYZPoF5XRi0yq JubIcVp4GI2DOfrHVj3vZOJyXoQdC4dp11CGxQFXT+W3IcqQTsGtSER4ANslEi9E3Af1tpOWqi2 sIsdVU3mBqwbsACcxxUibGO/FADmpH7ezyKkOXPbVotP6Ec76nDUZpAeoZgPx036nHECxb X-Received: by 2002:a05:6512:3349:b0:59e:1663:941 with SMTP id 2adb3069b0e04-59ef97e8962mr4718009e87.3.1771245518393; Mon, 16 Feb 2026 04:38:38 -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-59e5f5b0577sm3175920e87.71.2026.02.16.04.38.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 04:38:37 -0800 (PST) From: Marcus Folkesson Date: Mon, 16 Feb 2026 13:38:17 +0100 Subject: [PATCH v6 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: <20260216-i2c-mux-v6-5-9be28ecfd7e3@gmail.com> References: <20260216-i2c-mux-v6-0-9be28ecfd7e3@gmail.com> In-Reply-To: <20260216-i2c-mux-v6-0-9be28ecfd7e3@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/ZANAwAKAYiATm9ZXVIyAcsmYgBpkw/XbLu7lth7GLLf8U9ly9/S3XxpZEAm8IvRe sDkymr8Km2JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaZMP1wAKCRCIgE5vWV1S MrCeD/kBIgHp5wo4RriNM3Ho5EKUx0YkZ0shf+c7g0bha3DjkzejasJNnO3nGwrZ7CfwD6Kjvbi pZOyi/Raz5n76EulZwQ2NyFUfqAQn+PqznU+B/ROwqxkQUL1sXVhclqYirKwJxQTxVVFM8Hnslw Cc3nYhr7rmnooDTQAAZ1CrVnGCTjfa26jHTbHAMG/BQx+G3G9MoMxy6ND1HNPX5c9MZVXMzfAD3 G3dBar7nZD7Vh2q6gFWCuE3hUnpAWe/KL5ZjORVz+KLu2d/+2LfB+kQdB834cD4XiuWdI9GM+zn t/wMYtFwG3jbfdSOJB/Sgk4D89v31XylUqYxp0dn5sp41C+xt2wKmMgz0m3h36K4QzfkhnSbjaU UiFcZQi6gqJOR2bybnGP6lTnw6ysjHEm9XXxm7/ZN2vOzVXsNvmiWnOiJadCnOLzl6jCwl4w4Ws GF42Frn34dvlZVc5heSdQt5251OPVQSd1BpRqUz/mtmv1996ZoNq6jWW56KWB2dBf1+vRJzWIMi ym2n7LJcqR1Xt1xSwQRKF1c9zHFIxXM12eP0Xc7TiQhmqJHyBZOkQ8Lu6etwB3u799YsKc0pREh h+CZNcON10BgifHyMU3ZJ7aq+ftlqo2Iaw11Co+TFVrPbt/DrCqJB4L1830BI/xRXBWQtABLNLk w8r8L5jBMH6fE8Q== 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