There is a bug that causes the following error when in fact the clock rate has been set successfully.
Output of dmesg:
Fix:
diff --git a/kernel/kernel-5.10/drivers/i2c/busses/i2c-tegra.c b/kernel/kernel-5.10/drivers/i2c/busses/i2c-tegra.c
index 22672c53c..092b35ae7 100644
--- a/kernel/kernel-5.10/drivers/i2c/busses/i2c-tegra.c
+++ b/kernel/kernel-5.10/drivers/i2c/busses/i2c-tegra.c
@@ -1738,12 +1738,12 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
if (adap->bus_clk_rate != i2c_dev->bus_clk_rate) {
i2c_dev->bus_clk_rate = adap->bus_clk_rate;
- tegra_i2c_change_clock_rate(i2c_dev);
- if (ret) {
- dev_err(i2c_dev->dev,
- "failed changing clock rate: %d\n", ret);
- return ret;
- }
+ ret = tegra_i2c_change_clock_rate(i2c_dev);
+ if (ret) {
+ dev_err(i2c_dev->dev,
+ "failed changing clock rate: %d\n", ret);
+ return ret;
+ }
}
Edit:
Should puts i2c_dev->bus_clk_rate = adap->bus_clk_rate; before ret = tegra_i2c_change_clock_rate(i2c_dev);
And should we save the old clock rate so we can restore it if failed to change?