Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp93116imm; Fri, 5 Oct 2018 00:00:23 -0700 (PDT) X-Google-Smtp-Source: ACcGV61/jLXTiKzddJZGO65bh1YMfBGriZRbSfExM8t6OoHOjhmtLOcTM0EzI8frJzFKeGXUIdaS X-Received: by 2002:a62:2606:: with SMTP id m6-v6mr8206430pfm.104.1538722823627; Fri, 05 Oct 2018 00:00:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538722823; cv=none; d=google.com; s=arc-20160816; b=kXHxsPrnRkisD3I1yJ2IDFd8hz8ITvpVU3jwKVtV2XJQwqY+d8PFWSYdN6urRxbzmY zfCjpu7EqbH6EZVbXpupLbO8kqMUbmj/TmBrCNblyflZ+4QgE47iAQj6IvrEfJmxfi6l 6IOy4bjnT+YkMTGV71uOJNEXk17V1J3EL/JfYP+ODJf2MatUPFkKmAtPnuf6HD73lIaN y6uB1cnB/kJCLozwreogdhaDJMOMqLxGJ4jNSt5V/IN7WmOvWImgGgC8k1lb7gGuGyr4 jF+Tx2THFcdju6DhRNc1OxybJXajSs19lorGI6OHWKHC8abdSKTdW21Rk+tX9RTNS0Aq O8Bw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature; bh=x4TVnfM/1AFUArB6ebDMH737WKwyYGaVP4pnxjR+ym0=; b=dC/WraYlUHnA28gpWzyb5HArbGMjVK6prlkq2/vwE86dBALrxGCZy0KylDKx2FJAcd 7DQ5KOFJVmz9toz3GdxvoAA6NWvgiOLNIREt73uo9ikw+1rSkPsR5yEqtwYYP8SFp3KL hZXXKDkkefgJw6yJ18nRcAF54hYIY5LMSnM+CpyNv1b3Pda9o91HFDdOlff1FtwtHnP8 SSQDMINd59r+otkLYrKvYKxCenyNXovjlbr7+QETrjC532gj1jnpVxHEC0eFHBH3clYL IsGuNwTMQK3QuNRjrxQuVOIAy/iW1JwqZrEBL0bQr/3dncFPGPWLNrYu9yH8lVMq/tmS qpzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=ZxmAeSxm; dkim=pass header.i=@codeaurora.org header.s=default header.b="Go7Zp/EQ"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c197-v6si7944744pfc.74.2018.10.05.00.00.07; Fri, 05 Oct 2018 00:00:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=ZxmAeSxm; dkim=pass header.i=@codeaurora.org header.s=default header.b="Go7Zp/EQ"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728009AbeJEN5N (ORCPT + 99 others); Fri, 5 Oct 2018 09:57:13 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:58322 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727133AbeJEN5N (ORCPT ); Fri, 5 Oct 2018 09:57:13 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 6B7B560C72; Fri, 5 Oct 2018 06:59:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1538722793; bh=q8sFDxz2e2p2Lcr6ajXSMEgSrmUlieD4OBiEtaQKzk8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZxmAeSxmZy2MR+nNDlpuwWAoAsmvZL7D6bAeR9NRD7VcA8ezVLzvNpQ62rwsOPnOc bxPiCuMIli8LufKw6x57MqMulu27bBG0onJ5n9q/Taky5NDoD282lgvhXOEIlvhjFZ jhY3YAKPoNRXEo4jF0Tjg6cEGm3lLm/eyc7lP/K0= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_INVALID,DKIM_SIGNED autolearn=no autolearn_force=no version=3.4.0 Received: from aneelaka-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: aneela@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id EA33D60445; Fri, 5 Oct 2018 06:59:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1538722792; bh=q8sFDxz2e2p2Lcr6ajXSMEgSrmUlieD4OBiEtaQKzk8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Go7Zp/EQzMT9jgYiqgtGQHuRPX2NxNlLlCJui5N05BWC5aWBbkZhD1ms6GLktCl4A B1VhOObChNubfdwEtpY+6YCuy/BqmaH9Kd0JVQM3KnIuxAR+KtlqXBRnmfQoKHLlZn AIe1lY5ARE5q63PfeUEHktFmB9LLcsx6urq89VYM= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org EA33D60445 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=aneela@codeaurora.org From: Arun Kumar Neelakantam To: ohad@wizery.com, bjorn.andersson@linaro.org, clew@codeaurora.org, sricharan@codeaurora.org Cc: linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, Arun Kumar Neelakantam Subject: [PATCH V3 1/4] rpmsg: core: Add signal API support Date: Fri, 5 Oct 2018 12:29:33 +0530 Message-Id: <1538722776-13648-2-git-send-email-aneela@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1538722776-13648-1-git-send-email-aneela@codeaurora.org> References: <1538722776-13648-1-git-send-email-aneela@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some transports like Glink support the state notifications between clients using signals similar to serial protocol signals. Signed-off-by: Chris Lew Signed-off-by: Arun Kumar Neelakantam --- drivers/rpmsg/rpmsg_core.c | 41 +++++++++++++++++++++++++++++++++++++++++ drivers/rpmsg/rpmsg_internal.h | 5 +++++ include/linux/rpmsg.h | 26 ++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c index 8122807..e9b719b 100644 --- a/drivers/rpmsg/rpmsg_core.c +++ b/drivers/rpmsg/rpmsg_core.c @@ -2,6 +2,7 @@ /* * remote processor messaging bus * + * Copyright (c) 2018, The Linux Foundation. * Copyright (C) 2011 Texas Instruments, Inc. * Copyright (C) 2011 Google, Inc. * @@ -283,6 +284,42 @@ int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, } EXPORT_SYMBOL(rpmsg_trysend_offchannel); +/** + * rpmsg_get_signals() - get the signals for this endpoint + * @ept: the rpmsg endpoint + * + * Returns 0 on success and an appropriate error value on failure. + */ +int rpmsg_get_signals(struct rpmsg_endpoint *ept) +{ + if (WARN_ON(!ept)) + return -EINVAL; + if (!ept->ops->get_signals) + return -EOPNOTSUPP; + + return ept->ops->get_signals(ept); +} +EXPORT_SYMBOL(rpmsg_get_signals); + +/** + * rpmsg_set_signals() - set the remote signals for this endpoint + * @ept: the rpmsg endpoint + * @set: set mask for signals + * @clear: clear mask for signals + * + * Returns 0 on success and an appropriate error value on failure. + */ +int rpmsg_set_signals(struct rpmsg_endpoint *ept, u32 set, u32 clear) +{ + if (WARN_ON(!ept)) + return -EINVAL; + if (!ept->ops->set_signals) + return -EOPNOTSUPP; + + return ept->ops->set_signals(ept, set, clear); +} +EXPORT_SYMBOL(rpmsg_set_signals); + /* * match an rpmsg channel with a channel info struct. * this is used to make sure we're not creating rpmsg devices for channels @@ -468,6 +505,10 @@ static int rpmsg_dev_probe(struct device *dev) rpdev->ept = ept; rpdev->src = ept->addr; + + if (rpdrv->signals) + ept->sig_cb = rpdrv->signals; + } err = rpdrv->probe(rpdev); diff --git a/drivers/rpmsg/rpmsg_internal.h b/drivers/rpmsg/rpmsg_internal.h index 0d791c3..033656d 100644 --- a/drivers/rpmsg/rpmsg_internal.h +++ b/drivers/rpmsg/rpmsg_internal.h @@ -2,6 +2,7 @@ /* * remote processor messaging bus internals * + * Copyright (c) 2018, The Linux Foundation. * Copyright (C) 2011 Texas Instruments, Inc. * Copyright (C) 2011 Google, Inc. * @@ -46,6 +47,8 @@ struct rpmsg_device_ops { * @trysend: see @rpmsg_trysend(), required * @trysendto: see @rpmsg_trysendto(), optional * @trysend_offchannel: see @rpmsg_trysend_offchannel(), optional + * @get_signals: see @rpmsg_get_signals(), optional + * @set_signals: see @rpmsg_set_signals(), optional * * Indirection table for the operations that a rpmsg backend should implement. * In addition to @destroy_ept, the backend must at least implement @send and @@ -65,6 +68,8 @@ struct rpmsg_endpoint_ops { void *data, int len); __poll_t (*poll)(struct rpmsg_endpoint *ept, struct file *filp, poll_table *wait); + int (*get_signals)(struct rpmsg_endpoint *ept); + int (*set_signals)(struct rpmsg_endpoint *ept, u32 set, u32 clear); }; int rpmsg_register_device(struct rpmsg_device *rpdev); diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h index 9fe156d..48c8ae3 100644 --- a/include/linux/rpmsg.h +++ b/include/linux/rpmsg.h @@ -2,6 +2,7 @@ /* * Remote processor messaging * + * Copyright (c) 2018 The Linux Foundation. * Copyright (C) 2011 Texas Instruments, Inc. * Copyright (C) 2011 Google, Inc. * All rights reserved. @@ -60,6 +61,7 @@ struct rpmsg_device { }; typedef int (*rpmsg_rx_cb_t)(struct rpmsg_device *, void *, int, void *, u32); +typedef int (*rpmsg_rx_sig_t)(struct rpmsg_device *, void *, u32, u32); /** * struct rpmsg_endpoint - binds a local rpmsg address to its user @@ -67,6 +69,7 @@ struct rpmsg_device { * @refcount: when this drops to zero, the ept is deallocated * @cb: rx callback handler * @cb_lock: must be taken before accessing/changing @cb + * @sig_cb: rx serial signal handler * @addr: local rpmsg address * @priv: private data for the driver's use * @@ -89,6 +92,7 @@ struct rpmsg_endpoint { struct kref refcount; rpmsg_rx_cb_t cb; struct mutex cb_lock; + rpmsg_rx_sig_t sig_cb; u32 addr; void *priv; @@ -102,6 +106,7 @@ struct rpmsg_endpoint { * @probe: invoked when a matching rpmsg channel (i.e. device) is found * @remove: invoked when the rpmsg channel is removed * @callback: invoked when an inbound message is received on the channel + * @signals: invoked when a serial signal change is received on the channel */ struct rpmsg_driver { struct device_driver drv; @@ -109,6 +114,7 @@ struct rpmsg_driver { int (*probe)(struct rpmsg_device *dev); void (*remove)(struct rpmsg_device *dev); int (*callback)(struct rpmsg_device *, void *, int, void *, u32); + int (*signals)(struct rpmsg_device *, void *, u32, u32); }; #if IS_ENABLED(CONFIG_RPMSG) @@ -135,6 +141,9 @@ int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst, __poll_t rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp, poll_table *wait); +int rpmsg_get_signals(struct rpmsg_endpoint *ept); +int rpmsg_set_signals(struct rpmsg_endpoint *ept, u32 set, u32 clear); + #else static inline int register_rpmsg_device(struct rpmsg_device *dev) @@ -242,6 +251,23 @@ static inline __poll_t rpmsg_poll(struct rpmsg_endpoint *ept, return 0; } +static inline int rpmsg_get_signals(struct rpmsg_endpoint *ept) +{ + /* This shouldn't be possible */ + WARN_ON(1); + + return -ENXIO; +} + +static inline int rpmsg_set_signals(struct rpmsg_endpoint *ept, + u32 set, u32 clear) +{ + /* This shouldn't be possible */ + WARN_ON(1); + + return -ENXIO; +} + #endif /* IS_ENABLED(CONFIG_RPMSG) */ /* use a macro to avoid include chaining to get THIS_MODULE */ -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project