From nobody Mon Feb 9 04:29:02 2026 Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AFBAC30DD32 for ; Thu, 2 Oct 2025 14:42:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416136; cv=none; b=FwEYgOrkzoTZQ+dUXNthbaIxQmdAiGFrduxRlV5by2bk21WkIuLB3kahQScQZ6DLwT3sREdCFVriNrMFeRvj3qVvovANx3DFAjFIyHp7FudYh7KziHjTV60gejlCQylZAXcPhe2NfkR2xR/ZyVstwvSVawk+8bHj/FPzx0/fuN4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416136; c=relaxed/simple; bh=5vuOIHtLq7CFaEidcZicx94qxk7qZlaIZNjnBzwUQCQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pbYyeX+S2dkZEj3yV8X2l0udUKLwPaNnU8uyrZpXA4sx8MENuQ5bu1EQEoxTr9oZwO+gmt+dg2afO4xPTyhVUbGCMQ+nQkNoh4g+riny1TLqZnIw7yEYaRJPyaJg4AO14BFTCFLjiqBUGtQ4ZW8pSZI+KTeaxMD1HBCUOSwDQFI= 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=Kve5uZs5; arc=none smtp.client-ip=209.85.167.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Kve5uZs5" Received: by mail-lf1-f54.google.com with SMTP id 2adb3069b0e04-57f0aa38aadso1274776e87.2 for ; Thu, 02 Oct 2025 07:42:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759416133; x=1760020933; 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=Kve5uZs5z6a1JTW3lT3z0CBheOJeScInJhedo3+QVc1M/9bidZGzfMHWM4zSDusEzg 9Ww4d7CN1ODlEhyEGJ2v+3JexEJRuq4ZxcbtRc9MwSNnM5FIeCWq5FJn5bSUppOSaJx5 F3OCWpnP7Kgs7yCEGBtr0jTjtv57dhzZjF6YscKdy8qRhORci377k8uq2f9+yA2iMTMH Z8PlH6KUfaf77Nwd2bxd6nerW7QtzfbkCPFVFw2v8nEBApsKEqdoOUG2oXU1tzRKWob2 FJfv8tNDw72v78L233z2R/tRW93XHQ7s+2bsS38yELvdrtz3+SipIyj+Mt3YfGcQm26z wkiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759416133; x=1760020933; 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=r8eGlBD8SkiT3Ddl34p4p/9PWOi68QPDOeCvUunf8ghrGEH8OCfKYzmEmLRy2ha7zL 8LCxI6d2oy51z1PTVwQtFSpfiuLKpSprN45jnfsHrfQsLF3AMSZRyNcR2/n8/9pD8OuP BHWwk8DkAI0WbcsXoUG5fhaPmGRDYARrdMqIJa4C8D7v8pHvOpyS1blzQmH+G7TN0IFu Ka2FSexz4e1p2fqBstI0MTCA4vQroYz+e0C+PoXBouT1kkb6J4tiosfSiNc9ld4eSVPH od0/TXtM7srNVwPHmAbMu7vBUE71wEtQ7nf7PKO+2hyEQARf3fHmG2RrfyXFSjBoGb2j TQvA== X-Forwarded-Encrypted: i=1; AJvYcCU/F8xdPMHhob16tHbEjbEiRfL5tWCMOsBvqEJSOZMXkXmJ0smG9VGlaQDnRRW0dtWIuV1cXzbLzzKPWqc=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0yAUFh0KwVKquTGALEzeNDc+p7Igyby/6FPFyyeYF5X8Dz0pR uQf4azegMS+OWVYtL6ceTEKwMO+aQGe+qJx/n+M92oZ11nSd0OS9zON6 X-Gm-Gg: ASbGnctywqDTqdDZAdCuvL/ugoZseWK/0dtP0TnPSNjvmOvPURPjtJwF0bM6M2i2hDr F7vCcCiTRftIbc85i7cfjbq+VPJeE1777LEeymwgB4zo+EzNfN8hC8ongOOKp0YaGZdOFcFWSa7 7ih8hjVDsM3eXBU41uvOXHCzU9a3brfPO+FnHrG+4NuzWUVsD/yvGWJZfr2N1SYAb72nQwz7Sjv o1LbU7dNYzhLqhIbNbwQF0w8kJr8ArxOY3JoIVlLx0g2Fn3hnIiVQeE7Sr89SUehutLqER02dmX NfQl2/nmL9XZS2Ubi78h7celxeFNhKBvJ6SXvS9e9ecEZYLHOCyXef/gwjjVgEUOYyqNmYjint9 4wfW6E44vzDQJOZE4NYM6ueBaeArud7z5Auh+1UN5F8HlBmLZTJ2elnGS+VzOKODW480N3IRFww /urk1VQ2lnaRwVHaY= X-Google-Smtp-Source: AGHT+IERyyKNqaNT87ECbJ5igCLeF2vmtOluPcZeTEexFXRyoqikIqVU1Kihwsqb6e06ppVs/cqtPA== X-Received: by 2002:ac2:5144:0:b0:57c:2474:3743 with SMTP id 2adb3069b0e04-58af9f3fbdbmr1909198e87.32.1759416132486; Thu, 02 Oct 2025 07:42:12 -0700 (PDT) Received: from [192.168.1.166] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-58b0119e60fsm884712e87.94.2025.10.02.07.42.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Oct 2025 07:42:11 -0700 (PDT) From: Marcus Folkesson Date: Thu, 02 Oct 2025 16:41:32 +0200 Subject: [PATCH v2 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: <20251002-i2c-mux-v2-1-b698564cd956@gmail.com> References: <20251002-i2c-mux-v2-0-b698564cd956@gmail.com> In-Reply-To: <20251002-i2c-mux-v2-0-b698564cd956@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/ZANAwAKAYiATm9ZXVIyAcsmYgBo3o8oVrt5yyWpCE40+l9t5c9Od5JLxFteQjmrX kRLdZyjpHiJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaN6PKAAKCRCIgE5vWV1S MoukD/9SOOM6WikhU2lmPNMj4+dJCYO99J4XPsNEowIK8TxfnGgdELVbwsZNKv9adrAE4yB14I9 +Jr4kyZBfn5rd73hUyjEkLRSwJkH7cd9XvT4Wl3Sn2bcBpHZn2K8TVmnnsB4sPm9el6yyXrp3nT wu5BVfPzO20IEb/T5H+04MUiO7xP5FzOuNGH+HEK1/Yh/D2ob4rXLTrumyE27fykyH1kflc3LeZ Ow8SA8JZNH5eIGFynPvqUn7zkgGhO+xcTz31ZEkdfOQGRRQxujw7A48ETiSYd6wEVbfxFYY+ux+ qPGO2w6Q0TsrVgZS7DsRVKnCH+axdzBeQe+/uytOA5xwNVxykQwgwQifLDIdmWZGQWrlnN2Ha16 CJfzHEuhp7UO7xPfEJLbwdrHgsu038kstxWa/aBvc1EDpLVUR97Q+SkiZRDlNZZdFjBb1+UxYYb 4USWj4ouQdYRoqsOUGcO/IwhbwFBFhLP9EN1mS7GogUthsn+9BQJoIHMHNQp0pLO+DrTGo1reQs lgC6+EIakcViy6S6j+dkBadSx5A5uNUl1L6B9Vny1OI20er6Zokk1K7ydsoy3rJ7VvV435wjWq1 EtrScWdMBQxLhCIFXh1EM6Fc8InxDkULWWtcOLtWM49qrkeuClh0fjBorrkvDzcKJV6cd48TeGk vngX1nqXomPLx+g== 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 Mon Feb 9 04:29:02 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 66DCB312811 for ; Thu, 2 Oct 2025 14:42:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416138; cv=none; b=T1Ah1m8BZNF3dpzG0/p2rPwNUkSXO0pIdWXgk2e5UW30l2mE9ziQ5MI4gIAZ4oE4cA7i5uAFY/b0YJXkPwESoVhKibcIByWa+uTVRBuYSHjq7J7w4evxkDQZh2syG5J2kZpAnMmmJD6MxTQwakzJF6GMZPKw632SdGgK+Uctiw4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416138; c=relaxed/simple; bh=CnKS7KgVbqNJeBUIwvWBcCBehV2jOZtzW9PNcQI/CnE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G+O+Hm6M8lQ91gGEfl0jd7BFqj6fIgqWtVqpiV/yjv4XkE0VUow4LADE8l2MwxB+lFF2i7p2xiY2ltFqRBa8ANuHCQvL9J2JBMX4EPVumwb193Fr9XWTdaWnSEpNuq4XhSPhHsBZ6NWk3gQlLrrxSHjKo2UdBxgKAzc6mnnjDfw= 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=mjoucSJf; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mjoucSJf" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-55ce508d4d6so1173690e87.0 for ; Thu, 02 Oct 2025 07:42:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759416134; x=1760020934; 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=ZfyuHu7f2fQho6DT6kcnt03GbK0UWs35JdS1BwwuDZw=; b=mjoucSJfxVYBIBJiNltjoPvR6oRPN0vrQPXCxx0zXb3rmRhJFxBn4FOd0vItTCZMIJ mQxF/fSpSwuaGjphPZvX7ZndJONVWjZVvbxb/176bbtvCRKqvhR3PbyIrRW2Xl9Nhkkv Zksyka4Yq2gofb292ULE8gorSUmjHZiHB+tQ1XfUpqDMvLuwJimbly/+tgh1VmMsTDeW /Y7sxP2kx6flAjGe4kMzQ5oQpAdypVkJVXJZuUu+G22gNlkFTNuzp53V+tYWM0YJ9hXf P67ugVRtBBLrcqZ1NsIgXcS9EkplxE8GCXOH9xQlgpZt5G9lChfj9flIUvEagbWR3CwJ W3vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759416134; x=1760020934; 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=ZfyuHu7f2fQho6DT6kcnt03GbK0UWs35JdS1BwwuDZw=; b=uFQ8CCpw65Pmyswcf9QfAd0Jj9rke/4vIdwjgADQivj5MtONxSEsIlSJZocgolYXEI 0KO6NbcNog0z6adm7iyh4lfRr1wc0Jt9RJhRo3oclpItljmZJrE8kBSZxkhRLcIOMj1n 1mjn03S1dOQ6UeZGw+aka/k57neSq7D1TGuTQT0Tb1iUzxOTOJ7wB0bnlz/LGllg1dai RCKEGEUKPaEz4qZalzyoS83gcjQYkBSSu9OsXEY2LyUkgsaeW/Crbj818p+n/kn0pLRv g84Yy/DBM61MZ9wlTBE91nlcj15bQTvXfp6YAt1+E5X10CWK4Rv48lDdw/9jss79/hIc UMbA== X-Forwarded-Encrypted: i=1; AJvYcCWuXMjUmGlO7vyNmooEjnExm5IY03UKSG63goeKkW2v2Um9AAGMeShM9n29n1xVVxg5Adre8PFm1964btc=@vger.kernel.org X-Gm-Message-State: AOJu0YyRF+V7JAYWGd8hJUqvANkiIyZYsfnjHbK913MllYkRQ310YUCa Ru+d2eH8xN45Hwua8+N3+RVTAoNf6SocQSssgJUTktO0BNgm4i4x3YG7 X-Gm-Gg: ASbGncvSNsKl2gs3G/kEjMWJZj7u1fOfY8Za5xWRBTEOlyllhTQ1k5+xj3i+lsLOQC1 qq4u/AcF8me5vCjuDbJqDsHkVptMJdlZhJ4fNfdxaAZn3EhpuLR/Q1Y2F7v/fVCR65ieOIZzeV1 iqL31MDoWnjyKBPuaWnYNHwwrbwjqmby1Lg4k2m260jXCn0FbjVXNmVm+cxItLEbYb158DtWhXT HxYD3VPSZcpgGvNKqd4SXZZ5v+rOR6KxoQgdf2b2v1qff82xzPrXVzu0r3562NJWe6RFi4FAT+2 ShpkcJ8dwmUgGf3FgxHdVKm68Bd8gvhqh24gKNhMsfsaGl1S79Ls/9ScrGUN9aP1O8vhxC7Wgga rCop2ikBOpLF9XK9RPI2b+pN7wp7Om0xV/7yIvSCOjCrIzG2zIYcRtJnaWaI0YnmXqTpH51su+A DYEZng99czSzvF3a4= X-Google-Smtp-Source: AGHT+IHvlF2spZ+hnhw5AwvVnmf222TFfcTBJgdlsu4qB7yk4mCTPKnFgGpIgM5bjJFAbuhn7c4yJg== X-Received: by 2002:a05:6512:3994:b0:586:83e2:228a with SMTP id 2adb3069b0e04-58af9f4a92fmr2258097e87.45.1759416133957; Thu, 02 Oct 2025 07:42:13 -0700 (PDT) Received: from [192.168.1.166] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-58b0119e60fsm884712e87.94.2025.10.02.07.42.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Oct 2025 07:42:13 -0700 (PDT) From: Marcus Folkesson Date: Thu, 02 Oct 2025 16:41:33 +0200 Subject: [PATCH v2 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: <20251002-i2c-mux-v2-2-b698564cd956@gmail.com> References: <20251002-i2c-mux-v2-0-b698564cd956@gmail.com> In-Reply-To: <20251002-i2c-mux-v2-0-b698564cd956@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=7497; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=CnKS7KgVbqNJeBUIwvWBcCBehV2jOZtzW9PNcQI/CnE=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBo3o8uMaRwZa8DTWs5SZOYWDcoIZ4pXHFz+5S3P ue9nMSTMCaJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaN6PLgAKCRCIgE5vWV1S MspED/4gVppfP67fZfYX4b17MuAi36CT5f+G15I8IWwI11Mh48RloIeylQQvVa7JL1KMEAx34ZE WIboQKCSMIHQc3wMNvODVCe3adi2Lfhmrxwed7hFmT21xlEeRu2KLXtdBeByxUYOZDLiKUHDsHT WJHxvJcilPDBEN+ibki695c/SQkshy7xvuNsA7FOY7Ci2Tpc5+Qfyyqr0qaqpQ89sPLn8Zv8EoS 2TgzMOJfMBndWxmPTKlY9uMT9keD2p+fYgZ6xVNc3ZJuvXWbtdOKh5ePuLQiWWlrmccO+M2kqEM nXvJqCGFQq+qMjv3msXfDOPM7LKK7XdiM38PPzDRs3sntxL5KsqOa4Nmu35fBMftpyJGEILvwMl 2r9c7yTlb7SpwrFTAb6YDvvK5CW8MMZP+hTWqr10T1Fz9IxTi1Y8FIuhqs4Y++pFRJ6Kfcm7Wql jVWxZhhUTQL0RWj0f+vhE67FUi3ZjaaXA+yqYRzCgC9LCZKEIScdyVwUqwFuXs1ids4WEbjJxMH dyRnr86y2xAPil7VJVBanvftkG5R6N6PBI9dkaDcvx6Ut9tcy7tQJK8Q4U+Cx6TT70JpJvqA2nU RgFqAPLNuqvuH3HWAaILH1bB9lVsp+dtY9YJD5XhBZ5iXCvOgofuvzXCGFCA/TYFuBlzNOPBa1H QSy5WB2sm2+k/Fg== 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 | 115 ++++++++++++++++++++++++++++++++++++++++++++--= ---- 1 file changed, 103 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index 4d8690981a55dc0e1b35454971923791e6ed9f7f..5987853afa75cb58e1c6af6c7e7= d52873ea53507 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,31 @@ 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); + goto err_free_priv; + } + priv->adap.dev.of_node =3D child; of_node_put(mux_node); } --=20 2.50.1 From nobody Mon Feb 9 04:29:02 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 984C53128AE for ; Thu, 2 Oct 2025 14:42:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416139; cv=none; b=W4HZC/39+BzAF3bn1/HjrxTRKT7+xJvtIZ2gaMVf4UNGVeTfAa21lX7OHccTs1tA3BIuPWi5KEivB12uVjNnJ6RHtPT4hWkNxPh1It+bJVqmGHtrL2guTuisKfZ5TU++F14Nbjg72L3+ScdTJhnLLxuGY2BMY4zEhNsc/8k8brw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416139; c=relaxed/simple; bh=w+MZYaVZ02IqzT3KVbIc8v+JL5IabUx7ix7rNxqMcO4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Avpzt6Hqw8uilH7aGgO30RIUvYc4xjAfx2D9RNeT3fvm2aSp2eO2Hr48EyA6wiWOdUAh50/kBxznxY94Dc7OfH1xlJQIxCSzLoQAvTaD09uERn5oF+1zJ/VGfqARk+rI96qgfJi8KAsixDWl3t4VcJYyaf5hzCb1nw+cz+KVZ3Y= 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=CMKeQG0P; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CMKeQG0P" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-5797c8612b4so1424089e87.2 for ; Thu, 02 Oct 2025 07:42:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759416136; x=1760020936; 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=b2uUwOXeOx+ZJwhfggQur4FjGWmefpICu6kR9jNyeuE=; b=CMKeQG0PlZRSdDX0Om1olTue4VCe3F5imKRjNCLi4YYn9pTMFmjUNs6etY14gUH80w A647zT/slVjNtQI/Jfv9WsPQ/6c7G3x2HzwISH+RhN+KK3k8xnnQViv1I4mAb07kHEv+ BcGaeQERitomkvRihRWdRZVDrBmeSxXWgm8lIyURZgeUWq8TnlmmJARzIVfmd65J63Ap gE8eJQkeVWYl21O7uILe0IFBSdQ5kUYPhjjol+ayZXHx5cfqNH2zL0bDf6f8CsQZyuUn 2S+YKCxPasB+8rjqZgDhGD04Ex4TB2Vo3drxq6+nUFeqNlTf/LN+FUWB+2O1bgB3qPOJ HIrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759416136; x=1760020936; 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=b2uUwOXeOx+ZJwhfggQur4FjGWmefpICu6kR9jNyeuE=; b=eOwD8EhWX9Wfs2tNfNQbA3h+eK5y3Dz1J1fiXtM0tz+DomRUbZ1uiy9Zc1GKebo56j H5g8lyh+yHUnf0OJPzAt8X3+/+FvIHkHWU4JziH3Y54bUILdBtVpCrMXlknuCcskPB+w f3EeAa7a9HmKNtf0xUc2cEbMB6xxF2G7htmdVz6NL4bDKNlIb5nJ0FUEnlN4CKcyCXNC AuOFAuBwOJ3+s1Y3i5tvRKmtQS/aHnOoSilUapiQ1HEZyLjn8WDEcZZzr0Js8u8ksQ/o h90+xTwqo2/JyvwkmWuA7s9BLJLzftTegE2Yjpnge/MiB+GFuwQP6Ya6sqIgckGbX61C hrZQ== X-Forwarded-Encrypted: i=1; AJvYcCVcRnVmbLhyKZEk6Gaq3rV9Ofczwf28QSRTejp5uRwcIi4z6d5Zbqp91hFwqxQo7wN1zILGHgMxHX2P2VE=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6Ywea22EZHvh7XITbA5vg8Xfp61EutbKN/Avm8qfQrYvF/wQ4 j9xvkk+2YabIUNChQ/gALeEoJ68fG/Qgjg0WuPRj3amoW4OIYhGgGFB8 X-Gm-Gg: ASbGnctDWntrr/Ow0hpCJAFCNoZQUAoJ5Dw+DRu0pGbwAHGrwPp/VtbWZih3LImFR+K J/aMDIFIj405z+HntbKxRgNSrNzRH3fZ/6ZplthkGME9y/bFd8oBSVQRYqtiH4WN5+Zq5R3GbMX w6x9c9CTyMMIeVq8+4VQSatWmp1RwbkbXmysWPPK5LqCXKccoJuLfmdJpuFiVseyPE3tr0CuVZN kVuCrLK5hhhc6r4u70J+pRpfKGjsSspAutzl1gCjNXz+zAMdDt2xr9s5PvthF/JfaJcejP0rnqE F40+sTUmw89p28VYcAPN9TNx7Hib0YIl3+Q/dGnmfOG39FYMusiVEthK1ASB8HuRIV3DAAGOo3c VMRFLuSZVI/a9AaftSWY4ievlWgaDBJihSTRi73oRQIH5Ea7yqtuNv5SAQu2Wg46UZLfMvwju0I PMQaTlLxHsE/rJm0fU7OBIPWgI2g== X-Google-Smtp-Source: AGHT+IGhPnOc8T9NtMczj2X/q8cc3NRXoSP7R5os6ByTZSjWiGkW7WZLddjDX41weWGkosgmQFMyOw== X-Received: by 2002:a05:6512:2356:b0:57b:8675:e35b with SMTP id 2adb3069b0e04-58af9f0e6d6mr2525880e87.5.1759416135487; Thu, 02 Oct 2025 07:42:15 -0700 (PDT) Received: from [192.168.1.166] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-58b0119e60fsm884712e87.94.2025.10.02.07.42.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Oct 2025 07:42:14 -0700 (PDT) From: Marcus Folkesson Date: Thu, 02 Oct 2025 16:41:34 +0200 Subject: [PATCH v2 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: <20251002-i2c-mux-v2-3-b698564cd956@gmail.com> References: <20251002-i2c-mux-v2-0-b698564cd956@gmail.com> In-Reply-To: <20251002-i2c-mux-v2-0-b698564cd956@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=2838; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=w+MZYaVZ02IqzT3KVbIc8v+JL5IabUx7ix7rNxqMcO4=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBo3o8zNqj3vWMKZsDPeq2WJrbZnQsZi3dBQR9Mo 6gj5akCgoSJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaN6PMwAKCRCIgE5vWV1S MmgTD/9icKEup0hYMJO82jco9VRXMaEsGVKncS5vll1JbZPr8WQ2r4IJnYUWXxqBKADQMZ2U/hk V+o3PNP8BlHsaBMwKztFGDfcHgBO/6+wn0e8DWNAF6tAKZsuZW6E6zkjfjDFcuXfiUC5ydl53ym iVpyETHBXPuRv5W7GuwzvT5+gr6GES41OtLRiK/Gi1vXMayKzY2nJTjSykw9sqm0xcsuxIqW8/B ZGzl2qCIqcwlkhnu1+mCjQend/g6a8D/kdVie8E/NyWPd7ksKbR0vMPPPA653lY8WLwAYJpfifT z0xNjGM+YON2rgCpnfiJlnacm0IrDZ+A8eDHwe0xM3RvD/uC88Cn/haIjm8FnyYnT4xleV1/9IA 4iNhKsnrYiivRvKXL8hIQaLbGmH7lHxK4WrSMHJLjIO38PgUojiz02X/BKGQ8GnO1Ej1wgGQZOA NNUvNirR0LynQEehGbyx7EOfXxT6jTqAMLHeA9pAYaxR2a72f5eCzslBktQ2lp3Zz6RzNvR71eo /REyhcaxkOQ2n/ngZculFBggFBTcmG4n07/ibjVjpHIsYzbGBtioGjbdtiJF7ljmcEJfpWq3Rsg JQrNfVKRru5T5oYP2lcaD7ExPYbdb7M/p+rIbBYUW+6kILoPMH2Ix1gSNiyGmiIZmhqBmBCuHYy cVXz3ZtyG79o0Ag== 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. Signed-off-by: Marcus Folkesson Reviewed-by: Bartosz Golaszewski --- 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 Mon Feb 9 04:29:02 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 15D042C027F for ; Thu, 2 Oct 2025 14:42:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416140; cv=none; b=KLP+AzKr6tqw5wH1Rgx/PHkXA0ReC31oQLbq4XQWYSJ/NcYGproJHVS20msjQkYuYTWmVHsqa2xoBvfGL2UFp/b9rnY8YkQmIGJoHwm18VL1lMfRc7ElAyQTupIfq7oJ98la9GcCd8sETbDyuLAx7ZD3WZXU/ND+wrACQ7OFSl4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416140; c=relaxed/simple; bh=SEKtq8WlaDinzaqN6sbmXex+0jo1iDkPy6Zh0RvgHvU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uBtZaCqi8dzeus1pfir98DhwfG65bvRbUG1cvMir6s6akVcnO3gSf45Xge6h2FO2KUrijZSnTKM46AmJqeQcO3fXhH3TPNJURnsyaBmGC6/5hqR9a4YIMNhxap8Qbih+eea+BNueCUX3BRccaUCiZ3Q2cqpUFCiq100WPHLQ28k= 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=hZUhqEe0; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hZUhqEe0" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-5797c8612b4so1424119e87.2 for ; Thu, 02 Oct 2025 07:42:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759416137; x=1760020937; 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=hZUhqEe0aJZ9Rog3vGBNtGx90JMcOJD4di64yzwKak9hIE1677rVUmULe0112kueFP /7EHAluQb8WLH1wXOvLgBGeIKA9DKrI04n9PYSkrDxFRqrZ3XFrUb6vWCRpaFcaaJM5q C5CdtxviOyEsxcuzhYLASNsMpQSoLLHDmpmlLkrCOKVJ1HrwPcV73UfXEZcPpi73P6ie mc30C3M4P3J9ZYWN2c4hRYxLlhvJMVu5b2oUv0JJpfwBQwhsB4xFw5s7Gl6zFgvX+XhT vFEN1H22DE4fx8rvmqEJXBdU9HGP5ILAoQA4UjffhEioIZoY9/2ljrOMeAdkc8Ip/RW0 m9LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759416137; x=1760020937; 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=qHG5kXVjBodMNZqqwsE6KFJhykh31ddtTysb1VZb+08HHTYK6Ni4+ch6tVuzcOV7EA 6OVy2tzUQhexkuOSr21Y/VaH/LykZTnJtRyx9OfaRp8yQojIi1YqjG4VHx47CR+WW1BW jRTnZaIu6xl09bKfB7d/8xj9IJ2+/qfkCagqMDh1U+uY/QPkVIaxF84pWhOUHqEerjA/ q/5jUpK7DcbpR3pNJzkxFFZzOk6hYXcYeffMKjLQqmnRu+lAR2TAL1xlvRBHljpT2T7E Ee1zY4HEr4JLgzvMa+jajGPVI+qeFv93+xGIvcAGE5GJ/tl4CTM9nrfgBLEGoeeJDOgj OL9Q== X-Forwarded-Encrypted: i=1; AJvYcCXfi2grWDQ+qhJy1nNXgFeAIGZf/oZLOsUx7+A8YohfafQao2sT8WT1IRWbaTWnho9lTC8PQkZ5TfnRM2s=@vger.kernel.org X-Gm-Message-State: AOJu0YzOlu/KeHJ7TVMaPJsRlFHuxEY0bmboPv4U8/yUfPy3DvN+lP5B 6rmbnM7NOWJJtR7cXJQQIN874VlTDdbLD91HvUUW+Id+EfLCPgclabGY X-Gm-Gg: ASbGncvP8seSBvuL31Sw6KYWoMQJC/ZpIyfkGuY4HGMIvhkHG66tOUxsYWjZTaIxHg1 6ULXmBRe6++lIRCHJsDNenEcmK63UOxgvF+AvxlD4eHDAZ5mg2VSHM/E4WynKUncC+QqkT8XGKC i4PtL1De4oSeQpB8VsLr+MGGNaf6svFE/FIHX5guoHHN1HGfQxbHnkL2EHeZOnGwBaJY/h1E3km Tu6IZyEkqlLB7CSstAe9CQhqijBG3pp2zCH3q1EeW7Htp8mWD9+/iEeUdv7ksq13SdoFPtvcE1M jTKPgAtrIKdj85HsBehU8l/4wZ9nH+RBGelvOX/Z8mXUXyEm7OFO00cOXkwh88e1vCUOBMn8osj Qrhg29b67T4BLfVXHbaVaAIkQf/Ef04HYgqDnCbGh47iNQlS+CVnz9i1/DA/Hv4FsnUAosnwXt6 UHGSBNClVcypF+v2A= X-Google-Smtp-Source: AGHT+IFlC3v1YYZBYn9JkfJx0Nz5xBDWw6BPu2hVfH1sXIWLY5CnUNsKrvc4HAl7fKytpVF8f6F0Pg== X-Received: by 2002:a05:6512:6c9:b0:57d:1082:e103 with SMTP id 2adb3069b0e04-58af9f1fb89mr2486707e87.16.1759416136880; Thu, 02 Oct 2025 07:42:16 -0700 (PDT) Received: from [192.168.1.166] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-58b0119e60fsm884712e87.94.2025.10.02.07.42.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Oct 2025 07:42:16 -0700 (PDT) From: Marcus Folkesson Date: Thu, 02 Oct 2025 16:41:35 +0200 Subject: [PATCH v2 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: <20251002-i2c-mux-v2-4-b698564cd956@gmail.com> References: <20251002-i2c-mux-v2-0-b698564cd956@gmail.com> In-Reply-To: <20251002-i2c-mux-v2-0-b698564cd956@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/ZANAwAKAYiATm9ZXVIyAcsmYgBo3o84HWKLdePi9d7Tc2PXy/ubOIvh9PDmJUI93 qBA7BYJFC6JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaN6POAAKCRCIgE5vWV1S Msb+EADCHGLcNzYBswSFO9dObGRTq+GinFNvJi1Xknuw5pbEsMWNSeUHZO/frQMkN2WBh/bZXPn avl/25KjZ2kLk31+G3MYQoQLfJ+rF/Zo9h1JtYZqtbVlE5PKYtbWIaUaw1kl/d0q5HKMt7YHL8r Da29RmFGTWQ8uJKcUynIvk/VRZPTHehK5lRo/D33kuSZPtQ4lzHJ6Pl9aEGzegukAi0QlizBJyI xhl5Yoq1gsRdJjxLZvL15jX0Ohw9xc3mvkL8pSRd92zB5M06TZX5B5Q4w/+WydkgWrpBjzSocqX bh+Lzq30gHjtmDitCM1WL5BSE85Tize4E8StL6gO8A5RxkmcZX0RUxYorO1vIgqIh0d1+Pn0rQ4 k0kPZ7ymJ9bt/Yet8S/qfkpIZmEkIGHAwGPphM3wXnYr6yF6oYXg4PaT3c5swKe4y6jeNtc/Qsx 57kT2Q77aPPsW6pjPVrKcNaKsrJa3Ub0raMYm07sWvUnJxAry9np3ViFl/jGMZ2VOsf95NLcpLQ 3CGiwzg7UmikygJC6xwPKFtsUKqsiiMZMRUslJHwx1dcnxXtXvWHapivkPIENm1VVhLb3u7+UMP 6i+F87YEJilujFQm+zW0rBIjuOFvd9To6gLjrveIMlp5TojCJkfAYq3wnAkNfHEjLAL6nfxIS2N uWqLK377NiLQPow== 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 Mon Feb 9 04:29:02 2026 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (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 4822730DD32 for ; Thu, 2 Oct 2025 14:42:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416142; cv=none; b=K4+bHcGECG3iaA/tM4gGWPfNBXmqazlqnYZCrqrBiSIK318EzoVtqhMYW7/0Z6x9PTYbFxxqzf6AfrPnAsFrKq02kriS4AKf7s5OS98YYgRvzcIJj6p6tRETdmCWfs3FBYoZOVSbhwS8XzhLq4CwRQqe7aWsSGKmMYJblPNPkyk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759416142; c=relaxed/simple; bh=RcFIrKoSgnto39HXDCzkc41AKHrLdxTXBU7nIzeA4ck=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HTpFdxPjL3ENsyOGX4qmETt3T36i9qsptcA2qYOfr5zQxHWW8/lw3gnm/Q/9uL8qcwpx8LKRxNolF46jkGNdvp7qeDH6bBdJdIvlR7EMGbB3oMCLIuYhkpF2EMyS0W4DBh6cqWRCgFSB51CTOlPU+hrj7ze4Se67v3XOla+PXQY= 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=Q9KfRFI+; arc=none smtp.client-ip=209.85.167.41 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="Q9KfRFI+" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-57e36125e8aso1078276e87.2 for ; Thu, 02 Oct 2025 07:42:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1759416138; x=1760020938; 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=Q9KfRFI+V4p2NrutMaXfLfLM8EgNpNyJZp4pkIibiCL09hkFLiiQTzzMMBG6Jg7tQI r/YAoSDPZrMae77KxBoAezTfDXyQ8ZIX6t9Xq5phkBdXKEGvihIguOXasg2gCpCPrKxT rNBoWn22NYHjBabQ50lQLxmk77Ad2CMIH6K4KbbjtmV0oEVE6Nk4vQQFGMdyNf85gN33 IUr8jfIsFlz2yl9c6mpB+tcMSfVwauunObWILMzf33Pj/vPkAkFQkYd1GsmpC1gJqFkz KtHM4WNG3tNF5QgVzXgKgdu3kOW7G6MJcJmk9LnTIOUQ1Ah9FGXfGT76VeKSp9bMgTSb m4Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759416138; x=1760020938; 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=BX2HjrqwfhTeYfmJ3qPzxrwA0pFoSq29jkMtQGxGJjQhkWI9p4n0ImConE6VM3wMNR hjPbF37yrjfFrjtGmT6Ho2aSW5gc3Ck83OnGcIQ4MIZHdTbSliM+sBSN/o6/kS824vB0 cY4VHR1YnX4uZmcW4wPj3zBARqEbNwx+head3HQ2ByhGPnwa8GIjeUxuBMCJeYpNKYW6 nLx4JNSLN9400O21Ss+SALYemUX/iOSadRp2EgKgewr6OeLzE5zfZ9E4SoEVATh5EmDG INNeEvj2ZWSIT+jTgHxWJ2fnd5Zq+Od2tMZ48/U0q2FsRbHC7PsXzHfOhbiC9jcOpSoy kXQg== X-Forwarded-Encrypted: i=1; AJvYcCVuLgpyveJA/Sq0m7XCESRLZDFtcOk19r0loLtnVZu5jMtS92aSIOIFRvwkaMU+XersccYzIJHmnDKN/9s=@vger.kernel.org X-Gm-Message-State: AOJu0YyEaRpK+wKX4PgkeCka9zKdi07cA6DB9r32sCyT39c2zzMWyMYh usZOR34S9CmcLAShozOcj2oOKYnnCAL5CHX1+//6IQsZlhD8plRWIvMV X-Gm-Gg: ASbGnctriWyPP2S0lirBU/GCjW+OV8718pP5olLNtIkjo9uRTX820mZD7VIQPDebQnk F9j+/Im3ehez7E50JuzzvaEjkSUBgHT7fvcTRb319kJFpzLmcjOo6XPcWXRbMkc9aam+WPGivAb m58Y+2QaxfITdzF8sADHWy53hC4Liexj/qGNUgKkWbPu3/8FTFuPoPozOc9Nyxrm/Qtkt5Yjgf0 yRsZZqGGdl7onrmdpv/7eXTqhXGg5qKyl4g1hoGEcWRvy+tyESeK5vImFLiwNNiVrY/10nB0WtW 8cHQLMVK0PBndbWY1R7NRDlDV4YWWvGiCnIG28b0Q7vQNaUC8VBYSh5tATkfIRlwpl/XwEJ+rMU RkrbmO4A2I8O5z1YR50IrpiGE1glpB+8zcXRB1eEoSIIji7V7bO2XhSNibp6oPRwLYEQO+dxl4o wnHMn/XMl+W/zCuKPNb/4aDMUj5w== X-Google-Smtp-Source: AGHT+IGOtzlaSk4pcU9eh33X/Hi+M2goQksZbtKwAH/v2LSHcSlzpXGeAeOPN1PpfWcqe7I4kfeXnw== X-Received: by 2002:a05:6512:2356:b0:55c:d62b:d0fc with SMTP id 2adb3069b0e04-58af9f0f3cfmr2665238e87.10.1759416138032; Thu, 02 Oct 2025 07:42:18 -0700 (PDT) Received: from [192.168.1.166] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-58b0119e60fsm884712e87.94.2025.10.02.07.42.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Oct 2025 07:42:17 -0700 (PDT) From: Marcus Folkesson Date: Thu, 02 Oct 2025 16:41:36 +0200 Subject: [PATCH v2 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: <20251002-i2c-mux-v2-5-b698564cd956@gmail.com> References: <20251002-i2c-mux-v2-0-b698564cd956@gmail.com> In-Reply-To: <20251002-i2c-mux-v2-0-b698564cd956@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/ZANAwAKAYiATm9ZXVIyAcsmYgBo3o89diRzxaElr4YwuimquAd0U3fRuYUfF6kui ED5Vph5J1CJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCaN6PPQAKCRCIgE5vWV1S MkfmD/92ZWCqZ+QbeUVymKqEGOTxJKzOoYBSjuURXjqmGPk0f0frTtk7kloYMLTIVVzB1zxwJh/ vBq4l6zRtFShK/uC42KCcnZ7tKup/o9D9IJxO8KBECwFjn08HowEAP8+EsBP0LiL4qrMrcHjZSM qNJd+njT7tz+IOxrYeDxJyC4XYNcoagRR09VsoJGdBp0oKHNUr+fsqiUwLriErQrBbXN00xId4l 9FQ7qiwiAuUSN8r/3EOMRUFKBJr7CJA0q2t6ImDhT5wGMCOkdt9xjrgXHd2EuG8NVayOtIVLJW+ L1/99h62x3xYWbf806rrwdvzUBJ6XTGlSeAMOhNR08Uu15egDxcyU+f7x3+wDLd24HpTLqy/biK JJPwATk8+qUgJtOBve9DUG1ApYnk9vUnxwlcmpmeR5buV9uwaM9R1plIxEnAemVNADW0zIlweKN wwjJejhCDwmb+ztMoxZ4XN/R3kyqXXMJOftsFoN52ETBLHZDTtvlj2XzHWs/xmHZPsBqDKk5To+ ZPEn/G3Yil9tf0QuQhMVXbWVx+jx/j9d+fEnwtsu/T6N17u9SMiPWBjHInSXfjBBalVEXYctDyM JX9htBROmH5/E/pgtErT+JcsmdshvrWE9TmP7M6SCA0ZDepW+trMReOwtdf7mcnfdXRkqDRwCj8 OHStS1HZ5zBHzhg== 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