]> 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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 Aug 2025 08:47:30 +0000 (09:47 +0100)
commit 56344e241c543f17e8102fa13466ad5c3e7dc9ff upstream.

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
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/i2c/busses/i2c-tegra.c

index 08a81daedc115eb30ea3bf63a53ea47cea598cff..5766231b13cd171aea01cf00762ae18f941e351e 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))
@@ -1668,19 +1663,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;
@@ -1790,10 +1772,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;