From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5085BC433E0 for ; Tue, 2 Feb 2021 22:18:22 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DE18664F3F for ; Tue, 2 Feb 2021 22:18:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DE18664F3F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:MIME-Version:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:References:In-Reply-To:Message-Id:Date:Subject:To: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=65a3mqUfLYiqhaOdFOr1d4P6AG6vgRfNqTAzntn01Bo=; b=r2vPdafR1Yw70GRUqSvnGBGU1L J7KZUD+T7Qf043TvQqHfj00RfsDMIrev9kyKMxrea0LALVUKrC/piUAxRa24Ix9ZAWVOekhjyL3D2 a6PCLGLVs9fa+szMB5EGwrle4ZKaPd03Q1CdaaNK6O+lnjHGlJnkATBoMJ/nm27O9HIZWtn1LJOgT FJQ5E59b1xasXMr5YlKbK6B18RmmvhZK1BnBSuFg6wK1bBKKyukxxAJ0AzniEMFhEh24ax7KasalN Y2IGdJ3Gxl47G8PwgKtaUBaBfnSj7q1jmnVbgGQN7KSWmi7o5zbZ5BAz3EJP7DofBsmhp/Uv/5Ka+ dpouFPMA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l73yZ-0007YZ-Hw; Tue, 02 Feb 2021 22:16:47 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l73yU-0007X1-LZ for linux-arm-kernel@lists.infradead.org; Tue, 02 Feb 2021 22:16:44 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3AF51143D; Tue, 2 Feb 2021 14:16:41 -0800 (PST) Received: from e120937-lin.home (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2F8203F694; Tue, 2 Feb 2021 14:16:38 -0800 (PST) From: Cristian Marussi To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v6 04/37] firmware: arm_scmi: add devm_acquire_protocol helper Date: Tue, 2 Feb 2021 22:15:22 +0000 Message-Id: <20210202221555.41167-5-cristian.marussi@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210202221555.41167-1-cristian.marussi@arm.com> References: <20210202221555.41167-1-cristian.marussi@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210202_171642_841485_CB8E0F17 X-CRM114-Status: GOOD ( 17.88 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: f.fainelli@gmail.com, vincent.guittot@linaro.org, sudeep.holla@arm.com, thara.gopinath@linaro.org, cristian.marussi@arm.com, james.quinlan@broadcom.com, Jonathan.Cameron@Huawei.com, souvik.chakravarty@arm.com, etienne.carriere@linaro.org, lukasz.luba@arm.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add a method to get hold of a protocol, causing it to be initialized and its resource accounting updated, without getting access to its operations and handle. Some protocols, like SCMI SystemPower, do not expose any protocol ops to the Kernel OSPM agent but still need to be at least initialized: this helper avoids the need to invoke a full devm_get_protocol() only to get the protocol initialized while throwing away unused the protocol ops and handle. Signed-off-by: Cristian Marussi --- drivers/firmware/arm_scmi/driver.c | 70 +++++++++++++++++++++++------- include/linux/scmi_protocol.h | 14 ++++-- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c index 583c00a1355b..ca911a7eb511 100644 --- a/drivers/firmware/arm_scmi/driver.c +++ b/drivers/firmware/arm_scmi/driver.c @@ -745,6 +745,30 @@ static void scmi_devm_release_protocol(struct device *dev, void *res) scmi_release_protocol(dres->handle, dres->protocol_id); } +static struct scmi_protocol_instance __must_check * +__scmi_devres_get_protocol_instance(struct scmi_device *sdev, u8 protocol_id) +{ + struct scmi_protocol_devres *dres; + struct scmi_protocol_instance *pi; + + dres = devres_alloc(scmi_devm_release_protocol, + sizeof(*dres), GFP_KERNEL); + if (!dres) + return ERR_PTR(-ENOMEM); + + pi = scmi_get_protocol_instance(sdev->handle, protocol_id); + if (IS_ERR(pi)) { + devres_free(dres); + return pi; + } + + dres->handle = sdev->handle; + dres->protocol_id = protocol_id; + devres_add(&sdev->dev, dres); + + return pi; +} + /** * scmi_devm_get_protocol - Devres managed get protocol operations and handle * @sdev: A reference to an scmi_device whose embedded struct device is to @@ -768,32 +792,47 @@ scmi_devm_get_protocol(struct scmi_device *sdev, u8 protocol_id, struct scmi_protocol_handle **ph) { struct scmi_protocol_instance *pi; - struct scmi_protocol_devres *dres; - struct scmi_handle *handle = sdev->handle; if (!ph) return ERR_PTR(-EINVAL); - dres = devres_alloc(scmi_devm_release_protocol, - sizeof(*dres), GFP_KERNEL); - if (!dres) - return ERR_PTR(-ENOMEM); - - pi = scmi_get_protocol_instance(handle, protocol_id); - if (IS_ERR(pi)) { - devres_free(dres); + pi = __scmi_devres_get_protocol_instance(sdev, protocol_id); + if (IS_ERR(pi)) return pi; - } - - dres->handle = handle; - dres->protocol_id = protocol_id; - devres_add(&sdev->dev, dres); *ph = &pi->ph; return pi->proto->ops; } +/** + * scmi_devm_acquire_protocol - Devres managed helper to get hold of a protocol + * @sdev: A reference to an scmi_device whose embedded struct device is to + * be used for devres accounting. + * @protocol_id: The protocol being requested. + * + * Get hold of a protocol accounting for its usage, possibly triggering its + * initialization but without getting access to its protocol specific operations + * and handle. + * + * Being a devres based managed method, protocol hold will be automatically + * released, and possibly de-initialized on last user, once the SCMI driver + * owning the scmi_device is unbound from it. + * + * Return: 0 on SUCCESS + */ +static int __must_check scmi_devm_acquire_protocol(struct scmi_device *sdev, + u8 protocol_id) +{ + struct scmi_protocol_instance *pi; + + pi = __scmi_devres_get_protocol_instance(sdev, protocol_id); + if (IS_ERR(pi)) + return PTR_ERR(pi); + + return 0; +} + static int scmi_devm_protocol_match(struct device *dev, void *res, void *data) { struct scmi_protocol_devres *dres = res; @@ -1076,6 +1115,7 @@ static int scmi_probe(struct platform_device *pdev) handle = &info->handle; handle->dev = info->dev; handle->version = &info->version; + handle->devm_acquire_protocol = scmi_devm_acquire_protocol; handle->devm_get_protocol = scmi_devm_get_protocol; handle->devm_put_protocol = scmi_devm_put_protocol; diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h index bbcb2d999068..b3ca2969c29a 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -595,9 +595,15 @@ struct scmi_notify_ops { * @sensor_ops: pointer to set of sensor protocol operations * @reset_ops: pointer to set of reset protocol operations * @voltage_ops: pointer to set of voltage protocol operations - * @devm_get_protocol: devres managed method to acquire a protocol and get specific - * operations and a dedicated protocol handler - * @devm_put_protocol: devres managed method to release a protocol + * @devm_acquire_protocol: devres managed method to get hold of a protocol, + * causing its initialization and related resource + * accounting + * @devm_get_protocol: devres managed method to acquire a protocol, causing + * its initialization and resource accounting, while getting + * protocol specific operations and a dedicated protocol + * handler + * @devm_put_protocol: devres managed method to release a protocol acquired + * with devm_acquire/get_protocol * @notify_ops: pointer to set of notifications related operations * @perf_priv: pointer to private data structure specific to performance * protocol(for internal use only) @@ -624,6 +630,8 @@ struct scmi_handle { const struct scmi_reset_ops *reset_ops; const struct scmi_voltage_ops *voltage_ops; + int __must_check (*devm_acquire_protocol)(struct scmi_device *sdev, + u8 proto); const void __must_check * (*devm_get_protocol)(struct scmi_device *sdev, u8 proto, struct scmi_protocol_handle **ph); -- 2.17.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel