From nobody Sun Feb 8 05:35:41 2026 Received: from mail-lj1-f169.google.com (mail-lj1-f169.google.com [209.85.208.169]) (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 351822D877A for ; Mon, 20 Oct 2025 07:17:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944681; cv=none; b=rPuIED6kSBJsZl+xzI3KhPJs0QXNMy2oE3lWkFyD0g0nBfSN6hECcFbUkRRlUdfV+CTLmMLyiq7sDYVDxWJ+0fHb4IrFDE6pGrmPYlZbA9VA1KwI06h0m80M05FsYzrhG0trG2wqoVEbVLx9FR2f2cEHa/pq6JJFzdHkkw4Zrf8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944681; c=relaxed/simple; bh=5vuOIHtLq7CFaEidcZicx94qxk7qZlaIZNjnBzwUQCQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZIUApufSLJ5x3ZdKM4tlbIjc2idHsU1RHkLgXQ5Gfnt0l7WDa8oZhViz4dTOskunfEqFKAmhs8AnZ2s8qs756qJ+95OVOlYqlzNZrxqRI2SquP0l7Yb2LKeiftB7L6rqmoAxo8QjJiUuZeR7mZXSm+gKNlUnxzoHTa/34oq/tBo= 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=f6NYcsYD; arc=none smtp.client-ip=209.85.208.169 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="f6NYcsYD" Received: by mail-lj1-f169.google.com with SMTP id 38308e7fff4ca-375ff2b3ba4so43826121fa.0 for ; Mon, 20 Oct 2025 00:17:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760944678; x=1761549478; 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=lFWIsHcR+hD5XAKLrrYCj9xMsNWxUYwTXzF4H7urqUQ=; b=f6NYcsYDfqQXcUFXxSKmX5xIqxdRWlHLi/to1+Srkt+Bb1urK1Dq3WssOlDf9yrjwE Cg0Rr7m3e5LydZTXAMOhNVgUaWn+ZP+pq5U433vfg25tOnmtQMutfbJf6qpmVt0Nd2dt q+CRCDyEI+rIVP3ZsmD+9cAkVwq/qVEtBmsSUlwyL5yB2HaWvwVbYY5GcKWokr1HrHDI aqWurkrCuuvrYhsEdaerhoN26SmrkDjaWoBeXbnNG3/m30RoNhfmrqYEso3BUB8u7gCY hPtxZti4HM/S8M+iGOC6nEHUi4uwhnwIC/4kOXp38zsSC86AUBY9MlzElDDGh67x4q2r lDww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760944678; x=1761549478; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=lFWIsHcR+hD5XAKLrrYCj9xMsNWxUYwTXzF4H7urqUQ=; b=NBQhkN9jjvVCkzKNC5Y6EsmqSjVa4mTqCefHU3GCKAmewgUZQ9edgujKJDXD7FMYRJ KgtBGkTwnfP+NaLL//JRtbj61KtolOFjgIf/1z/stUCbJQyDxsO+Rq3JWFmIvK3gGOYl wQVRO0c2oLbQYcY+zqPspBIr294VNJzqSjzOYp8I6WnJ7ShmKpgqjIBH+VXHnuGcIlmt pfJv2e3G+seoGd8KF15j4uNZZ0+Q6AD+c/IoxrE8YvfMzBYv5Ax1L06i0KCbzwu1CNkf ZOKR8K3OBoF11o3gaZ7VuAczo4zPrM4gKJdvrlPX8iE4vewNf9pTaX6KOdZNaSPIxHnS Y+Hw== X-Forwarded-Encrypted: i=1; AJvYcCW58BnyvRHyGbPr3oU9tWN1BLIUcYs9Cb1pm1nYJ4DZ4bq3VLe3OJnpzTbOjS5T8KcCc5k2f+i1hWOAo6s=@vger.kernel.org X-Gm-Message-State: AOJu0YyayyZiUbDA4Nbnnugp48YGlYRPGMebz/qmLm8VSWAezlCmywXb g7KkKRGucEKd+VDfHnFKWc/1Vj9MLRkkwX0B8QmFaAsuySKRHYEwyMkb X-Gm-Gg: ASbGncsiujJufvvKn92fydboDU9OwixrxYCFi6sVguzmor3+gQqLoUcqk+FTWiy4IW9 WefbqtPMieQtyuhkzwhojCvnjB/w4r+LYKooSCYM+GelIEOqD31fDTOF32gAboRuulDU1aSUPkH QFPa6uuugX9AXpbscudMy5gpTOUFNqexzfGnPANaa+c8akyk+AMCs2MEsFdwH5/vpaPG2CrKoPf aYzdnnOpYl3FWKUICRQvfWq6aTTXlOvxy9zApaZ12SkbDmxig9bj3LtT0EX9XzXF00kVBPS5nLN 7FVUsH7YnEMcC2cQtbqvA/shnb7HRD9NuHmCZnPicLyQhRHshDrKwz4cyXTGZlZZBrdJPp4JuC8 JQ9gLaLFtMkP2Vqtp9gjft4O+BVkcRpu2uj4fVKuiCgJ2V6UoEU1sbuC7ZYXkpq8YV3M1QiSir2 DGueLbMJMHmehOA3p8BeeZ39BGzlOzzx/egs8tGVDy99jgwJoEa91J5EY= X-Google-Smtp-Source: AGHT+IHXByz8VitGJjgs3nH3R3vZgX618KuW3LJgEm0Ki4juvIMqSu3YilgibjYpLhrcCwdymQlHCQ== X-Received: by 2002:a2e:9a0c:0:b0:351:786c:e533 with SMTP id 38308e7fff4ca-377978ab86cmr37067571fa.15.1760944677919; Mon, 20 Oct 2025 00:17:57 -0700 (PDT) Received: from [192.168.1.168] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-377a921ae62sm18863341fa.21.2025.10.20.00.17.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Oct 2025 00:17:56 -0700 (PDT) From: Marcus Folkesson Date: Mon, 20 Oct 2025 09:17:24 +0200 Subject: [PATCH v3 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: <20251020-i2c-mux-v3-1-908ac5cf9223@gmail.com> References: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> In-Reply-To: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> To: Wolfram Sang , Peter Rosin , Michael Hennerich , Bartosz Golaszewski , Andi Shyti Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1672; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=5vuOIHtLq7CFaEidcZicx94qxk7qZlaIZNjnBzwUQCQ=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBo9eIJOGymSysyiJWdt2FAXU9oW4MmgLIfe0XX0 4y5pTaPSXaJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaPXiCQAKCRCIgE5vWV1S Mr39D/41YR5hxoU0Mg4dWKd+5pjXIF2UTG5GSN1R+tXLqNmx2OdXPIGIkovXdgmYHUjNa1tBR90 2giVBkbZLDeXNYYQEAUtm5qvpvp/8usQxSjjP+uFPF/Aef5wokgaN7AgzeMxOzJMlHRgyJSrmzc wm7Skn/P2U/Y3s0fhc4oMR0yGN6CCtb28h5HEffgwi+MwgA3n791Rj9diEsokY/SgcgLR9hnk7Y S0/0lnkOvOHPAg4OSGYFTvHPTYilRhk3zn+7Z0oci8JYkOqafe2KPBn7z/+DJBZxLcQEUNENxKY RurpcfSDe4KfwHPWM9KZ3XU2S6gkt2cslYH5n575XjBwSy/MNYAGKNNbq0eg5z7S/ytUNniCisz f+O0QFKJyuWIo7KQMPoIxV6eGDqigYV0jgbcUP3+j4oC22UcCW70PFwFjBJPbPSF0A/UYefzf+z B49NvCs4Aa+xMUfz8w3jC1xOPHwvqKdxEWXzwJQRSO/JMrybif7ugMEqTYcmzigjajTUKgbTwJH Z+FgOE0KSUurN3H/H/6Ugsn6B1IFZAgxzvF/XxoVeeCsXIW0pnYP+xETiiZ+oJExzpC/2K6gc3v 16WDV+P0PNZf9SBYt9hCcR5z9uusyMHsSjJwL8l+0JhkikVO3sS0nm0mvVVtLIxuhFB7ClWb3US eOBtKLUftn5S49g== 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. Signed-off-by: Marcus Folkesson --- include/linux/i2c.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 20fd41b51d5c85ee1665395c07345faafd8e2fca..d147e388dbab27966beb4dfbf86= 9928b429e082c 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 */ + int clock_hz; + 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,17 @@ 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) +{ + int ret =3D -EOPNOTSUPP; + + if (adapter->set_clk_freq) + ret =3D adapter->set_clk_freq(adapter, clock_hz); + + return ret; +} + /** * i2c_mark_adapter_suspended - Report suspended state of the adapter to t= he core * @adap: Adapter to mark as suspended --=20 2.50.1 From nobody Sun Feb 8 05:35:41 2026 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (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 595292DAFB4 for ; Mon, 20 Oct 2025 07:18:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944683; cv=none; b=GvPd32G1fAe0517Slg/lo2Innzo8PrfKCHkUZBcYRFnA3nFhvkhac8NHeuDaMEkww9HfbpPltVMLfQWaBghGaegXD7P+4SI4194Ici+noU8xjS9k7bGm1rqc6iG9s5BQ6LAVbhbixJX+tLNDeUm96WsdJjosj4NLwE83wmXN4CU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944683; c=relaxed/simple; bh=/iS9Z/pm4g1MBRBvX3jA56ZzUhOrp48L5lgjzmLwrLc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mAih+VQ/SKzihf00yF2aTvP5VT8OmGzSU8f9vxCUyLx5S/A4nLd08fFSgVpjgwtsmC1vWh9XtiTlaCbpSXdq6XYjmHAoqqZ89xmfQKIWPzQOm0XNr8eV3xH+mLsELlic9Lz5sPx7ywj8XtlgSKTd1IlbN8RqfxDfWnUewQSvCzs= 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=K+0jwSj/; arc=none smtp.client-ip=209.85.208.172 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="K+0jwSj/" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-371e4858f74so49103811fa.1 for ; Mon, 20 Oct 2025 00:18:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760944679; x=1761549479; 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=7hltXMUlkzirB7nFSN76+e+DFNg+q24PFFqRwJUD70Q=; b=K+0jwSj/CVUieycZdA4gU6R5fipH7rKGnlQtKohzZR08orm23DOdBBR9LYLaVkXpOF oNrSfUV8bjmRATbPh4mUeduR7/00B+CfsnCD35i5n0F4NwOmTDRGEUniybKGpoIEQD1g 4NHkRV7xjBgfMu9Frw//aG6+CkB2t0ojyUGOgVCHubRW02HHcGqGq/sPUCbPTkdF33Q/ of6vXrd508KjovnKVirOAOBXVUmo1Jfk0iJbtPi3KLYRJF80NmbJHRGHP2qnqfqHgEX1 /AcVKNGM+389VJvuG3bT/ohtTU+N64FJ47OlrMsuKX+2/rtA8413w4Bgp7MviEF5jT0Z GSVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760944679; x=1761549479; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7hltXMUlkzirB7nFSN76+e+DFNg+q24PFFqRwJUD70Q=; b=as5qKj5b/K+MTDNxy/7OGrA9NQhl0g5RednG1fCQ2jHyvgnorvgf8CkjYRQS0GSR4q pyBQOR+XNtqJAzwshsNTLxIkZx7LVm/whaMK+5FWBY6nF3EHAfzs92/5tWYgat0X1rjn DFDIwKfp/l4w1+G8KGtEwKTf8ZgIOtQWxlVd0AHWxNTaZvd40fEbdhNcQPA3cRWc2dMm n7dkXtLE6FC/G5nrFMQor3QMNEU5NQm/Bbq1U6fPR1XUozvL+AtBzE5kToYga5Bz4MPd j8gvRPnhKGsRGojChfDjVIgJ60//2VdMf2PlWys2iHBJQE2XlB+vEzNbKqvcGf3VxSYs Qvkw== X-Forwarded-Encrypted: i=1; AJvYcCXc4DLoDAScjrIiGrIBnEks5DHae227lJfxqyx8FwNwrKsweiiQpsTvW6TGq4x4iVEgRmI6/vnx8jznebk=@vger.kernel.org X-Gm-Message-State: AOJu0YxCFlf9OCC8oojZi2MKu0wk14cKvJf8xQijPCj8m/qZ1G8YEE8K u+0+4SrFggknucNvw4K5sb1Tq9fipWzEQzM7oFNS1nAPv6y/VFHj69yu X-Gm-Gg: ASbGncvhb1dGFGj9Go5g6nsJ3/UJ1QeosbwqS9RYb87Bxwn1hcc+VHtPKoxw1sgDlr6 k3xoOlLf+g/1g2CHCikKXxVkiMKckt7BHMaZDUBjSNt3ikBVkBAfxPhrt/fzGxyUcvLaDjZ7adE C89EbjJQn9MT5Pndc6SOAP9/qvhT+zxvux1a8NnqUPnr3wwpByevDnm6A2my2QzHqVj1dAlGRUa BxYaDPHhSjKidqBlqHgYqHFU9bV8kTlE0LIRhqu2TnPW+aR/peW6Anc3YMRBkVVxrB9+0VZD9ix ZEH5h8ZQ9zzS7AIx3tnVBZ2j8Ytl/xP00pkMOkQTlJ/Fd2WbRwdhgnD/heS/G6DGvQstv04NLus eVkEu8FR2tlRKXB9wWRgh1ry8yl5imPLxXFSh1xQz2jz7jYILvV+MYn2qomvmyI6gLXXcycU7HJ n7w5NR+TzbYuLqchIDIgwNSXfz+8iP0hlqvDY2HtYZFnXjOkbUoka+3AU= X-Google-Smtp-Source: AGHT+IFOSjHzTf5ZFSeasdKYfpp5nWUGM93vqKy15Ur2zTONCZTgOd3fOAO7IQLpuPX2GBKwktXROg== X-Received: by 2002:a05:651c:1608:b0:36b:ee68:b022 with SMTP id 38308e7fff4ca-37797732121mr38865791fa.4.1760944679264; Mon, 20 Oct 2025 00:17:59 -0700 (PDT) Received: from [192.168.1.168] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-377a921ae62sm18863341fa.21.2025.10.20.00.17.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Oct 2025 00:17:58 -0700 (PDT) From: Marcus Folkesson Date: Mon, 20 Oct 2025 09:17:25 +0200 Subject: [PATCH v3 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: <20251020-i2c-mux-v3-2-908ac5cf9223@gmail.com> References: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> In-Reply-To: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> To: Wolfram Sang , Peter Rosin , Michael Hennerich , Bartosz Golaszewski , Andi Shyti Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7517; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=/iS9Z/pm4g1MBRBvX3jA56ZzUhOrp48L5lgjzmLwrLc=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBo9eIONuOu9MR9C01xqdAkdsU2YF0UumOJnisww xPainNZtPOJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaPXiDgAKCRCIgE5vWV1S Mn32EACqdMDBYVOF0BCZ8ACrLGJ6qmLQFWSX0rPDx9CeQbzxnNNW2QbkS9HY9O0h8WaZGx3we1i sow6pCp8/1o0vkiwPSga/oaTY/kWsg2jX2RQfDS2LqnpSMIRmPCAV/qOAWUlj6/txmC6q7wolbu FkHECeEkhcQzkiFEQgBzHbZWHAW1OZjdZK0JENwxpWbkoV4MGhT7+PJHOV62KbX3MEiEmkBT3V7 XY1tvk0v25IPEAgG6vRtsRU37j/rE0nZIMlzmWPQzN81JiLIUq+Rc9sVWADtLejAXy56c/y6CDd 00jtKU+zZQNAw9EtooSKKvw0QWkOO+bl/DTIslG4MWzv2nACaMEvZ5zSTomzo2gWF9Is1eJNLIO GDxjxDe+lB3+/dPfJTbcokQPxZr4ycLqZm/VxqGhu9kr4iF/CDDXkY6d8fCR6udsc3Wb6zdK0jt ZlOS35/THU8eeubnx/mrZGcNlROQDnyCcFT6yK7ajdki64Sf/eUWBcXpb15dxkawh7QbQyOaDnG WhikllJThAu2i1QJlOi9J8kH9HfYWOFpTNhogRf0hvzULAuNBEweu8b+UooFRUdeCD7qCXeB0BJ cYkopOvnDpCv1UQrc77xxXVnh1ruZMXJUY3uJiET+m+UPyyFOiXrK4tZwFYdySR4e5QjAZEMsQI j7H431bMcOM5Frg== 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 | 116 ++++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 104 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index 4d8690981a55dc0e1b35454971923791e6ed9f7f..67ba33a13dde42335ba4e289afd= ccb2419b6e4ae 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -36,6 +36,72 @@ struct i2c_mux_priv { u32 chan_id; }; =20 +static int i2c_mux_select_chan(struct i2c_adapter *adap, u32 chan_id) +{ + struct i2c_mux_priv *priv =3D adap->algo_data; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_adapter *parent =3D muxc->parent; + struct i2c_adapter *root; + int ret; + + if (priv->adap.clock_hz && priv->adap.clock_hz !=3D parent->clock_hz) { + root =3D i2c_root_adapter(&adap->dev); + + /* if we are parent-locked and the root adapter is our parent, + * we already have the lock we need. Otherwise take the bus lock for the= root + * adaper before changing bus clock. + */ + if ((root !=3D parent && !muxc->mux_locked) || muxc->mux_locked) + i2c_lock_bus(parent, I2C_LOCK_ROOT_ADAPTER); + + ret =3D i2c_adapter_set_clk_freq(root, priv->adap.clock_hz); + + if ((root !=3D parent && !muxc->mux_locked) || muxc->mux_locked) + i2c_unlock_bus(parent, I2C_LOCK_ROOT_ADAPTER); + + if (ret < 0) { + dev_err(&adap->dev, + "Failed to set clock frequency %dHz on root adapter %s: %d\n", + priv->adap.clock_hz, root->name, ret); + + return ret; + } + } + + return muxc->select(muxc, priv->chan_id); +} + +static void i2c_mux_deselect_chan(struct i2c_adapter *adap, u32 chan_id) +{ + struct i2c_mux_priv *priv =3D adap->algo_data; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_adapter *parent =3D muxc->parent; + struct i2c_adapter *root; + int ret; + + if (parent->clock_hz && parent->clock_hz !=3D priv->adap.clock_hz) { + root =3D i2c_root_adapter(&parent->dev); + + /* if we are parent-locked and the root adapter is our parent, + * we already have the lock we need. Otherwise take the bus lock for the= root + * adaper before changing bus clock. + */ + if ((root !=3D parent && !muxc->mux_locked) || muxc->mux_locked) + i2c_lock_bus(parent, I2C_LOCK_ROOT_ADAPTER); + + ret =3D i2c_adapter_set_clk_freq(root, parent->clock_hz); + + if ((root !=3D parent && !muxc->mux_locked) || muxc->mux_locked) + i2c_unlock_bus(parent, I2C_LOCK_ROOT_ADAPTER); + + if (ret < 0) + return; + } + + if (muxc->deselect) + muxc->deselect(muxc, priv->chan_id); +} + static int __i2c_mux_master_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) { @@ -46,11 +112,11 @@ static int __i2c_mux_master_xfer(struct i2c_adapter *a= dap, =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); 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); =20 return ret; } @@ -65,11 +131,11 @@ static int i2c_mux_master_xfer(struct i2c_adapter *ada= p, =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); 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); =20 return ret; } @@ -86,12 +152,12 @@ static int __i2c_mux_smbus_xfer(struct i2c_adapter *ad= ap, =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); 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); =20 return ret; } @@ -108,12 +174,12 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *ada= p, =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); 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); =20 return ret; } @@ -365,6 +431,32 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc, } } =20 + of_property_read_u32(child, "clock-frequency", &priv->adap.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); + + /* 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; + + /* 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.50.1 From nobody Sun Feb 8 05:35:41 2026 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (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 65B432DCBEB for ; Mon, 20 Oct 2025 07:18:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944685; cv=none; b=bsom3cTuiIGbzw661z3RN9FfmXqg5GWMRMUaGkI9xtsSiCvlSa4MaTv83Rcgx7XTUIM2W33oWRlZXQwqdZgv7nvWH9Y68I2fUNmV6IdMDs342qGwGPJad12nE09zmXNjS+I7q0dqOE4XFvb2Rx7LyqqRwKzUNBbIjkN5xiAulFk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944685; c=relaxed/simple; bh=FTihK6uYT4ixjF50Vw4ynXL5CEP05/iNF9Xq9F5RApY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OVAZ0oNzt0y+fIEQIoTryGx085kKgrdtBZauEoQFe+V/hcRxlSlLRGj508T1v4t080OJMb2oQQlukvEwlCuio4AgAycem5wH46P0z1eyjF0L7ZR2NFFwi1UFlR73ZKbRUsLpCFK9Cjn3mtMgIhM/Ru2ypX1GRIANKcPSJGmnwoA= 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=Q756PmHl; arc=none smtp.client-ip=209.85.208.172 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="Q756PmHl" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-375eff817a3so44075661fa.1 for ; Mon, 20 Oct 2025 00:18:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760944682; x=1761549482; 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=ahXnYEIy0Y1Nce01ca/pyKJBMfwBwWqGfxBJ5FNQLYM=; b=Q756PmHlViTOTuiGlDS8T5xx38YU9eoNwIIT+R/E4NfoyFBqvHkOYG5GW/N/SxNisC toA8xYvm/vUadZ1P0jaVlgigvKkvNaVTHiYKyoY4khE0MERuAe/1SmFnribui7Nlg+CS gAN5Vg7hlMwFWKljHuyG/YfzfzATGEKvFp25cnRxnRGW07ua9WunjZ74qYSFHbP/ekRe IvfIEgpXbeFIksfHYMNjYNxAT62cH9Wa0I5zdTDSAE1SJGtjdONIY5YzzElVdqD64+G9 Dtr4hGIfzG+qLbqGz3Xt6IhtkrSGRc14nfDuwDtbAVGAm7e4v2Xfc/VYPPiyPUuco222 BiSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760944682; x=1761549482; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ahXnYEIy0Y1Nce01ca/pyKJBMfwBwWqGfxBJ5FNQLYM=; b=FimUeqhjsAlo0eJ2jfCGItwfR+MTc2OAg77Tsx4ZE5Wv8R5/V8ijUueztII/VcS4cm sNHa7bb5SAky2X6stI9RcqE9wiUbiVpF4SiVG98ZXGMoianPWxCSE7wmfEyXZXCzhfjE lBhR7Bry1zt5z/yjvWk3S4i6zokvaCqwoHfEjOVacX9blCqHTJe5MIioc2G7GNscAKNf QvO0MtBtpYiVnCGPEhp+06dexomlxaVB4PXNvt+Nxt0lM9DqsBfgwRUTOjLOnf4q/Kfk TLBYS1C1+1lhPAqOB06P4pzP4FPk19AhD6OGyX49bIxbz5EPpV+iM3ihuypxIzZawzNZ Vu4Q== X-Forwarded-Encrypted: i=1; AJvYcCXS5/KOVsodmH41HugcK1mEvwp8KNhgjAUuefZY8PyGJbASNvit6xYYybLa7JNz4CqXIrPrHLr5dPC+4jQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxtWO5ZO/UBKNaC0eulsIvvRwRGjYdVqJD0UqbflWsiHRuh2Dpi LP37siv/lxIYnGLBas5SwWsZoLoxeLm5YOhlS8OjSnekM6GgOeXo9f1W X-Gm-Gg: ASbGnctUJ6EQB4U5UXjNGuiinoWGoNhP2p+LO95vxEr6cuIDsdEDn3xIamO3SuzRPPw Qw607CPdu5GBlvdd5YMtSt8JifwljU0LxF7MH0IGaoWTJ0q7oFG3gvsT3Owg/RMky3A+FRTI+GV 39TnVKtmBfzqyN7htQB09qV1qHHk1itVfotdxx1Esbea21jYnGMCf7crFUIm/qNiiOJQznKCXnI nTCB93H4EUZYZsummfsS3tYU9cY1Slh4HFuRC9EzhRBy8HqbCAKlZLvVAP38TefRNUPYvUbxLlx z89P9JKka5+c3YIqI1q9cbs8T++lYCKQ2Hkd3ywkR2SQjHKuzn4BgAR3w3TVG4pHi6HD5OE3KnR cP7wxP/v/exSyLk1hEDGQ/WtGs0RVIUyQvbSws3c6EWMmN+CN8bERDCASIcnyUbSE4+rOMCi4B0 VARMSBOAqMaalZs/eH7VdsmmrU9LMVf6OGSOGHhuwVf04/ X-Google-Smtp-Source: AGHT+IHc20f5dVJc4cXk+lySAahWKiNgFNk1yyb9uo2f2CQAkVWvE8JLzorsxqq/7Nc7apWUcybs5A== X-Received: by 2002:a2e:bd02:0:b0:376:3a83:4287 with SMTP id 38308e7fff4ca-37797ad9579mr41086221fa.49.1760944681398; Mon, 20 Oct 2025 00:18:01 -0700 (PDT) Received: from [192.168.1.168] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-377a921ae62sm18863341fa.21.2025.10.20.00.17.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Oct 2025 00:18:00 -0700 (PDT) From: Marcus Folkesson Date: Mon, 20 Oct 2025 09:17:26 +0200 Subject: [PATCH v3 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: <20251020-i2c-mux-v3-3-908ac5cf9223@gmail.com> References: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> In-Reply-To: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> To: Wolfram Sang , Peter Rosin , Michael Hennerich , Bartosz Golaszewski , Andi Shyti 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.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2905; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=FTihK6uYT4ixjF50Vw4ynXL5CEP05/iNF9Xq9F5RApY=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBo9eITJgL8eZ4mgTF7Sje1LcSSVkFjVx0hh55ZX UtvDGMzVRaJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaPXiEwAKCRCIgE5vWV1S MqBmD/9zCdk4ai36HV8z4fap4cJ5nFGwa+6KluAzekdnmMs0wj78o9UrLZbVDEJnMFlPu+WDe/X 9XiAy6rx/lR3jqukyWAfHrVdo1a0XnaZf6J7SvWJ6shWdnWpjUiEwOGSsv8X+kTR1Cb1ARvWanQ KvaGaiduD3gMq48ISJ4bHdWx0QCSetCnP2H5n9TLm0dh7hI1CJbq/OcQIUUuR6a+wRl9S3TdLLR xIIr8NlRS/ZxbpkhYqSXTnCyFWwPFaC1p6O1zYZC9ysbwZN28wjRWoSl7kbAkA9d33kaNlA5XvP 30hYgo4s7zQbI/eTbK453pWv0HG0yIZevd3mk56cUypMoNcH/JNaEGW0WIGubADCELJXJnAsmar UaAm6hOL0FQApzNYUNSAy/sYN0jZtnoC6SlkKfZf+odNAw02mIL1Y8Eu+80UsDzUY7fdbPFv6GD x6zWB1uPfQ42kdkknvYXw2crH42kAn9jTAPIiEmMzIltaQ/Gg6sBFxrfyDMikqTshhygltgDJjB xTdqO2ptb0vpNLWTm70c2+BUU8BVkHaKwsvGXd9Em7M2NEDph+iKIhrfQXE88aVXg8GNymcZSug 3RP1LH83VcZMwAXMscQkTYojDmMRABe9Ch3NYXyqzq5M6/sFK39GKfznPjbfVh/00JmAh6cWpjN JHx4QmCeU2r52aA== 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 6a3d4e9e07f45ecc228943e877cde1fd9d72e8cb..82f295619c4d0ef108c57d13c10= 004aa25014cbf 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: */ @@ -761,9 +759,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.50.1 From nobody Sun Feb 8 05:35:41 2026 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (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 ED9262DF6E3 for ; Mon, 20 Oct 2025 07:18:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944688; cv=none; b=ZmzWyuq3xReKObPkgPalMUxzscz6WndWZ0tiA+hYL/TVc9MxtBM04J9JdmOp+URuzhym4NS0A+aL48n7NePKumcxC5mPYRiQ2MZIXynCY0fl3SB+Bg5BHNlgSOc+DIhx+r4c599N3/T/s4jlcJJqTIdCokhjT/jbLrkj4KvlELM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944688; c=relaxed/simple; bh=SEKtq8WlaDinzaqN6sbmXex+0jo1iDkPy6Zh0RvgHvU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JMz6lY/pxnmW7HaUH3926R3na0W7qKk5QbYzEW74dmnxFk3xKOzAmzaAYTSlL24MPUNagUtoA/xwPkrvWG1NuCyCxnb9GCy8mENKXImyS8XSE6v/23EVBxGwIANaeOo3VlUpiafKVKz0QjKOUYIMl9IdZl+AXuYN9dA5Bl9AoPU= 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=CpHHwWsI; arc=none smtp.client-ip=209.85.208.174 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="CpHHwWsI" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-363cb0cd8a1so49667041fa.2 for ; Mon, 20 Oct 2025 00:18:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760944683; x=1761549483; 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=y5g+HyoylNTGFqMAbK4m0O1tDUAH9kttNvpRkli2e+0=; b=CpHHwWsIKUXCT6q5m9I9mxzTyt5s9907yxnIA9xQqj7lG4zyjBatIsMTcwNKZibolx gJlp0EFRw3ho6AIhVWlfFt6MMFmNwwyzR8Y3g7UovgqDG4wCyZe+0XFvpJtGm8VpZUgA j5PBrtmqnSWnoTVLYG19fOuPecfEf2Rih+jRDfCUlynL9GgvbRNI5d4w5H3SHz2Eu+sR 2Vh+092jEv3i8FEK9K0VWTmPuw6gxGQI84Cad3EGxVSSoPlAQNTx+OWaBIO1Sf3UylO/ UHq99K8Bf+eA09Hh54Y1YVT6EMEadhHCPRW8zxHAc1kidbG+umvxfIuI9Q5npRO9cxED 3TpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760944683; x=1761549483; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=y5g+HyoylNTGFqMAbK4m0O1tDUAH9kttNvpRkli2e+0=; b=ElGWY3lj1Zhyz47dZORMi96WdmaKnu2onL39VklqUoDyNpMLOlzCwcK6X05oux++yg OIAs63RVFT47h5fPdTqjl/HDMWt9xCOc0/ybREtzzkvsb1icOoJ92IvtxVsl1+edpRfG XtctdmV994VnD9H9rq/KTmWVP9zqp/sd4f8X79gk6bChaXjW0WHN/z4K0lSmr/Foi/zV ct1cEkR4vZf1mkXrUFbU8TdSjixBbEOl4BcTsD/NirOcg3VzQnkTXouXEGXQveGoNr+W E2PKOyGVsFnKJnIDk1sn780BLMHO/w0I4spW8vj4eC5/iaKdtnNIQNjo9wBJ8/5m7udu KrNg== X-Forwarded-Encrypted: i=1; AJvYcCWtFqZlzrp832CkFzpVYqHpMSgKog0/IHKz4n6xPvDvb/GzIEpeVLfkjmKAmu4ANqQ5ZlPW5xnU/GnC9yY=@vger.kernel.org X-Gm-Message-State: AOJu0YzotqBpXQxOZOa4PmAgnY2YBqmruwDINUj9DnJCHi5Ne4czZUMg N404RB255kamdFe+MNKIDo4avY184MfjL1sv+3SXUKtWwkZ47RG16HZK X-Gm-Gg: ASbGncuWE4F13ZxurAmd1pL4uEWoxdr8mhdLQCv01Vw+Gm7BMLILHE/hAwQ5jGOGaPE 6+ICh6cyP+e+FOUPZ5j6C2JgZFCGs2LaipnZIb0ngMXdGLuZMFQxJJeR4jW71u81c/XZ0woOUKy BNDmtaA7Myoe7EiTmO1FGhW4E12lJIN4vtH0GftHljo9yFzI7kVFjV8A7hb5F/Yh0x7DnCJ4ish 5ocbt7eTuAuqZshY8PtajXgYlTR2lBvBQUDtrl6xWrQsyPdRcEsiTOJ1MHKBNM1I8tG2RqkOPQH Fn1koOCUJMXPGNXyEx2ojbmFR1a+5Lm0fE+t6U5Myq8gejGHXOfPnFk2FVbHFMzibS/CLOoyVNh jzMiOCQmTLWyKleS0VcOqjejdsiHlVuv9Y+BgM1rVqliT8bhN5soF6/e00F3uwr2qolw9SPTcaX q5rNBAiyYrfyaMEzyFTmM5ojeS57arRp4+7tB27j03fyxk X-Google-Smtp-Source: AGHT+IGp1YoHROdSXnH/uYRYyc4xRRnoYn8XBIGIRo9FTNvDdUeBD58r78uBHGeJccaDt+7VPakDHA== X-Received: by 2002:a2e:a9a1:0:b0:364:e586:963d with SMTP id 38308e7fff4ca-3779779ed24mr36793911fa.19.1760944682677; Mon, 20 Oct 2025 00:18:02 -0700 (PDT) Received: from [192.168.1.168] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-377a921ae62sm18863341fa.21.2025.10.20.00.18.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Oct 2025 00:18:01 -0700 (PDT) From: Marcus Folkesson Date: Mon, 20 Oct 2025 09:17:27 +0200 Subject: [PATCH v3 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: <20251020-i2c-mux-v3-4-908ac5cf9223@gmail.com> References: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> In-Reply-To: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> To: Wolfram Sang , Peter Rosin , Michael Hennerich , Bartosz Golaszewski , Andi Shyti 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.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1680; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=SEKtq8WlaDinzaqN6sbmXex+0jo1iDkPy6Zh0RvgHvU=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBo9eIZ1Jf69x3LAuim1DypUebtkcRfpVSMEi+DS CMACgQmyliJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaPXiGQAKCRCIgE5vWV1S MoKdD/968DvG23fzIcVGZGpsOk49d/VnVy7WOHLZ1aymMwSR226Np+PcY3TW95V8f0lrR0BfWfC GZoxRRTcYiVCH8SMN2YnKcJFISC5/aTE4pcOwvrIKGMj0qOf8QFuH3wEHjAHOgtPwKhqb0tu/bd 8FXDShyfUiR8poUbWGZhdw3OhzrjdTApQc++Lydmlb4QiF9eB8p1gu+Hk6LtyOS4AOFr2VeA7tS PcltmLnDsNAZPGxFxqBvScGfXpijOnmShj3NDXSVdR25VbpHy04sYPxLfoJc5eW8MM02ef3aBdi xuQYjPXvVlDXF893/AG1mcEO68CoSBXN6RHcVCNlDEa4YHl6ztpASahiMpyrOqyt5KI2zwUxE8E 1TBi9CG22ppH1Mk2qpXY3hX73i+s3h1JWg9cEUH1Fps5nHROoWIsm9Ot+WiDWKo6T8+KcHJY9df ehIalq+w09UyIrpC+qHd1h673ADHbnSIVdRuQ/B0lh6RX5so1uqWwt6WbMa4CgC+LhacwwChb0N tznonRbF3lm6a2hymMgR0huj6TEWHKoZPt7kfmlAnEOYzMmrUROjZnhqxnHR1LL9K6t4g6gGxPo 8P7LXYkkC8CaVx8ODOLAxAzNXfvvmsNB5z/Er/9icX/OD9YLfxCM3DZn1veaSZkYlt3RE96d9cf R0Tju8jd1zleopg== 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. Acked-by: Bartosz Golaszewski Signed-off-by: Marcus Folkesson --- drivers/i2c/busses/i2c-davinci.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index 82f295619c4d0ef108c57d13c10004aa25014cbf..fdde573eb59d11a7c6a87141863= df1b9b58f64fd 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -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 (dev->bus_freq_hz =3D=3D clock_hz) + return 0; + + dev->bus_freq_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. @@ -810,6 +831,8 @@ 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->clock_hz =3D dev->bus_freq_hz; + 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.50.1 From nobody Sun Feb 8 05:35:41 2026 Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) (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 38AB72DF6FA for ; Mon, 20 Oct 2025 07:18:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944689; cv=none; b=hK9iBUZatAiTKZdYzk/v29BI4p2Ln+fWlX3Gce4CHGT2y7lsYRVWYlOxCWxIqHxr6AWPRM1NYyLYWm41TFeVUEWqUzCan5dRnC0thlr/7asmjTRl/EibJcIKUXRSjDU5lNykv4k9OemAv8RY6z7xcka/Vxawhe4FtOJw8gCAiPA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760944689; c=relaxed/simple; bh=RcFIrKoSgnto39HXDCzkc41AKHrLdxTXBU7nIzeA4ck=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y7e4rswaL88UKrbzZ2EdWZ+r1M3Nbe4ByemiviPizhFKmj0W+71RxKkl1or37GZjBDMJeJixmDH9YfPZdUwhMqA8n97MPnSoNxjT+TrkPRTTvpYpGOu5dYcHBAPcdQMtKXQKdNpU1lMa3eCwUZ06cvR2WPQwQIsfkRPzYa6ZdBo= 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=WqnhWe7x; arc=none smtp.client-ip=209.85.208.179 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="WqnhWe7x" Received: by mail-lj1-f179.google.com with SMTP id 38308e7fff4ca-37612b15a53so45043801fa.1 for ; Mon, 20 Oct 2025 00:18:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760944684; x=1761549484; 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=//TUA5vuRqCmK3LhoKxiqeBc8EfoelaRnhe5iPSMmkU=; b=WqnhWe7xiVmG7MuI2MHLLUfaYfaM5AdzEBAYUXPW8urn0+i52z3iyMqEsYsB8btTSk YaDo5rcD/BiACFZhSEqonVOTi8HJ1SKWXpEihQvXPB9P3IC2IhEgNvE2z2RR2G+FsvVh gaxlolCTLOAr5HfogFO3mN/sVrsd9HyWO54WUuHmjdQNTt/Y7U+inDOX2P9JRO0ZhYCH nV5LHXd6tn9nYHmPyVK1Fju8RlDA8jv6LSg6HwirBN+RyTbrwVGMAoEHSUwb78MK1CBu VsCdY9qqFZ8Oab4v0CFQr+enJ0ahrQl2Sv2NlydYRGAetrONYJnMIWFaoJynBW8lfnrj mg1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760944684; x=1761549484; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=//TUA5vuRqCmK3LhoKxiqeBc8EfoelaRnhe5iPSMmkU=; b=ZXA6mn3EdCbvD1dDEel9FrhHDm0MOun0sMBbA173Ng0tu38tz/vvPvyA2yli1RmMXJ zSr6Q3SpSiIPe/4WsZqncogO4P3J5AzTKDvIudVvfcN+8XQwJa2yvMbF2j3r3JWbatyx IZg0wI5HuruE6DAapvJ812SAtzttLF+n/SNQ7J4AFIBGVnOeoG50PxTe9DUKzm8uyvJM 1Im+oPYBobsi78XZ/mw9ELTR435bh4Lz3as3stZd71D48yMT3akVrA+m+AQx5zNsYOFz /lk+ZKUUz+sWapvftBUOQiyYvVfEINdGqqwyOE591Wc5Zbkde4PAPVQsf/eF0HWlM0Dd VfYg== X-Forwarded-Encrypted: i=1; AJvYcCUEDFU6QKDWTnmB3ZeRN6QYV2YRkU4uwvxuKjhro9Hnc7fSJsMxE7VxrBOPK6aOZDduTU/4OhM6lK8kZfs=@vger.kernel.org X-Gm-Message-State: AOJu0Yxbxwgpz35KfJ4B9xu4rRgdwlkbH/FlN0GVPZ2KfT0M8AkCW8Tz Kp0WmDjmUDpfiLIclz6BfDtX17ze3fTScJjSA2KhgbbelM7Mccyb8Y7uEpIbJH9YCXc= X-Gm-Gg: ASbGncuiadU487jhsEVUL3Wm28HVDFecieRKBhNGsPeLpuqmQtqy96SUPKGX/1bkKLW Z+00JhVVz+IblKokYEwkDT9Ps7FINQE2npmeRvZXKn/nQBVsDlilIk4xF/gLAwSDBvVQeTPUQQE 5oiMo0iuEuR5cNSQQ5eQullPNL1AUlGT2X3QDR6fgPRqphjvplpQTHlTI+Tkr/Rge/bjX8Q1XKy lpp3Yt/3Uh4MdlFN0YKiuCgMkkjER5CTeZNJlraVW8HEyDlT+MmfJGMNrATsEqVzu9vfDTesX0v 4s3Y2N9q5bwOAJEyCQxRbnR+PCDFNKmzwh5uT1HeAC/pvy7ydmZXOn1Rfh24wCrl+yRlBLZ5ck2 XAxL3OlHJXigR7oX3l48Dn/Qrmpmp+sY6Ug/rFE+hHlXWAyK2wtJ/RSBeUsSUV9a2Et1ibULZMc 0iGLwygPCQbzuSt16yCbn44+CMNvzfBK43BdGEYoDhxZ4LbIJW00llIik= X-Google-Smtp-Source: AGHT+IHh2wqGu0ExNrwddXEATOjNKtBcULAJBbJEFjC5sgHg1pbE/2OBk6y9xSUU1xLzPcNt/U/tew== X-Received: by 2002:a05:651c:1595:b0:372:17eb:1191 with SMTP id 38308e7fff4ca-3779793eaedmr35769721fa.18.1760944683996; Mon, 20 Oct 2025 00:18:03 -0700 (PDT) Received: from [192.168.1.168] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-377a921ae62sm18863341fa.21.2025.10.20.00.18.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Oct 2025 00:18:03 -0700 (PDT) From: Marcus Folkesson Date: Mon, 20 Oct 2025 09:17:28 +0200 Subject: [PATCH v3 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: <20251020-i2c-mux-v3-5-908ac5cf9223@gmail.com> References: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> In-Reply-To: <20251020-i2c-mux-v3-0-908ac5cf9223@gmail.com> To: Wolfram Sang , Peter Rosin , Michael Hennerich , Bartosz Golaszewski , Andi Shyti Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8215; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=RcFIrKoSgnto39HXDCzkc41AKHrLdxTXBU7nIzeA4ck=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBo9eIeQlAhgS2qIv+uQnFVrYg/iCLMq0RlKE/4e wSYKwI9FQ2JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaPXiHgAKCRCIgE5vWV1S MldtEADRexPNmR5XRZqMic/rZNCi1v0rUBibNGFESL5UgamBrAak845xal3CxyKG3m3SI5rVXvI DS//zyQyKLg+R8KWvq6LG+z4Vp/tTlhaNmlgDd0hlepqQzWdREmNbyFI+p0ojE8mu55ZO1zzBr2 6/2bt3n17WgXeijZ1cVb7cetWzCo9Ffx3sKinanq2TDwong0mdUHBWjBCS2xZIJl5d1Q3nbYnPb CYCpPI2KRIRPyWpkbOjY+pBUMvnZ0BPgge7LX2TCaz40T+JAcEcDnQP+MW5QmMpW10hd6SX9Tc3 B5j3hpY+TQU09HrtkLNctxszOMW/sEhIst9Oo8WFaA0vMTVvHhyVIkOvvvpmB68y4TPtNzy74PP lElqXlf0pinALTB5BNoaUEKiTn9BfwAUPgLGQn+eySwdGy/EYrXNkffQLUOFi+jljALZvHKrUeR CCG3rp94cCFRNLONejMXKqXRPHpg5uM1lwHYOeY2Jj1ukfB+IhiT2VL+Mj9RWI1JmWg/kyJ6w1G Ygvrvr0Nj/KyMKZ5YeruFfpdjraUviQLJ3t1aVAnhiiJVFnq3uDgrb1A5pizhP0l0S4mHwuT3aN nsO12bVYq7N9qFtKObkYoz0jk62YMGiQGKi5JPu3Cz9bFWfzmWCeHEsuHZmPdRyIWjGS++LuMTR BQIJ+K7E9T7mj+g== 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 | 176 +++++++++++++++++++++++++++++++++= ++++ 1 file changed, 176 insertions(+) diff --git a/Documentation/i2c/i2c-topology.rst b/Documentation/i2c/i2c-top= ology.rst index 48fce0f7491bf1bcd4a851f685b010386c9ce0d2..2c4a1364ce82e353f51608e60d0= 8535f80523fea 100644 --- a/Documentation/i2c/i2c-topology.rst +++ b/Documentation/i2c/i2c-topology.rst @@ -367,6 +367,182 @@ 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 allows 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 therfor 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. + +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 D2 can operate at 400kHz. When D1 is selected, the bus speed of the +root adapter would have to be is set to 400kHz, a speed that D2 may not su= pport. + +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 parallell is still okay as those are locked out duri= ng 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 parallell +---------------------------- + +When multiple muxes are used in parallell all access to other muxes are lo= cked 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 is put into when= 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 predefine= d channel + to D2 as D2 may handle 400kHz. + +Supported controllers +----------------------- + +Not all I2C controllers support setting the bus speed dynamically. +At the time of writint, the following controllers has 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.50.1