Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DC284C433FE for ; Tue, 7 Dec 2021 08:09:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232164AbhLGIMt (ORCPT ); Tue, 7 Dec 2021 03:12:49 -0500 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:42062 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S231181AbhLGIMi (ORCPT ); Tue, 7 Dec 2021 03:12:38 -0500 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 1B740pnJ018749; Tue, 7 Dec 2021 09:09:00 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=S23BQfuWjC3JI4sYe7w7IBbRYjP4Miyc0PMhSA/fiqU=; b=I95lSol6/Y7xEcEVTUW985hC0YxmhXvl0tDsD9ODrgw3dkoqojkntJ6qDpzli5L0mTsI ByoGJSp07OF+XMC2mOIk7UMSv2z6i96BjDoFGezrXI6HVvbzoGKa799LU+Mml3otlCc0 Riv0GkvYPKsf32q6whYhKhyPAGl0ij9WL+YWNBa1gLMjhFnYyJUY6pQhLJk7fSDEyA3z 3+3f2d8QMR/vMFIl02XkdiArmh7LnN1DewZhHkrD9kxsbd7L4cULUJ3Z8n8w1iD4/2Mc 9TmgZ/5FOtW+jocLm4dZncxrfDVl6qBMm5W/9C2JHX3TAvyS1r2NVcm+dONRJQTIsQTu Pw== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com (PPS) with ESMTPS id 3csp32bc9w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 07 Dec 2021 09:09:00 +0100 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 1FA37100034; Tue, 7 Dec 2021 09:09:00 +0100 (CET) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 16F5F2220B0; Tue, 7 Dec 2021 09:09:00 +0100 (CET) Received: from localhost (10.75.127.50) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.26; Tue, 7 Dec 2021 09:08:59 +0100 From: Arnaud Pouliquen To: Bjorn Andersson , Mathieu Poirier CC: , , , , Subject: [PATCH v8 09/13] rpmsg: Introduce rpmsg_create_default_ept function Date: Tue, 7 Dec 2021 09:08:39 +0100 Message-ID: <20211207080843.21222-10-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211207080843.21222-1-arnaud.pouliquen@foss.st.com> References: <20211207080843.21222-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.75.127.50] X-ClientProxiedBy: SFHDAG1NODE2.st.com (10.75.127.2) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2021-12-07_03,2021-12-06_02,2021-12-02_01 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org By providing a callback in the rpmsg_driver structure, the rpmsg devices can be probed with a default endpoint created. In this case, it is not possible to associated to this endpoint private data that could allow the driver to retrieve the context. This helper function allows rpmsg drivers to create a default endpoint on runtime with an associated private context. For example, a driver might create a context structure on the probe and want to provide that context as private data for the default rpmsg callback. Signed-off-by: Arnaud Pouliquen Reviewed-by: Mathieu Poirier Tested-by: Julien Massot --- drivers/rpmsg/rpmsg_core.c | 54 ++++++++++++++++++++++++++++++++++ drivers/rpmsg/rpmsg_internal.h | 4 +++ 2 files changed, 58 insertions(+) diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c index d2129d3e6225..3f86512147e8 100644 --- a/drivers/rpmsg/rpmsg_core.c +++ b/drivers/rpmsg/rpmsg_core.c @@ -133,6 +133,60 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) } EXPORT_SYMBOL(rpmsg_destroy_ept); +/** + * rpmsg_create_default_ept() - create a default rpmsg_endpoint for a rpmsg device + * @rpdev: rpmsg channel device + * @cb: rx callback handler + * @priv: private data for the driver's use + * @chinfo: channel_info with the local rpmsg address to bind with @cb + * + * On register_rpmsg_driver if no callback is provided in the rpmsg_driver structure, + * no endpoint is created when the device is probed by the rpmsg bus. + * + * This function returns a pointer to an endpoint created and assigned as the default + * endpoint of the rpmsg device. + * + * Drivers should provide their @rpdev channel (so the new endpoint would belong + * to the same remote processor their channel belongs to), an rx callback + * function, an optional private data (which is provided back when the + * rx callback is invoked), and an address they want to bind with the + * callback. If @addr is RPMSG_ADDR_ANY, then rpmsg_create_ept will + * dynamically assign them an available rpmsg address (drivers should have + * a very good reason why not to always use RPMSG_ADDR_ANY here). + * + * Return: a pointer to the endpoint on success, or NULL on error. + */ +struct rpmsg_endpoint *rpmsg_create_default_ept(struct rpmsg_device *rpdev, + rpmsg_rx_cb_t cb, void *priv, + struct rpmsg_channel_info chinfo) +{ + struct rpmsg_endpoint *ept; + + if (WARN_ON(!rpdev)) + return NULL; + + if (WARN_ON(rpdev->ept)) + return NULL; + + /* It does not make sense to create a default endpoint without a callback. */ + if (!cb) + return NULL; + + if (rpdev->ept) + return rpdev->ept; + + ept = rpdev->ops->create_ept(rpdev, cb, priv, chinfo); + if (!ept) + return NULL; + + /* Assign the new endpoint as default endpoint */ + rpdev->ept = ept; + rpdev->src = ept->addr; + + return ept; +} +EXPORT_SYMBOL(rpmsg_create_default_ept); + /** * rpmsg_send() - send a message across to the remote processor * @ept: the rpmsg endpoint diff --git a/drivers/rpmsg/rpmsg_internal.h b/drivers/rpmsg/rpmsg_internal.h index d4b23fd019a8..950d6aa4843f 100644 --- a/drivers/rpmsg/rpmsg_internal.h +++ b/drivers/rpmsg/rpmsg_internal.h @@ -100,4 +100,8 @@ static inline int rpmsg_ctrldev_register_device(struct rpmsg_device *rpdev) return rpmsg_register_device(rpdev); } +struct rpmsg_endpoint *rpmsg_create_default_ept(struct rpmsg_device *rpdev, + rpmsg_rx_cb_t cb, void *priv, + struct rpmsg_channel_info chinfo); + #endif -- 2.17.1