Commit 56344e24 authored by Akhil R's avatar Akhil R Committed by Andi Shyti
Browse files

i2c: tegra: Fix reset error handling with ACPI



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: bd2fdedb ("i2c: tegra: Add the ACPI support")
Reported-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarAkhil R <akhilrajeev@nvidia.com>
Cc: <stable@vger.kernel.org> # v5.17+
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarAndi Shyti <andi.shyti@kernel.org>
Link: https://lore.kernel.org/r/20250710131206.2316-2-akhilrajeev@nvidia.com
parent 89be9a83
Loading
Loading
Loading
Loading
+1 −23
Original line number Diff line number Diff line
@@ -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;