]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i2c: rtl9300: add support for 50 kHz and 2.5 MHz bus speeds
authorJan Kantert <jan-kernel@kantert.net>
Fri, 27 Feb 2026 11:11:34 +0000 (12:11 +0100)
committerAndi Shyti <andi.shyti@kernel.org>
Wed, 1 Apr 2026 21:55:33 +0000 (23:55 +0200)
Some SFP modules on certain switches (for example the ONTi ONT-S508CL-8S and
XikeStor SKS8300-8X) exhibit unreliable I2C communication at the currently
supported speeds. Add support for 50 kHz and 2.5 MHz I2C bus modes on the
RTL9300 to improve compatibility with these devices.

Signed-off-by: Jan Kantert <jan-kernel@kantert.net>
Reviewed-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20260227111134.2163701-1-jan-kernel@kantert.net
drivers/i2c/busses/i2c-rtl9300.c

index 672cb978066d6cc4d85ad93e0b1e0c2473e11d92..67a5c4228fc9c9ec46cd54a2a49c2e0a1bd26853 100644 (file)
 #include <linux/unaligned.h>
 
 enum rtl9300_bus_freq {
-       RTL9300_I2C_STD_FREQ,
-       RTL9300_I2C_FAST_FREQ,
+       RTL9300_I2C_STD_FREQ,                   // 100kHz
+       RTL9300_I2C_FAST_FREQ,                  // 400kHz
+       RTL9300_I2C_SUPER_FAST_FREQ,            // 2.5MHz
+       RTL9300_I2C_SLOW_FREQ,                  // 50kHz
 };
 
+#define RTL9300_I2C_MAX_SUPER_FAST_FREQ                2500000
+#define RTL9300_I2C_MAX_SLOW_FREQ              50000
+
+
 struct rtl9300_i2c;
 
 struct rtl9300_i2c_chan {
@@ -433,6 +439,12 @@ static int rtl9300_i2c_probe(struct platform_device *pdev)
                case I2C_MAX_FAST_MODE_FREQ:
                        chan->bus_freq = RTL9300_I2C_FAST_FREQ;
                        break;
+               case RTL9300_I2C_MAX_SUPER_FAST_FREQ:
+                       chan->bus_freq = RTL9300_I2C_SUPER_FAST_FREQ;
+                       break;
+               case RTL9300_I2C_MAX_SLOW_FREQ:
+                       chan->bus_freq = RTL9300_I2C_SLOW_FREQ;
+                       break;
                default:
                        dev_warn(i2c->dev, "SDA%d clock-frequency %d not supported using default\n",
                                 sda_num, clock_freq);