From nobody Sat Jul 25 22:03:16 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 EE00F36D9E0 for ; Mon, 13 Jul 2026 07:20:35 +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=1783927237; cv=none; b=fmLIlzTx4rGELBknnuzC7nfEFjbjA33tskVtqwwbhYaXquKPL1db8EDkYo8KYiDk7VD6g/vo2NYHAhnKZoIcjTSRLrP9FWNsDOpkNohYLr9L0EEUE5QO1IEDIJg8m7/JVOLIllNkoqtoENhRGa7mQd0FzXJq8RQddnUKBs/P/2w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927237; c=relaxed/simple; bh=utkdIrJtEC44DqqTUyxORrRSv5x0AbtRsT4oMW64lXM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HO+SPHfmD801XtjGzw4QuDhPvruuwfKL+MSQiI1BmYBq8f4rADP9rttpAFgiXOlD9p5uD7wLy7qdtCBytZYzaqngzt109MBvB8SW7WnpiDvLkuCZUMmS3ER/irAmrxlk9EK5RFOEybwTSQtv/otp8B/QDVs/Nld8aB25NgwJjzA= 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=ITMCwiBx; 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="ITMCwiBx" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-5b01910b499so2365150e87.0 for ; Mon, 13 Jul 2026 00:20:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783927234; x=1784532034; 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=mUX26WpwvVrJFwxAmnUDIQNXofqL2zgl9QzvPbM33SE=; b=ITMCwiBxT93dvKJ9SyrgqrBe/As8DmTzHw3Tl792dkFjzkp5L5ygZ8ttikeH0E2nD1 SYqEm3DcglGkgcB830KHzn7Gk1opS8SBP2cYmby559QmBmrmjCk8CrVR6QfwjcuPqeMc ExR0jcqLFl67leBy8KFOvMpISNaAJn/KW19Ct6TZm8vYPVQEpicmvP9QK06Vw1hOSPHg et9VAv2AoWMa5MlFmxbLJf9eh03SwE8vhI4chLDQXpKcfhwdd3MW+oL2FG3W3/IeKENN ObZjsnCpJOdUZXg9rNjYhuOZ+CqUgXbjC/o5S5V6gQ9WE1EZbbQ8bjeopTopJkgOS8NB g34w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783927234; x=1784532034; 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=mUX26WpwvVrJFwxAmnUDIQNXofqL2zgl9QzvPbM33SE=; b=o1XnKRrYBZRvaPV+4ZXcYO8RlAlJSHzKgSHSynJs5G4AyRe6/FCpQXX40og9bLgjvT 4KgGemcCbtHCWGZKK35aASLN7GXLVsbAoSA3dLRJN2zqLi0yV7II9kms/dFTZrYd3YXq Wsj+psnrM2QsyDDR0u/SEvgyzAQlksZgvKgYmQjdmajX1rWMaRGiXZyJKLdAYOy01EvQ nVYHd2SDvWyySCMN8atAJjnwwh5jj6clVyyj3o1ybADhrMktvC9gOq8ZvO3h9hK5d+ih dByjpvE5tVvMTcbahKoaEsI+U9macZnVlFg1oFXFm9Z5p0YzwTg5hPaFIp5f2XEI937O 46fg== X-Forwarded-Encrypted: i=1; AHgh+RoOZfmwXAy8h/a4yKlrhO+OTeDJ+hhUPREvJfP9QB3in+JnxfkmJogskeliouXASCNOVNzaRi2HxY6IYe8=@vger.kernel.org X-Gm-Message-State: AOJu0YyrUK6JA2F8JoUy842r5MtGNyuqg1+Ux92k9aa4x6H3BXQQUpBF hoD0/o7lWXJkz3XLsRPLnso1Kl3ooyaphPh7NbKgUP4/Byx4Krek2xdqv8lz19XRYHQ= X-Gm-Gg: AfdE7cnij1nS7tOL0LoyC1/SPKLKxqRVMv8ZR+xGqitYZCLCa+zaZumOhEYLC0oBZA+ JChikhirnLmbyn3C8U2kfTVkyjeNxH4S0qC00Rcy6eoJ6SYqb2TqGpnQ30dm8ijINqS8PiD3LJx lxZK1QZJjo8n7eB8CsoJ1fdAPNrD9NnX46WbWEcoZAj8s53zuJNHx00LNiUqmFyf2e/tp4d3sIE tlV5DenUsXIOa0miett7Qz3z0K3WZs0kKFFbDI9Q9YCq+v39mR/UXbc+E80J1fEiaGW+O3RcfYW B3uQpFyEXv3pmp0S99sohrAvTTGindV5EcrR3FJK4NgP1434jDqQ0fFqtSHKhjL3EXBv/fTvnud me9LLNZbqVHUpSwdA+CfJPWAGPmNosFctAuUgoKEEHB9C5IBRj6XTtF/xoUEiq3dcips1NHD6dX 67sSgP40d6x2mQZh6RIzk7efnU1V1diLeMMAUGD29VFeXdtSjjkIC8acCmBA== X-Received: by 2002:a05:6512:230e:b0:5ae:a4a4:b6ca with SMTP id 2adb3069b0e04-5b023d12238mr1708807e87.14.1783927233848; Mon, 13 Jul 2026 00:20: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-5b01ca55723sm2625636e87.35.2026.07.13.00.20.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 00:20:33 -0700 (PDT) From: Marcus Folkesson Date: Mon, 13 Jul 2026 09:19:57 +0200 Subject: [PATCH v11 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: <20260713-i2c-mux-v11-1-72bb8af8ee8c@gmail.com> References: <20260713-i2c-mux-v11-0-72bb8af8ee8c@gmail.com> In-Reply-To: <20260713-i2c-mux-v11-0-72bb8af8ee8c@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=1645; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=utkdIrJtEC44DqqTUyxORrRSv5x0AbtRsT4oMW64lXM=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqVJGxwTjAtaPb0x5drXc0YkmoWzNJ/oOfKfU+v Up1Vt+tNK6JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalSRsQAKCRCIgE5vWV1S Ml3vD/9bNNLgaY8rXBnkrdoKHbiEb1/KlJz8oezgUw8JKMycE6i5sYg9soeiO7PosGFTsdXXEiV 7z8Ff+3WT9gywMHcNHEnjfDK3XzJsUreSOK7pe8qsmdBFsxA5TMn5dUGj6a2KMVYrXB1qrMXqLE Lkg1zc7KRwXnlm9fe/595rL0/4YD57hlyR2XPUyAsmomk2b7q2vj5LwoTCOkDFOvqMHtDOm33bv PLurGaVJWJXRdSfRbtSCe3RMNuBrNolJE6JuRJJakIWtzx6funBlavwO+Qif9sOYX1uOKoKdGmj 4XbLzxw2YwWpo3tgEtu2WIcwTW+/tNAQ2gqV6CA7fDBMPXSElclnAYXk+x0DFuqeAP04SfDIvh6 eiKhJZAaG4+92N2MlcD4llb7ZK86bkigpmGlOhZ7OoA4PpJkoGVLJ4BADpKkYY5SpBqA+jew7Kl +OyqMnYZ9Xm9z+J1jUsertIuZS12CLPEc6VwU1oXbyijaPbN9djHkdIkLKy2Zj/5vAfB3XCH9Es fypF9vGE6zGQWXjr8uUM39x2Ra5WXMSI6kXCuF6F8WLA6dkhLI1FtDH2As4D7gA0SrhrCFx2dLF B9xjAlyz3Q/Z8gXfyEFA2KjkStyfrSYZYJ0DjEDfFdS9TT/vj2ipv9CVRyeoNvg6lIcTWhpKqe0 1e6ya2D9fiWDixw== X-Developer-Key: i=marcus.folkesson@gmail.com; a=openpgp; fpr=AB91D46C7E0F6E6FB2AB640EC0FE25D598F6C127 All devices on the same I2C bus share the same clock line and the bus frequency has therefor be chosen so that all attached devices are able to tolarate that clock rate. IOW, the bus speed must be set for the slowest attached device. With I2C multiplexers/switches on the other hand, it would be possible to have different "domains" that runs with different speeds. Prepare for such a feature by provide an optional callback function to change bus frequency. As a side effect, several bus drivers keep the bus speed in a private structure and can now have this value stored in a uniform way instead. Signed-off-by: Marcus Folkesson Reviewed-by: Andy Shevchenko --- include/linux/i2c.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 20fd41b51d5c..c5ba07f03ada 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 22:03:16 2026 Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) (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 E06F036EAB1 for ; Mon, 13 Jul 2026 07:20:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927238; cv=none; b=nOGSLPZPrLA0ZFhClMvS0Nyhd1JfssHewdxwAzAn0UM6w8w/wMcLl2QEaz6OsRnryEBydTV2PiCUiQvqvmpJ4AoHE1kllqPNXXdJws6BncQUutXpcgIFFKNMh6BQR7InoFX7PFMd0Z4mdDpKia9UjJ7C8+GUul2LjptkF9XwLUk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927238; c=relaxed/simple; bh=vnuM7kAv6UZYVTKxBCbKpa+2q5drZUiYDWWf72AF6A4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oBGUN6GEnH61aHnrY7UgjY/1aFZLGnS22hz0kvzItBor3owB2P2yK8wW3Fpv+OpqX+89oR/VGer86G1xjVomRkJHk/SWNB0ZhbpicOSBFjAUUCZt+oCM7D1QDYN2rsxQWZHdSXCYtyy5T0JMXe4T200J3vUttYIeQ6/JYLCt4+o= 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=OIbHWTxb; arc=none smtp.client-ip=209.85.167.53 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="OIbHWTxb" Received: by mail-lf1-f53.google.com with SMTP id 2adb3069b0e04-5b011edaf7dso2550264e87.2 for ; Mon, 13 Jul 2026 00:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783927235; x=1784532035; 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=dprxgYd134ZCbde7II6xEs/NYUu1NZeUWNqjC0nuXDg=; b=OIbHWTxb6r+g9ERfRhtijfh4cnx0oeXMkKDNAfOOzk/jBM/2FFY6LGGasyEpljdhn9 FtiFEyBygnzGPhD29ZsS2Qw9uT8dcC4eFL1zVEVYIiewJoe9ACoEGXcrVBmZC3vTqIJ3 QCz5JbXyBabTBlVmYdHXjaZmyX7sRLgkyeyUzn6y5ZpGsAr7WNxSr3p/WagAcUCLqW9G PmeZe+ZZtBi3qFYhxvD6VF6eyNdszg+kzDVSbSjnSrKMH33BWRS0TpwprbEHakEF31eO KJQ18LA4z0tw/q+9PQU4rtjMnZnFJzuBmt4yVgjSl8Rc7jCgzHcbP6riVSHNCJTPb/W+ rXwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783927235; x=1784532035; 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=dprxgYd134ZCbde7II6xEs/NYUu1NZeUWNqjC0nuXDg=; b=AkjYUKtSLmfC5ZjwmR7nfvQjOg3D4EX6wcg9MEZ1PV4fBWHFdSfdm348FTTb/v/eXq C1w3XKJd0kTEm3WgHlWYUs1TfRiKK0ZX1IIStts6d49ciqpcHrLQfSkviA/7R7/lkCg2 qetBWFRpJtRM915WvXr9MpiySzGHRx/B8U8IZmAyQ5TkWggVenjnDqcilGPCJn2j2Njm EXmA6c7hg16PZhIgZFIAmvMTJeB1OUscvoPximqJB1hp6uKKrF9I0c3UEi2nKQgU7aMD CU8Jgbp3f1UJwUYjvZUrPYVMPYcaiXunpof+ikA9/w6sYYzIzAahC60BUvT++2WMsOCt QLCA== X-Forwarded-Encrypted: i=1; AHgh+RoweXThTHkMU0+EWsP0gLzzDfxDgs0BzQH6aI3x6BgeirxLURH8DJNrSoSNfSLcS+CTwSYZBSqWVhNTYRw=@vger.kernel.org X-Gm-Message-State: AOJu0YwctlSrSBRQ+xkj1PPsVHGxepUplkJWo7YJXPCLAlx+WMK6/oEs 5+LE9iVLUuhHYMkfGGZvsnSMg722CdUq0AJRVfrtgbilVCJyVJ20aV49SxPknRui6VE= X-Gm-Gg: AfdE7ck8+dRhwHxRBwE1raLhyWhCvjkHjbPaBvEjGQ87034pLRqPH3hP8VcpyXbMFDU r7euPqz7DOnp7upZHpVcD0TRJ36pj62zcOa4hIq62TCmpxvzNJddoHi+P2TDMNhp3vH4ZKCe4WM 3uT/eaZtD1biFeBsBmvsoFFdaPzgUt+/JcDqacIK6MgqlyJALll6LD4PCMBwfmCK8iImd6p6phz O8LY+qFToW6IuefG55oYQCy0MyxZzEIq+/mjxwEkBb52rsREPwUZeDYYreGEfcwoLyttyibxeRN OHDm80tSyfT4MPFR8CgUm2yBbd2yFTyi32+JM/93Xk+M4/jvy19SV1Rspuh+P+m1CKT3/cxHhBA Yty8VognsJB+PbvONzhL1khh6hgZ7iGCcSrR5oYDZTtDckQmBc3UvSWyDo0CQDd9KT5W7CkF/TD kr9q5/U0Q531a1hj6pO/5yesBEHbh+sMsUwWxhosTFoHo+oQAFc63rU3j0qzGDYnkn9KS+ X-Received: by 2002:a05:6512:3056:b0:5b1:5142:5c30 with SMTP id 2adb3069b0e04-5b151425dadmr568417e87.4.1783927234912; Mon, 13 Jul 2026 00:20:34 -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-5b01ca55723sm2625636e87.35.2026.07.13.00.20.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 00:20:34 -0700 (PDT) From: Marcus Folkesson Date: Mon, 13 Jul 2026 09:19:58 +0200 Subject: [PATCH v11 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: <20260713-i2c-mux-v11-2-72bb8af8ee8c@gmail.com> References: <20260713-i2c-mux-v11-0-72bb8af8ee8c@gmail.com> In-Reply-To: <20260713-i2c-mux-v11-0-72bb8af8ee8c@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=2493; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=vnuM7kAv6UZYVTKxBCbKpa+2q5drZUiYDWWf72AF6A4=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqVJG2jUPsQ+B917os5jCn8R16fUEqvn3JkO3eJ spLK8xMh2WJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalSRtgAKCRCIgE5vWV1S MtZxD/9ASSOsNq1O1WXCwFDoTWIHuFHmsrumS2i+YzrgmZvlAUXbOxWVxCXxSPHTayTfPpEvrpf XSTy7kw3jB5fM7qRPi1N5FOp4MfZh4YVyrKnKtq1LDZP+FG336Mb64Un8vMYxZ2SMBYSQZdJBo6 j2ERjEtS0MUZT7rxZlBkW8N5+jLfGqGnxhnP+xOwtVNeuM5GYuJ23esdRstjd7sVyA6NJdhM6na fHGmFomp3OaWL0V8iWXI7rlg5x1bkNUdwZaje0A5zk/2TI4LsBS4O1oJ5yOQuUORp9CRb8dhTAS 2/Gsv/laAx0CIPvAAHVlc1kCaCii5MlZDfNmuSqWqEksEijbS9gTwZQIs2mLC7RIxxpgHNf568g +fi8BqjFL1F9lAWfw/seqUpC37YdLqQOT71e0AbURBbzGfJAhy0sqlTp3bvDsSQPW45ZS5lzRn6 QYEMJB5HXcr8nPaHa608aPj+x0rqdsCfeFBPRLHtBW+3rI1s0VawM0iF1hoqCdDgtiskSjnEUyu mKVOLHQINzOqudtvzWAiTEn1qbfvd0KcjsPF0jy0pbWkec5CubMb+wgOL8pDq57ChHAiBMdr7GO k6Q1D79MPQlDyzAGLVSUe40ypi0CKtUHhYojuOLDOjFTLiNy/uuUPbnSLAnOTgagqgwecOHu5QQ tIxxsRjJpi4YDzg== 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. Reuse the same state values used by CONFIG_MULTIPLEXER. Possible idle states are: - MUX_IDLE_AS_IS: Leave channels as is when idle - MUX_IDLE_DISCONNECT: Disconnect channel (set HiZ when idle) - : Enable channel n when idle Default value is set to MUX_IDLE_AS_IS. Signed-off-by: Marcus Folkesson Reviewed-by: Andy Shevchenko --- drivers/i2c/i2c-mux.c | 1 + include/linux/i2c-mux.h | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index 681a201c239b..edf16683dc83 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 MUX_IDLE_AS_IS; =20 return muxc; } diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h index 1784ac7afb11..624fadbaa703 100644 --- a/include/linux/i2c-mux.h +++ b/include/linux/i2c-mux.h @@ -13,6 +13,7 @@ =20 #ifdef __KERNEL__ =20 +#include #include =20 struct i2c_mux_core { @@ -22,6 +23,17 @@ struct i2c_mux_core { unsigned int arbitrator:1; unsigned int gate:1; =20 + /* + * The mux controller state to use when inactive. + * Possible idle states are: + * - MUX_IDLE_AS_IS: Leave channels as is when idle + * - MUX_IDLE_DISCONNECT: Disconnect channel (set HiZ when idle) + * - : Enable channel n when idle + * + * Default value is set to MUX_IDLE_AS_IS. + */ + int idle_state; + void *priv; =20 int (*select)(struct i2c_mux_core *, u32 chan_id); @@ -38,6 +50,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 22:03:16 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 03D57381AE2 for ; Mon, 13 Jul 2026 07:20:39 +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=1783927241; cv=none; b=HJA3uTmm9KfN7HRBw1Y/ZPS8H5KwqwwC7K4zhyzX/NOd9bciFGbWqtKutWeMKplNrR4EHilwUh/goElAJISTJcdGVWf0G+gG27QWkMycUUAMBKQnBUTOYV8/laKVc5E7LeXmn6bZDY4Zww2InXZdVf0YUyJM5kL/69SwpJcqey4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927241; c=relaxed/simple; bh=ZxPMsqSzC6U0Vp6f0tS25bdKvZHfqwU18TXuNJQFtdw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LBh/7er0auYP9M8QOk4XzP3RHs2nPFbdGuHfgKkwMoqAzpq7VTa8y6uw5gOMjP8ic8HlRxc6Kmf9KhLCg+go+IxhiCk0VRr+lr7vtGQWkE5YwyemY3MVx/9feDmv3+VzEWTo6KUh/PiTPy4ayKnkKhJL9Ra1kxgMqywdIDnR8CI= 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=WoRjn1ua; 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="WoRjn1ua" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-5b00d083818so3278802e87.1 for ; Mon, 13 Jul 2026 00:20:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783927238; x=1784532038; 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=QvewnpOsLjrZCg1uQPoBXdF7ZUbQt8CHA9+FuuFeSOg=; b=WoRjn1uaxYU3GUGNc4Q7Q6MtkztpEB0EmkjnZfsG/1avSy/jytCAaq0d5NaFZsjP47 q4P5UMOL43pnchYxYqA8RhGK9bPhW3snnpEuGUX+rCYbFY0hEukD+XZwO2VD4ZF6qBKS rDu8sFPs2281yuSfEw8lyPKBNxiHh+4Rt73vRx96jKTti8dilVjOIrvptzKqwN9JqBHj as23upRM+u63SJqOof5vBBoP9JjjqrPVJlyEyPWyEVCrI1ekSBdHHEJJ04Aqca2r6rQZ uGXQJrXdVBeC212lfx3o8rLsLcqe+l6x5+mF+YActpVjKIrCRBdK9HuyWUqo65p3h5C3 Q3aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783927238; x=1784532038; 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=QvewnpOsLjrZCg1uQPoBXdF7ZUbQt8CHA9+FuuFeSOg=; b=jSBsXoZXrxxp2JvLOOCvnXOrNpZ90ObANs+TH4bfJrzfsyuJ4R7CbrTEMYZ7glnS8N ZVeqUY7SCW0bwV7RThWCfTXdgqjWumi/UcSDG3ARrOm4o3EqfTDcudvgA1cj2WkPzj/J cZ1mkiorxSvuu7ZkQmYi5XM1ILbaAGsRlVemIrAPeTTi/k4q12JSL68apJhKJ216w5Z/ Acc/LM6uwG0O5vJ6BYYmm/fdD4yIYi9ngDJbCSeNDCpCtx5y3nZjGUsptKzSRXrpitmR DVVaMCT3t4L1fIDg5HG4nkr7+KlaqI6sTupRtE3vacMOJor76bCsVtsV93tpx4d5/gGv Letw== X-Forwarded-Encrypted: i=1; AHgh+RoAWZ3OP6uIvUb6RzcFdQgPIyHB/YQUSuptD8NssNw0Z0jqBzJ7rJlGzR+4K8J5RkGa6rPCbUc89iaDQ28=@vger.kernel.org X-Gm-Message-State: AOJu0Yyo5oXDsi3i6cv1vCNp9fDbOt7aRRIpuYTxATWcyuffi7Zpzxmq Xw3HhObl2Mjs5zwbR7k5UDF6qm4EFPFrxMD5ERUfmRAqw82tvYyqHk3L2TUWre516AA= X-Gm-Gg: AfdE7cmhXis+3fEB6Bzuh4lwRQx6JQ72JTZuATsdyRQVGVTHlKp86xJvfNGNgtz/xme rxCRM5gWqscrWl9Y3BzOYe9OEw8WbXzut2rYkzFL+tpDaO5fxxNIyXN0kna7BB533cKsvsMqtdN JS3Y92K2Zq1amCpf8a8edHAjlsZBWR7jZIILgwiIDFDj7Q6dXW3v+wb7xBR9cD0jCclLqH49mBU 04KMoZnzL26hpXOjvAUIrUs+GADLvP7gUuIOakE8KfCwy2A3pxeqX/PZNPoDKki0fIElptqr55D Itk3s9OsIejqWmbTbtSZ5XnZjn0QkTPOBTDltut9AeN74vSkWSfXRWR6Mjymy0W4RqgjHoWixm9 FrnYov0cr+hjCKpQqfI1eNYhW5dmXlA/wYr5tB/kSZLTtLbt7IR2KWGBG5AjjH9V/vfwlJ5ntDq nOnJcL++BCwsSOoFPqbrKQXNs5u72cNgKBD4PcGPEgBZwnjHXLXtDn4dybcw== X-Received: by 2002:a05:6512:400a:b0:5ae:b018:6a37 with SMTP id 2adb3069b0e04-5b023d119abmr1701966e87.12.1783927238018; Mon, 13 Jul 2026 00:20:38 -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-5b01ca55723sm2625636e87.35.2026.07.13.00.20.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 00:20:37 -0700 (PDT) From: Marcus Folkesson Date: Mon, 13 Jul 2026 09:19:59 +0200 Subject: [PATCH v11 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: <20260713-i2c-mux-v11-3-72bb8af8ee8c@gmail.com> References: <20260713-i2c-mux-v11-0-72bb8af8ee8c@gmail.com> In-Reply-To: <20260713-i2c-mux-v11-0-72bb8af8ee8c@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=9221; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=ZxPMsqSzC6U0Vp6f0tS25bdKvZHfqwU18TXuNJQFtdw=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqVJG7lD2w3RsN1ew2PshvwJ6WTBJg07Y/Bp9tR 9Aj6tVkCeuJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalSRuwAKCRCIgE5vWV1S MuIgD/kB+HHqt47X203VsYvw8K6Jryr6c0T/97dZ9lz2WB9ulUJsOJ6gJBMaAC51rpR9Oip8lH9 +wmUAud00muXacKITUZa4W9C2Ufasyo8zepmAMTjGTjxNEVbXgxDAYNovdiVrDLUK2+6g0hs3g/ ZlhTyPxvbMLkO2Adcetu7k/PiSG4+nIt5YUqTeWNDRB0PdYc3GX3l0kAGVK9aQd3fC7+qe0ZRpZ Lma4IbScCi57dafhNAKX/cw7zV3Wr2q/e9lZUbKo4A7sAoaMRP5MDx/2pqokPcOQgAmZeONj6fw sCZ+R1zzOuECPtlRZ6vggSXVN+Ql2TtM2IGh5JAmOk8vZ/toT8AOHKpzmnBJ0u/DvDuv8PMo9/V uwHesy4kgSn97cIR2Jvjb3PxIJ5a7RkTndSRQXKBQcMvnDzIvEKBA/XTrSd1/HIfgkmCVzPRanX F9PFCeK1MmVa0lSVk9WbLjDd8LYYh9CdIWbIKAQCp63KKYsDMMX/PrACLSIZ+j5cQB0C0Eewk7Q DOld306qkF1GNFMZKgxi3LzNyMnde7+zzcNrIZsHU/gGX/mKnlgppBzUZUXzZL2Mba5FLvbHGLZ jAF8OWGRuGUOg1z/U1AVpQfzwrx9XLrBeBfwvBSyJj/NLFt48GhNFh6ojKlDiVQywug07maHvwE 6mhoCeHJgI2iPCw== 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 edf16683dc83..48ecb11f4a99 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 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 22:03:16 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 8D2B23859EF for ; Mon, 13 Jul 2026 07:20:41 +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=1783927243; cv=none; b=OuWCMKuDGK4065OsS5F5ixbmcsnqnUQKmqLEZumlC5UgQ8YLr8xY6NZC6qnC+IEMgk/XUT3J8+I+5/ywR76PncFYlHlSmEcS8lsRA0v36ZrwiWcK5V/f2FyxkL2Z6AabqkzTTB4ea3FxCsCimFdMoXbagz45+o4QrKVM93Qt0dw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927243; c=relaxed/simple; bh=+XcNRIzkmbYbd4RGr5v7OnmsIYyLQ+F0lGI6snUGPQo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OQs+fOjfqttRI3pcu2u2q/b+nSqEYDJccsNln+lYQvlMY2PO8ffQtHqtrREBLC2YZqDHfcSd0X806ua6f/vUCNYOitYw8Wf+a0tQasY1cWzU9bHV11v37YRr+qHQ5rR2h3TOReSY1jp+eSQa5WEU+PgwWmsXH5UvRLiudURi7X8= 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=rvLuvsD/; 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="rvLuvsD/" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-5b14d1f9315so1110738e87.2 for ; Mon, 13 Jul 2026 00:20:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783927240; x=1784532040; 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=rvLuvsD/vA8inACuwqmcNJ0v0QJuhbR09XsNVxTEZ8VSCRF74XGEi03Mmbfl75ebXR u9ok508bnahR66qa6A6LR6mWVlObaXR3zh8tYmoVNHHT6RkTe/5l2tT4ewmHoqfWzc8e hUdby6dhawuuq+6b8jTW2V+6p3aKzqsaKJ7RdKfe4SSEMXzrooUa2DgHJ4PuyQR4mJp7 XXBMT6kneFFIRfo9MDqSpeSt3H42GpQ/4oePOgtu89HAEwGmV6mBKa3sSCk31digIbGE zlfR8dOzp8uNSRX5Na/lAfk4GsOj7tpA31huqJU+J0+HRCa0xX5xXAiodjuDgtBZkz+K 4d2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783927240; x=1784532040; 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=N3L6PswqnPjHq/X7rRpsHgS5PTkvKB49Sg4yXdCX/PX3TtvDLFrwi/BpVoNPoO7JUT 6krwCaN/dMFd4kNCZlh3gHP9/gggvLJjAzZiExI1a9DVKhbmTUU3e46DIPMR3TXYiIkg ovu3zqRVLHogH+7FqxZirBqtpfQVfFIPhoClCmPXc/eB+IoGS6FrbBRJzwn+XzGPWMA+ 8I4D9T4qAmoA9qij/Tz0H9DHpXAuiCp7IMa82OEikeLWcI2wrW9zqOoU28thWOzmD9Qb Ofzqa0cdDmcLQTrHT8BtokkudLtEptMRTzIZMiBLSZzg4rqyiohRPjVIwPsEB1KXKh6c vn9w== X-Forwarded-Encrypted: i=1; AHgh+Rp7zUxQn45ZpUqdvhnGcFPrPPXSbU0ze+Azvj04xSBmG9gqhe8Mouke60JShDto8dIFyxhZWJ/KVS+7aCw=@vger.kernel.org X-Gm-Message-State: AOJu0Yxw+z7ZXPn/BDqw3QrU19a/3K5GB0KHvQ6HIBt6wP4nNwyqd8eL +M8a3Mfr11nuFL0KFJeRXqV/NssNspud6m43DSLnBvdcbYeVuJXAxI8AkbuWEecLtN0= X-Gm-Gg: AfdE7ck96z1e4yIWIwTLESbjkTi+LkTTrGJMLH0/P7OZVA52TKz7U13XiAVDTMusBgI s4WXyZcSZ7P056nSQAWchz6iEWjF2UOdNSqnADvBKuyvIYO/Y1teaSHAcFGgLIFnVa6mmT8CmoF qyru+vy+OWZNWM/+eGPGbWF3tSinKFyI2Z2wwkn1kXNWI++JVbyRRi8fnWSot3AVw9KfpYJuMRh k/3pULVVbHaOo4S3//vqNOTINF4/zzx0utYJa/6KqMa9MhyolWBp9DqtdRaUh41MdlSlRGIAXpt 8Mub0lE750Wv+RmNQlVK6T52j2GOpOqoEqAhVoPDqaxB1xd1Sj+OmIXD0Gn29BAOxtZRN2oXu4u mwYmq3OC0xm8QuHJAh5euK6K/Lch/ennFs7qvp5hX+XZi4o81zwWqX2idHSKFnf5K22FTgGmC8s /yY5GStXM9RHU1mbVA+Skxzd7HiHettrxLEk40Kq/QQr2NBJiK0x3j3o4Yrg== X-Received: by 2002:ac2:5a5d:0:b0:5b0:1433:13b9 with SMTP id 2adb3069b0e04-5b023666f30mr1407505e87.25.1783927239479; Mon, 13 Jul 2026 00:20:39 -0700 (PDT) Received: from [192.168.1.135] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b01ca55723sm2625636e87.35.2026.07.13.00.20.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 00:20:38 -0700 (PDT) From: Marcus Folkesson Date: Mon, 13 Jul 2026 09:20:00 +0200 Subject: [PATCH v11 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: <20260713-i2c-mux-v11-4-72bb8af8ee8c@gmail.com> References: <20260713-i2c-mux-v11-0-72bb8af8ee8c@gmail.com> In-Reply-To: <20260713-i2c-mux-v11-0-72bb8af8ee8c@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/ZANAwAKAYiATm9ZXVIyAcsmYgBqVJG/pzVMAqizUHvztweXaWVBDpM4y5gVWk5HZ S37HT5pyw2JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalSRvwAKCRCIgE5vWV1S Mn4fD/9BwGcAZa8DhnVd9G0RNPbmv8PAuimgGEwGv2EKo9MNof4aHekeKrMnsUgq69rra+8Eucx WuHqRPWqmDTknWnCKO25jj/NcfkkIsxm6dTWT1b24R3HzaJLPoterISEl5008f8BQ6mrG+grIKT vbRpaa7mP7WKkXNpwb5PtcmyJgHE0jip1M23M0U0ASsIBWaAEkICKzeIZoUtbYqOPCTdvxCT/Yo BM7RT92Q5dnxBk9bCRIj1iGQf9copKWeB+MkaPC9VtET8qzAFa/rlnA9LyzhZEiRjXDJ3rdbECQ K4MhqmvQwmf5EUznjNDshyB8/PvnD9N6d8scAXHHR846hEHzWQFf3eaeHEUevr/U0+luSCFsxYd TxBg+cq7P8czHpkkrHqfZI0i3tATjtOfa5gbfZ+E3yJhtJUToly/m4YzGpHCpBELz2PYFWkNDfT viO/1pJJdI/XXrD6RytzcudRIBWY+nkbCq0i9pjUCJFEViwhIJXkNxhn4DdJA9H7aDMO68YoFKq x8sFq/6KbvFj8icXJeRag7LhBQtSFuxtaRTjI0i+kkKi6iQoJHalam3I7fqwL8i+37HvvginMad 827vJNbs/tGlrUkHFRULmozg/hziNe4h7lGsgkZWyWT5zY715reM4pIpdmIlMfmBmIs0YD4EetQ RiLIhr7gyEp2R0A== 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 22:03:16 2026 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 34B7E38AC92 for ; Mon, 13 Jul 2026 07:20:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927246; cv=none; b=R4j+YEhg1828nUbqOmYFtBjeAyMidGLYIjC9B1krra8JeLASRplwcGKqkgjB2onKEbdrtzGu1pKvSa2pDremTDF2AccD3avmOJ7cmekW2KFxp4ZbyU1Xm0ctmtBQwH/T7J6bTdnbrIpy5AbaGKVEJtLAWyrYTmh6R37rHd2T06w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927246; c=relaxed/simple; bh=KipNKAzTJU8VgRjKDoGKNRn5s5XpRFE3NoXWRS5HQQc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X07j1JoJLbjDOg//VGDodpl7RgfswiUlOpRylhD5AfElcEkgIg738DQdGqj25J8or1V3IE76+82/UgjkBY1NMIGf7v3KOijUoNNjRtYLC3s14tkBvbww/kcWWFQGxIrR95E4xVDty6tcf77Lim8qMC/0JoKEZ8AwTSL0Xxc1IfU= 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=Q/LSsW0B; arc=none smtp.client-ip=209.85.167.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Q/LSsW0B" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-5aeb91c003eso3025732e87.3 for ; Mon, 13 Jul 2026 00:20:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783927242; x=1784532042; 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=LK67j8GtIdgh2zXDGYw/AI9RtdfrjczxIkn8lzlmvug=; b=Q/LSsW0BNYiT4P+ATz/Oo9wHjhzXk81LDGj/aoL/fJ5HuVJMhKVwpfeJDdXGJF5U/u eMfXFM6HNOqpUW85aHDXYUczc59PhOKtLsHDQ4qJfefD4gLVW1JVZT6IJDo5o8CeZOD5 HTckWSr58yypFA3d0nQ3K7W9yyCLq2HUEz+d4ews17wGi45YYDY9BqrYYDnk0jWg3ySM F1TWZOF2TjnltU3R38ftN2bg78ITbfpHaMTxTos+ARdC1x4gvz56yhS3wUT6hfUQ09sg BIqcH4VLCHSotDlC2mlxZZls5EWAInE2G9xzUZs+cPn4OTek5yUROk/kS7XZ+iQ2SQUs Si1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783927242; x=1784532042; 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=LK67j8GtIdgh2zXDGYw/AI9RtdfrjczxIkn8lzlmvug=; b=ohIadY5Bi6v4Aj3yyqNBS7Ak4pyVUGhAm22BQy/rhR1WvkcvGIplkJisQtnI2Kyd/6 cJgTTBJWZJO93U9HxsHIRtBv/G9ZF+jYr9y8GE8alwKjb1cjUPC7Pvyb19CwUdRO+7H9 m+VODSnOrUXIXKNTQKsjk0I2Mfilw9Bwts3WGi+4YaSLnqpqOGxb8XUkHcIT+xY/RDB1 tm/w3tJaVPO2MQCeNBumu6I6hm9XqfVmhnwcbte286MnB5Tx/67htgcEs+J3oTSsUtCV eNl1vm/1qS7mf8khjxogPoz4PbFqU0nkUMbs3qqOPEifMzxPKgKsySyAOvrRDPicxHKf X3lg== X-Forwarded-Encrypted: i=1; AHgh+RoRZjfR+xv1Hjk7M4kAlb0e5vQU+TgL2TTi7hrYTT2LL/ScXUjQ93bdhIqXqBZFdV+eI0wOU3seOjwGARs=@vger.kernel.org X-Gm-Message-State: AOJu0YzBWl3iF60uTzcA4Dj84GI7CsICzSifXeLDgM2FHo9PmIVQv1ok 45AwFdPwyHLxjrt+YiX/gdYyNoN5MrfdO2i1zcs2jJZGeZ2sWq5Z6+xm2Nwsp9E2fXQ= X-Gm-Gg: AfdE7cnuPFfM9D+cVWlazE2viDUBiuNOfzE34BW7cCUecPPn4VZxTG1cWT413IzQHMr mLRAQVmQRT//3z8XCb9/1mX5RV+54GOAKRgcKHjbITDuO20c+WNLiIQTP9uc6vsu6HvKQftKIP7 dsKjNUoAEZXiyEgvQ08pLgiq3aJjYNGeukrQPAyOO3hLzb4l5doRId1XyCC1wbzvpqF9papJXrM QQDpOh6BFL0nQapqqSKH06Zq2LbNVDpip4kpP+OA76Twel1dxFgylhc+jHrXR4r0oHws32ufIUG I5FWoItRncQFIFemXW2E1RPH9PyXU0sKuQTq9GbAXL6mCjVjJCUzwdekl8+t/Z7Yi3PSw3Dj7um yx3ftSKl54QQj5BEfEbXdZHKwaSYNL+IeexrHJ0cP451vuYcFMwh+Ez721XsLBsSlUB+dmmOwL8 0VJQ+UBp0ZisLmpXzKdn/0JzILc3jiW6MbTGlJ7uScO30h61N4OPIuxFcktA== X-Received: by 2002:a05:6512:3509:b0:5ae:a9eb:eff0 with SMTP id 2adb3069b0e04-5b0236b3f00mr1956757e87.57.1783927242235; Mon, 13 Jul 2026 00:20:42 -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-5b01ca55723sm2625636e87.35.2026.07.13.00.20.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 00:20:40 -0700 (PDT) From: Marcus Folkesson Date: Mon, 13 Jul 2026 09:20:01 +0200 Subject: [PATCH v11 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: <20260713-i2c-mux-v11-5-72bb8af8ee8c@gmail.com> References: <20260713-i2c-mux-v11-0-72bb8af8ee8c@gmail.com> In-Reply-To: <20260713-i2c-mux-v11-0-72bb8af8ee8c@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=KipNKAzTJU8VgRjKDoGKNRn5s5XpRFE3NoXWRS5HQQc=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqVJHEIYnKNxtWilpVrad41XofG86sGu06CkLzf K82KPt+QaWJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalSRxAAKCRCIgE5vWV1S MvUCD/9LWlczj0L1fn2joODNFGQb5woOPuSNDMMw85B4V5Wrc2ForgHkbHfPvwBjF/xVQ6f6JS8 SuDQDnzIqvsuMFzw8R5LfUmm5ueZIDPhQmZbVGXJgzyCl8xO0tq0uOHYOHbaICriYM0XlkKBWBw e1uQ92LgMebc+FmEQJFjjbWHMKWJ14QHVADKqiVF7t6rl6xYixN10JDxEQDJMpXlz2W5OOu220h +A+ExVcp3Y770NBaHD57rNHcbddOxCdB6UelwsqFE0sYf33EYrLzV9IK3VnuCbunKM6LIbFPJ+Y M5top4ePflHSPJ4VN3z3kH20ou2P6uq+lyEv1/rWbpUhChUyapBwkpLLBY4AB+bxyMA9hq9lLzU 5C38tYq3hsYE9j/3yG8QwYstzhpDUR40OnPz+IWxZv5iXNf6FMbOxgBePiFGBUKgvHsIhYNK0JU gW6wbOettVXjgAWzW1B41Mylp/Duo4a5YVKFFb1luIoAsexGN2xyJLjkBBeB/6AqsX6sD8KlMck NgSDCk+V42y/Hd2cJ3a/VCKTjG7qwcvFN8B4SYk0iWMj46H14iBwhsabi4KDbA3Y0dR+8pNu/HP zG5OdeqB1JzXFJWR4thJBzZfhQ+SbXhzY2gYYt+pPQ6SAul2lHuvEu1fjEPaCCgsBbb6pyvmNK0 D2kerlOLYIt/03Q== 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..06e8af83df0e 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 22:03:16 2026 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F06936F901 for ; Mon, 13 Jul 2026 07:20:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927247; cv=none; b=A5Xq/IbkBf3Tmv01EKbAwTvi62c5dpTdxKndI8LcBmP5p7GWSwdpmVmXQvog95ZCOsqOriLY3LRpFUkNbqspsx9WRJjTRHzBGGqiVpu6Z4oDueN3tki3GjzYCDi6+2cefU/qVaDOrmkGxdovfoFykVdgQ+njTWE3dIUiGjlXfhE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927247; c=relaxed/simple; bh=tWBE+9nC9oYSk5UAsuWGi9/zHXxUjrXV0Pqxs0s1rgA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jEucDPrb90gku9z2b84mwA5Qj70tzodrDiHeLGXikJzAoO6c1I17cI7b+GlDSALQBBMMYPbCAlPOukQRI5RrXf+kQ4OjdDnnWclo7WuBShhIClBRZUyvroVM7g6DD5ExHPQOqiwOP3O77etJ1Kwq2hWoA+tfhnFpbAPoAxPwW1k= 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=PinkzyY4; arc=none smtp.client-ip=209.85.167.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PinkzyY4" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-5b00d1e7082so2114051e87.1 for ; Mon, 13 Jul 2026 00:20:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783927243; x=1784532043; 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=2vmZPZjXbsjdRbGB07wKnlv0n+AtIoVZmnXS0nIYHMM=; b=PinkzyY4JUWehSZGCn5ufPKnNuPwus8gznIRcf7YOpd2IgepSFxIHgeyga+lNxF2k1 5DozAfWSsnx5M/IcFLW9OajbM0XU2wYi9dZwQYl53+sAlBini3uoNVOcwQdY2B+N6oNv UKDJXRakHi3mWN6H5J3+CsIdag3Fdl0T17jbb6/7iZRdpnQALF3dhSA4Kh6ikGLp9sPC 0RoI57sO11ZcnDyuHNtl/9aL7LTODlefUMcxVf7ghb5Gew54bs7DmOirKxhXXnTj1tYO T/F2SKH0bZoFS56POKkJ0Ba7CfWARzUk7AO0FMWZiofLOX2hvv6cNfu45Fit+aT8aFg+ jkbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783927243; x=1784532043; 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=2vmZPZjXbsjdRbGB07wKnlv0n+AtIoVZmnXS0nIYHMM=; b=ZiYuCn4ODAv2s4r26JjuUCTdFhJw6ljvuKeCFxeDt2lw7eoU9+Z0RwIZ0MRUwbc8D+ UM5wveY1GRweX1eAo0U8K21Onvcw0I2ltCisXoYno06EFcY21us+E4eTqEeWa91TURoM shzo4ft/WeEkESQkDROtblaJ6Cqcnefji2q97v8Lkyv45l46JohR9mEntLeMSrum8h/4 hhY09Antoom8RmInnONjDcLtIVDa5SxZrPRnSN47U+90BHR6dunhMWtqzQyl2J2Uyk/n cfKJK64r/Tk2geTbYxGPEHLAlW33cQZU2V5hgqzXKQF/V8DrEA7Q+gTAYYV00wlfdI6v czmA== X-Forwarded-Encrypted: i=1; AHgh+RoxjLWsjNG7JxmPT931j1cwGBBgJw7zaKgqx4FacWzqLoG/8uqkntzoOkq5gFQ5i50arhzjHDrowq6hhPo=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6P6XfdrX7dHOICQaHzx3uZWYsNlHW+MKE7l2CyeYDmGjh5Xbh 1WJTG4aHnJXxlIGaCEX724niCXvBDr0JS0swUIEp7OskZcjzLkBoNiAu58gvEEv4DnU= X-Gm-Gg: AfdE7ck+p5Jxt6AnwTDwZyqn1Mb5ocZt/nhohBWsOKR9cqlVTTfzlTdu7qWCcAOn8IJ iSkrgu/Zx43zrjyBlgakphmMXucjd4YdZ0fEhfx+s7DYMALvaE3+8CdDwvvnXQ0sPo79NdA/lx8 J+Q3Gqolh4evvU6DJKtGy1xj0xMK5/6TtJOKz7YCk6AaXDVMEWw23qRoDN7DnUtI7Zt9WjZeSui EQsqtpYg76WjsTAzlYNZjIMB2NWFnDWGFRdQ1nvY7VhjX4S2V0UwbBLMo6eRdsfKKLw+RSXIfpT ReqyHlyHAZi4cEcN2Pcqqons/ESXTKRsKCEAtk5moPZpgFyOcGSDVOltU7Z7ZOTt1El0yMyZahn NryT6LrRBaRQ/DO51i0nr6Ntm7vBGg6SlyTXkIN/BPIl3mGGlJOZZpQrq9aRN+ePLXIYeCy5CkN 3yODegbyR839jHigZiUAr666GgUZGdQpWYL37rELi1jjx9JDZl3GV0rFxKwA== X-Received: by 2002:ac2:4544:0:b0:5ae:c210:1a19 with SMTP id 2adb3069b0e04-5b0235657eamr1234362e87.12.1783927243380; Mon, 13 Jul 2026 00:20:43 -0700 (PDT) Received: from [192.168.1.135] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b01ca55723sm2625636e87.35.2026.07.13.00.20.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 00:20:42 -0700 (PDT) From: Marcus Folkesson Date: Mon, 13 Jul 2026 09:20:02 +0200 Subject: [PATCH v11 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: <20260713-i2c-mux-v11-6-72bb8af8ee8c@gmail.com> References: <20260713-i2c-mux-v11-0-72bb8af8ee8c@gmail.com> In-Reply-To: <20260713-i2c-mux-v11-0-72bb8af8ee8c@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=763; i=marcus.folkesson@gmail.com; h=from:subject:message-id; bh=tWBE+9nC9oYSk5UAsuWGi9/zHXxUjrXV0Pqxs0s1rgA=; b=owEBbQKS/ZANAwAKAYiATm9ZXVIyAcsmYgBqVJHIkaxmStpAntzH4EF4X+3uFF8fU4VR6pxy2 qW6K8bor62JAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalSRyAAKCRCIgE5vWV1S MtMGD/9FeY+aRJXCArOuIHRATMXvNmzmm2bgWtK5fqndDZF+nnjxa4OdbmUDw0DXnTAcH41Q8zA SJNhPg7tHbTLyAk6hNZOffWpTPyBJSg2gREx/igaTf6UKjUR87MfTMbmw+U+tBRXgZqYnCCE5Hb hpcp3/m/jU5zsgbJ3qDYtWakO1FZQrVDyWi3dTC1hhH0i7p2sQ5ENgFeurVDF1pVlSaaGsf+EC/ kgyWwU30RXT4n+KL17ExMRlgXhhe4oxV3QwtVXSmq0BlOSpT2/IM9sa0zIFJo+1fHNnIwPnkLWR 67Qt/eextkWalgfMCPEn6gaLrK1o+Vi7UrLIgahGyBAjm9eEy1Jw64SEK++DLUwcWXIsi8KGJfb q9RCttMn626mXzsxoHwvdtYv2zqruEQ7hnVO4/UGisWqGSMZaYGMtOZ1UHGo5/GklY+15rM247s b0RbhhCyU4HjObSSnguyOiLPrF7KIxEztXnEbWH7/q4NvJaQVJe7DSl7wXv5uDJUL3OTKYImcdQ yOTjfkAYfvYjJsQ7hKfVyhOERuqKfFDP84o02XOKpDGyHWj7dOUJaC6QQsP5QbO2YMea/7kouG3 +eU8T0kJ9YRxapahtHIj2Z3V93wWYZDl8aIk4CTfx399Ki30Uqw6Q80zcO5dFc/aLszH4qSiXi3 Fg41PQK1pGG8siA== 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..d1bd59d73799 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, 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 22:03:16 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 01E3938D3E2 for ; Mon, 13 Jul 2026 07:20:47 +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=1783927249; cv=none; b=on7nGv/Kvx+KQ+TkuJ2zQRGBo88P6tt5eBp2gnzpSqKeH1/HR70uvWfpQQCHMKhJ+d+DPVxWPUNkre7Mqu9bZPBmRtx4lB2TXC7HbB1Yc7yGgb3zUAe5brliuUHbg1Zt0t0VpGrq3I8w3eqNE1vTKKaA1qchIPLNF38bX4rb2f0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783927249; c=relaxed/simple; bh=B2YqMrgTja5ulsdupqJSWKQwHmegjD8Hbyvf0CUQZgg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VWRYdrfb8yR41vStcT4BPiZ2XTFY268SrdQK4HrtbCla0e8tp7LqbkczAs+Nzthwg9k0WF/DEfV7O+w4FeqA1Jqf2xrTC/tmf92jTVQO+ymylvgYyGWmpHm+mJzKyPhvlJ10RK2gbAqw0nk4EQTeL+i6UR6k0/mGZv4YaOXATLc= 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=rkFh1X3M; 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="rkFh1X3M" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5aeb5e85378so2898565e87.1 for ; Mon, 13 Jul 2026 00:20:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783927246; x=1784532046; 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=rkFh1X3MNSifCDiRPl7+RXVkEqqypG10lQf85WdhK64v88A80MDjGrkanYhPHRSN8B jOQIFKp+fc8uY9+MDJCsw1rrzPUbfqque+whS/ifcuUnimNZys84SI0R1xYMovvuQYfD xXtllNH2qdBoRTz8dBQSLo82/5a4w2i+3U9JQfq4fTb7oB+SgADp16iKDwA53pnzL9VC 02tvMgczRx9OVSJUZmI9z5SdB5clpWnbQkIpJBWD/iaEEl4KNLF947TITR2ybfqRPzpO eHt7kb0SoDJvKOtt+HIPNgT9shhE0WXwJ+AjPlrt/Qb7AWQtB4gQQ7YGyHJ2kPrq+9uj A6dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783927246; x=1784532046; 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=M4WQIoCxCS84AocVZ2HuDy8YjP+OduqDaFxiVb1VJ6pjCP+B234SbZySaCMldAjX+e ODDzhetiWLPvCk04GOZJTxS1dNs5/jqBZrHhmIRh7PifyuHeagRNnq/bd8OpBUZoI3sK 7uTO5UDno/GpAi2C1zh3JIxvtR7GdbUeSJO/N6ehYsaAQKVpvf+n9dSAnsC8qBSmbHJM +YoNBUdVYkvATh2ffsKXnBX080cce5zi+tI46L+K9TKdtJ3RJRvr37MACAl+EgevHvvk TgDWg92SyY4PkCKfZ3cptE6FRE3novs53aEIM+fn8tzkX/HY2RVXiKnt7TAkMCi0zfIE Jymw== X-Forwarded-Encrypted: i=1; AHgh+RrqSGKAy40/hKv3rsFv4ggxTp1B8JEN4iRKBR0mzRwq6vFbUwqSLZkpCr+PqRjmS8Z0oOqMBX4V2zhoRcw=@vger.kernel.org X-Gm-Message-State: AOJu0YxhCHi/SccZwuHIHCKx3qLpKcgQnH7M9WURr0cFaFHYnabw8hc0 1668Tlu73QrXom4k+aOfze27zJtcugbqtwxzChr/PUSJa6rJlM2glvAW0P59B6DSxVk= X-Gm-Gg: AfdE7cllB/HL7SBxb42e0Ixmq7Au46OuXByMT2hak0gD2toWjaTkN5DRUQ11mojliUy y+rVznL8OIA73ZW5nQt6kTWK6ezF0bQ4PobtZpfDBdbrlV86obrz/K9m/cL9FGENAZEC4WLuGEL ZuQySffmbq8pPJujwL5dyzUEZlvHFlA4vGvstY1NIlb6KAdk5Rp2c/Y2cmR6KKBRYjg5sztjHaH fs1wQ6qGVYSUxNf4Vq/gukfsB+Rkn1thST9bGlBcDiuVz2YdpIdn1ca2DPEGUNi1CvsMvGNtROX mYk+RTuEd9endMNWLOhe5BbRAMLnf7u8FhBRsehDDAqY7RfqcZdRAnNkvELd/G/L12pagfhYAcE lSwxtzBXLeZm50VPuaFg/eCAMtZqJxpcXO3xCE/hRZKEaciHlPEtX/TX8DRQl++lW0wmHul69D7 bWs5E2m21LN1hQ+hW+aGOcz0FIHIEDPqdukOOUanj4rOQD/xHzmJQeR77u5Q== X-Received: by 2002:a05:6512:1448:10b0:5ae:c34c:aecb with SMTP id 2adb3069b0e04-5b0236c8074mr1227281e87.41.1783927246050; Mon, 13 Jul 2026 00:20:46 -0700 (PDT) Received: from [192.168.1.135] (83-233-6-197.cust.bredband2.com. [83.233.6.197]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b01ca55723sm2625636e87.35.2026.07.13.00.20.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 00:20:45 -0700 (PDT) From: Marcus Folkesson Date: Mon, 13 Jul 2026 09:20:03 +0200 Subject: [PATCH v11 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: <20260713-i2c-mux-v11-7-72bb8af8ee8c@gmail.com> References: <20260713-i2c-mux-v11-0-72bb8af8ee8c@gmail.com> In-Reply-To: <20260713-i2c-mux-v11-0-72bb8af8ee8c@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/ZANAwAKAYiATm9ZXVIyAcsmYgBqVJHNuKyI0yNLKsQJG4GN5P1WhzEMYHleBlk62 DTxJOazLuCJAjMEAAEKAB0WIQQFUaLotmy1TWTBLGWIgE5vWV1SMgUCalSRzQAKCRCIgE5vWV1S MrdWEADPLGXRkVU0zPINh6949Chkjripdi5y3umm5HOULOIHGi9eMA9pceYq+IigsxfwU5Df2XB HYQJKvnC+vzTxikIsDb+RFo+3rf+pqu+4kMr7HHFyMFQKNJYl0ThYKzFlLWlxlsptKphWzW6Rp5 449ayJi00lXvdfzWd2VrjoMHk7s6eU4BMHmLwQMdEogZV8JaOT6ErelaJEBiCvvw2Sk49In9krp RFb/cnlAtRPO6zQ+emjgP80FUGfidG7RHk1aQnOJb55ZWLt03DpAiUtloywdLt0zLPoG010Drb9 yCzjYQ+cHoqFP6wlzk05ygNI/w4Cqq5C0THvTj63HN9p7Mg+44iNx6DOfr8FQ79gifWEyFhlxEY huWjuIoAKZSxsdAXpoUMkQYiG+58w9sUKGXYjs030pHWZs0szCA/75vpXDl+IPrRasvh6XrpJju PWjCdpYhOfzJecVct8yn4QBlwrhVRsP/HcFvqjK8nZeCpSBdUd08A7TQT5fS7UnPNDJr48FmNJ9 5JIb/Vt5jSko2iU0nTOQ3SSgGoZSJWoVfBFDKmQnrkvn617aOd11XbLBjacdTRZnjRRLIZvjs4x EgQjBdNn6o4h99xnEhdGhRxMIgRG/i3boiGDaZIqsPJXHjJvirwunqu1fnWEDTOFh7JRTHg0FRl 7N6h4tdt15p9adQ== 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