From patchwork Fri Nov 17 11:14:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 13458819 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="L8vKQ9TS" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CBBCD130; Fri, 17 Nov 2023 03:14:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700219680; x=1731755680; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4ZIGnBR1FDtLcgY8YztjKUNudOuUOYsU/Ds/6gH0wn8=; b=L8vKQ9TSDfcBjRSGokrTJ+izW5V/4mLi0dSRsqOQwJevHcssa0DSCPMc /8oQx30sSQSQD1wN/zVlXjoKrc4uSTGx4sk0km1W5zMdY1kHS8tepkooG 5QUzAndlppxB7sxDHR9kRnDPNoGmq2Eu/wdsnsa9mQte7Da651H6aYGsS PGLbU57uXMAY8deRbGiwH/fYwXKD6G7YBJON6IN5JKrMEOV8W4r2wrVR5 zcP1CaZnhoHkS6F6zJiONgd3owo33kJ9jw7J+Lr5hL7MdQ/wYfF5/OhrW tNgCHMvWLiw9C7Odhpp1PJjOG9v7Z0JCTF5v485nJFDLEEuGWNQvbqnCp Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="9941628" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="9941628" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:40 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="769201188" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="769201188" Received: from turnipsi.fi.intel.com (HELO kekkonen.fi.intel.com) ([10.237.72.44]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:37 -0800 Received: from svinhufvud.ger.corp.intel.com (localhost [IPv6:::1]) by kekkonen.fi.intel.com (Postfix) with ESMTP id 69F6C120E67; Fri, 17 Nov 2023 13:14:34 +0200 (EET) From: Sakari Ailus To: linux-acpi@vger.kernel.org Cc: linux-media@vger.kernel.org, rafael@kernel.org, jacopo.mondi@ideasonboard.com, laurent.pinchart@ideasonboard.com Subject: [PATCH v2 1/7] pm: runtime: Simplify pm_runtime_get_if_active() usage Date: Fri, 17 Nov 2023 13:14:27 +0200 Message-Id: <20231117111433.1561669-2-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> References: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The majority of the callers currently using pm_runtime_get_if_active() call it with ign_usage_count argument set to true. There's only one driver using this feature (and natually implementation of pm_runtime_get_if_in_use()). To make this function more practical to use, remove the ign_usage_count argument from the function. The main implementation is renamed as __pm_runtime_get_conditional(). This function is expected to gain a large number of users in the future --- camera sensor drivers using runtime autosuspend have a need to get the device's usage_count conditionally if it is enabled. Most of these currently use pm_runtime_get_if_in_use(), which is a bug. Signed-off-by: Sakari Ailus Reviewed-by: Laurent Pinchart --- since v1: - Fix __pm_runtime_get_if_conditional() un-CONFIG_PM implementation. --- Documentation/power/runtime_pm.rst | 5 ++-- drivers/base/power/runtime.c | 9 ++++--- drivers/gpu/drm/i915/intel_runtime_pm.c | 2 +- drivers/media/i2c/ccs/ccs-core.c | 2 +- drivers/net/ipa/ipa_smp2p.c | 2 +- drivers/pci/pci.c | 2 +- include/linux/pm_runtime.h | 32 +++++++++++++++++++++---- sound/hda/hdac_device.c | 2 +- 8 files changed, 40 insertions(+), 16 deletions(-) diff --git a/Documentation/power/runtime_pm.rst b/Documentation/power/runtime_pm.rst index 65b86e487afe..da99379071a4 100644 --- a/Documentation/power/runtime_pm.rst +++ b/Documentation/power/runtime_pm.rst @@ -396,10 +396,9 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: nonzero, increment the counter and return 1; otherwise return 0 without changing the counter - `int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count);` + `int pm_runtime_get_if_active(struct device *dev);` - return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the - runtime PM status is RPM_ACTIVE, and either ign_usage_count is true - or the device's usage_count is non-zero, increment the counter and + runtime PM status is RPM_ACTIVE, increment the counter and return 1; otherwise return 0 without changing the counter `void pm_runtime_put_noidle(struct device *dev);` diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 4545669cb973..8b56468eca9d 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -1175,7 +1175,7 @@ int __pm_runtime_resume(struct device *dev, int rpmflags) EXPORT_SYMBOL_GPL(__pm_runtime_resume); /** - * pm_runtime_get_if_active - Conditionally bump up device usage counter. + * __pm_runtime_get_conditional - Conditionally bump up device usage counter. * @dev: Device to handle. * @ign_usage_count: Whether or not to look at the current usage counter value. * @@ -1195,8 +1195,11 @@ EXPORT_SYMBOL_GPL(__pm_runtime_resume); * * The caller is responsible for decrementing the runtime PM usage counter of * @dev after this function has returned a positive value for it. + * + * This function is not intended to be called by drivers, use + * pm_runtime_get_if_active() or pm_runtime_get_if_in_use() instead. */ -int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count) +int __pm_runtime_get_conditional(struct device *dev, bool ign_usage_count) { unsigned long flags; int retval; @@ -1217,7 +1220,7 @@ int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count) return retval; } -EXPORT_SYMBOL_GPL(pm_runtime_get_if_active); +EXPORT_SYMBOL_GPL(__pm_runtime_get_conditional); /** * __pm_runtime_set_status - Set runtime PM status of a device. diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 6d8e5e5c0cba..b163efe80975 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c @@ -434,7 +434,7 @@ static intel_wakeref_t __intel_runtime_pm_get_if_active(struct intel_runtime_pm * function, since the power state is undefined. This applies * atm to the late/early system suspend/resume handlers. */ - if (pm_runtime_get_if_active(rpm->kdev, ignore_usecount) <= 0) + if (__pm_runtime_get_conditional(rpm->kdev, ignore_usecount) <= 0) return 0; } diff --git a/drivers/media/i2c/ccs/ccs-core.c b/drivers/media/i2c/ccs/ccs-core.c index 12e6f0a26fc8..45701a18c845 100644 --- a/drivers/media/i2c/ccs/ccs-core.c +++ b/drivers/media/i2c/ccs/ccs-core.c @@ -664,7 +664,7 @@ static int ccs_set_ctrl(struct v4l2_ctrl *ctrl) break; } - pm_status = pm_runtime_get_if_active(&client->dev, true); + pm_status = pm_runtime_get_if_active(&client->dev); if (!pm_status) return 0; diff --git a/drivers/net/ipa/ipa_smp2p.c b/drivers/net/ipa/ipa_smp2p.c index 5620dc271fac..cbf3d4761ce3 100644 --- a/drivers/net/ipa/ipa_smp2p.c +++ b/drivers/net/ipa/ipa_smp2p.c @@ -92,7 +92,7 @@ static void ipa_smp2p_notify(struct ipa_smp2p *smp2p) return; dev = &smp2p->ipa->pdev->dev; - smp2p->power_on = pm_runtime_get_if_active(dev, true) > 0; + smp2p->power_on = pm_runtime_get_if_active(dev) > 0; /* Signal whether the IPA power is enabled */ mask = BIT(smp2p->enabled_bit); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 59c01d68c6d5..d8d4abbc936f 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -2439,7 +2439,7 @@ static void pci_pme_list_scan(struct work_struct *work) * If the device is in a low power state it * should not be polled either. */ - pm_status = pm_runtime_get_if_active(dev, true); + pm_status = pm_runtime_get_if_active(dev); if (!pm_status) continue; diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 7c9b35448563..13cd526634c1 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -72,7 +72,8 @@ extern int pm_runtime_force_resume(struct device *dev); extern int __pm_runtime_idle(struct device *dev, int rpmflags); extern int __pm_runtime_suspend(struct device *dev, int rpmflags); extern int __pm_runtime_resume(struct device *dev, int rpmflags); -extern int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count); +extern int __pm_runtime_get_conditional(struct device *dev, + bool ign_usage_count); extern int pm_schedule_suspend(struct device *dev, unsigned int delay); extern int __pm_runtime_set_status(struct device *dev, unsigned int status); extern int pm_runtime_barrier(struct device *dev); @@ -94,16 +95,33 @@ extern void pm_runtime_release_supplier(struct device_link *link); extern int devm_pm_runtime_enable(struct device *dev); +/** + * pm_runtime_get_if_active - Bump up runtime PM usage counter if the device is + * in active state + * @dev: Target device. + * + * Increment the runtime PM usage counter of @dev if its runtime PM status is + * %RPM_ACTIVE, in which case it returns 1. If the device is in a different + * state, 0 is returned. -EINVAL is returned if runtime PM is disabled for the + * device. + */ +static inline int pm_runtime_get_if_active(struct device *dev) +{ + return __pm_runtime_get_conditional(dev, true); +} + /** * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter. * @dev: Target device. * * Increment the runtime PM usage counter of @dev if its runtime PM status is - * %RPM_ACTIVE and its runtime PM usage counter is greater than 0. + * %RPM_ACTIVE and its runtime PM usage counter is greater than 0, in which case + * it returns 1. If the device is in a different state or its usage_count is 0, + * 0 is returned. -EINVAL is returned if runtime PM is disabled for the device. */ static inline int pm_runtime_get_if_in_use(struct device *dev) { - return pm_runtime_get_if_active(dev, false); + return __pm_runtime_get_conditional(dev, false); } /** @@ -275,8 +293,12 @@ static inline int pm_runtime_get_if_in_use(struct device *dev) { return -EINVAL; } -static inline int pm_runtime_get_if_active(struct device *dev, - bool ign_usage_count) +static inline int pm_runtime_get_if_active(struct device *dev) +{ + return -EINVAL; +} +static inline int __pm_runtime_get_conditional(struct device *dev, + bool ign_usage_count) { return -EINVAL; } diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c index bbf7bcdb449a..0a9223c18d77 100644 --- a/sound/hda/hdac_device.c +++ b/sound/hda/hdac_device.c @@ -611,7 +611,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_power_up_pm); int snd_hdac_keep_power_up(struct hdac_device *codec) { if (!atomic_inc_not_zero(&codec->in_pm)) { - int ret = pm_runtime_get_if_active(&codec->dev, true); + int ret = pm_runtime_get_if_active(&codec->dev); if (!ret) return -1; if (ret < 0) From patchwork Fri Nov 17 11:14:28 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 13458821 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Sg2bd+Wu" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 93170194; Fri, 17 Nov 2023 03:14:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700219682; x=1731755682; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=E51JwvVc+WS4nt6BjqwLo96XXpb3Un3sSEB2K+/Lpqo=; b=Sg2bd+WujtCjJCKaK94Bo/1IyjJkWb1tnDwQAeAGeTHluVIszsgzt/dN SRkpxB+9do/5m3Jc4mnIlGi04/RQPf3c2YJY1J8vNCYve1+48VEJI2omP fkNZpbGQJDx9wc/PZ8cT26hFi1/CuyvOYc1TLityYFIsw3dBQuJZynNVP g8L4OtzeeomPhkxf9ocdpwNHM5OKbZTJlqkQoFlwhkyxVFaFtMBDVjaO+ zXQP85wFcvBReeJZugcHkhcsEM8iE4i0DKTo3kH0LVxSRhAMGUlK2PRup 64A3BuwTBo2Q0ruRDfDRxLmSsuyL1EO6dXbytTN4mBV54ZbMjJlRzQ4fY w==; X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="9941633" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="9941633" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:41 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="769201196" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="769201196" Received: from turnipsi.fi.intel.com (HELO kekkonen.fi.intel.com) ([10.237.72.44]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:38 -0800 Received: from svinhufvud.ger.corp.intel.com (localhost [IPv6:::1]) by kekkonen.fi.intel.com (Postfix) with ESMTP id 2D916120ED2; Fri, 17 Nov 2023 13:14:35 +0200 (EET) From: Sakari Ailus To: linux-acpi@vger.kernel.org Cc: linux-media@vger.kernel.org, rafael@kernel.org, jacopo.mondi@ideasonboard.com, laurent.pinchart@ideasonboard.com Subject: [PATCH v2 2/7] pm: runtime: Add pm_runtime_put_mark_busy_autosusp() helper Date: Fri, 17 Nov 2023 13:14:28 +0200 Message-Id: <20231117111433.1561669-3-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> References: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add pm_runtime_put_mark_busy_autosusp() helper function for users that wish to set the last_busy timestamp to current time and put the usage_count of the device and set the autosuspend timer. Essentially calling pm_runtime_suspend_mark_busy_autosusp() equal to calling first pm_runtime_mark_last_busy() and then pm_runtime_put_autosuspend(). Signed-off-by: Sakari Ailus --- include/linux/pm_runtime.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 13cd526634c1..4afe7b0b9d7e 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -495,6 +495,23 @@ static inline int pm_runtime_put_autosuspend(struct device *dev) RPM_GET_PUT | RPM_ASYNC | RPM_AUTO); } +/** + * pm_runtime_put_mark_busy_autosusp - Update the last access time of a device + * and drop device usage counter and queue + * autosuspend if 0. + * @dev: Target device. + * + * Update the last access time of @dev using pm_runtime_mark_last_busy(), then + * decrement the runtime PM usage counter of @dev and if it turns out to be + * equal to 0, queue up a work item for @dev like in pm_request_autosuspend(). + */ +static inline int pm_runtime_put_mark_busy_autosusp(struct device *dev) +{ + pm_runtime_mark_last_busy(dev); + + return pm_runtime_autosuspend(dev); +} + /** * pm_runtime_put_sync - Drop device usage counter and run "idle check" if 0. * @dev: Target device. From patchwork Fri Nov 17 11:14:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 13458823 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="O7fzctNC" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0E13FD4B; Fri, 17 Nov 2023 03:14:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700219683; x=1731755683; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Nl2Dsw+dPH2fUNbgA5kZPDoI4Q44DM8znc3EQjvjalA=; b=O7fzctNCFA+Sg6r5l96ARM2UpVU0LysS6H5HNxW/p//CYqqUR2gQ5bBY lZJNZ9AaMGBndblYwGYFKtA5Q9tKyaChtxkRO9eFoetkMVANBaLwsR+84 qe2Se2QMOcfN6PCX1GiyXkisSeyx4uiHJirLhBveZBrxDoD07fwtGdvb/ 6F0VpXs4oJJzY/pCxYLO3vDoKFEV4ijH5smjXY3HgCvHYhgmpB852T6Nu HY3s7Ak2ET2lCOpnkaAssUZiKMz6WHmVtYd/TDEh83R9n9BkwiciIXeHv xL2vOMuUXdQm7epcZrL4EU4yu43xcUJ91iARudfjaLKOMgYxP3bATVmL8 w==; X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="9941636" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="9941636" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:41 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="769201197" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="769201197" Received: from turnipsi.fi.intel.com (HELO kekkonen.fi.intel.com) ([10.237.72.44]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:38 -0800 Received: from svinhufvud.ger.corp.intel.com (localhost [IPv6:::1]) by kekkonen.fi.intel.com (Postfix) with ESMTP id 16409120F14; Fri, 17 Nov 2023 13:14:36 +0200 (EET) From: Sakari Ailus To: linux-acpi@vger.kernel.org Cc: linux-media@vger.kernel.org, rafael@kernel.org, jacopo.mondi@ideasonboard.com, laurent.pinchart@ideasonboard.com Subject: [PATCH v2 3/7] ACPI: Documentation: Document acpi_dev_state_d0() Date: Fri, 17 Nov 2023 13:14:29 +0200 Message-Id: <20231117111433.1561669-4-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> References: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Document that acpi_dev_state_d0() can be used to tell if the device was powered on for probe. Signed-off-by: Sakari Ailus --- Documentation/firmware-guide/acpi/non-d0-probe.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Documentation/firmware-guide/acpi/non-d0-probe.rst b/Documentation/firmware-guide/acpi/non-d0-probe.rst index 7afd16701a02..815bcc8db69f 100644 --- a/Documentation/firmware-guide/acpi/non-d0-probe.rst +++ b/Documentation/firmware-guide/acpi/non-d0-probe.rst @@ -24,6 +24,14 @@ there's a problem with the device, the driver likely probes just fine but the first user will find out the device doesn't work, instead of a failure at probe time. This feature should thus be used sparingly. +ACPI framework +-------------- + +Use the Linux ACPI framework function :c:func:`acpi_dev_state_d0()` to tell +whether the device was powered on for probe. :c:func:`acpi_dev_state_d0()` +returns true if the device is powered on, false otherwise. For non-ACPI backed +devices it returns true always. + I²C --- From patchwork Fri Nov 17 11:14:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 13458824 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="brl/NxHw" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2D81B129; Fri, 17 Nov 2023 03:14:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700219684; x=1731755684; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=k2EyQptTu6UwFV+ONjT/W1odmEoHOBwbS7iQPv5wHAw=; b=brl/NxHwKirK++Pz+v/6J24xnb+/Sr/WA3hgl/DV8bBCf2Orh+SyJVlW rjxcaoS2gjwPfi9XHuWI77cGpxWdViUHG2BBYdFYhwUC4KTGj27OPWll7 U6AYz0Q5BuNEbPHQNSbmwLMabGcyDUDXpZ4Admge1y++PtqBnIGV6jt16 s+rMm0fE7C08KIZ0qKphfM/4WHq/uE4ydSJl07hZfQR/x25Tyogk6XFUY MqadeilgcaWhRwjQYPSeUQkx90fP50/cvK/TjMT6Jli0RV9Pao+HoucKZ 37N2Wmiqf8qOZEy4YB0cyHJAX+027qJXwmunOhs9xCOUS7xXbb0X7Htye w==; X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="9941639" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="9941639" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:41 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="769201200" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="769201200" Received: from turnipsi.fi.intel.com (HELO kekkonen.fi.intel.com) ([10.237.72.44]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:39 -0800 Received: from svinhufvud.ger.corp.intel.com (localhost [IPv6:::1]) by kekkonen.fi.intel.com (Postfix) with ESMTP id DDF87120F2A; Fri, 17 Nov 2023 13:14:36 +0200 (EET) From: Sakari Ailus To: linux-acpi@vger.kernel.org Cc: linux-media@vger.kernel.org, rafael@kernel.org, jacopo.mondi@ideasonboard.com, laurent.pinchart@ideasonboard.com Subject: [PATCH v2 4/7] media: Documentation: Improve camera sensor runtime PM documentation Date: Fri, 17 Nov 2023 13:14:30 +0200 Message-Id: <20231117111433.1561669-5-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> References: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Endorse the use of pm_runtime_get_sync() in order to resume the device and pm_runtime_get_if_active() to increment its usage_count if the device is in RPM_ACTIVE state. Signed-off-by: Sakari Ailus --- .../driver-api/media/camera-sensor.rst | 76 +++++++++++++------ .../firmware-guide/acpi/non-d0-probe.rst | 2 + 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/Documentation/driver-api/media/camera-sensor.rst b/Documentation/driver-api/media/camera-sensor.rst index 6456145f96ed..c1bb0de40189 100644 --- a/Documentation/driver-api/media/camera-sensor.rst +++ b/Documentation/driver-api/media/camera-sensor.rst @@ -58,35 +58,55 @@ pipeline. They must obey the rules listed herein to ensure coherent power management over the pipeline. Camera sensor drivers are responsible for controlling the power state of the -device they otherwise control as well. They shall use runtime PM to manage -power states. Runtime PM shall be enabled at probe time and disabled at remove -time. Drivers should enable runtime PM autosuspend. +device they otherwise control as well. They shall use runtime PM to manage power +states. Runtime PM shall be enabled at probe time using +:c:func:`pm_runtime_enable()` and disabled using :c:func:`pm_runtime_disable()` +at remove time. Before enabling Runtime PM, the device's Runtime PM status is +set to ``RPM_ACTIVE`` using :c:func:`pm_runtime_set_active()` and after +disabling set to ``RPM_SUSPENDED`` using :c:func:`pm_runtime_set_suspended()`. +Drivers should enable runtime PM autosuspend. The runtime PM handlers shall handle clocks, regulators, GPIOs, and other system resources required to power the sensor up and down. For drivers that don't use any of those resources (such as drivers that support ACPI systems only), the runtime PM handlers may be left unimplemented. -In general, the device shall be powered on at least when its registers are -being accessed and when it is streaming. Drivers should use -``pm_runtime_resume_and_get()`` when starting streaming and -``pm_runtime_put()`` or ``pm_runtime_put_autosuspend()`` when stopping -streaming. They may power the device up at probe time (for example to read +In general, the device shall be powered on at least when its registers are being +accessed and when it is streaming. Drivers using autosuspend should use +:c:func:`pm_runtime_get_sync()` to ensure the device is powered on. The +function increments Runtime PM ``usage_count`` which the driver is responsible +for decrementing using e.g. :c:func:`pm_runtime_put_mark_busy_autosusp()`, which +starts autosuspend timer to power off the device later on when its +``usage_count`` is 0, or :c:func:`pm_runtime_put()` which proceeds to power off +the device without a delay when its ``usage_count`` is 0. + +Note that runtime PM ``usage_count`` of the device must be put even if +:c:func:`pm_runtime_get_sync()` fails. :c:func:`pm_runtime_get_sync()` returns 1 +if the device was already powered on, which may be used as a signal for the +driver that initialisation related registers need to be written to the +sensor. + +Drivers that support Devicetree shall also power on the device explicitly in +driver's probe() function and power the device off in driver's remove() function +without relying on Runtime PM. + +Drivers may power the device up at probe time (for example to read identification registers), but should not keep it powered unconditionally after -probe. +probe. On ACPI systems I²C devices are normally powered on for probe but +:ref:`this can be avoided if needed `. At system suspend time, the whole camera pipeline must stop streaming, and restart when the system is resumed. This requires coordination between the camera sensor and the rest of the camera pipeline. Bridge drivers are responsible for this coordination, and instruct camera sensors to stop and -restart streaming by calling the appropriate subdev operations -(``.s_stream()``, ``.enable_streams()`` or ``.disable_streams()``). Camera -sensor drivers shall therefore **not** keep track of the streaming state to -stop streaming in the PM suspend handler and restart it in the resume handler. -Drivers should in general not implement the system PM handlers. +restart streaming by calling the appropriate subdev operations (``.s_stream()``, +``.enable_streams()`` or ``.disable_streams()``). Camera sensor drivers shall +therefore **not** keep track of the streaming state to stop streaming in the PM +suspend handler and restart it in the resume handler. Drivers should in general +not implement the system PM handlers. Camera sensor drivers shall **not** implement the subdev ``.s_power()`` -operation, as it is deprecated. While this operation is implemented in some +operation as it is deprecated. While this operation is implemented in some existing drivers as they predate the deprecation, new drivers shall use runtime PM instead. If you feel you need to begin calling ``.s_power()`` from an ISP or a bridge driver, instead add runtime PM support to the sensor driver you are @@ -94,20 +114,26 @@ using and drop its ``.s_power()`` handler. Please also see :ref:`examples `. +.. _media_writing_camera_sensor_drives_control_framework: + Control framework ~~~~~~~~~~~~~~~~~ ``v4l2_ctrl_handler_setup()`` function may not be used in the device's runtime -PM ``runtime_resume`` callback, as it has no way to figure out the power state -of the device. This is because the power state of the device is only changed -after the power state transition has taken place. The ``s_ctrl`` callback can be -used to obtain device's power state after the power state transition: - -.. c:function:: int pm_runtime_get_if_in_use(struct device *dev); - -The function returns a non-zero value if it succeeded getting the power count or -runtime PM was disabled, in either of which cases the driver may proceed to -access the device. +PM ``runtime_resume`` callback as it has no way to figure out the power state of +the device. This is because the Runtime PM status of the device is only changed +after the Runtime PM status transition has taken place. The ``s_ctrl`` callback +can be used to obtain device's Runtime PM status once the transition has taken +place: + +.. c:function:: int pm_runtime_get_if_active(struct device *dev); + +The function returns a non-zero value if the device is powered on (in which case +it increments the device's ``usage_count``) or runtime PM was disabled, in +either of which cases the driver may proceed to access the device. Note that the +device's ``usage_count`` is not incremented if the function returns an error, in +which case the ``usage_count`` also must not be put using +:c:func:`pm_runtime_put()` or its variants. Rotation, orientation and flipping ---------------------------------- diff --git a/Documentation/firmware-guide/acpi/non-d0-probe.rst b/Documentation/firmware-guide/acpi/non-d0-probe.rst index 815bcc8db69f..f0669059101f 100644 --- a/Documentation/firmware-guide/acpi/non-d0-probe.rst +++ b/Documentation/firmware-guide/acpi/non-d0-probe.rst @@ -1,5 +1,7 @@ .. SPDX-License-Identifier: GPL-2.0 +.. _firmware_acpi_non_d0_probe: + ======================================== Probing devices in other D states than 0 ======================================== From patchwork Fri Nov 17 11:14:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 13458826 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="KoDqadAE" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3EBA9D4F; Fri, 17 Nov 2023 03:14:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700219684; x=1731755684; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=A9/YvkwCnHZnNCqK8j9jReosCqqZSDqKlSJZVgPOZyA=; b=KoDqadAEe7LI82XApf2ITN8iO9n+9Z6gxcuUxXF1Xl+s6KLjIjYIOVnh Dwx1sMfJH0YGaXzriT9ORDT+5TOAZu/4OCORYMR/KB6Pim9WyZ5p5kFOU Uj21UEvc/qw43L5RRzxoc46ftbYrEa5Z5djt5emhZI0dyPiZ+RJbDdWSa gwfrShGBlgcR8xE3+vqoI164YOlYcHPqp3UkK/EyUAXXa7yhKUD+eK6ix iMYEBmF09pUsDVwmPGLLAKzNlmzPDIYO5Ue2mjzWtTDxXsI44KEVwTaef NBh9VAm8qCMofhRmLzm/JwekRWlM0gYDFRY6iTnWOJ46/s1IT8FFqNgJp A==; X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="9941643" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="9941643" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:43 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="769201203" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="769201203" Received: from turnipsi.fi.intel.com (HELO kekkonen.fi.intel.com) ([10.237.72.44]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:41 -0800 Received: from svinhufvud.ger.corp.intel.com (localhost [IPv6:::1]) by kekkonen.fi.intel.com (Postfix) with ESMTP id D372D120F2C; Fri, 17 Nov 2023 13:14:37 +0200 (EET) From: Sakari Ailus To: linux-acpi@vger.kernel.org Cc: linux-media@vger.kernel.org, rafael@kernel.org, jacopo.mondi@ideasonboard.com, laurent.pinchart@ideasonboard.com Subject: [PATCH v2 5/7] media: ov8858: Use pm_runtime_get_if_active(), put usage_count correctly Date: Fri, 17 Nov 2023 13:14:31 +0200 Message-Id: <20231117111433.1561669-6-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> References: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Use pm_runtime_get_if_active() to get the device's runtime PM usage_count and set controls, then use runtime PM autosuspend once the controls have been set (instead of likely transitioning to suspended state immediately). Signed-off-by: Sakari Ailus --- drivers/media/i2c/ov8858.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c index 3af6125a2eee..a99b91700a8d 100644 --- a/drivers/media/i2c/ov8858.c +++ b/drivers/media/i2c/ov8858.c @@ -1538,7 +1538,7 @@ static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) struct v4l2_subdev_state *state; u16 digi_gain; s64 max_exp; - int ret; + int ret, pm_status; /* * The control handler and the subdev state use the same mutex and the @@ -1561,7 +1561,8 @@ static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) break; } - if (!pm_runtime_get_if_in_use(&client->dev)) + pm_status = pm_runtime_get_if_active(&client->dev); + if (!pm_status) return 0; switch (ctrl->id) { @@ -1601,7 +1602,8 @@ static int ov8858_set_ctrl(struct v4l2_ctrl *ctrl) break; } - pm_runtime_put(&client->dev); + if (pm_status > 0) + pm_runtime_mark_busy_autosusp(&client->dev); return ret; } From patchwork Fri Nov 17 11:14:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 13458822 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="WJWRQZ8d" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F241CD51; Fri, 17 Nov 2023 03:14:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700219684; x=1731755684; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=OPmQAk0OpQh83zt36TXMHBtJTrjTJma9nZ7JEe6oktc=; b=WJWRQZ8d/nRo3w9jtmwj4gUPKQshr38AXInt1VeCKRX7cOCsvnaxsEOA EF1FBX1qehpMv/ezPsbrv7b8q8Gzt7sb+/1Sg5+uKe+Ks5GJua/tO4IHE oIfPb+UpVSp/u45ner4oWGJrAJmcPrYnoIzF7BvaiVq82WFBgpKvXCdvn 7B4DBiWxD/6vJng9inB6bKw8fQ3u9RpfWwBdYs/21dl3JBxd5aWh7LZj4 EFOGeFSRBVvW3XEyO6AeVp3lcNiqVhnyGeezpFKs1Xk3i9qdJjkAG+9eO PIg01hkD9yMhE6rmn4wdeyj+PIfFg5RkJdxQTFlu6L993nNrxwBd0A5o1 A==; X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="9941646" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="9941646" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="769201204" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="769201204" Received: from turnipsi.fi.intel.com (HELO kekkonen.fi.intel.com) ([10.237.72.44]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:41 -0800 Received: from svinhufvud.ger.corp.intel.com (localhost [IPv6:::1]) by kekkonen.fi.intel.com (Postfix) with ESMTP id 89CC8120F3E; Fri, 17 Nov 2023 13:14:38 +0200 (EET) From: Sakari Ailus To: linux-acpi@vger.kernel.org Cc: linux-media@vger.kernel.org, rafael@kernel.org, jacopo.mondi@ideasonboard.com, laurent.pinchart@ideasonboard.com Subject: [PATCH v2 6/7] media: imx319: Put usage_count correctly in s_ctrl callback Date: Fri, 17 Nov 2023 13:14:32 +0200 Message-Id: <20231117111433.1561669-7-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> References: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 pm_runtime_get_if_in_use() returns an error if Runtime PM is disabled for the device, in which case it won't increment the use count. pm_runtime_put() does that unconditionally however. Only call pm_runtime_put() in case pm_runtime_get_if_in_use() has returned a value > 0. Signed-off-by: Sakari Ailus --- drivers/media/i2c/imx319.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/imx319.c b/drivers/media/i2c/imx319.c index 5378f607f340..e7b2d0c20d29 100644 --- a/drivers/media/i2c/imx319.c +++ b/drivers/media/i2c/imx319.c @@ -1880,8 +1880,8 @@ static int imx319_set_ctrl(struct v4l2_ctrl *ctrl) struct imx319 *imx319 = container_of(ctrl->handler, struct imx319, ctrl_handler); struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd); + int ret, pm_status; s64 max; - int ret; /* Propagate change of current control to all related controls */ switch (ctrl->id) { @@ -1898,7 +1898,8 @@ static int imx319_set_ctrl(struct v4l2_ctrl *ctrl) * Applying V4L2 control value only happens * when power is up for streaming */ - if (!pm_runtime_get_if_in_use(&client->dev)) + pm_status = pm_runtime_get_if_in_use(&client->dev); + if (!pm_status) return 0; switch (ctrl->id) { @@ -1937,7 +1938,8 @@ static int imx319_set_ctrl(struct v4l2_ctrl *ctrl) break; } - pm_runtime_put(&client->dev); + if (pm_status > 0) + pm_runtime_put(&client->dev); return ret; } From patchwork Fri Nov 17 11:14:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 13458825 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="CkXZVtuu" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 50514D57; Fri, 17 Nov 2023 03:14:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700219685; x=1731755685; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=wMdQE0ACbFrBEZ5gtKToux6b5gaXcnt3420OvS47qMo=; b=CkXZVtuuzrG7Lr9MFbXAdmTtawWn7KzMU0YRHnLLrUWg5NzhYBpPBLng Q4YsPsfT0XibAOWxv/K2W5XKPA+etzHKhg4dGvUKiHwz5hyqYxqbzGSPI Jxv6gY+tJ830l/xoqd4hud4+CE5NnjSrp39RwunRUGbK2jK10LzrSmtiL jTnpaseOPsKploMtj/kgaVNKby0S8pf61gspLEdiqSbLrgnKC1OUYjmCm y1C+jhU+5v934h3sMdOiLA2amSsUG/DfQpNecrT285eq10z4bi/mYtHxO cBG2/M36ahjPwjVomXqqeT8yiE+gJa7ERCvZNgxSzuWP6JCpW0YRfDTfC g==; X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="9941650" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="9941650" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10896"; a="769201205" X-IronPort-AV: E=Sophos;i="6.04,206,1695711600"; d="scan'208";a="769201205" Received: from turnipsi.fi.intel.com (HELO kekkonen.fi.intel.com) ([10.237.72.44]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Nov 2023 03:14:41 -0800 Received: from svinhufvud.ger.corp.intel.com (localhost [IPv6:::1]) by kekkonen.fi.intel.com (Postfix) with ESMTP id 52E78120E67; Fri, 17 Nov 2023 13:14:39 +0200 (EET) From: Sakari Ailus To: linux-acpi@vger.kernel.org Cc: linux-media@vger.kernel.org, rafael@kernel.org, jacopo.mondi@ideasonboard.com, laurent.pinchart@ideasonboard.com Subject: [PATCH v2 7/7] media: imx219: Put usage_count correctly in s_ctrl callback Date: Fri, 17 Nov 2023 13:14:33 +0200 Message-Id: <20231117111433.1561669-8-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> References: <20231117111433.1561669-1-sakari.ailus@linux.intel.com> Precedence: bulk X-Mailing-List: linux-acpi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 pm_runtime_get_if_in_use() returns an error if Runtime PM is disabled for the device, in which case it won't increment the use count. pm_runtime_put() does that unconditionally however. Only call pm_runtime_put() in case pm_runtime_get_if_in_use() has returned a value > 0. Signed-off-by: Sakari Ailus Reviewed-by: Dave Stevenson --- drivers/media/i2c/imx219.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c index 8436880dcf7a..9865d0b41244 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -371,7 +371,7 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) struct i2c_client *client = v4l2_get_subdevdata(&imx219->sd); const struct v4l2_mbus_framefmt *format; struct v4l2_subdev_state *state; - int ret = 0; + int ret = 0, pm_status; state = v4l2_subdev_get_locked_active_state(&imx219->sd); format = v4l2_subdev_get_pad_format(&imx219->sd, state, 0); @@ -393,7 +393,8 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) * Applying V4L2 control value only happens * when power is up for streaming */ - if (pm_runtime_get_if_in_use(&client->dev) == 0) + pm_status = pm_runtime_get_if_in_use(&client->dev); + if (!pm_status) return 0; switch (ctrl->id) { @@ -446,7 +447,8 @@ static int imx219_set_ctrl(struct v4l2_ctrl *ctrl) break; } - pm_runtime_put(&client->dev); + if (pm_status > 0) + pm_runtime_put(&client->dev); return ret; }