From nobody Thu Apr 2 12:07:41 2026 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (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 2C34037B3F1 for ; Tue, 24 Mar 2026 13:54:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360483; cv=none; b=niecz5pHn/pZdHhKVa4cS6RGWYcO0wfK5Abc9P8XDj+bkI3LdGsNukSovEPVbINPvOWjAdyjLa5062QMG2XE/zaIk4JoUQN6SGIsdwesFwqBhZ22fGWGpufdrM1OM26pmcDni/wZNgS80sXDMWdE/P/3JvKwWD39GK+U+AvwZbA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360483; c=relaxed/simple; bh=XZVd7p9mIBaNy+NIKUZiBgjkJyYONlNCoWZWgB7A9Zk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RmGQzizjn1IbzHxDaS83Z3IMmTYJAMKMo/6dotOjxkKisDxk4oWGVEmpgpGouAVq3ZmOfIcG+rKcYL6qJM410E3RQvL72aAQBW0k0Fmap1YaRvO2JVQEF8a96KXyWVytdAJM0lhv+lwtE1t3Zh6TVIX0Zk2+qh+Aq6YgnCqjc60= 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=qlbRaQAf; arc=none smtp.client-ip=209.85.167.50 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="qlbRaQAf" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5a13e1cfa45so4547603e87.2 for ; Tue, 24 Mar 2026 06:54:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774360480; x=1774965280; 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=JdAp6xh8xeBfkhw2oXmLZzz+7TGqiyYSvmIRi8yYlCE=; b=qlbRaQAfd3yZdKfAvSIBHTej0Om9PfcMEdsEWyodiqkxcJPgkOr64OPXFJ45uLyzXK HmbLISv8qj2oGIOsELd7TEqn8+o66IOSBpQ9s3ToIstm29TlSQBT/TJ1aWeYBXW/CdiD PJbQKawXtrSD+pWynqnURmEovpwrvcumzc1Y7tv8l6nphEyhNIIj0V+z4DuvicoyQoZK Ly3XYDEWmaln5fAyNWIuCFikvo6Ex+oDs+0e0UqB5zwGZ3EWIa9GeGyBuVurRCXB5hZx CbYcTFtXq8I1aFnhJK7DDn7a/jpYan9ZsbPAgtF7au6IB1yvjIghOOgrq0CDky+SxjiM W6Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774360480; x=1774965280; 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=JdAp6xh8xeBfkhw2oXmLZzz+7TGqiyYSvmIRi8yYlCE=; b=jsFi7jXHJNYsJ+fwbw28AOy90KOJ8jZRCiPnnjACOj3ZeHPHPWrEAGcXlU7pSXs9Yh zVTwR3SNvqxK//X5WTT0RB5nKuJ64VvGr3lh41y2Sc5NqVgRpwl9sE0noZo58YxP0RIT 8P4wS8UiWXvxdYWQLUSkkZGofsFuTRa9UxjoTNNCxEFlKAb9ZdemdYnqEHSwYVA28Ipj E3Yl9hU7ZHjiuXfXzeMItospNodIXyM0TRU5ur5gSi5aYbMlUJ9Sbe50iOjiFHuYUReI 5IfYmeC53SxFUMM1GmaqtYJDlV7ieD7K297QX8u77EQKkJxuYqD79I8b60X6+I5TbUvt JSXQ== X-Forwarded-Encrypted: i=1; AJvYcCUnF5OB59kvhv5pSbkwIzk2SB0odblJ3sZBmOb/xbz3x3GXCF2aLQGFxK/pQTMZ7SIZon0dA5cd2NsGpw0=@vger.kernel.org X-Gm-Message-State: AOJu0YxaBwcpXMLGJvKXSLpov0KfqimwftPurZdjboONcbfJ25nkbFCj j3NB2Y8Y2p8jhhkptQnhsDQ/qejgFtyHbqG2MVEdiGZjnMeN9vTrr7V3 X-Gm-Gg: ATEYQzy5vPqMSvFW57ypFjdrQHpIs/SOdgszcOipM5QDsTsAN0/2lzS/mXAREooAuTu +ootWnNzEKy0RVzrXT2Niy1Q0QadPSG39hjC2JQq4KOp7YJH96pczBo6O3X9Rwmn6N3sWnNMTUn gxkP7uHOdYlXi1HrUWfXTfgL0TRPoZaLtUAk3BMVHhTzk8OpXAVr346EIjptOByMswrUO1iadBa kD3ezOe9EB48Q52GPwX0gyyOY+7I5TUhGnDElPA6eYMQG5KsZbYe+ndpYTFijqXKXav6n5b/GGq fBHEjDcwDEiEojU/C5MxxxCl2U1YFRudXpY3N7wMcP+sxRN/n5QgkyFeT2GujApy7RtnzDzamTW wigRlCYm5oacLvyvZhN0e1bqeoz2sl1Zs7/tUISduykLy8CnHLHNHg6lAK5wRrCW8qbUip0Daq3 AZSTtlw44kMjLZF80YHRLf4Ga5ZDsn2CtERwhBoyYYHnzV33Qc5hNWLBzWLa/7q3q7BxpF X-Received: by 2002:a05:6512:1150:b0:5a2:7eb8:2f9a with SMTP id 2adb3069b0e04-5a285b60fa4mr5257979e87.21.1774360479973; Tue, 24 Mar 2026 06:54:39 -0700 (PDT) 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-5a285207454sm3162823e87.48.2026.03.24.06.54.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 06:54:39 -0700 (PDT) From: Marcus Folkesson Date: Tue, 24 Mar 2026 14:54:15 +0100 Subject: [PATCH v9 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: <20260324-i2c-mux-v9-1-5292b0608243@gmail.com> References: <20260324-i2c-mux-v9-0-5292b0608243@gmail.com> In-Reply-To: <20260324-i2c-mux-v9-0-5292b0608243@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=2485; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=XZVd7p9mIBaNy+NIKUZiBgjkJyYONlNCoWZWgB7A9Zk=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpwpeNI6OmaQ0d2ac8J3iIBGEysEYB0qwzhghkE 0W3akq+mXyJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCacKXjQAKCRCIgE5vWV1S MtN6EADTibXYTvwLToTRixa2sh4rGUbNLanpKU1sKffHdHOLtUuOEo4bHoRHV4E0tjabv595SmY 1SMoGPf/phfw7YneGwh/MyGjm/bXChh2E226fW1kkqhRa2OEyU/mVQVKzxuHhD8axJJKo30NYJv 79zdaNSTsOHy+Jf7dUytw2FXXwi75TI8dknQ2QCRl5mYIzMpwF6aPerYGnna97pwjvUMngzgTOq Ug8wZvq6eMINF8G1LRrblPT2MwedfA5QVaIIzIlgTwIF63Et/o0g1nBNJIq6YEMQX0kwTL+kwSj IyD4rGtU5yjFjPQK1qhnWtslh+METP8OL0dJkBHCyZFfQOXo+GyIEif4s+xTQmeqwiaFo3i7aK/ RAD0r2qN0zfBbE8AhzftKThJCECn/IrRMdgt1F1gFfKsqOnRLexMvdq56g9bNHEUjWxIr5NaS4J 65pO+YAXVUpcXp80l341Xq0LF85vejFvK2mlDnQpMqsYS7Sz683IVEQDkOrwFGTaOnEKYM1gB+h tfEcw/4Cn9jnke4nbM1av4S2MXAV+fbaPI4+pEPTQNCz0r4yBc12t0G12WoP+fq/WKdTA6yiN3V ExYkKdrb8kyorl6UN/JsBiS04Twgaqh6HsC43OrXnbAzqqzSSs6G3ur8jaBryTt8SvCpf5XCVa4 a8wntfiGesMABpQ== 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 | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 20fd41b51d5c..712f9608108e 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,39 @@ i2c_unlock_bus(struct i2c_adapter *adapter, unsigned i= nt flags) adapter->lock_ops->unlock_bus(adapter, flags); } =20 +static inline int +__i2c_adapter_set_clk_freq(struct i2c_adapter *adapter, u32 clock_hz) +{ + if (adapter->set_clk_freq) + return adapter->set_clk_freq(adapter, clock_hz); + + /* + * If the adapter is a root adapter without .set_clk_freq() implemented, = this feature is not + * supported. + */ + if (!i2c_parent_is_i2c_adapter(adapter)) + return -EOPNOTSUPP; + + /* + * Update the clock_hz for non-root adapters, even if .set_clk_freq() is = not implemented, + * to allow the clock frequency to be propagated to root adapters that do= support it. + */ + adapter->clock_hz =3D clock_hz; + return 0; +} + +static inline int +i2c_adapter_set_clk_freq(struct i2c_adapter *adapter, u32 clock_hz) +{ + int ret; + + i2c_lock_bus(adapter, I2C_LOCK_SEGMENT); + ret =3D __i2c_adapter_set_clk_freq(adapter, clock_hz); + i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT); + + return ret; +} + /** * i2c_mark_adapter_suspended - Report suspended state of the adapter to t= he core * @adap: Adapter to mark as suspended --=20 2.53.0 From nobody Thu Apr 2 12:07:41 2026 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (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 943193FBEA2 for ; Tue, 24 Mar 2026 13:54:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360487; cv=none; b=qk2x2J91rDa7EZRWzdynJDnT1CqAzGINqU/ti5W8XM+pwPfFwgwV+MX++mP+vMjYZSrY8sYrwnylmhim9YuqQUTHdcGzSW7uW9S5PxVgR4FsLj6FL9/Ck1VBwPEOAmHPAhadWuuF+Wz6SWlcf5B/gjShATuRV+CxvMujmV8Zvzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360487; c=relaxed/simple; bh=zzwP/dH6nVUsUc4kUSRaQrWbWPe+IT1e5Ig8MAfNhhE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kXn5CNuT+6z92pab55e9npxyqwYMXx48u2ZmhTZimtn7IzrlfdiOD6waAzuCsxNXq/TfF2rz4ZKBvwCJ5DCWTAp1gF4wJn/zU44Hp06H/alE8duKyyzPZEaS/ih03fpL6rt+m2yDquwIQyaElHldcNHM+GrC0PFa2klbldMkn10= 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=h9OcnoKW; arc=none smtp.client-ip=209.85.167.46 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="h9OcnoKW" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-5a27c021b58so1400912e87.2 for ; Tue, 24 Mar 2026 06:54:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774360484; x=1774965284; 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=AASvAwH/C6MYHGsYw3qf0hanl2I5flhOZHJJpYjf0HE=; b=h9OcnoKW/fiH3G2XGi7sFeyBsdBAFPthiCItWbhrXtrYmglsRlQrjNnJ242/PoJWSk YA8WnjbQuR5daMe/YOEvmkuT5Yd+CEYcoqYk5XihcDFkTmQ10+8/Y3ILPEQMq4B3+HQ/ 0z6PJM8JD4anmWolFjQPTDixChFDsO58CZy7umZhVnyiedHvaPYeZGR9MHtOiX/kYM1d 9oDiLp1OodCPrq2tEE8kAdJeGDPRezjFqbsZxY39ciNd3TSeBOulI8Yhc9cgpuG5qgRU HG5Z8qivW+zf+M539ETNeRVhZjr+Smd7P7z2DVv/AB918eW8LY0xLL3PpAl2hQuJco3k rJGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774360484; x=1774965284; 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=AASvAwH/C6MYHGsYw3qf0hanl2I5flhOZHJJpYjf0HE=; b=YUjFEi99olDUvL7kdxKk/HwsThDw3InxfccbJW1/0c+OsRlQ9FHx1fmqZgcTdj6VmT dXhclqHATe+4LpF35Ln8euh9kiDKEvYSFJ8gEs/I+rPW9Wnivx4nthlQCnhcznuWufPA 9ic312jGkXgzaoh9R3vC5tMJ4lVXCSV2716PRuDzwaZlOKKX1dkMkYQOnbFUYDfN2Ky3 PbImqb/iAaFNZEAOkwiUCEI/HwKxjTEgWpXz9WX3qPAIPqUlr8A+zCyKHOqVVFve4UqI Cc5B3tP/5oOHVwxMJdH9kK0y7SuSajx949LLDgTVtJoUOZnY+MCaoLWEBia/2PfPtCrV Vefg== X-Forwarded-Encrypted: i=1; AJvYcCW6NwRz29TvURA9HK/2rJjvQOyleYqkvqlp5lfsUZ9ySLj9FY2sZZfkadwfZqloiK27j4T5I7Z0hmFMbiU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0e6V91NlIDIp9pUUerenkTxQNHezV+TlY5aAv9vmXkk89fPgZ nf4z6uf0sBv5IdKaNqKj7x97FEkjsqurBe921N3NmkPHpohMxyU3vNRK X-Gm-Gg: ATEYQzz3k+Hl3pdbN+/R/sGlKeaibnHnKksuGqXIMEPOY9M0I+DaIgy/pfDDcnMGLi2 LB4KMrQX1QRXKb0Be6JNNGEv8Rb94vk8Te9AEjJ7vr+dzxlw16YKfw2GSnxr3FvhuZKA6XcTPg3 0Dkja9c6XNCH8UERUrz/QY8D27U3KAY1X7Rsq2ycEjz01DmaCvZifw7d0MbpAku99Xu+7pFQS70 zFRKF73mQJwYUkzShRsFsQnKDe3FUrNDCpS5yP2P18GXCmGnhQvxv/J9WD5kZJL4QEaEA3XDWPc USZBDsiSXAh6xiSRLnFnIuHVbKDYmWCjWFBb1L5f8S8aj0/6Z19FJwEB5yZ0ONIJu3e2DZh5Vli noszA1D3nR5sLrrE921xj/pBI9QXH6N7UlG6TAX6F58pI6ejQXYE0WOJhoowKdAnOYXGH3zhYqu 1e4hLUJLFz7soPHxWh48iDT7oy9gm/f73bnXfnLuY4EudutVU3g7VjFo9ZSNi69mr8YOo7 X-Received: by 2002:a05:6512:10d3:b0:5a1:7458:c17e with SMTP id 2adb3069b0e04-5a285b55dd3mr5528724e87.37.1774360483376; Tue, 24 Mar 2026 06:54:43 -0700 (PDT) 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-5a285207454sm3162823e87.48.2026.03.24.06.54.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 06:54:41 -0700 (PDT) From: Marcus Folkesson Date: Tue, 24 Mar 2026 14:54:16 +0100 Subject: [PATCH v9 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: <20260324-i2c-mux-v9-2-5292b0608243@gmail.com> References: <20260324-i2c-mux-v9-0-5292b0608243@gmail.com> In-Reply-To: <20260324-i2c-mux-v9-0-5292b0608243@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=7627; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=zzwP/dH6nVUsUc4kUSRaQrWbWPe+IT1e5Ig8MAfNhhE=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpwpeS17UHmxhJ8CGOEdifxF/PD0KJwhBW/q8sM 6oYa9EFnq2JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCacKXkgAKCRCIgE5vWV1S Mq4kD/wOYxLZGglFGcP1qoL6GdhHXQO/bjAa/srPJEh7UjC7KC/0tc0ayxEKJfdrGAgrSXGcP8C hA4gclNC7vYdcQu2W280HT+hQjL7KRrJ16cPdK6zqO1IEAksvJyiLaYh3VDux74cUyMRUcHTAIp X+nhE/eJLLtQU45xEx/FB4GaxBO1ociPSjkMPRJjsgflDRQNL4UgB+1xKQyS533qnsr18hrfnMz R08DRT1IyxAzQzZu6Z9prSkmYJhQSKLKw8+zGV3hGaSBfdpkwGWGwbIJnzTJ1I2eO2/cf/iGD7k QBVg/3/Fx9w7mVBnmOQe0MqTzL/wkxwrq5+3l1gKHrqfHuQ4llJHKFopPpQV6oRQB5F0ylxe2Sp OD0KISytWmYJhMHCTSldawhC9eeEYopuEplmQEXExGtnjcQcYt6GWkx3rPYBEb09xLoNW+Q4sIo iWPMZiprIlkJTijf/JQ85Z9Kq6oQv+H0vqdmbHTZEXO5f35rQN8qwORuziDKvvPsX5197F9qI1F Wr20d9i8SejoK0uT7ewowtxPGuTX+O+4a2StViFktLGrpAWLc0Sz1bLu54P32cztNLh4HQtVqv+ 5e0Y/fBmUpqzxFOt6PwfGFh8p+1+swNWcWxLomOcdTE8BELjSjEHkTgefMFwp3vSF4JVUymba2l +dkAzDbOX/npvjQ== 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 usable 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. putting 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 inherits their parent bus speed. The following example uses dt bindings to illustrate the topology above: i2c { clock-frequency =3D <400000>; i2c-mux { i2c@0 { clock-frequency =3D <100000>; D1 { ... }; }; i2c@1 { D2 { ... }; }; }; D3 { ... } }; Signed-off-by: Marcus Folkesson --- drivers/i2c/i2c-mux.c | 107 ++++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 95 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index d59644e50f14..6b5c9ae1efde 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -36,21 +36,75 @@ struct i2c_mux_priv { u32 chan_id; }; =20 +static int i2c_mux_select_chan(struct i2c_adapter *adap, u32 chan_id, u32 = *oldclock) +{ + struct i2c_mux_priv *priv =3D adap->algo_data; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_adapter *parent =3D muxc->parent; + int ret; + + if (priv->adap.clock_hz && priv->adap.clock_hz < parent->clock_hz) { + *oldclock =3D parent->clock_hz; + + if (muxc->mux_locked) + ret =3D i2c_adapter_set_clk_freq(parent, priv->adap.clock_hz); + else + ret =3D __i2c_adapter_set_clk_freq(parent, priv->adap.clock_hz); + + dev_dbg(&adap->dev, "Set clock frequency %uHz on %s\n", + priv->adap.clock_hz, parent->name); + + if (ret) + dev_err(&adap->dev, + "Failed to set clock frequency %uHz on adapter %s: %d\n", + *oldclock, parent->name, ret); + } + + return muxc->select(muxc, priv->chan_id); +} + +static void i2c_mux_deselect_chan(struct i2c_adapter *adap, u32 chan_id, u= 32 oldclock) +{ + struct i2c_mux_priv *priv =3D adap->algo_data; + struct i2c_mux_core *muxc =3D priv->muxc; + struct i2c_adapter *parent =3D muxc->parent; + int ret; + + if (muxc->deselect) + muxc->deselect(muxc, priv->chan_id); + + if (oldclock && oldclock !=3D priv->adap.clock_hz) { + if (muxc->mux_locked) + ret =3D i2c_adapter_set_clk_freq(parent, oldclock); + else + ret =3D __i2c_adapter_set_clk_freq(parent, oldclock); + + dev_dbg(&adap->dev, "Restored clock frequency %uHz on %s\n", + oldclock, parent->name); + + if (ret) + dev_err(&adap->dev, + "Failed to set clock frequency %uHz on adapter %s: %d\n", + oldclock, parent->name, ret); + } +} + static int __i2c_mux_master_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) { struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Switch to the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D __i2c_transfer(parent, msgs, num); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -61,15 +115,16 @@ static int i2c_mux_master_xfer(struct i2c_adapter *ada= p, struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Switch to the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D i2c_transfer(parent, msgs, num); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -82,16 +137,17 @@ static int __i2c_mux_smbus_xfer(struct i2c_adapter *ad= ap, struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Select the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D __i2c_smbus_xfer(parent, addr, flags, read_write, command, size, data); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -104,16 +160,17 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *ada= p, struct i2c_mux_priv *priv =3D adap->algo_data; struct i2c_mux_core *muxc =3D priv->muxc; struct i2c_adapter *parent =3D muxc->parent; + u32 oldclock =3D 0; int ret; =20 /* Select the right mux port and perform the transfer. */ =20 - ret =3D muxc->select(muxc, priv->chan_id); + ret =3D i2c_mux_select_chan(adap, priv->chan_id, &oldclock); if (ret >=3D 0) ret =3D i2c_smbus_xfer(parent, addr, flags, read_write, command, size, data); - if (muxc->deselect) - muxc->deselect(muxc, priv->chan_id); + + i2c_mux_deselect_chan(adap, priv->chan_id, oldclock); =20 return ret; } @@ -362,6 +419,32 @@ int i2c_mux_add_adapter(struct i2c_mux_core *muxc, } } =20 + of_property_read_u32(child, "clock-frequency", &priv->adap.clock_hz); + + /* If the mux adapter has no clock-frequency property, inherit from pare= nt */ + if (!priv->adap.clock_hz) + priv->adap.clock_hz =3D parent->clock_hz; + + /* + * Warn if the mux adapter is not parent-locked as + * this may cause issues for some hardware topologies. + */ + if ((priv->adap.clock_hz < parent->clock_hz) && muxc->mux_locked) + dev_warn(muxc->dev, + "channel %u is slower than parent on a non parent-locked mux\n", + chan_id); + + /* We don't support mux adapters faster than their parent */ + if (priv->adap.clock_hz > parent->clock_hz) { + dev_err(muxc->dev, + "channel (%u) is faster (%u) than parent (%u)\n", + chan_id, priv->adap.clock_hz, parent->clock_hz); + + of_node_put(mux_node); + ret =3D -EINVAL; + goto err_free_priv; + } + priv->adap.dev.of_node =3D child; of_node_put(mux_node); } --=20 2.53.0 From nobody Thu Apr 2 12:07:41 2026 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (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 C04163FE658 for ; Tue, 24 Mar 2026 13:54:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360491; cv=none; b=XRaHCTqWxTPIdkSKiSUyPdyV1tcOxnnED29NjGbRZ9Q+44v0892c5FEDK3ohUZvTHhR9PAt2nsoHxznWnN5CCKGR3Ny+Yr5Zkb3nZTOCVMGiU20V6EHvXLvdMg7N1axxiZEzv5ghoEvSO/rTOk72UuKTvqEYp/wYO19o2bQ9X6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360491; c=relaxed/simple; bh=vsSIa0c3XvGrZdSaP0ssvqDlYgrE1wL3DrKCmY5NXO8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZDGvOZUiE9lp1Haa6hsE+pKnDZFh08+g6KBzQAvyyMjW1PNkT0DhY1XlLrRoG5fOdZ8D8RgyZAEpHJBc9/YpVpxS5v5Rr1PoO8pwJUXcN/RcwEbJM7Ya84wS6cmnXA3B9n7VphSgIB9BNy82kpPE5Rhjt4mHPIeWRluk1KjjueI= 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=qEYr0Kz4; arc=none smtp.client-ip=209.85.167.50 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="qEYr0Kz4" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5a299cba953so510584e87.2 for ; Tue, 24 Mar 2026 06:54:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774360487; x=1774965287; 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=O5AwS+cqy4cAKKPRWlRgkDDFxDwgSl6qxYrDkjeel6k=; b=qEYr0Kz45Jt6+EmVunKic3gvgcM0gnjO0UzeVRDg/IZEYYMoo81TS90uJ/b5UqHCFN ZU1+rvvJSQKrcn+R+a0jYkB5NRo/N7ALlb3DPEmYLSxHDyrB6QsBVR34vK9qMufbN/hm TtBTWSwrybiBs9MN/aolXjpbj+sfv8loveeMTbL77vtbq3tyf8GRYBb/OoJMSiGYvmHG FMfnf/G8pDZinDSqCTxyDHETQ+jX02h/69MWHl+ACSeHr4VRzwL20ovFGajkQvvSmqU2 mTGlln4Sg0PLMDUHkl3YTNLjZ4eVAsYAcxubCDEARUwSMeXohrWQf7ousuJCrU+E4AlM CeBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774360487; x=1774965287; 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=O5AwS+cqy4cAKKPRWlRgkDDFxDwgSl6qxYrDkjeel6k=; b=m+G122S3b5PSt0WRgCx51b+aMK/xvK1KwejoQ+lE+AiXtsRZ53iuleiGyA69Ug7rVu ZOg/ubo+5SbtRSnEJBouccIhnra/8V6v7O6HDJr2sj0BXwrHzRWPd/2p2PZ/U88f/Hs9 p/5egOwuS5Koc0COo73xBh8MYq/xYa5Rih3eLz3i3ryFLG6KNXenY7rJT+XtzbmmXzlz zUX9A48kXu7NM0oNp8XUiclwaJIhx0NX9+a/vAi9+WQi/oTe6shVgeh5tIqLrK38saVA gvvrWXhgA8wg6GHFtYOpMw+DvRCTPR6OJbCX6I77kR5joMgdYKKCIUJocUwHwvA4tPzF LHug== X-Forwarded-Encrypted: i=1; AJvYcCXxjT01nwAIIhfw7jeviQvPg5+DC43IvMeROeVIf67eiHCPNdrLm40qVN0mRytdCv86DfrwHTgOGQeQvqc=@vger.kernel.org X-Gm-Message-State: AOJu0Yzh6fhz37eFZJlT/M0IqAjRH0loNVRQRbNjEpmp88gyodzAfsw+ B8HuYiC8+xM9Zbgd1kXuekUVCfe+OAOujIUi7Qr3+s+WMenxOWt1AtnN X-Gm-Gg: ATEYQzyYNHZEs2rIDK6ZXOAyEI+f09knxsJxdMVpbsgkBUZ+sZ0lpPVKNv3uI+ZEPzK PFxEEJuKAINdMfZnkWzmcTok9+EkO+caejUhJu+Yjzcbm/nQ2qlzWdlrGVWt1RnQY4vsSDfzt1H hlABvEEmcgZ8/TgOPPsnG3xqFeiEP332eD9+LKZbnuDYG8K3JaEgAFklgWdP+t4vyEHXuHVQ2nw CiUlhsT/zdSKCxscwaDLOkkvwae0PjAy4k2A1BAhKfsZHuFOp78iBDzsNv0sHISVyQrThrRQy8W 5U5AVtDpfLH2btzCfJNw1RdDf0S7FuyAN6NgDZGm8fgdkWusy1C0E9mR05OIeaUD7zUCE+AumCS MU9soIoZfWorOulQUdK8VTOqMcfUagfDqVkG2CLeRF3KVTNZ6HajWmJwVm97GKeoO189UlM0+4V tlY13BjVA8akkBEfPMtF5T/Dvm3xj06VII7wAXrRjzZeWc6FDX8o11WB/yKM7M6EU6yfoBZ2M+p Fc/p2U= X-Received: by 2002:ac2:46e8:0:b0:5a2:86bf:39aa with SMTP id 2adb3069b0e04-5a286bf39admr3361995e87.2.1774360486576; Tue, 24 Mar 2026 06:54:46 -0700 (PDT) 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-5a285207454sm3162823e87.48.2026.03.24.06.54.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 06:54:44 -0700 (PDT) From: Marcus Folkesson Date: Tue, 24 Mar 2026 14:54:17 +0100 Subject: [PATCH v9 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: <20260324-i2c-mux-v9-3-5292b0608243@gmail.com> References: <20260324-i2c-mux-v9-0-5292b0608243@gmail.com> In-Reply-To: <20260324-i2c-mux-v9-0-5292b0608243@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=3233; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=vsSIa0c3XvGrZdSaP0ssvqDlYgrE1wL3DrKCmY5NXO8=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpwpeXnuFJFWzexXqw09JiHF2NlDfub0tdgNkAy JmNB8DycneJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCacKXlwAKCRCIgE5vWV1S MozOEACOJ2bpbAAilgam5B/hfpEicuTdw7nYs4wdBsggK24iT7bbb1s1mO1+BGuTP51q6MKlptY SpQQzE26PEk5T9v/sEa1on45fHW3qPqwi8leQ30vBk4+lJlfWXJCXuZ7lwvx3/5dC1jNXM+psTr Ii/NhpwlYN20GV3NWfLDKRi0f7Yn66t1kcPmLiQ/fpVqlN118+xXwBkdVzqYKdPMbkrBuzXqh8V MAx5HBdeqGVR9y/gMmWKclBLWBZ0fT4D9mHGI8a2NcMzJDgvBUN9Da100swKoWerXTXC4E1BXwA 3GbOt3pVW9Gg/JhhF2aSlOz2kW4Oz2T6TQsRk5UfDmAHIrNkeEdwLfv9EHHkCfFXuPbMAsjRgim FAn3jDtVCbZHB/n4iiPCChGPo7QkqXdAfk2MlQC6OSKGNtvfLOG3IV5MOKmzevxYcFgqBgpKBiR e4S+JVQ9sofJTt4b0jFxpraujpKmAnUoe9JTtqNEo9fMWAxZZywZtp224UzpWWZv0It9rNfsgGv MLoafcSTorixc3gva745S5KlCMoWgA7y2kXehEdwBhpNk9x53P9clEVLXBbOy8Vo7aVlPEPDTbY zCNMSk7iOwhcmJV1SYdwM84btVVf1bBPdbMENP/+2dUOn69Zt4MjL4Xl7o9pmyrjRWYYlJpilQq /Nj5lSnT6J0B6Pg== 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 | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index a773ba082321..549fb22cdf4f 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -117,8 +117,6 @@ /* timeout for pm runtime autosuspend */ #define DAVINCI_I2C_PM_TIMEOUT 1000 /* ms */ =20 -#define DAVINCI_I2C_DEFAULT_BUS_FREQ 100 - struct davinci_i2c_dev { struct device *dev; void __iomem *base; @@ -134,8 +132,8 @@ struct davinci_i2c_dev { #ifdef CONFIG_CPU_FREQ struct notifier_block freq_transition; #endif - /* standard bus frequency (kHz) */ - unsigned int bus_freq; + /* standard bus frequency */ + unsigned int bus_freq_hz; /* Chip has a ICPFUNC register */ bool has_pfunc; }; @@ -209,16 +207,16 @@ static void i2c_davinci_calc_clk_dividers(struct davi= nci_i2c_dev *dev) if (device_is_compatible(dev->dev, "ti,keystone-i2c")) d =3D 6; =20 - clk =3D ((input_clock / (psc + 1)) / (dev->bus_freq * 1000)); + clk =3D (input_clock / (psc + 1)) / (dev->bus_freq_hz); /* Avoid driving the bus too fast because of rounding errors above */ - if (input_clock / (psc + 1) / clk > dev->bus_freq * 1000) + if (input_clock / (psc + 1) / clk > dev->bus_freq_hz) clk++; /* * According to I2C-BUS Spec 2.1, in FAST-MODE LOW period should be at * least 1.3uS, which is not the case with 50% duty cycle. Driving HIGH * to LOW ratio as 1 to 2 is more safe. */ - if (dev->bus_freq > 100) + if (bus_freq_hz > I2C_MAX_STANDARD_MODE_FREQ) clkl =3D (clk << 1) / 3; else clkl =3D (clk >> 1); @@ -242,7 +240,7 @@ static void i2c_davinci_calc_clk_dividers(struct davinc= i_i2c_dev *dev) davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); =20 - dev_dbg(dev->dev, "input_clock =3D %d, CLK =3D %d\n", input_clock, clk); + dev_dbg(dev->dev, "input_clock =3D %u, CLK =3D %u\n", input_clock, clk); } =20 /* @@ -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.53.0 From nobody Thu Apr 2 12:07:41 2026 Received: from mail-lj1-f177.google.com (mail-lj1-f177.google.com [209.85.208.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D3E283FE660 for ; Tue, 24 Mar 2026 13:54:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360493; cv=none; b=E9rewG6G0JI3uI2JUkcUgQjbHPFBSwO8dIzXGFuWcNYRZ7zC58V3sf6SUng0jdxktRIK6Ig1KSMGlXrLspX7molQuwrx2wB3Gp8DRjYRC6XrgrdbxkxcIV+iJhHG9PJTRrskNLy8XprNp088sV3HKMQONo244qiC7iKF/WUGtgY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360493; c=relaxed/simple; bh=ryrI9MAQVwCIRRCngn0KDdHz7g1aMSsslONZvQCRx8g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MjXIASaOtR3N2+cSntN2R5gcp84WZLh4GpRxi5M9r1Xn+pZro/83hKA8Z+Oysb3Nbvd/ksoCAaRGifwH99sq1HVTr+mca57295CGZ+d32o99ytPqbDtl+15yCCpY23rZdD7/KKYfW549pybIn9SRG/oGZX6CVO1GNUIMuGj5IQ8= 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=ZHmvppdX; arc=none smtp.client-ip=209.85.208.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZHmvppdX" Received: by mail-lj1-f177.google.com with SMTP id 38308e7fff4ca-386b553c70eso39593811fa.0 for ; Tue, 24 Mar 2026 06:54:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774360489; x=1774965289; 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=oz1kP6mGnYmsV3pNCXtV9G7tgVBh7BnFUeruC1cPFLw=; b=ZHmvppdXhURiLELwFxX594JA+pei3PUXrlRBMh9PvnLy7Dc5iOVMY7qf+hMpV0RR/k aHaIDC/CQsi/rPTgj+s6Lq8Oa+qVwDCwbBydWJTote+frMgCr0VZkRjK5/h6lcLE7ZfI fJhiJIkoEDRrFp31e2gOpbLVQgZlLPlcPtzgTZfXf9WD1lKJxi1jn3rOV+NH9XSKeDLN XMvPTJelfdQuTM/xma7enmOxG+y/Fxf7Nm2jw3Uk7T9i0coHONuXYJEdCMxH5Ef4vtVU q4RddaidRJaYjmCqbpJhwTEwbxV+EANRyEhbwcyK4dujmf+VFu4uvdQEoWChQ3YTPAxy Nbrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774360489; x=1774965289; 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=oz1kP6mGnYmsV3pNCXtV9G7tgVBh7BnFUeruC1cPFLw=; b=iXV2UcZuDR8VEGdtKR5M1gxjQuPqtFov6i4Rcem5dAV1yKceGztwkwBOWOkoCitHEa yIhT1t8ympCqPDwgWo3qNvL9HqtapITm/LCeV7UNKTlBhEBzk8HHkIzhnwM2iGhiszQk zOjxWel+04/43No8TP8M6YqeMlH7ItVkKoVGWLJ/Q4vmFR0YHe3OQ+bHXpupoDr/eEQp hQql8qpQfHsLu0OjUQ76gTYTLisctXJYaSxXySgf9ALDWYLCwru3VEsHZY3al8OCJXnK /RH2thWHQxfnoybd1UT+6/cu4frgRtsLN0SEnoGHxUhqj+W9gK6rPvbp/NgxDuTdubLb BR0w== X-Forwarded-Encrypted: i=1; AJvYcCW9YnD+IYLNgvBUjWrFGSc2L6DS92h+1CS0M0Sad+dzu+hw81b4PlLSadRlPfur52JqP2dDGjkgw5zhbxA=@vger.kernel.org X-Gm-Message-State: AOJu0YweNiOKDO0uBdTUd9cwMoEBtPhP/svYs3l6JtU6wy43wqka5umH wLJ0+Zlargb5b8vtTQPxm2lo0wo8pXCe2PFnKDsTd/flm7Gzmeub2TBq X-Gm-Gg: ATEYQzyZgKZ6353OOYzrnx7BFdk4PmKIZD9KXF5kqicuFUqJ41oUkYNa2U6wnCTi5ut 58niNXMcUBdSU/jt0qtlQo/Z6D5eDPtnT3DBIgZy7cjZRCwr+Bt3EcSDKgJWlTcJUVkdcmfgt71 1g9cLY0YW99H/c1uQr2a7P5p1xrOFjZkYt0LRujP0ARIJLDLF4f/QvlUz6MvbDWfDasdI+DENt9 O06HW+N+7hNRGNvKmfp6EhbNW7RjtohqcRKrIKfql9Awy+f7ZiF59Vqt+FQsD71bSl5iG47PaAp v4YTzmWQLrwN/LYPO6O0PuXF7NVvDL5lrGtK4qGiM6J61AGdUFc7Ain06MYSFbFkeW7aWRqA5w4 gTeryNhpcDPCI/YoF2bmeyW9NNBEemeBSvw3G90WX+aNfbsWuCGVn+z9NWb4OQIxeB9/T+qx6Pd oRkpckAVKKHdjGmp5+PYy1HM3VIGHDGEYkHYhBFwbtVqNfmWfzTierhwfVi1cvp+LJxG9y X-Received: by 2002:a05:6512:124c:b0:5a1:6c86:b945 with SMTP id 2adb3069b0e04-5a285afdc41mr5770590e87.12.1774360488477; Tue, 24 Mar 2026 06:54:48 -0700 (PDT) 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-5a285207454sm3162823e87.48.2026.03.24.06.54.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 06:54:47 -0700 (PDT) From: Marcus Folkesson Date: Tue, 24 Mar 2026 14:54:18 +0100 Subject: [PATCH v9 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: <20260324-i2c-mux-v9-4-5292b0608243@gmail.com> References: <20260324-i2c-mux-v9-0-5292b0608243@gmail.com> In-Reply-To: <20260324-i2c-mux-v9-0-5292b0608243@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=3881; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=ryrI9MAQVwCIRRCngn0KDdHz7g1aMSsslONZvQCRx8g=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpwpecpKtb2LQM74bmvDz0req+77DcvmlflCxyE W4Thx+y7rWJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCacKXnAAKCRCIgE5vWV1S MlCUD/wPBVoCUV1xDm82HsdePvpFTI2QRLF6oP9tMPcFfNn5gKnix7i6IZSK70o5JGbRZP2Oqt0 krIWM96uzXsZY1ahQOTrC//PEKTVZLYgv8Lek7pJ8fNJV70Nd2DzkaovUlBXeGWQUeHcSX0rrc2 jw8muH/LXYI4RgA3nxwZlX3lLNEb0nNbxv/rDf0jYPs+j9mcGXH0WnRwsoVv1JO/UovW6am8AkH tvgbfHNliDmVpPJPeE6U4SxgwY8Otxk3b7cw7L1y2bcqxDZFIzflpxzuNNkQj5DnW+llnIAzgP0 sjO8H0ms1lOrTt5+f4i3I9gWz5CAdvaAmZwbG0n5JEwpG1CI5BnJVlFMwld+yEJBaU4HyAexUOY SnRNTR5ot1h1CREUoKB90y7hEflr+pzSwtaqZNYhU2WtZAYyqB7HRwV0TpoCOUGhndf0HXHMqyJ iljSssZsBtgHzvWyxdh885YIt54nIFeggj3YJs8prKmAiM305wftGDGIK2xLfY+IMdwQq/cJAPq +/5/7exap9aoXdqA8WVdd/gAnHS4L0bLoN7UzcALDmF4Am49BXowNySUrTaEqHHiQfTMe5uDwlE L7+KTQ7rWJCda0niD3xovRf+f7DUKsLQsSep5U2cweJQW4WJ0R5W443R0ez0yJwVRLlnoxAR3m7 UorDwjz3rJvMstw== 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 | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index 549fb22cdf4f..d87172408445 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,7 @@ static void i2c_davinci_calc_clk_dividers(struct davinc= i_i2c_dev *dev) u32 clkh; u32 clkl; u32 input_clock =3D clk_get_rate(dev->clk); + u32 bus_freq_hz =3D dev->adapter.clock_hz; =20 /* NOTE: I2C Clock divider programming info * As per I2C specs the following formulas provide prescaler @@ -207,9 +206,9 @@ static void i2c_davinci_calc_clk_dividers(struct davinc= i_i2c_dev *dev) if (device_is_compatible(dev->dev, "ti,keystone-i2c")) d =3D 6; =20 - clk =3D (input_clock / (psc + 1)) / (dev->bus_freq_hz); + clk =3D (input_clock / (psc + 1)) / (bus_freq_hz); /* Avoid driving the bus too fast because of rounding errors above */ - if (input_clock / (psc + 1) / clk > dev->bus_freq_hz) + if (input_clock / (psc + 1) / clk > bus_freq_hz) clk++; /* * According to I2C-BUS Spec 2.1, in FAST-MODE LOW period should be at @@ -267,7 +266,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 +278,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 +775,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 +821,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 +829,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.53.0 From nobody Thu Apr 2 12:07: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 9B52B3FE64E for ; Tue, 24 Mar 2026 13:54:52 +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=1774360495; cv=none; b=C0LeMirvwi40dWH+SrLEMhS04ILJlvhO2+m3PIWb4DP82mSCdAY8dEBs9ybhdnx0UOycXaekdsY0FIPHfwIkElHWCjadYT+75fBM/rub41itUn/3+MUwQ2z4urEDkoW3kU6sg+Ky0B9NaDB7S7Pqzjj23sNvnBmTiAv0x2BGYx0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774360495; c=relaxed/simple; bh=GuWaYKwfMV3ENq2uAbPKaKDYJ6qhLIPVj7+qDo+zpgI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q5zOw4R1xelGOdzP/MxUaAufP+whTWgyvw7hsbRvVJecm0y3XwStTbiBBmJ9Ff+OvyjtqQLWKfXtgn5IyVa9pYBb6V69amPsfiHyx1TDpdVLxlNGIRaEv8da5q4eI9rEratDhKBGeUXY8EjraHUOb0F7RmY5wIH6WxZ3cB/vbUo= 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=PzHvR1h5; 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="PzHvR1h5" Received: by mail-lj1-f169.google.com with SMTP id 38308e7fff4ca-386b553c70eso39594131fa.0 for ; Tue, 24 Mar 2026 06:54:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774360490; x=1774965290; 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=4eVM5njdwmLVkvkbsPkw/voN/xq5dei4oewrLsHcno0=; b=PzHvR1h5dHxr7kVQCZcb34dqA+c0EPB8fRH92JXCF9y8+eo8C9YK0o5H2NuPIJyu/8 dYx/zavh9/mMp6MwGvilS2+KCdBHmixr+QnLjfMpAKRulm9K8xMnb5BhIQ7S5txR114s Ktk8+XAaI5fc+lq7VGbnG83HBor5EgjF0tEHtsNWOKT+0+7IgyysvPBZGrALU5t4dsPO +sFV4aj0FI02bZuVCeEZF5DxMhRK3tHNXcUV7g+0OWflZ8FeOzxFWy6KqER7YS/QwELh cAa4ldoj0Sg2Qb9oSzb02PBTwBXIxYy5Xbdp8xdHoiE04PRpt2CkFPPECQWpr1mz00K0 c6+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774360491; x=1774965291; 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=4eVM5njdwmLVkvkbsPkw/voN/xq5dei4oewrLsHcno0=; b=bQjWf6l3DQuToC6GoNHjgL5zi9qHY2Y4TMgLFyq+ScLxIY5DIKQwYSlWjoMDeNLWqw //iyF3icpKd01dCqDc6PLiI23/XgeHTWVRI+EGJKNMqz717HElivAq5BqZBSWS1fQo5B TIXRmLFKs5J4Ow386K8cL9OlMgTluDnKvMEL+/c28K2dUtsmhLU/u5euWSlgfKrwpAYo ZRGQrDornq4OtIRu3Xgtdt9MUNleBqPljV4CAon9Yd4x8yLFvVly50D5ygluaJpAtiK2 7zfjivXU1x1ANcU+8saAoggLQpNldN1kCvbTvsPQLgBXL48RJONoj7atYzuLFQJ+iQEb Hq9g== X-Forwarded-Encrypted: i=1; AJvYcCVRFAY9z+DQkbQnkHtwMpkOekY6xb0Syc8GAacNHq7fJwK3FRGVn3YrH5O7hXazSTs18V8UhtD85XqL4Ds=@vger.kernel.org X-Gm-Message-State: AOJu0Yxgg32M30cPezXxA2id+RNJzffzP8JBk+B3m2lKoSYmkvfjIXRc /rDdC3hT4Hw3eKB8FmVp2wvRP3o8aPvAcaMvV/35oU79MjgeEPgHOhuJ X-Gm-Gg: ATEYQzwevmZFOLkvWyXij2FmjRqqXnAKRfHa7WZ7d340+3p9ij1ZuHoBUe72J1zE7MN /jb1awU9+gzajQ4gpiJDEFjdKAXN4cZZKFS6HigRbBB5nzvpwwCIpqLtq8cwhMPI03YVgSv2LIx JZ3keoOJ3c8A3jUcgql57M/75Cj2GOqVFuaoeHABupkfD1ffOX/EPaooR162GCqS1DIlkQV7qMH qitPG2Jy39VVHFq2lvRXpdYTOb0ORlbK9YYRG1Eve8GnWQjxAtnvlDZUp14kzZaPnPOLKhVxNqX QdVwJ9wpx2hl7sTWaxR4x47pFZacTp84gH9gR7gg6JNnMR9+E76TtRG6nUZg/6GorHIMepGqwij ldx/nUJZYvcVZVlY6oIcJdR0YJxLydKpvQfhEMnqj5DL+oU4j1h4v+NrWxAycDFhOj4DlXoXgkf G95dDkxwx8mayGXHPMKq598NLDvcXMRdkThTaSdHa7CqsRMAPVWm1QoEvCL2+h1pn+jZDg X-Received: by 2002:a05:6512:2244:b0:5a1:58d3:a78e with SMTP id 2adb3069b0e04-5a285afe997mr5521719e87.16.1774360490303; Tue, 24 Mar 2026 06:54:50 -0700 (PDT) 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-5a285207454sm3162823e87.48.2026.03.24.06.54.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 06:54:49 -0700 (PDT) From: Marcus Folkesson Date: Tue, 24 Mar 2026 14:54:19 +0100 Subject: [PATCH v9 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: <20260324-i2c-mux-v9-5-5292b0608243@gmail.com> References: <20260324-i2c-mux-v9-0-5292b0608243@gmail.com> In-Reply-To: <20260324-i2c-mux-v9-0-5292b0608243@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=GuWaYKwfMV3ENq2uAbPKaKDYJ6qhLIPVj7+qDo+zpgI=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBpwpegtwHxJOynPPBbWU/7VFhGEIzuMIL/Aqc6/ e2v/aBzLS2JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCacKXoAAKCRCIgE5vWV1S MiWLEADcTDlo96dNktCHucsX4wxFTvWqQz+/jzYJ6A7WebX+7gMIKlNQyN2TRdddkrastNt2Ffm 9tgBWrvkpMDAld2okAN+w92oVXZx6mc/41A4hSycbKrW5rcySOYAVo9ZHi1dv33aAWOd5U97+ui ffW+uOlg9dbYZOYS1lbuLelB62NUMBaC8uooCCsx3elqhfQ206jf8y7xZbI14s+1TmT9D+fJ7PK WHh5WUbHhcrZbjhTK3R6QsZOoTZkL0JfFaKfx8fKgRWGwgLdYwuLPDQOe7zIl+NbXfe5PeaT1eh /JiTPrdpVaNvsx0fizNN/rkq6bAqZ4C65GvW6+J/Rm7fS4/rVIbGIbU3WMKrgWbaRrUYX3o1sqb 70vtE4xp8jilCU9pcMgnDuzfqjZYCHkb+0wziEFNlP5A6awv5CX3qIUne4c0bUCEQtsxruNiAg0 3vJAHXabmAtLTa2jqXXAXahgF9hYXRENdV3lKStlYvAoj4+GUyTxQYwmHTHBC4ISh7w4CMuBrJD qIMY7rQlp4DSX3UVrAs4ccSUzLdJwyy5RbupsNjCoolq88j1Y2pEA5YDrjelOEW7nuUX2NHXcJK UWqYqbwYrvO6E8ppxkkqUgeIIGoISAwfsoUjJLA0FdCc6Wpvcb91GFODHosoMQM74uPHEpVre+C +4A7DBoe9ZCyUwQ== 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.53.0