From patchwork Fri Jan 3 14:00:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 13925599 X-Patchwork-Delegate: geert@linux-m68k.org Received: from mail-ed1-f54.google.com (mail-ed1-f54.google.com [209.85.208.54]) (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 409DA1B983E for ; Fri, 3 Jan 2025 14:00:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735912862; cv=none; b=WSfKactX0TUcLF5z0RMvGvbBL9kTfk4Ht/XgfqZEv8OZS3IOdbdNziSfOGmZ3/CJ5gld586qG6y109m6Xx3pU9gzcVOYAmDEr0hkH4SlYvDCsLSkM5SFJuwY7dqL5iWuWvOReeCYblwjK8W3UGj/8wp1koqrv3BpoY6ATwYgLQ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735912862; c=relaxed/simple; bh=EuNVdSlSZudyJoOAdfDuJcdMXRlPdSBuq49eBU9+fpc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eHX6RVL0I2HZYl1tyjXRZre8GDvCFoEyAYuyPIJ6lT4Mk51/HTGM4ju8RP1HrRuxiPV2bnxIkG+a/FM9GdLC2m3kjSDwxe87GESa64Isbf+yu5V3YJJ8WH6tS63IsDa9n8BCxWDMhuE6voCRLaB2NWMgT5eVIjeev0whEfnQrqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=T/bZ5UT7; arc=none smtp.client-ip=209.85.208.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="T/bZ5UT7" Received: by mail-ed1-f54.google.com with SMTP id 4fb4d7f45d1cf-5d0ac27b412so16475422a12.1 for ; Fri, 03 Jan 2025 06:00:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1735912857; x=1736517657; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZyoJR7eM+UULUVfgeh2RQ3JsSmCjTnPlEP7eCTmVZEM=; b=T/bZ5UT73CoqhM5XtnHfBCJOiLWuWT0OfsmasT+MBHyRKh6X62SEjlKJPUt/H5o7cf 5FnhkUNZdiYhObMiH5CjDWazzu1Ywhhw6URKiUWJ/BmGOmKiJXc+qEsWBVUtapza+fne SZL/UHtQt5z9RWHj2RCltLmxMibB041T2ILjvF3HKg4r7+XXa9ps9ojocjPB6GEhI7oe EPVu1YYJLcgQoMOzKNRsSglUba7S0FgzcHeZ+SiChyJ2I21CTYjihUlVfQzn+d6/CLJ/ VXKfRWYkS+9Upsu/rlxL1BjMkp/eaxLIuRfqeGiJ7yaeBWFSblsRcLwuZSOxnKJ8nioH 6EWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735912857; x=1736517657; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZyoJR7eM+UULUVfgeh2RQ3JsSmCjTnPlEP7eCTmVZEM=; b=Psn8kgmx3q8zD5rzupp8ctd0p107WZLc6P0kLfTQy1oH51gMmsJUcO2LJi7tA0CY3g HSJLjHhEHwXjHGyCRxpz4lCJZd4EhmXteyZaDT4HrS7ennIwq+yC0dG2FkzLwWPAs1pl m1HeQksz9BL2GxhBwgtoVY6S0b7vmLMl+OEJg0mMX9aO01xuBa+GRQPtn03Z1DU20dEh o8/boad9Zs0W/FBpWG8C05vovYFaBDYdZ3b6unlTp4LwlmFxME2K6i6jyUcj+ZAUCXIL y4f/kBH4ISZlj4P8DhxOvy5t4tZNuJGLU+aIBLpMkAW8rGJO2TBS+pKsLoZ5hx3AajEL GGuw== X-Forwarded-Encrypted: i=1; AJvYcCWbePoTex9MCPOBTMt+QAFExq8KJDXWcFKN/0yFejCx9OOsebtAVbsfKRlgBTQ3ckjvxgrKr2/AmDQlnT9tRok8dg==@vger.kernel.org X-Gm-Message-State: AOJu0YxCH+79rghoDAm+tNhiglQNFqS4JBHnxX+IVQ/zaOaoEkx7aoAJ OL6ifkGovZA4JeW4ELJCd9bd+lG+c1jJmH7euM5Xs5/Gh+A10t6axpQLeS9yDNA= X-Gm-Gg: ASbGncsM5qHyB4VHMj6HnlrOue1ZOHS6EA+4qduOHK7KGwZY2lM8GqAkIw4uh3zRoOJ hXEVAxJnGLpje3s0EQdPHwf7ifOFsftbpt52vuhaOasVzyFh5WnxQffctud27415oHGx8V1TWhk TRGqdg7UtcPf5GbENkN1GrwFIsEkMXRmzAy2/EUusS3h4DrZ+VevgvkuVAs9T313xLmLTVZ26sS 16t4+yZE4kAf29jR+tSfXFBL77p0Gahn298s4ovnH9SH8rbubjCxEMdzMVOz0PFBzauptqHKdbZ yma43ICH2wk= X-Google-Smtp-Source: AGHT+IH73GcCsE/lQyg6qOmyCUftPapB8Jd9zfJekawKG6luwVZg0kmD20Vj1IYY2YIztuCKga/dhg== X-Received: by 2002:a05:6402:13cf:b0:5d3:fc60:a504 with SMTP id 4fb4d7f45d1cf-5d81ddb0d51mr39508173a12.20.1735912856437; Fri, 03 Jan 2025 06:00:56 -0800 (PST) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.102]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5d80679f0e4sm19502384a12.42.2025.01.03.06.00.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Jan 2025 06:00:55 -0800 (PST) From: Claudiu X-Google-Original-From: Claudiu To: prabhakar.mahadev-lad.rj@bp.renesas.com, jic23@kernel.org, lars@metafoo.de, ulf.hansson@linaro.org Cc: linux-iio@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, claudiu.beznea@tuxon.dev, Claudiu Beznea Subject: [PATCH 1/2] iio: adc: rzg2l_adc: Drop devm_pm_runtime_enable() Date: Fri, 3 Jan 2025 16:00:41 +0200 Message-ID: <20250103140042.1619703-2-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250103140042.1619703-1-claudiu.beznea.uj@bp.renesas.com> References: <20250103140042.1619703-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-renesas-soc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Claudiu Beznea On all systems where the rzg2l_adc driver is used, the ADC clocks are part of a PM domain. The code that implements the PM domains support is in drivers/clk/renesas/rzg2l-cpg.c, the functions of interest for this commit being rzg2l_cpg_attach_dev() and rzg2l_cpg_deattach_dev(). The PM domains support is registered with GENPD_FLAG_PM_CLK which, according to the documentation, instructs genpd to use the PM clk framework while powering on/off attached devices. During probe, the ADC device is attached to the PM domain controlling the ADC clocks. Similarly, during removal, the ADC device is detached from the PM domain. The detachment call stack is as follows: device_driver_detach() -> device_release_driver_internal() -> __device_release_driver() -> device_remove() -> platform_remove() -> dev_pm_domain_detach() During driver unbind, after the ADC device is detached from its PM domain, the device_unbind_cleanup() function is called, which subsequently invokes devres_release_all(). This function handles devres resource cleanup. If runtime PM is enabled via devm_pm_runtime_enable(), the cleanup process triggers the action or reset function for disabling runtime PM. This function is pm_runtime_disable_action(), which leads to the following call stack of interest when called: pm_runtime_disable_action() -> pm_runtime_dont_use_autosuspend() -> __pm_runtime_use_autosuspend() -> update_autosuspend() -> rpm_idle() The rpm_idle() function attempts to runtime resume the ADC device. However, at the point it is called, the ADC device is no longer part of the PM domain (which manages the ADC clocks). Since the rzg2l_adc runtime PM APIs directly modifies hardware registers, the rzg2l_adc_pm_runtime_resume() function is invoked without the ADC clocks being enabled. This is because the PM domain no longer resumes along with the ADC device. As a result, this leads to system aborts. Drop the devres API for runtime PM enable. Fixes: 89ee8174e8c8 ("iio: adc: rzg2l_adc: Simplify the runtime PM code") Signed-off-by: Claudiu Beznea --- drivers/iio/adc/rzg2l_adc.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/drivers/iio/adc/rzg2l_adc.c b/drivers/iio/adc/rzg2l_adc.c index 883c167c0670..f12f3daf08cc 100644 --- a/drivers/iio/adc/rzg2l_adc.c +++ b/drivers/iio/adc/rzg2l_adc.c @@ -464,25 +464,26 @@ static int rzg2l_adc_probe(struct platform_device *pdev) pm_runtime_set_autosuspend_delay(dev, 300); pm_runtime_use_autosuspend(dev); - ret = devm_pm_runtime_enable(dev); - if (ret) - return ret; + pm_runtime_enable(dev); platform_set_drvdata(pdev, indio_dev); ret = rzg2l_adc_hw_init(dev, adc); - if (ret) - return dev_err_probe(&pdev->dev, ret, - "failed to initialize ADC HW\n"); + if (ret) { + dev_err_probe(&pdev->dev, ret, "failed to initialize ADC HW\n"); + goto rpm_disable; + } irq = platform_get_irq(pdev, 0); - if (irq < 0) - return irq; + if (irq < 0) { + ret = irq; + goto rpm_disable; + } ret = devm_request_irq(dev, irq, rzg2l_adc_isr, 0, dev_name(dev), adc); if (ret < 0) - return ret; + goto rpm_disable; init_completion(&adc->completion); @@ -493,6 +494,19 @@ static int rzg2l_adc_probe(struct platform_device *pdev) indio_dev->num_channels = adc->data->num_channels; return devm_iio_device_register(dev, indio_dev); + +rpm_disable: + pm_runtime_disable(dev); + pm_runtime_dont_use_autosuspend(dev); + return ret; +} + +static void rzg2l_adc_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + + pm_runtime_disable(dev); + pm_runtime_dont_use_autosuspend(dev); } static const struct rzg2l_adc_hw_params rzg2l_hw_params = { @@ -614,6 +628,7 @@ static const struct dev_pm_ops rzg2l_adc_pm_ops = { static struct platform_driver rzg2l_adc_driver = { .probe = rzg2l_adc_probe, + .remove = rzg2l_adc_remove, .driver = { .name = DRIVER_NAME, .of_match_table = rzg2l_adc_match, From patchwork Fri Jan 3 14:00:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudiu Beznea X-Patchwork-Id: 13925600 X-Patchwork-Delegate: geert@linux-m68k.org Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (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 A81F81FAC40 for ; Fri, 3 Jan 2025 14:01:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735912866; cv=none; b=NMzN1nBHkce9/19SrxzmcnC3Tduwwrbt/CKdJZUIZcqxiRdXQcPWT6yroM30K5OBmWedPKL+pCZSuYLF3RaoPKu+0kj0kj7BgOtLdwnC/vAgH/HyRQ77SwhuSnack9URSlMuAkcdMH1SFl0/8j/zXvqdUVd//c/qlBsBdNQwiU8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735912866; c=relaxed/simple; bh=Fmy27Bnmn3Uj8FkD7cvCCt580n5f2IKg/FvXHV0a6+E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Oqz0bCVhi/GkLJg0w4yxG9DbB2FmIwxulbm4qYfc3ggHr173Kbc2fvI79fhDwMmQwMNgW9JxsCvAkvkAcAe96UQ5Ul9fyo8lQ+bby76mnKY1Qdz/BXyqtRxiqRqd5KTilWU/+DI121ciE1s9Ie5V/H8onYvP0f94OMZAT+rycBI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=I+pq1zuu; arc=none smtp.client-ip=209.85.208.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="I+pq1zuu" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-5d41848901bso23602223a12.0 for ; Fri, 03 Jan 2025 06:01:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1735912859; x=1736517659; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5qluG0ViCE8ATiodOgOOl8Lv8eXopMgs1l45mWqKjsY=; b=I+pq1zuuau9nyQ6nQUz8NVH2lctcF/cobeGYcUVXMH5KZ2LPxvOj5WsZLbuX6dTkfr ErKG3RQ8whc/OuOusIJrRX3f6IzlBAo6zXAfGQK07foxC1G4VzeGunXjDEFNH1WtMAyu 3LuhoEaOWbbkOLJVxHj27UBtFAqj7z0RsuH11S2UNqWiivYXkqUYdqrUFoBTQUKarSVR BB9pppsbgj8FGYQhpkjSSOtZyMRWwhxHA2bgVdv5IPCDFUqckN6jsNvvmU7PB8883krO fODycMsFCBwwzbyE4KmC9jk8cQaiJKWb4LhrMKzrF8OcipEULCjXF0JEsE0j3Uap88ee XQgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735912859; x=1736517659; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5qluG0ViCE8ATiodOgOOl8Lv8eXopMgs1l45mWqKjsY=; b=o4OvYnEVUI4r0tQExI5yPhkOW8ztlrExmAViYbFZ6p5XZY9RNfQSdjYL2H26M/gOni 3HHeDmbamguR1c2+EILCx/ywdsrStciC+9IxsFOJxLE5fouZF9ar6gJj5luQK0YN1a1B bTOZQTLIikDQum/21Jh1dtUX0Q1y1w6P0xXl6V+KA81fRde0baWfzg7spwEP7jzpE5Js H2DOIn3nIZt4hcss2h06rfe6Wso+ejB5iLsdd1f5Fd01XRmqWQw2/W+nj//sVTzWPNsp ju0zRotmTxFFuJgocs0zo/TdwdLjjAlTR1LIV5Zgq+vt4V5kD1zlxv9JLJOWnlD6tYtW eGvQ== X-Forwarded-Encrypted: i=1; AJvYcCU4MsUxP8/yFE0NAtde9qL+tnqosvSJtpt0mCt72CfU8Yup6sCXaqiNbjVnlCOoEcyqGhmhGhct1KbQ/xAdnQT1BQ==@vger.kernel.org X-Gm-Message-State: AOJu0Yyyya5wSYyTc92MkU+skhScPGjI2zxqhg+MqhRNYUwpWt3ap4IX LAH1b7AKKwtCbBDaR5HZHV6duAPD81yjCakkzh3AhrpC7dUVPTEVKqq9E1bL5a4= X-Gm-Gg: ASbGncuRtS28P9g19Uw5iczpxHBdhAKWsx0h5GsgVXcE+n1/RxJn4Fn0urMRrN59Iuj kTfFNWKVz7I8yRW9Rbc2UJh0aMyALifCKQXb7UJw2ZNHs3wkTbTnBLESJ1cCN8Rn9/QWR6AMsMo lWUAsuEuH8PfyKxe6ILTJchbn4lIW41iThuLMaTJzg74gpq2FM2MkI/s84cegNN2r10Ku7lYVEz dSwQvN/rbCiBH/NO8CwkCp8spgH3xSGMGv7YeinbQRtGoBwUuJJALDh45sv8xn6aGJVMMnjhr3W ssjhrHZ5jNw= X-Google-Smtp-Source: AGHT+IG1Xlx6lYKDq/Jh3aaztieX8SW5bSS3JbGGOUo0jKzSzCn1vGsHxn6qMMerERmHlKGSZGu+PA== X-Received: by 2002:a05:6402:2346:b0:5d8:17da:dcf0 with SMTP id 4fb4d7f45d1cf-5d81e523027mr36220171a12.4.1735912859111; Fri, 03 Jan 2025 06:00:59 -0800 (PST) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.102]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5d80679f0e4sm19502384a12.42.2025.01.03.06.00.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Jan 2025 06:00:57 -0800 (PST) From: Claudiu X-Google-Original-From: Claudiu To: prabhakar.mahadev-lad.rj@bp.renesas.com, jic23@kernel.org, lars@metafoo.de, ulf.hansson@linaro.org Cc: linux-iio@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, claudiu.beznea@tuxon.dev, Claudiu Beznea Subject: [PATCH 2/2] iio: adc: rzg2l: Cleanup suspend/resume path Date: Fri, 3 Jan 2025 16:00:42 +0200 Message-ID: <20250103140042.1619703-3-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250103140042.1619703-1-claudiu.beznea.uj@bp.renesas.com> References: <20250103140042.1619703-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-renesas-soc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Claudiu Beznea There is no need to manually track the runtime PM status in the driver. The pm_runtime_force_suspend() and pm_runtime_force_resume() functions already call pm_runtime_status_suspended() to check the runtime PM state. Additionally, avoid calling pm_runtime_put_autosuspend() during the suspend/resume path, as this would decrease the usage counter of a potential user that had the ADC open before the suspend/resume cycle. Fixes: cb164d7c1526 ("iio: adc: rzg2l_adc: Add suspend/resume support") Signed-off-by: Claudiu Beznea --- drivers/iio/adc/rzg2l_adc.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/drivers/iio/adc/rzg2l_adc.c b/drivers/iio/adc/rzg2l_adc.c index f12f3daf08cc..8289b872b165 100644 --- a/drivers/iio/adc/rzg2l_adc.c +++ b/drivers/iio/adc/rzg2l_adc.c @@ -88,7 +88,6 @@ struct rzg2l_adc { struct completion completion; struct mutex lock; u16 last_val[RZG2L_ADC_MAX_CHANNELS]; - bool was_rpm_active; }; /** @@ -563,14 +562,9 @@ static int rzg2l_adc_suspend(struct device *dev) }; int ret; - if (pm_runtime_suspended(dev)) { - adc->was_rpm_active = false; - } else { - ret = pm_runtime_force_suspend(dev); - if (ret) - return ret; - adc->was_rpm_active = true; - } + ret = pm_runtime_force_suspend(dev); + if (ret) + return ret; ret = reset_control_bulk_assert(ARRAY_SIZE(resets), resets); if (ret) @@ -579,9 +573,7 @@ static int rzg2l_adc_suspend(struct device *dev) return 0; rpm_restore: - if (adc->was_rpm_active) - pm_runtime_force_resume(dev); - + pm_runtime_force_resume(dev); return ret; } @@ -599,11 +591,9 @@ static int rzg2l_adc_resume(struct device *dev) if (ret) return ret; - if (adc->was_rpm_active) { - ret = pm_runtime_force_resume(dev); - if (ret) - goto resets_restore; - } + ret = pm_runtime_force_resume(dev); + if (ret) + goto resets_restore; ret = rzg2l_adc_hw_init(dev, adc); if (ret) @@ -612,10 +602,7 @@ static int rzg2l_adc_resume(struct device *dev) return 0; rpm_restore: - if (adc->was_rpm_active) { - pm_runtime_mark_last_busy(dev); - pm_runtime_put_autosuspend(dev); - } + pm_runtime_force_suspend(dev); resets_restore: reset_control_bulk_assert(ARRAY_SIZE(resets), resets); return ret;