Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp207640pxb; Mon, 8 Nov 2021 12:16:11 -0800 (PST) X-Google-Smtp-Source: ABdhPJw83GE+gpCgdC/1ckjuD+f3G5p2iW8/bFBajXP5Yz1gEKoYe/Slnjbjd+8QyPi6rO3G1BkM X-Received: by 2002:a05:6638:3891:: with SMTP id b17mr1359189jav.100.1636402571487; Mon, 08 Nov 2021 12:16:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636402571; cv=none; d=google.com; s=arc-20160816; b=DC74c4+LYl+LU0XGkB7n3F1u7oQFjTtHVyoirVsSJWX2xVeGCAr0KVbX3QTjFbP1TV oZUwu51PFP1mMrRYcTjTCCFHOMQciz9W/oJaAKS26vn2AW1u+J05d3I1nxfC1oZ4Q/6+ gwBQ10sjl0GyUO84ncbXPMAaLWXCW/YGFsf3UG8e+YI/TAnxJnGiTi7SRAGjAkH4VY5S MfsS27st80euoLbwkikkEmQIt4srKD6884aJSsOTd+2Pwf2ecoXMGJ6t7jY4akuE6yYm Px2NrrogYzH5Smx8+29K8PMmgEJSMcjbkQ4flM4Wg4z3KEw6FdNGbIl9pGJH57lovhpI 7l8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=tZF7B1AEqL3PxVhSsmPz+HyObnYBEuTvkk9FW+Dz/Mc=; b=RFc326iX6OyRoX4Psov7PJ3ie1ZkFvdirPQp7i8CKxvKRQRSncITsk0uL4sUkGARyZ NWt+QEGhIqdyDx29SY/PBJSfaFpek1WLGYNJ4gGAiWg+xxP8h3KDGo3gaXJCXju4cEPW kFPJN75vMr8eLxkvJua2PgQk00a3QiU0kunJOiUu3GBjkhLtaEzbxt+BVhXg4GwWWkdC S/dGF1KUZq9krYgWD81JIQed+3DHwXT4gIuApasi7OwkBkAsdsDaIPeptYkMUzGmQJzt hRJz+Vn/HMA2ZuI6DAqRu2YMXqejM6QepjZ5hFVRiTZSmyEAiNFD+mWSR2CWr4GtYgT6 5k6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b=fnn6El9f; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=foss.st.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y17si24457925ila.36.2021.11.08.12.15.55; Mon, 08 Nov 2021 12:16:11 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b=fnn6El9f; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=foss.st.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240495AbhKHOXI (ORCPT + 99 others); Mon, 8 Nov 2021 09:23:08 -0500 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:35616 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240360AbhKHOWk (ORCPT ); Mon, 8 Nov 2021 09:22:40 -0500 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 1A8DSDmk021137; Mon, 8 Nov 2021 15:19:48 +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=tZF7B1AEqL3PxVhSsmPz+HyObnYBEuTvkk9FW+Dz/Mc=; b=fnn6El9fmTCFwOTcIKeGooDREN5TzwMApQ/d2EYNZO7gv7+4KoO/LHs20HYLFDo+I6KY HGu0tskKWSH5vMLcPI6sa3ZW6VZjcSe/IuAFWUQ3+/tMTCuenR9kOYs6igmKMR2JNfhi l6NyWgCbmOfNe7HMeqi0LImHwHxN3pcUPR/h+8B9/KOrtNk9fZsa0cDop11/biA79dqT L7s5t0gmDR5saFmeVCC4CcSfTThSUgoSUQhPKqjP9Bc87pBgK2Eb5yw5f0YcYdZt9aFi PrSHH3H2QIbzYzLC1Z3gBBvthCWS6R8x+oiSHbrvDFnwR8xNcd1hLKMANlzOodFo+sj/ Cg== 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 3c709q2a4b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Nov 2021 15:19:48 +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 34CE6100034; Mon, 8 Nov 2021 15:19:48 +0100 (CET) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 2DCBA21E665; Mon, 8 Nov 2021 15:19:48 +0100 (CET) Received: from localhost (10.75.127.49) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Mon, 8 Nov 2021 15:19:47 +0100 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , , Subject: [PATCH v7 08/12] rpmsg: Introduce rpmsg_create_default_ept function Date: Mon, 8 Nov 2021 15:19:33 +0100 Message-ID: <20211108141937.13016-9-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211108141937.13016-1-arnaud.pouliquen@foss.st.com> References: <20211108141937.13016-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.75.127.49] 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.0.607.475 definitions=2021-11-08_05,2021-11-08_01,2020-04-07_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 --- Update vs previous revision: - move rpmsg_create_default_ept declaration from rpmsg.h to rpmsg_internal.h - fix rpmsg_create_default_ept function header - Treat rpdev->ept!= 0 as invalid usage with a WARN_ON --- 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 45227c864aa2..bdcde57c22f6 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 8bb56d347c81..4577e9381d25 100644 --- a/drivers/rpmsg/rpmsg_internal.h +++ b/drivers/rpmsg/rpmsg_internal.h @@ -98,4 +98,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