From nobody Sat Jul 25 03:46:07 2026 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (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 119AF38D6A9 for ; Sun, 19 Jul 2026 15:17:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474243; cv=none; b=tLVDlAzShM7hEdlqUGDWuA/SS4EZfbO+0G+2CV3R56O58TCw2iiECx5prLAx8u9llD8jYY4ud8TQ7+f3FY6NCc2l40Jl5/dYl0N391JB+jnai0eQlbUl7jNT35RewNs39uoXGJvZ0sEHP7z8yW9c3SAwISfWrF9qYBGP5F3n+bw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474243; c=relaxed/simple; bh=QuvLqztu7n4x7VS9RDk6Xi06jDDy2Ub0BO7TJXiOzLc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lz7GqvgCLVMq73sX8vnECD5QYDli15wujMGDRLtrLPTbnh5QngrRylhvEO12TXeKcZeJFIumaiMYyzBwBEqCWOl8rAsOL1hPurOZ41saoEz2J6dUhHY44S5CNEadQ3+GoO3FK6jzD9RMOJ/j19OJubVuPwR7aUX52dvgNMimOxo= 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=mKoLkpJq; arc=none smtp.client-ip=209.85.167.51 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="mKoLkpJq" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-5aea0fff535so6779295e87.3 for ; Sun, 19 Jul 2026 08:17:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784474240; x=1785079040; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=1U4XlFDnYXrurhy3P+gmuMmaOpCiuKFSkl/ypZyvgd0=; b=mKoLkpJq/tX8FNamSe5JJ+plE2xAG0neyYUZFsgqZO+WHk+yLEaBaF2l7GEG/rwYCy KV4gWgnJCKi4J/nas36hpjKaz2XWHhfiRTQVtxtw/vP6ors/3Tkjxz8dPnrRec76pPf7 TL8YxXrmZ1cZ9/lc5MJakGXKiML42VTbb4kCKlWUYOoSRAvsqBrVyVeQ0x8U3jqz3Jr4 4Jlbz2GyRFjiFnfQOqg7sAlocGmTZo3X4pQzYM8K3Mwxf+Qv2Icf0uXnWYp75dA02dtb HUMqjSXfm/TI+fOg4IMxVxecWTCiQgV/Iq2rBMGz8qEOy9irraPt29fjQzN/7cdJVXmT iYDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784474240; x=1785079040; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=1U4XlFDnYXrurhy3P+gmuMmaOpCiuKFSkl/ypZyvgd0=; b=KwGEYoshrS9DbDnnox6DYD1yBDNsrHpWDW9Zzv0Yx7bnxHUx8Dp20ita68fDLJYUV5 CBMNlkkcja7pNo7NevUmudmQQUxDBADSTQUGsk3NdRVEVt86MZOQ5iKJ60e1TPLVBdnn VeXpYaJuWDToBTjkaBO+ZaIoYHoNWBseJR4q7ACcz7XVV2bDgEyf5VrX17upyWsXBjRK u/E5Pt019sGcuejeii5AjI/TXpyK8iOcsf2ROEoTCf7WVHh1ikNVrPTzZLIOctRfJ6YZ yfDPUCXhWlqxFLvNjOnE5yzJBoShJ1HgNEgT7+Q7qsyCzWKs8k/buRQFKIHbVFryY5km s6Ng== X-Forwarded-Encrypted: i=1; AHgh+RolHgey2QoMBjoeMPKT5sYyDrErLMD6xfcb19qNBaAzKF3faJtTPYbewpNdAbWH3FVl4nnkrXfDMUEQLr4=@vger.kernel.org X-Gm-Message-State: AOJu0YygScGXiSZ77fFS/xh0tDc8cAc5POGaa7SEvlMcBqK1Nbf9Aqel iBTtPi9VntOgBVLvbotKekVKbXYw/P1qzr01DHJmsm+Gy165WV4IpiTN X-Gm-Gg: AfdE7cm0qcGM4RiX+HBTIY4yzXVRmCCCUgkINCKaJXtXv9UIOurRJZKHABDaO8mK68w eWmJ7moo1kg5OMNGbp52FqgGi0vjusDEGaLPql/aST6+mXUMNasn4w8+/K8XenC2EYlfeK5PQLC PC0AdFXc7fHpUXPV2ZmD5boBPxdIH6rQEbARKZq3ByB7G/LFFxLAokc1mry7SBS4Tg83TZpdkPj 6xrLs9hGFfwsvOPrelU71eNa7BXu+1yEvTgluVbQMCCcW47a1g6xjaAUBehkjgxhzV2YP7+tQzo pRuOpoe8qoXiLEE98EAc1euXdJr9n0FVObRh1phwzm5OlV+p0t7JfbOURQFAa5JCp34EGs5VQKs hLl+u095wZQd8t91T7q3ZJKhAAT35xOaMBTXtKnU729IzWghOa20QY/yvx/FiTHYSzCNWIq/3Hj wC12iCxNoLLGK83fvzFl4qAJnLOp7oeOTAAdP8nHr9wWEDDkA6KjHptTEa6Q== X-Received: by 2002:a05:6512:3409:b0:5ae:b7ca:33ec with SMTP id 2adb3069b0e04-5b28f8550admr2242374e87.9.1784474239934; Sun, 19 Jul 2026 08:17:19 -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-5b291e26e5fsm1835096e87.80.2026.07.19.08.17.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 08:17:18 -0700 (PDT) From: Marcus Folkesson Date: Sun, 19 Jul 2026 16:59:44 +0200 Subject: [PATCH v12 1/7] 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: <20260719-i2c-mux-v12-1-a5010d623a57@gmail.com> References: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> In-Reply-To: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> To: Wolfram Sang , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski , Peter Rosin , Peter Rosin Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1705; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=QuvLqztu7n4x7VS9RDk6Xi06jDDy2Ub0BO7TJXiOzLc=; b=kA0DAAoBiIBOb1ldUjIByyZiAGpc6najychFUf1agn36NniRGFSMFQTWS59H+RmRjFSDFoFh8 okCMwQAAQoAHRYhBAVRoui2bLVNZMEsZYiATm9ZXVIyBQJqXOp2AAoJEIiATm9ZXVIyTIAQAMqm oQTG/BYiPkxnvB1hjpW5LPGujoqnOYiOZ7JZG1+ZmTAIb7as+ULc4C181rfnZFBZI60dg0hJW3C T2NgUzSnILXybiQJQ3oC78FNNtSSsSZUaUGwoWGRwUPk4IZ2Rp948QRpT30tQOcvh/POr3/ZPFE RQ0at3I31K61u1ZEvyhB45ivjNr9nnKNyUYbM6SgDh9c39fPxEdhdpdQmlQwzfTiVB19+URLGdB FoYMx28SDUNsSsBkQzJOe3BQsymLGMIyBZZcH9a9cmke2K3TMuPfLe1PfwqvWq5x02sANaWvv0W CDpVvXE8ojEaN/AmtJZeKe9XLqD7cTBG7UroIpCP0L2qG9LkUuavgNGiRKOzJ2eOstao5aXvkmC sa+mDEeLTWWqHgjN7kE0kuF8L52hjZa9Lmu9GC1eScm+nOIHwyUfoCiRQBrj2DdwGeywj+gxkRa Y7Xok1QrGlWhgNdcmMbR+qAfEIjQ5K7XTaQhixXl6MApMffiocgLC9w2/jz9D5hWPtjEsXMSGTN XNRv2jTNrVAHG0MXqUrAOXgXn9cCcrpG0GXDCef9sSiKyqS2pzL4FtcHQN6jRtLNz/MaOaP0URd 7hGDFryHH7YviZQhD2/BFly/wvZtpI6ik3d5TDx1z/e4sl1XiV0JRXO5PaWVNivNM2090xJZzpl lzdrH 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. Reviewed-by: Andy Shevchenko Signed-off-by: Marcus Folkesson --- include/linux/i2c.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 20fd41b51d5c..b3b0d16b4ddd 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -729,6 +729,9 @@ struct i2c_adapter_quirks { /* * i2c_adapter is the structure used to identify a physical i2c bus along * with the access algorithms necessary to access it. + * + * @set_clk_freq: Set clock frequency for the adapter. Returns the actual = set frequency. + * This function is optional. */ struct i2c_adapter { struct module *owner; @@ -742,6 +745,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 */ --=20 2.54.0 From nobody Sat Jul 25 03:46:07 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 41D592C3245 for ; Sun, 19 Jul 2026 15:17:24 +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=1784474245; cv=none; b=icHjtbCnpN8VgmNCy9SVLaqORh69Ri233YKpFYvqGhwOocXcYBwr2DA0+ynSvC4DYEcFect4Qlco2V3f/6KCoD4lEhFw5yj0VwzwsYuJsPKwiZMw5G3/CFVayG6Y0T42t9FZ3PYidUK+FCQRurPCGHn5XC5M/ueWRRhCJUy0leU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474245; c=relaxed/simple; bh=y4CWJt16YdZrTCn8rdj1CNouLpjIWr3Jrm21zLmgNMc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mNC+Z0NJI9blazwqpRDfy3WLLLF1G6y5HPLmFHlNr7pLeklJnuJ5/IG+9PEA6gzp/sTMz1p3Ni9WmR3fU9m1a2fDQ+f2bgY5r+mVu5BZcW0EvlzTflaSSmExQcG1rrTEkVjcVDFqJss6umhlM/5JNyMZYz8j1/06dC93PraY3Yg= 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=IxywBAR1; 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="IxywBAR1" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5b28c91fba5so3466762e87.1 for ; Sun, 19 Jul 2026 08:17:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784474242; x=1785079042; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=/8qLIUHsL4QgH657kTC3Y7xhccUy2MxOta7XG4RiyEQ=; b=IxywBAR1FgiIhjb1MO+wyTiZAY2GlaH82I8V+V8jl3oOlgS1Q1gRRGA3bvamD6J6xt kXjaVLdO7UjVIGesQ4hHMgfES9Z2I/RDDkC2Pbj2fkGaS9QmGJJnECr/Tfi9M2DG3pLF YEvRnWobfSAdn8Q7L2yWXjXnR4TR8RO9HjNsMsi1VNUxfsEfAlf3WFtWH6SBl7aVWdKZ 0KZwqCFgG5bDv5HmmUKkbMd+qsOaNilvyA/L/ZDUW+RG6BD17Ij2p1p8D9CtUsDTRLK0 ob4QmA6hTOlTKsV1l3J/i56QFVLXmh/9SCOvr22mAnqqhnziU1ctL/sEDqcXnSZUrazX ijwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784474242; x=1785079042; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=/8qLIUHsL4QgH657kTC3Y7xhccUy2MxOta7XG4RiyEQ=; b=HFTe5Wql7BETKWACPti235w7RWiezPlOuhk1ZJ4sxaOdhGuBB0llVc88Mzk2zhz9cF FlP3mS7ltcqhBuaUS+JZ4+5Jg+KsJ8tmtBMZ0NASoekYrIWFVR65mkgQ4KEC8Rr/6Zuw 6AXe3ut53jRUYlxR5I3KWneEBpN0X+5PjwtA4cf6/RxvtA+NFZYxvbLL/YY7Xak3tmyR 89aPc1Cd5u+X8p93UzS4W8WXW3AomzyU5qqMJBVz0EYNMeQBVrPoQjPN/NZvyaMs3alP Jl1OtgzAzaZq0jylDTN/juL4NDX2QMTLY+ozdA120UfE3KfOfHtJlEVftF9vaNekGZJX 72vQ== X-Forwarded-Encrypted: i=1; AHgh+RpACmI4pxYyurkaXD8SbvqZfTQ6ojmXss2WtlIEDj3ELnYsVgxkI1v8oQJvKkpuFWui7vXg5bpzqPvDRjA=@vger.kernel.org X-Gm-Message-State: AOJu0YzNPoyQ+ej0QfBzlQa6yPmYoIjf3Fpt/sy7ex5cDndZsm1wZmRe l/RJn1dczLtHqTRTtBz4CPbkQPhDrH0POjZd00BrVpvbCis76lTNklR4 X-Gm-Gg: AfdE7ckdydu/0zbH0Od4mK4uBb2yZ4DxAzyXj/RBQK4ePUUJCRUbCE1iLDLJsLorteP 1QAAT38yb3gG31bFrdR+/GcRdSqWEaMRDO3z8Yn1gDXCNzycxWvXSTR51QxkqOCGTkQtfSyIj2R S2HXeA1m71SKrktw4jr6CM6UkGbSVECere0ZZxA9XXU8itBX25CNZ6tKKT8tmZhpa2UYOKWoGEM 7AwJLV7VBIWt23vL2i9UjFNHSx4l6jEb8Z0IIBr8Nmr4iWTS9JKSqcc3s0spBW5A7p+bGMLKFO5 FcYxvAJB/iWuUxhv2VGFJ+uI695z7Pl3lsl6+27+KfZbauOkdqy2l5M71xnRR1qIcjlr9NjBz09 TcemrxdIkbcuRrsnp12UuSdf33mvtldbQmHspZb/zfeRIA1JcN0SHD7qt0OUIaYiww8kBeUcz8C 4ZdHLSzhaHKlU9rJs7KzgQNdqcgxXYzIjftmkvnvaF0w35kH4= X-Received: by 2002:a05:6512:608c:b0:5ae:c2ea:b3f1 with SMTP id 2adb3069b0e04-5b28a1681bdmr2552035e87.10.1784474242005; Sun, 19 Jul 2026 08:17:22 -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-5b291e26e5fsm1835096e87.80.2026.07.19.08.17.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 08:17:20 -0700 (PDT) From: Marcus Folkesson Date: Sun, 19 Jul 2026 16:59:45 +0200 Subject: [PATCH v12 2/7] i2c: mux: add idle_state property to i2c_mux_core 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: <20260719-i2c-mux-v12-2-a5010d623a57@gmail.com> References: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> In-Reply-To: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> To: Wolfram Sang , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski , Peter Rosin , Peter Rosin Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2781; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=y4CWJt16YdZrTCn8rdj1CNouLpjIWr3Jrm21zLmgNMc=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqXOp7WFi6OrXLhmafy952YX+tICQUAvJ64aqCl Vj2SS1Nh5qJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalzqewAKCRCIgE5vWV1S MkUvEACBhKgPGGuR3qHycC2u24eW23zFyI1Ka1kJ15o928/alNJoCF3E2vkSsJV4VO5HlIYSk41 zqiZk/1/NYlEorRIdrRZtru7cocnd5lvayoiFDAHbbnDagGn8dATvnwbnNaRS68e/fs2hatNr7p V1TC1e4Md6L3gecHbpOafI2p0RCVCi7z0Ashi0+vkc6eNk7up8gDQQ6nq+vHhWw0PGGL3WWqkxx vIQCC2JEr+CkU5+srA5H9HXSJIe/L6Vm6cPgiGPv/A77TNNsqhsy4694qp56yMbqNrIUh+H49/G zFIZcV+ObnEU8tPDX26wQp7O8+Oh4dpHMEy1L+PdgjcHkZp3bI34jol4oTMYDz5A8QgW0OikWNk 2GKObd44wxpSQP+ycs/vbJGz4Llwzc/UJqj5fpwmgrgVS1GKgJccx9J+dRo0OR+K2v3jX8eS1yK ++ZnzcuP2gDUocLAS0bQBvGXgbesOHGLeZd9ofSaS1VmzPNuJQfEXQBYgi7iCfvwAs2247KZ2MP E8KDM1988ewRpD5W7LXCisjddvDw1saTLeyE7lesX1A4UWvar614kDCgua0vf2nZTYdRE/1s2V9 jAc6Ne0iJa51R8vfiImtgKzfkgBlO7B/S7sDmf1hcTFpLM0aKvGbHSZ8ubUgwi4Nqa1nkqCzRQX dLQM/h0YMYzrSKg== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 Muxes treat their channels differently when idle. Let the mux core have this information to make it available for internal use. Possible idle states are: - I2C_MUX_IDLE_AS_IS: Leave channels as is when idle - I2C_MUX_IDLE_DISCONNECT: Disconnect channel (set HiZ when idle) - I2C_MUX_IDLE_UNKNOWN: Unknown idle state - : Enable channel n (starting from 0) when idle" Default value is set to I2C_MUX_IDLE_UNKNOWN. Reviewed-by: Andy Shevchenko Signed-off-by: Marcus Folkesson --- drivers/i2c/i2c-mux.c | 1 + include/linux/i2c-mux.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index 681a201c239b..b126ce7338c2 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -247,6 +247,7 @@ struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *= parent, muxc->select =3D select; muxc->deselect =3D deselect; muxc->max_adapters =3D max_adapters; + muxc->idle_state =3D I2C_MUX_IDLE_UNKNOWN; =20 return muxc; } diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h index 1784ac7afb11..a348f81e7a90 100644 --- a/include/linux/i2c-mux.h +++ b/include/linux/i2c-mux.h @@ -15,6 +15,10 @@ =20 #include =20 +#define I2C_MUX_IDLE_AS_IS (-1) +#define I2C_MUX_IDLE_DISCONNECT (-2) +#define I2C_MUX_IDLE_UNKNOWN (-3) + struct i2c_mux_core { struct i2c_adapter *parent; struct device *dev; @@ -22,6 +26,18 @@ struct i2c_mux_core { unsigned int arbitrator:1; unsigned int gate:1; =20 + /* + * The mux state used by the driver when idle. + * Possible idle states are: + * - I2C_MUX_IDLE_AS_IS: Leave channels as is when idle + * - I2C_MUX_IDLE_DISCONNECT: Disconnect channel (set HiZ when idle) + * - I2C_MUX_IDLE_UNKNOWN: Unknown idle state + * - : Enable channel n (starting from 0) when idle" + * + * Default value is set to I2C_MUX_IDLE_UNKNOWN. + */ + int idle_state; + void *priv; =20 int (*select)(struct i2c_mux_core *, u32 chan_id); @@ -38,6 +54,20 @@ struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *p= arent, int (*select)(struct i2c_mux_core *, u32), int (*deselect)(struct i2c_mux_core *, u32)); =20 +/* + * Mux drivers may only change idle_state, and may only do so + * between allocation and registration of the mux controller. + */ +static inline void i2c_mux_set_idle_state(struct i2c_mux_core *muxc, int s= tate) +{ + muxc->idle_state =3D state; +} + +static inline int i2c_mux_idle_state(struct i2c_mux_core *muxc) +{ + return muxc->idle_state; +} + /* flags for i2c_mux_alloc */ #define I2C_MUX_LOCKED BIT(0) #define I2C_MUX_ARBITRATOR BIT(1) --=20 2.54.0 From nobody Sat Jul 25 03:46:07 2026 Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 730833A48F6 for ; Sun, 19 Jul 2026 15:17:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474248; cv=none; b=buZVzKQXctY/+PUyoAUeAbAHNv+Zk5+0mrjCMNN0WsX0+EFhGNduzrbMgVtb+iKHOuq1hNlPI/8HduTDAvlvl4bOWG6wgQqEooOgojiBxgy7NbxBKyhfPVkRHuZPczt80bq+7LRq+kjEOTFYLh48w9OQ1ZfiVrUWxbqyk4oQe9E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474248; c=relaxed/simple; bh=YG8BYZkd6HTx8BUh6LrDh9EFQErHmuXWXTr5T30njJQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f34JvruRHELezOFvQs3LfMizYrKiuIBeTOWpkpyAF5bcSGA/fMvRD/Zr8JfqpYlWsQfjsy07fmG02ve3d7qABh8cgfzP/YhxtLodMLB2YUx5i1KErV9OtrFg4lg+2tnDj8Kfp9qpePeOvAdaXMkbOrEW8TVTpjOpPvACEtx/7Rw= 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=VAcheaHE; arc=none smtp.client-ip=209.85.208.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VAcheaHE" Received: by mail-lj1-f181.google.com with SMTP id 38308e7fff4ca-39c9a3acd40so62865031fa.3 for ; Sun, 19 Jul 2026 08:17:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784474244; x=1785079044; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=pZbKZC90lt57E1POL/jmjWN3NoQ7bSkmvoquyJ2AsB4=; b=VAcheaHET60ysoNMoY/HqSH1X0a9xP7uMfQzqtRNyGhdV0YBkJB/att6hUzurvxr/s PA9tLapC5LGbuVqavKN8UauoZG9LE+HPLDVF+YcLgoh3WicBd4CkM6l6Cc6kOZrtmxX8 yvTecD2w4sd5v8gBJyTPxxcUgUOZPLspIan6Zyucg0R7HgWjbTWZyhFURGoaTOqgKJdh XmETY4ZAXVzdbX398Q8ZiUS4YLWBQsarWDW0sqg520YRiyxfCiw0m6Cw5CSybJ+TKvpE o9qNqyjvNscFQHsLsog+BwLQjpmO2yuEPlAg6d335dOnlND9wr25WTUXyxhX0QNTwrQ2 BB6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784474244; x=1785079044; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=pZbKZC90lt57E1POL/jmjWN3NoQ7bSkmvoquyJ2AsB4=; b=nH78yn7BYgYwjs7kkYK/rSoxxk0+aYwvi3aZbu5ZcDpxbc1ZZGaQee40VbHvkcKMIi CvAB+RbrTO+6Zh43VJgGtXWZw/6eBx1BpNoxFdV9Yc2Kn0hEwBwOa4cO1yVnUb+ueR5e EQUtt2glOHlVJsX/8NbR+CYJv15Mw6REdU4L0KZ4iXSJCaTzpLa0+LMiVr1ROTf5DeRB RG5Xr2jBOysj5BrlCIFGbJ1ttLbbWJzt9j4DudUjZvLsu3CCWUgsauNyyBUrhw6+jHEf e8lwk/wSRwk0ZHucBHgwYK3P1yok6rje7QuPcnOfjR8fxppn9pgth5IoGmz77FTWqrnW eMzg== X-Forwarded-Encrypted: i=1; AHgh+RppeqPy/PksICbtYh+3RAJLBbu87kFEJSb6WjlHi0mrD05iyH8avjw7szsZ+4R/lcqnwvsgQrnR3au0XBM=@vger.kernel.org X-Gm-Message-State: AOJu0YwzLXW9I7dGZFaKAB1OeDFmCrVmkXTPBZLrF/3JpbZ7Lrxpdi// 3e41y6KOpb987bLc9Kys9ifhlqAVaaxVDz2LEgJVuuUWdEnmPYnewX+0 X-Gm-Gg: AfdE7ck+zTWrFByrvI3eG+GtXy6qHMadZBZZrzuFmTFuLZ78N5JkMDfVT/Z3C/FCkiA hSvG5yFuDPtg79zCRqPpMlKUFB3Vj9bJ3N664n0Cd/6/k6ojvHxHP2x+ypZiAocETz/f0KBHvSW aK8Hn94GaAqT8Kbe2uAz6jHNDifriF2lf17UIt/KtC0UncAAfghod7rl76VZAlRRzhyMnkfk9Xs fLtI3nmL0h6jPUtLA3G5vZPhmF/6OWc5Ty/eO/xeJqUzX4XGMJVETOicM+qALd7obGlT67r7OaU asiMWmTIDXiHG7JOUTOMB6KE3Ij11acRJrGuOj928MRUYIjImlahNk+lLMLMjDHiRDkBSHcK+ge t0AzmIZc48Tyv09MjiJuiaCT9wc2/KaUZxi3Yx0+i9UgkyMKu+CEer0MnP/Kj23J85ZQqkxk0Kn lHmTpXDwaIIa4YjE6a/UfoheMXiCvq7EzM9vo/IsdkiQ3O/Aw= X-Received: by 2002:ac2:455a:0:b0:5ae:a9eb:eff1 with SMTP id 2adb3069b0e04-5b28fabb075mr1708930e87.58.1784474244144; Sun, 19 Jul 2026 08:17:24 -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-5b291e26e5fsm1835096e87.80.2026.07.19.08.17.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 08:17:23 -0700 (PDT) From: Marcus Folkesson Date: Sun, 19 Jul 2026 16:59:46 +0200 Subject: [PATCH v12 3/7] 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: <20260719-i2c-mux-v12-3-a5010d623a57@gmail.com> References: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> In-Reply-To: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> To: Wolfram Sang , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski , Peter Rosin , Peter Rosin Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9225; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=YG8BYZkd6HTx8BUh6LrDh9EFQErHmuXWXTr5T30njJQ=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqXOp/KZnLcuCWA2pGTPKguNRXwtXMkauRDwo2H maddf/ItWGJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalzqfwAKCRCIgE5vWV1S Mo/FD/9Ulecov/E5wbrfvNooC+4ObhgHGozcDB69wh3tQzASRrc+cE7YduB0EeCErzULHmy3QVi YEngNnTlT9mgqrI2CwIRh/INzi/sGc/XrbrM0YkDJas9gZfO0/TPQH3iiOs/LlXrDCT6h6mErVg mj2pX2v/wMcg02opxNjPkrzTftYx7R+bbl1r5y12GfQf623W5Dx1h8hWVNwJW+tXZUeEdSRaGD3 7Qab1+/0wFiJlUit0E5MsM1RyYHeMW9jZn1lx5oPzvo/pcqaWqd5ZQhy9Oa5ZroYir4tbpjYoTy HMGtzaMFAD3nlLAOqPsT2HCb6yOCHK1q0pZIBQWPQH1wVUT96vGU7aRsPJwXBQ14IadE7mPHdbJ 00yMQgC4FsxFS7tYgzrF6cs7VNfyXsZ2d8lWHsffSsz/eGir+zDJ6anrRI0xsVLO/u7JLphSljP Ea3n8QPvzSg2gfRyCQNH6Px4V0cGtuPvjcMBESKW5MthAZZLp6aTpUjp7coPmj7hIrwgjouJJvA i2U5tTeTUpqrHMsy9DRmrTZd3TXZ/x4P3rgzgcwWA0LsByWbMipFhzc6ST7tZiCm7Sv6RoifZ9l 01R64dwNWe21DOjQDP1RngXPfg81GqDP2+CuHU2ntjtztp/3lsvnb9TXH0rrOPgKK/xVoxYzsmq 6nDlbkU+SYd2UiQ== 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 | 161 ++++++++++++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 149 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index b126ce7338c2..00de5f124132 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c @@ -36,21 +36,118 @@ struct i2c_mux_priv { u32 chan_id; }; =20 +static inline int +__i2c_adapter_set_clk_freq(struct i2c_adapter *adapter, u32 clock_Hz) +{ + /* If the clock frequency is already set to the requested value, do nothi= ng. */ + if (adapter->clock_Hz =3D=3D clock_Hz) + return 0; + + if (adapter->set_clk_freq) { + adapter->clock_Hz =3D adapter->set_clk_freq(adapter, clock_Hz); + if (adapter->clock_Hz !=3D clock_Hz) + dev_warn(&adapter->dev, "Could not set requested frequency. Requested %= uHz, got %uHz\n", + clock_Hz, adapter->clock_Hz); + + return 0; + } + + /* + * 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; +} + +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 +158,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 +180,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 +203,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; } @@ -363,6 +463,43 @@ 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; + + if (priv->adap.clock_Hz < parent->clock_Hz) + if (muxc->idle_state !=3D I2C_MUX_IDLE_DISCONNECT || + muxc->idle_state =3D=3D chan_id) { + dev_err(muxc->dev, + "channel %u has improper idle state for this configuration\n", + chan_id); + of_node_put(mux_node); + ret =3D -EINVAL; + goto err_free_priv; + } + + /* + * 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.54.0 From nobody Sat Jul 25 03:46:07 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 77AE1264A86 for ; Sun, 19 Jul 2026 15:17:28 +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=1784474250; cv=none; b=Xk1QY3jdTGVynQrqKH4RB9yP9G3lonvUh1Ddu+iAq5vSgS5qh3hZS1aFkUnW3R1HGEeyKMgM7F8ItsHVSADa1Zv1wa1QS79SF6Ap+FYS2rTDZq8L8LRWn1GrnMe1aK43F/evVwBS45DyQPAz5ihwV3h75zNaOB9p/dlz6/TDuJo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474250; c=relaxed/simple; bh=+XcNRIzkmbYbd4RGr5v7OnmsIYyLQ+F0lGI6snUGPQo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BMvt2MA/CqrnHwGtPuPUz6TY1Z6xMb6WdoRXiMxD16XeEJsGipdzKiIbNrTKWTa7uq95Cuodd6ET0ABpnlo4A4w2XHVvX24GP8Gg+OYTvR0DRHYa8/8GEu6BKwq5SMGdzjGOAdD37QEPV5LOfCNEv0fnf34sNfrs2RZBQ8VrUt0= 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=S8KkSQsE; 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="S8KkSQsE" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5b011edaf7dso8158090e87.2 for ; Sun, 19 Jul 2026 08:17:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784474246; x=1785079046; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=4Qa1P3gWmqXciURmGpT5GI4VZVYIEIGJapqmcZUGuQg=; b=S8KkSQsE6i1mT0xMuvA7h4hN+16TkEAGnS2v4MmecPi/f/RKXLi9JCCU9Ian3uZkaI 6uH16+2lDNjt3EoEZ0Z9recn5DGrGVtHiPhTBwvEqVLcjRhLPanUIcKFl9YVGFEr79Bz DiepJrMHYCnYO8Gt1gc4MNmD24KvZClbAPLhR213XABjs+KSzUqZJpdB6UgQ3A4xvhQh anSghTo5dI+6+hFiq7ZMN23tb/YP19oDX2VBMAq0fohlZdTdVk/R8sq/XpT2qX0hATQ2 erMgvLeXAbBSDRiKYIvyhWrkOfiTC41K84Scr2K35ZGeP/Ojcsu6MFc/fKUGIQe0UePI uP+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784474246; x=1785079046; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=4Qa1P3gWmqXciURmGpT5GI4VZVYIEIGJapqmcZUGuQg=; b=PTS8wgV0h5XparpoJFrEfdTVWonZdwjYD5hdqtlZbNCLXmMB3bk0zYtL31rSkgWL82 ci/rdpg+5GvGKQOEpklNr2X2BgcLO6BvCi/8NlBcLnfCCoRqMpt+hzBq0xY6PLIXpF7q dlLilsVgJGxHh0+i8IXgz6VAtGRyP2w7YbpF/A8oM1o1C4rO/Eb3X+JK5j8wF8GHTsU9 WcBLqT5qXYN8YasCaGThaWrnz0Iyb4UKWHSoRiQtnK4lr9AIJ+CxeePmYCrvImktqCDT +p7N1HuLU0KWHc9ZMGJqiTXn2XEVjpZQr6PkyphP28V/nuYHt7fwxJI3U/d5ibIjtEfc uaYA== X-Forwarded-Encrypted: i=1; AHgh+Ro2/3pmwAMwOkLS0Sxk6obWNUOPVERmkdSN76nkQHwuOP627+pEkAhXQyqd2RQ5DDMD+3Nx/YynPe9ivmk=@vger.kernel.org X-Gm-Message-State: AOJu0YxZoHJNqJCJc8lYuIQ00EITPL+a6wSXxIiimFB8oQmbAMPrqoJ5 /EmOuBcNL8Py57AktC1yHw8R8QYQLUJoQzH8tyxNtpEDlmPNziNIir6d X-Gm-Gg: AfdE7cmInF2jopXgIMka8GesGrsW42slJzSaUcMMeN553ZKY/fFB3hxiOEeSIjDWeYP Qvs7cA3tFh3YQOg7szFpa/xMePy0sHcpt47Uck6CgH1YmOgTSLCM1uye22N52AgpmWkQbd+NhOa 0usI8PBh8i+8FTAO/nQLCyC4vOXErnSVwt/Z0WNazvKA3OZsEhkWowlPRNKlX+tY66p5sL86UGX dmhaTuq9SQDTzePGurlUf6UXxOcP+ChTaXRF5UrkdeXs1pf/4HOAgstsMWIaaeEW0S+pLclnbPT VwQ01lQXft1WWRIXPW3r+7oQavJOsCA7Qpy4qrGSbhRJlqOC7PLgrAuYW5xwo49gBnnlS+OLbVt 3qI0lUZ5fWZO3Q/LZ9r5Bmj7DnLW++GfcA+yxyqUgA2d/zk5aku4G9rDoyVTE5juxktmTJY9WMi nk7QbOljVW/zD8xSGZjCyfyjV/vh6n+LMr0Ypni/EwO5ZpvAk= X-Received: by 2002:a05:6512:1328:b0:5b0:eda:de2a with SMTP id 2adb3069b0e04-5b28f998d04mr2011866e87.35.1784474246449; Sun, 19 Jul 2026 08:17:26 -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-5b291e26e5fsm1835096e87.80.2026.07.19.08.17.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 08:17:25 -0700 (PDT) From: Marcus Folkesson Date: Sun, 19 Jul 2026 16:59:47 +0200 Subject: [PATCH v12 4/7] 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: <20260719-i2c-mux-v12-4-a5010d623a57@gmail.com> References: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> In-Reply-To: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> To: Wolfram Sang , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski , Peter Rosin , Peter Rosin 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.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2874; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=+XcNRIzkmbYbd4RGr5v7OnmsIYyLQ+F0lGI6snUGPQo=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqXOqE/w5Wcpd25qcAvrFAjK3btR4TTYV0g3nYj Q+vQkEjIFyJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalzqhAAKCRCIgE5vWV1S MmWREACFw4mZ0lyDuuMASrzJzBxVPUctzhs1qzkgD7P+hxIwUA+pLpprcm+lx9cRyhyK6rFSaEJ aZr+3zq1YkjlTBFA/bWRi+Cr3OjkFKQak4R4VIXyFugMisWaoip2bl4RkiX8qJUN+I24+0AJlm/ 3ylO6g6xOkN4xhHceP8UyhBw+XvV/RcyEOU0JYVna8P++m2bZ9yCQJqIIRTAccQCjFlGWwo+AXh I8LVC9cDr4B5i9HeznRF106/Xmpc+kt6lO7dxmpgcmBPExT0SoWvDuBMa3Csaif7xrFKqQ9+9n2 9kW3Hz0WdTSkvWt9r8gh59o1EXQDIeB7S+pLDbqPzsv6MhzRiCZUiWsokGkHleo2CUZZO1ilb6N 4hZSiqMQqEPpEX2HaFDQxdldaCl/qB9IVOF78d6CgckpQyugrlr7x+M/hKGVOqQM/XDkBFiSbwd 0PUc86K2mWfmNDmzHVsnfVYpf4r1+uvTJwRyMO5lkXtEoGaeZFhBB7Dj3Fy5rfh7eW9goILdxqQ 4jKFv4QfxyTUbmSeoapiS+n7G+PLBOwgNS38vKBphONvE3rbLLOH4nOq/RUAXPPr5qu10ODxZIh 46+AUK9+Zyn7EwZQeHXsAP1ld+2GTWzpdFZEaUqX6fuFZDJTSBFnnU18LfRDs9fAm5KfKo4Hm2O 7KZB9P0XaDTYlLQ== 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 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index e15eef163a8f..f543997c31e9 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -132,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; }; @@ -207,16 +207,16 @@ static void i2c_davinci_calc_clk_dividers(struct davi= nci_i2c_dev *dev) if (device_is_compatible(dev->dev, "ti,keystone-i2c")) d =3D 6; =20 - clk =3D ((input_clock / (psc + 1)) / (dev->bus_freq * 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 > I2C_MAX_STANDARD_MODE_FREQ) clkl =3D (clk << 1) / 3; else clkl =3D (clk >> 1); @@ -240,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 /* @@ -267,7 +267,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKL_REG)); dev_dbg(dev->dev, "CLKH =3D %d\n", davinci_i2c_read_reg(dev, DAVINCI_I2C_CLKH_REG)); - dev_dbg(dev->dev, "bus_freq =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,7 +760,7 @@ static int davinci_i2c_probe(struct platform_device *pd= ev) if (r) 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.54.0 From nobody Sat Jul 25 03:46:07 2026 Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) (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 BE47729C33F for ; Sun, 19 Jul 2026 15:17:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474254; cv=none; b=dEJbN7g+k8gClPic8l6c1eksvwJQKnQnLzbIK0yfsY2DW61d564uHu/W/Sc1CJNiZFXS/gjyRfllX+ze+VqXoQWLAcbkD8CuZ8zH6WM4zDyhAA6FH4iIa+qfZO0uh3MBv/HIMvNTBgOdOglUMu9ZaKMmhpp8GhZ0uADPOmz5uCY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474254; c=relaxed/simple; bh=0IooApVNJrr/TWFtnF3D0qsEG9K3kvelVRC/Qgvjyuk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jECTAUy6p9iPFdB0Y2hW5kVMYGAMlUxZ5bHOompjbf4Srdnn8d/5le8gpCYtr64zFhtfUwGuK71GbmWmClHzDgAU+zzlvJ50sB5/bASQ0GARtBkh3g+M7RNJePZGxMfYfcPagXQe/eHaJIVruOZq/7sTx3xxWjbL6/2mkOEiyKs= 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=UXgu56mu; arc=none smtp.client-ip=209.85.208.173 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="UXgu56mu" Received: by mail-lj1-f173.google.com with SMTP id 38308e7fff4ca-39c9452243cso57941051fa.3 for ; Sun, 19 Jul 2026 08:17:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784474250; x=1785079050; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=0P1wZkKY3oPnYRFvFJO5fhl20ZxgiT2muLo4/CwDf7A=; b=UXgu56muFaSEcVV+j5JMXBB6fT9yyoNkiPIhJqqwgEcPD8u5X4eV0eV8EDKomfwymR a2j9KRJVOzwH0mkCu7IHOGA9p4nJ4YVZkRAERgrVxgaPppFE84AYzMaBVKdGJrg5BwVj QreE6MYY0sEr0Ju9GYz/CeGD6BIlwJOnxX1IvLVvDWlIu1MY/V89VFGwtgpD/S0bOVUL 9GdMc9jcjEr7LpJrB0tgfVRoll2uULWgH97Gcf4F7EiL304/lTR5rNVIQDNJIWDI9zep l7/PE9UIAdPfTqIX3T1CfL9aOQdg8MJw0m1YHwV12icsJu0Sfh6FYi/k4X0diw0AIX0S da7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784474250; x=1785079050; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=0P1wZkKY3oPnYRFvFJO5fhl20ZxgiT2muLo4/CwDf7A=; b=e3dEeOrqxmdW5j/vQTmXrSTnLfwu+Xcrcfa+ZCzo2WTYZhVGsoSMhA/tADwTqmpn1c vyAKqKBJ/TQQlWsALPSiP50unlNWsntqHsfVFCfsAIje7Ys84UL2Q0x821FhkFV+8+0Z mCA4vHLLTEAZ4UNwfxN//O2pLOKssC+kvckuvcWW0D2NbKiVQkbCcnyA3YgA+k50D0L2 Cg+Hs/DSefw1Z7brJ+mljIIvQLyt5a2CZOOC4t8vPtTCWsFyXGtn5kIXUYAiI05HwN3C yVg37q4wXnI+MfKSGYZTfqvKCw2I0YUlwzj/OiWuFS0nseE1csjvAJK5sTsbOW0bV5Nz VyxQ== X-Forwarded-Encrypted: i=1; AHgh+RqzhJk3a+TAJmTJ3koMCcKHTFHjsOmFaYihoBbKo0QPT9qI/TFDTDLaz7k84JuKwWuqap0D8NQECDqXh5Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yyo102P1MdwrVh7r0j+niHIGFaEBOOoWzyHI5W0gXPskzrRipGc 0L4ti3y5FnOPNJXyq1CVVK/O5CxQi4IgRdDwo1+CJnI/VDcQL0I/Dg5H X-Gm-Gg: AfdE7cmfNfkD1SOaAEKixwMjyQ7es0075dypPdMP0Y51XEuQYrmJuSyZImuLPbxiOzI ZYUAaplzXkkJqsur2ob8FanEBAkm4LVjP6otFrcUDslMz22KB127+9CYo389HwI0dFvY/HjEim7 /YI2rSeFTwO61/FQSs/eyzNxogCy3zlBRmyWiro092NQxoMv4uwMdU5gOc9x9HSLvPYiLXVkeFg r/lABlBU7fvNQTaLdsDVHpVDHubxoxfEnMRmbjdHePiWwLpsiLZwQZphYysIn/meBbCJadx5QYE 3y056agLl4FGBNUduXzNxiRx2u7tXUhQqYYzGQJKXIo3fP/MvNyHxGUiFtwkgv1WaWDtT18hwLL LPkWdVaOgWT/1AHCvlJt3QTCckZ82A1ARL1LN8tRe2AoC3bG5NUZm4k6PK0y7IVbzAzxpI/2pgQ WyBynCZrr8DSgZL+IDlt02/3gMGN/DanM4fIW34HkINIXYtBw= X-Received: by 2002:a05:6512:124f:b0:5b0:21e3:6716 with SMTP id 2adb3069b0e04-5b28fac5c62mr2539868e87.58.1784474249617; Sun, 19 Jul 2026 08:17:29 -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-5b291e26e5fsm1835096e87.80.2026.07.19.08.17.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 08:17:26 -0700 (PDT) From: Marcus Folkesson Date: Sun, 19 Jul 2026 16:59:48 +0200 Subject: [PATCH v12 5/7] 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: <20260719-i2c-mux-v12-5-a5010d623a57@gmail.com> References: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> In-Reply-To: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> To: Wolfram Sang , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski , Peter Rosin , Peter Rosin 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.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4119; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=0IooApVNJrr/TWFtnF3D0qsEG9K3kvelVRC/Qgvjyuk=; b=owEBbAKT/ZANAwAKAYiATm9ZXVIyAcsmYgBqXOqIy07xsgS56s5AGnVfEIWyzaYloyGKeNoyc U7m1aeCzuWJAjIEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalzqiAAKCRCIgE5vWV1S MmJbD/daqz3ho1lBvy0xeHIGX1v57Lk/kAo72SLucpqluzWuCi1bBXX0mpaFqtO2f835GkyrVPC CH2/Nxtkp82UcdYdO3ss+JncrpWdcFFbz7gWMMkhw/NEuHU25mSkAsuXzzle3RU0BxpJpH9jLjv FbCbRp3f8Yn58WIBaNq/7ii43QFAdL2tAxBfm5klQSbFRIFFiIqXvWKJxlwEpCvB0fAaJHoEWbw bvrewVsQwcDrzWakzh1wJ+xeXaJGaGD5cMlLXf5nsZHUGiyVruxzUh4U/kG6rFd2hJKx7D5jWy5 z7vh2JMQ82NSKxeLCZS5ZDj15jMdXUtmZf5PoOt7kp/CQXBcMBtQJEIWj/Q//1cGmuEsF+07gTd EevJD/AIIiTOwTh9DN82llPVJwMWsM/pnbOmRgDfMayaVPVBKLVVLsXiwjbJ53aAHUMEZEqI4y2 nGXvlmAl8YkE3LRTnCj/48DjZes9tahbt4hoVNd7xCTjHkJzxzaG4ZphMW7gG31oA/l8TJhFnDu 93In1lrjS1JUz6P7JIhOzlmaz2BU/78XzpOf9IsItrEJ6LVGWeMo5ZVbS9Z1vqLBvNXlC8VnIDT E593gorOQhn95pSjfdilpVBY3pwmbTujLAPzr8afOcUpxVvXynVIBGO3Cu9zPpupYKSkNwQeotc he3tYFNLYAYmY 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 | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davi= nci.c index f543997c31e9..87fef17bca55 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,16 +206,16 @@ static void i2c_davinci_calc_clk_dividers(struct davi= nci_i2c_dev *dev) if (device_is_compatible(dev->dev, "ti,keystone-i2c")) d =3D 6; =20 - clk =3D (input_clock / (psc + 1)) / (dev->bus_freq_Hz); + clk =3D (input_clock / (psc + 1)) / (bus_freq_Hz); /* Avoid driving the bus too fast because of rounding errors above */ - if (input_clock / (psc + 1) / clk > dev->bus_freq_Hz) + if (input_clock / (psc + 1) / clk > bus_freq_Hz) clk++; /* * According to I2C-BUS Spec 2.1, in FAST-MODE LOW period should be at * least 1.3uS, which is not the case with 50% duty cycle. Driving HIGH * to LOW ratio as 1 to 2 is more safe. */ - if (dev->bus_freq_Hz > I2C_MAX_STANDARD_MODE_FREQ) + if (bus_freq_Hz > I2C_MAX_STANDARD_MODE_FREQ) clkl =3D (clk << 1) / 3; else clkl =3D (clk >> 1); @@ -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,23 @@ 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); + + /* put I2C into reset */ + davinci_i2c_reset_ctrl(dev, 0); + + /* compute clock dividers */ + adap->clock_Hz =3D clock_Hz; + i2c_davinci_calc_clk_dividers(dev); + + /* Take the I2C module out of reset: */ + davinci_i2c_reset_ctrl(dev, 1); + + return clock_Hz; +} + /* * This routine does i2c bus recovery by using i2c_generic_scl_recovery * which is provided by I2C Bus recovery infrastructure. @@ -755,12 +771,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 +817,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 +825,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.54.0 From nobody Sat Jul 25 03:46:07 2026 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (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 BA2973624D4 for ; Sun, 19 Jul 2026 15:17:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474255; cv=none; b=ZKFHm5VKMW/dmI94vkG9U/1w1BnDjymlSLcnXnN+4+QoZEXOBcRqGaVLebbiqJjMrQt4pv8C23PLUvO/z/DGtLEDS9eUROHS8EKZoyQNBOyj+l6aXdb4oVC21OPnxQdTMtL+GX9a2cJLwRcCbLCyNE+g13wYVJ2XPzH1d+Y2SxA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474255; c=relaxed/simple; bh=yzE9PLCgDjOTow97MHP1nSRzWz6qa/3+7ghuIIxf6gc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CouD+Ddau6JlwKnVkcHn1IffUFj5cv22c0E3/LCmCxKH3gCOLLXb/giz/Sh10r+me61B2O6qRGuDA9xoGGIKjJZ9cCUXgOyFBcCoL7V0syfTaj247zthQM+qbq1WjdNeni4079opWxoS27QbKQrsznxv4c5I2bXCBB8UXT+qkWE= 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=G2gM8Zce; arc=none smtp.client-ip=209.85.167.52 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="G2gM8Zce" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-5b0231a3e86so8863896e87.0 for ; Sun, 19 Jul 2026 08:17:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784474252; x=1785079052; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HlP6ff475vHhLHgiF4j8BdmWTsaSA5axHhKG28Cf3RM=; b=G2gM8ZceGYP86BxTSqLElSM3xzFzrfsG0VYmq4yx4f+LtI7r+Hg1q02My0FSN1Ywhy I8ya5PbgoYELKQ/IxLHAMaRA9KtTJY4Wjlr2Ll6L19VfujAiWqOzAuvCX/7n/fLKieL6 QUukm1AUVpgTMWtZJ/yb/naBe/Mv2Q7GG2uVn4vkRzk3fBfRSgj3WscR5UnZ8XjopGbm TOqt77WMcwwLKbTxV87Q3npUNABdK4yddi4kSzTGcNcxLYp+gOoJwJicF08kBUEYU/VC F97tzk74FSTYmox6UQhlcgoNAPXLUW9YLfJ19iw17CtmRr+T3KAuPjbjkzbRGx3cW7dH hT8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784474252; x=1785079052; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=HlP6ff475vHhLHgiF4j8BdmWTsaSA5axHhKG28Cf3RM=; b=LFoedjP4QRTQ5vS7+eNku4Yijp49E72iJ6HexG5Ezh16YX4/eu0SHtF2b5KUnPEM93 OaYZSLRCxW2f67I24kyMbIcp/6L2Iy+PckHI0QkMlN9DBWdI0aQKdhimw8wHbYxYf7lS tXBBaZPQ0gzoIiB5+vLhOxLgMaWOT97LEhO8WeHi+Hmvo+M9s2JW2Yeqsi3evyxuMfmg ve0Poup5sKLfnoghzsqjyBQYmvL53NBL/4iIvG95rsrP1Hnt4AHge2EUJ/jh1y0CLYrk Rt4OyytRhapVzI8W2dmW+X8YvgpzphYo78qB+WfQjIiTbYVQGDBi6LVI4Mnx/fvEShCk Dr9Q== X-Forwarded-Encrypted: i=1; AHgh+RoDCambMUX2LXI3k4Oqg2+7j1VMoRTgUxDs91qFTzcxxXVj9oc1sg92rPLdE7eYL4+DvpdPbwfxIHSEgCI=@vger.kernel.org X-Gm-Message-State: AOJu0YyEs4LUO5F8fDIddl03p+/PxqfGHPmZyQlwaeiAGusEY3Yix8WK zBvnSeLuV+cXJ/hIOPinXnSR3CWa+C5L8Cn0j+iYJdlyPgEGJrWyxPgueKZz4m/vpyg= X-Gm-Gg: AfdE7ckEWEKb/w140Rg7hTwVCI0KPYKIy7tPiFQjMwSNCqgzlqO0W25inp3AAbhx+C6 FqWAH9rTfdsoCoX6rFjt3SKnW+ZLtYO/+jYVdVUFL99woOLGf9wlgct9RyFxs72/1e3Kx0R9NKL +JVKEGCJ1j7TBNqObzpvX7up1908ppVRpskzjh+/hcwOqfvemSo7t5w6FJasNLni1Dsf1L+Y6Jg hzl5mgBNzzyjmaiPE8DMB2bfvJfePwfrzyZk9hC52jLdIgQfm3HWOJOQZdQBOsehtJB1+zdQxgW g1VJL1A1FwlHV2lydptVFt9gAfwdMUsdPWWjrtM/t0YkhQywFCmVSol/Bogk5f6HE65g5AJrP6T qiYuMWEOerIvrtDu+eW+xJZLfDC3xSwEw8lDVBpe5uehk2RrzWlX1QGqmJIZRtaHENPtoNsDyGc E7GkIjgjNihMM7CBUucH05T7tdZabST/u5SxdqwU8KxH4esGc= X-Received: by 2002:a05:6512:6885:10b0:5b0:f9d:f7a0 with SMTP id 2adb3069b0e04-5b28f85e9e8mr1213236e87.8.1784474251690; Sun, 19 Jul 2026 08:17:31 -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-5b291e26e5fsm1835096e87.80.2026.07.19.08.17.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 08:17:30 -0700 (PDT) From: Marcus Folkesson Date: Sun, 19 Jul 2026 16:59:49 +0200 Subject: [PATCH v12 6/7] i2c: mux: ltc4306: set correct idle_state in i2c_mux_core 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: <20260719-i2c-mux-v12-6-a5010d623a57@gmail.com> References: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> In-Reply-To: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> To: Wolfram Sang , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski , Peter Rosin , Peter Rosin Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=767; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=yzE9PLCgDjOTow97MHP1nSRzWz6qa/3+7ghuIIxf6gc=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqXOqNBqVDEiT8/ZRgbDKXqttDBy3Co+sTZ+EAC DdKTTE4iWKJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalzqjQAKCRCIgE5vWV1S Ms52D/9ZWJxpXc+69YwDbf5mbGgWacFFbjO/I0QaymoY0pE4e8SbHnyw1DsTqcsABQykmYAE1cx ulrzhhYNkteLeEqN9QTbdJuRZ8G3aNthHgQ9QkQeGjjL+3W39YmbUeyVndbjR8RXpFJuUgsS1MV lxztf7vEp97T5aXYjH1wMXOB+QdMqBl04UkHRJRJwrVAV5vELLZ6IaKqUwfq5z0EoYYa8Vgb1d9 1AgViuvhriqlBp9dYwDHJ7ACM7cqdnOm7PNIk9InQUtRkeP9lhU0wFbzICCiX/UXzc9bLURDsuy mBksggtiAlAUcev2DvGpXW3T2P2qKsKCqKUCXIvTbJ/bsDhLUW1SlII1gZW1g9VTjeP/VP4I+S1 6DzYHfDJhmKxccKhQPQFvSU3Gexb1ZrYuO3hdlh6Bw3bCesHntRkiepaMjBfmA3uiELxPrWay7C SBuT9gtX+uMXJa9DqedphJbPKBZQFDtniEpytnTSUpmJ/fmZwA2/OGYQbh5L1+iZY4tQm4rHXMS 5SNJlthuyPLE3r+iaKKgurQ7tq5Ox9WE1CxIp1rHs/tRr7MMvfm5WMnwgF51hqHvBu/hXRS1K59 yh3FoIjEtF1SaSYh0jXH4l0qoZI/FwmjWfKCRF/FzGvWAT+GS9hVgj8iZxgH6Hj1NsJRPOTX1nM Gnksjc+ueyP077A== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 Inform the core if we intend to disconnect channels during idle. Signed-off-by: Marcus Folkesson --- drivers/i2c/muxes/i2c-mux-ltc4306.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/i2c/muxes/i2c-mux-ltc4306.c b/drivers/i2c/muxes/i2c-mu= x-ltc4306.c index 18228f5b80e8..df7136b7b042 100644 --- a/drivers/i2c/muxes/i2c-mux-ltc4306.c +++ b/drivers/i2c/muxes/i2c-mux-ltc4306.c @@ -232,6 +232,9 @@ static int ltc4306_probe(struct i2c_client *client) data =3D i2c_mux_priv(muxc); data->chip =3D chip; =20 + if (idle_disc) + i2c_mux_set_idle_state(muxc, I2C_MUX_IDLE_DISCONNECT); + i2c_set_clientdata(client, muxc); =20 data->regmap =3D devm_regmap_init_i2c(client, <c4306_regmap_config); --=20 2.54.0 From nobody Sat Jul 25 03:46:07 2026 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 058393A545B for ; Sun, 19 Jul 2026 15:17:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474257; cv=none; b=KxPl/UWXiprHPGFiL0K5hN9twNdmyJdyn3AtUroWAno4cpcIG9gGussjjSx+MXDckTk0fsy1PLbmlPusGFxF5EfO/oSDOmxXMgNguGLNVlCaBLbEpD3Z8yYrXlQlvLuO/1DyzZ1p5ClhWSpbssBIoAo5l8MDrOIg89d8fUrI5Zs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784474257; c=relaxed/simple; bh=B2YqMrgTja5ulsdupqJSWKQwHmegjD8Hbyvf0CUQZgg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZfCC/xGVnX36E4UGFXXCRBvLcW+vxbDiD1xKGKf93+6WGmtPcuQNutcWrPOFaZINGaU7KYI3JNFZWVlLwXJrph4V5laXpTSqAPBrk1r/F9nrTpIL9uH3PHAjVqO6l5Cf/1UvrbC0JltDC/lVYhli2hN93sc4mY2BYkSjneeQ7WM= 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=Fwc/NuKg; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Fwc/NuKg" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-5b0115b9e17so5773486e87.0 for ; Sun, 19 Jul 2026 08:17:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784474254; x=1785079054; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=3nOkF62GGkmnVWUbbVUdf1e4ZunQyMCemxV0335qyJ0=; b=Fwc/NuKgW3nOebX4hR7VaLna1vHOwmb0dxIcrhv1cDzzq/E73ADK2e77y0jvEQKrin W8p3vYkXYvPPM0qHFGcJD+NQcv7GZnIBQCJTPOOqqLrX8B6KJH44EBZRs2TEXBAkI8gG 6zJtI3xS47/7VWWPHNj+tGw6qZSoEtAQEENHS2U3+P9cy+7qLf7ycFIwU8RaNwQdiP4x m6WOsY2ay+PynaBxSbphSM7vryA8y4CwTSiCjWsF8jAbYq7CHg4KRIU9vCpyW1kre3Um Dmm0yKLsQ+Qt0yQ5oI21yL3gizrRSgkY+82KVH8FyQOrvUaLqEBHhwawWzkqOuqfBd4j W3vA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784474254; x=1785079054; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=3nOkF62GGkmnVWUbbVUdf1e4ZunQyMCemxV0335qyJ0=; b=Y1lzIU/tl0CJxr894szuba3yRZh7EMryIEuzgS2GeCoIxOkN+R2nO15boRWF5Wo0rK ExUoFI5Na0mFhygPiSzypoCfIsCI3x8jloWV9ov4lyPVGX4BnM0UcWmL0gnE6iqlDGJf u0e7vZHSp1Gr2ih7lKnX7bljolBvYdV+AJUwH5igxsVY0O98v+hk7xdtVDvhb2/JK0Ec SpVXYGRu9mgHn0y759OeKaFjfe92K2BVyIvsoukEcg7Ew1QVqhF2DFdwxTYlfCWr3qsF lCMMFeyV3bz4S/a964+nipdNTDXQHKhe8E5NLD/4UNdsocbWG5GeC/YUM/Ktu6YsNLvF L1QA== X-Forwarded-Encrypted: i=1; AHgh+Rq3vUlcJ/Vy21+OnKG/oqQDYK4CCCr/YFb4moXZy0WX0+x8kkYRUIM4V/w4wRPG1sLpvgTrWTS3lmirXb0=@vger.kernel.org X-Gm-Message-State: AOJu0YyUmyavTOeaPASQFPPprMdCgwvHGz3h8uCiTD+a4hCuk9k/ZvLo iOcI/sNYQzcFssbQZgjf5nS6kzh4blGjUGbW7LRhxWGaLu9JTg6ZnvWG5f5E4cvqHa4= X-Gm-Gg: AfdE7clyRZJKumPISURLzBn0SkwHe6i/YJFEgZsFQVJwE929bunRAr53mlbjzCD0t0i RYXHDQgFkKoaI79iyraYPIGm5zCnYCwwC3hqrpAhvy5r7uShF6YIIequL0Q3hi8bCUdbcmKmeCu wtraKcLFuB/eqDSr8gVRcts0BpIU516qMP7RCXNOcZHeh3QJZXqoilnNUzXDDTrzKsy+kKlOBof xMI3lLxrSF5/h/dA+FbIONM+yp03ZRGwelUHG/6PTPGxVsUlEaoXMmWf173PKOFpYH3gmpjMiLK mepR9Xb4NzWTZH0P4yz0nWzzk/uUbA41OFU1JIE0EWUqyO5+3/Y/ff7DLmiEXItCSppKE+8OTdW jAkADOz9CGZ9nGdiEtt8T2lyta+tKzOIRMNs1wImiRpZ53EQMRdYj+4wa8NTvUIjABY6WDoFbs3 3qDab14pmAyzu0InCYZhSW1ABXrxPP1mG2IBn60Mp6ftK8lU4= X-Received: by 2002:a05:6512:2c8c:b0:5b0:17c9:a504 with SMTP id 2adb3069b0e04-5b28f9b7c01mr2056967e87.30.1784474253752; Sun, 19 Jul 2026 08:17:33 -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-5b291e26e5fsm1835096e87.80.2026.07.19.08.17.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jul 2026 08:17:32 -0700 (PDT) From: Marcus Folkesson Date: Sun, 19 Jul 2026 16:59:50 +0200 Subject: [PATCH v12 7/7] 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: <20260719-i2c-mux-v12-7-a5010d623a57@gmail.com> References: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> In-Reply-To: <20260719-i2c-mux-v12-0-a5010d623a57@gmail.com> To: Wolfram Sang , Michael Hennerich , Bartosz Golaszewski , Andi Shyti , Andy Shevchenko , Bartosz Golaszewski , Peter Rosin , Peter Rosin Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Marcus Folkesson X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8176; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=B2YqMrgTja5ulsdupqJSWKQwHmegjD8Hbyvf0CUQZgg=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqXOqRbAOdx8k6mO8EKTe7IxMU4ceiT+Ms2L82E 3oxUNolewuJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalzqkQAKCRCIgE5vWV1S MkchEADG8OL2vD6lnKA5DGjIFgLDPQ75GC9MK5kZUG0dM3y7SaWnxnOqoGfLiqF1DUuPXmhybjM pWj/7Zi0NI4IQym5hsKQZQzLcYNN88SxjQ4iCn9rmc/z/bZd1HSTZICb0/eVQJEu5wOeavXa74b h0itQXalii90dRPmsYOmZ4pqBXkfw5B0JsbijVhDa/CZfMjZkWVYS7c5ruYC5pb48tCK+vz4oLf 1ZMfyNGt23LNjBVobXi4veOoVIagw3WT0De0TlObuZlsVNwLtm3P6PtGgch/Z2vAK6XvAsO4gWq s5rCzUnqeAZUWJhY91vg68aPZYPo55vBeMW9uTfWHyOMdBKw+Qpgp2FP7wKDe+CMDAC/nyzMoDT kXQ8GUHHGpIUNfkLzxzPQLWZf+PY+GvOV+Fp4diJVF7c1C1E+g5J/rlgDsfukOF3f2kiKFvRwlJ 8wV92RFTD3zwad8bq92cL3YeNez7RF29ZEgbWSN/55cXhvGUOsW0Q2Myc1cNdS41RdqZuhsj1LE 3GBqCLVNUQqTPukkJMx6+kfL3MXmbGpQ5ehmIbwHcDYV407WbwRMSYpUujbPrY+HheWNCC53axZ oZT/5L3VVXY43UbLgjT+1hBpKE3S2iW3qB/51rIVc/urIrpteZ+EvG1iHXkVgKGFLi/pE7Z9SS3 sZZtDv9tq3/MjtQ== 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..1ee0de6dbcb4 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 uses 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 therefore 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 are 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 apply. + +Transfers to D3 may interleave between select-transfer-deselect to D1, whi= ch +results in 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 is D1. Set predefi= ned 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.54.0