]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i2c: tegra: Fix reset error handling with ACPI
authorAkhil R <akhilrajeev@nvidia.com>
Thu, 10 Jul 2025 13:12:04 +0000 (18:42 +0530)
committerAndi Shyti <andi.shyti@kernel.org>
Wed, 23 Jul 2025 22:38:00 +0000 (00:38 +0200)
The acpi_evaluate_object() returns an ACPI error code and not
Linux one. For the some platforms the err will have positive code
which may be interpreted incorrectly. Use device_reset() for
reset control which handles it correctly.

Fixes: bd2fdedbf2ba ("i2c: tegra: Add the ACPI support")
Reported-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
Cc: <stable@vger.kernel.org> # v5.17+
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20250710131206.2316-2-akhilrajeev@nvidia.com
drivers/i2c/busses/i2c-tegra.c

index 0862b98007f5474c0e1f4a46d5bcbb037cea1be0..6316360475e7075c35d9ccf5d17b98394c6a51da 100644 (file)
@@ -607,7 +607,6 @@ static int tegra_i2c_wait_for_config_load(struct tegra_i2c_dev *i2c_dev)
 static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
 {
        u32 val, clk_divisor, clk_multiplier, tsu_thd, tlow, thigh, non_hs_mode;
-       acpi_handle handle = ACPI_HANDLE(i2c_dev->dev);
        struct i2c_timings *t = &i2c_dev->timings;
        int err;
 
@@ -619,11 +618,7 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
         * emit a noisy warning on error, which won't stay unnoticed and
         * won't hose machine entirely.
         */
-       if (handle)
-               err = acpi_evaluate_object(handle, "_RST", NULL, NULL);
-       else
-               err = reset_control_reset(i2c_dev->rst);
-
+       err = device_reset(i2c_dev->dev);
        WARN_ON_ONCE(err);
 
        if (IS_DVC(i2c_dev))
@@ -1666,19 +1661,6 @@ static void tegra_i2c_parse_dt(struct tegra_i2c_dev *i2c_dev)
                i2c_dev->is_vi = true;
 }
 
-static int tegra_i2c_init_reset(struct tegra_i2c_dev *i2c_dev)
-{
-       if (ACPI_HANDLE(i2c_dev->dev))
-               return 0;
-
-       i2c_dev->rst = devm_reset_control_get_exclusive(i2c_dev->dev, "i2c");
-       if (IS_ERR(i2c_dev->rst))
-               return dev_err_probe(i2c_dev->dev, PTR_ERR(i2c_dev->rst),
-                                     "failed to get reset control\n");
-
-       return 0;
-}
-
 static int tegra_i2c_init_clocks(struct tegra_i2c_dev *i2c_dev)
 {
        int err;
@@ -1788,10 +1770,6 @@ static int tegra_i2c_probe(struct platform_device *pdev)
 
        tegra_i2c_parse_dt(i2c_dev);
 
-       err = tegra_i2c_init_reset(i2c_dev);
-       if (err)
-               return err;
-
        err = tegra_i2c_init_clocks(i2c_dev);
        if (err)
                return err;