From nobody Wed Apr 8 03:07:01 2026 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3222E3C944F for ; Tue, 10 Mar 2026 18:40:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773168058; cv=none; b=nEuJ0h5ypkggxFu/l9iFdOOS/4AskZvmXSE+G9hE3i+9w5+gUPUqmM3q2OTACvLbUl2+H30fYqpOS3HwztaUm7PjJOdjk+M9PoXNJgZN8WsvEOC7W58CiUhsomdMrfn7m+twvKZuqGBIemaxapeG0tBmvaWVTHJO/4+PIaCLSKQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773168058; c=relaxed/simple; bh=IgqVFkgFxEBHiKye28u1/DIuj0AxkVj1Nm37g8a7WPk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=BxIK4jZZaBXvydotxtz4jubrt0iKmQPK+incO7f9gVXQMLwytLYUCb5PsWSGUjmJ15PfcpHHoS3qJf5MwxMlz4OFpTvX6RTMmY/lKkejUrIpT8IY2hNsSlH/x3ECYST79SFAnlXPsayMLOo7nSvkBldy3JG7GB6QFX89bqGBHRs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=eRzE6c/g; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="eRzE6c/g" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5a13a06fc85so5458701e87.1 for ; Tue, 10 Mar 2026 11:40:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773168054; x=1773772854; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=8H73v1k4yDBPkQaRIJyPVtsS2/rCIW0PUibXBmUlqIY=; b=eRzE6c/g3XkhlEK52OzCw1CPNVphepbP2i1knsBjbY4yqttcetdiSN3D3bvsacRMaY GYZI0w7AAwvQ4ZzylgW49y2oprOfjB618bc2SBG5T5d86VwLIf1awY2oBXCAP+fLADg3 KLo0fAWr/C42P3lIVGQaPDtzH6tE5vEgi6OBii1yLP/tbfKO1OBIw2iW9yjpPdvaauIo NOkfEkl2IMaTq+aBZCRWLB2OIdux13HB5Xs7ekYU0cX6qguldemvWrSqaiSUb94jn34x jj3GvQoFp85I3DFwo2zyLm5zbigy5Q6WuQHOT6znjKvQcPmgBLjtHFg4IjxR/6Rj0Smd LvDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773168054; x=1773772854; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=8H73v1k4yDBPkQaRIJyPVtsS2/rCIW0PUibXBmUlqIY=; b=nBnOVCQxGtkwTY3U9FTnVzu9wf0xxuk0L0zvCrNeVU58iA9XSMDPTsMoq2rgBsIgld KC+ywhHOWlH/jlOHma161BVP/ONt5lMHOvJ01UeFLtXs6aVHGWTWIt674z9r6OZk6o/k Kve16TyUOZBi7LZ88SZPgMbYuCXtAog+h2Mk3fTjzRnynMwDtFglt2sSGFx/qX8wlsek 4EAoOrxUtlgR5IkOmvD/thFWJwPzadq+klH1e1D5TsW6JhZcj3kuQy+j/7Mc0RevcTgJ M1CYoRd8qFuJbjwiSpn5H0MdhBUWnUSbgZ5ArbUyb+lw3Ivkmk0duCm3A+BnwEOCTHy2 4d/w== X-Forwarded-Encrypted: i=1; AJvYcCXzGE/bG4gvpTw/Ay/4Z4bSEFqKRfScKPQsinvrS4xAcsJl+qT476eZXsaFmB3hAHxvc7eLYAl6Siq6j1g=@vger.kernel.org X-Gm-Message-State: AOJu0Yxxq/ND+Mb/EgXiBiSJ5rrvNyAg8sg/Ab90Fp6XO0CgOUtLZNzg nErvGy4DGicbwYhN4Djr13CQfnew3ozj5LBGeneZHj94fWeIBZO2hYhv X-Gm-Gg: ATEYQzyRm3CxOEYfs/8rNrfhDtnRRA8IoT2UQooZRNunjD6F4/KQNKy7S1smwxgP0rM ZwLjrZmtFsOtKFkNMOYGJ+Swp3DzHqNI5nO1IlyimSAxVabRnOdPgeiL4J6bmsJ9DxsRUMyHgsC YFvQckPJDKTAzfOnZVBSf1PygOGNxZSZnVm4JN6YYmfnRB9TvRYDr+n0hZd/NLPvjYg0EaoQwOL 43kRO/bp+gsMCCrfq62N5eEHi8fZC+qsMV3UouiZnK+VMjFpnGtsD0d4Kj6DBSI2Gr8CvIzdWQP c0exX0IC5cYx2GIcyCdkMCXqkMkRGAkY3zFwTfyPhhvkyBlxnnhZsdi0O5ZzfXajfU/3ayPgw7e 3pG/l+Uum4+UzhNktEviBCLEUBSR3SjdiglZvURzkmR9PmN0WN6mOZQPwyEDGnu1zifkxohRYb2 uDF/G+v+bMVJt6O0/oyDVgLmSiupCQkY7i8T5saFQg1tk= X-Received: by 2002:a2e:a985:0:b0:38a:5e09:21ba with SMTP id 38308e7fff4ca-38a5e0923d8mr12345161fa.25.1773168053984; Tue, 10 Mar 2026 11:40:53 -0700 (PDT) Received: from NB-6746.corp.yadro.com ([188.243.183.148]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-38a5cfa060asm5905891fa.3.2026.03.10.11.40.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 11:40:53 -0700 (PDT) From: Artem Shimko To: Mika Westerberg , Andy Shevchenko , Jan Dabros , Andi Shyti , Philipp Zabel Cc: Artem Shimko , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] i2c: designware: add reset control support in suspend/resume Date: Tue, 10 Mar 2026 21:40:45 +0300 Message-ID: <20260310184046.2010403-1-a.shimko.dev@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The driver currently acquires reset control during probe but does not manage it during system suspend/resume. This can leave the I2C controller in an undefined state after resume. Add reset control assertion during system suspend and deassertion during resume to ensure proper hardware initialization across power management transitions. Skip runtime suspend if the device is already suspended to avoid redundant operations. Signed-off-by: Artem Shimko --- Hello maintainers and reviewers, This patch adds proper reset control handling to the suspend/resume callbacks. The reset line is asserted during system suspend to ensure the controller is properly quiesced, and deasserted during resume to reinitialize the hardware. Additionally, the suspend path now checks the runtime PM status to avoid redundant operations when the device is already suspended. Thank you! -- Regards, Artem drivers/i2c/busses/i2c-designware-common.c | 40 ++++++++++++++++++---- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/drivers/i2c/busses/i2c-designware-common.c b/drivers/i2c/busse= s/i2c-designware-common.c index 4dc57fd56170..fbe817df9b2e 100644 --- a/drivers/i2c/busses/i2c-designware-common.c +++ b/drivers/i2c/busses/i2c-designware-common.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -967,6 +968,7 @@ int i2c_dw_probe(struct dw_i2c_dev *dev) } EXPORT_SYMBOL_GPL(i2c_dw_probe); =20 +#ifdef CONFIG_ACPI static int i2c_dw_prepare(struct device *device) { /* @@ -977,18 +979,23 @@ static int i2c_dw_prepare(struct device *device) */ return !has_acpi_companion(device); } +#endif =20 static int i2c_dw_runtime_suspend(struct device *device) { struct dw_i2c_dev *dev =3D dev_get_drvdata(device); + int ret; =20 if (dev->shared_with_punit) return 0; =20 i2c_dw_disable(dev); - i2c_dw_prepare_clk(dev, false); =20 - return 0; + ret =3D reset_control_assert(dev->rst); + if (ret) + return ret; + + return i2c_dw_prepare_clk(dev, false); } =20 static int i2c_dw_suspend(struct device *device) @@ -997,15 +1004,28 @@ static int i2c_dw_suspend(struct device *device) =20 i2c_mark_adapter_suspended(&dev->adapter); =20 - return i2c_dw_runtime_suspend(device); + if (!pm_runtime_status_suspended(device)) + return i2c_dw_runtime_suspend(device); + + return 0; } =20 static int i2c_dw_runtime_resume(struct device *device) { struct dw_i2c_dev *dev =3D dev_get_drvdata(device); + int ret; + + if (!dev->shared_with_punit) { + ret =3D i2c_dw_prepare_clk(dev, true); + if (ret) + return ret; =20 - if (!dev->shared_with_punit) - i2c_dw_prepare_clk(dev, true); + ret =3D reset_control_deassert(dev->rst); + if (ret) { + i2c_dw_prepare_clk(dev, false); + return ret; + } + } =20 i2c_dw_init(dev); =20 @@ -1015,16 +1035,24 @@ static int i2c_dw_runtime_resume(struct device *dev= ice) static int i2c_dw_resume(struct device *device) { struct dw_i2c_dev *dev =3D dev_get_drvdata(device); + int ret; + + ret =3D i2c_dw_runtime_resume(device); + if (ret) + return ret; =20 - i2c_dw_runtime_resume(device); i2c_mark_adapter_resumed(&dev->adapter); =20 return 0; } =20 EXPORT_GPL_DEV_PM_OPS(i2c_dw_dev_pm_ops) =3D { +#ifdef CONFIG_ACPI .prepare =3D pm_sleep_ptr(i2c_dw_prepare), LATE_SYSTEM_SLEEP_PM_OPS(i2c_dw_suspend, i2c_dw_resume) +#else + SYSTEM_SLEEP_PM_OPS(i2c_dw_suspend, i2c_dw_resume) +#endif RUNTIME_PM_OPS(i2c_dw_runtime_suspend, i2c_dw_runtime_resume, NULL) }; =20 --=20 2.43.0