All of lore.kernel.org
 help / color / mirror / Atom feed
From: Deepak Kumar Singh <deesin@codeaurora.org>
To: bjorn.andersson@linaro.org, clew@codeaurora.org,
	sibis@codeaurora.org, manivannan.sadhasivam@linaro.org,
	mathieu.poirier@linaro.org
Cc: linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org,
	linux-remoteproc@vger.kernel.org,
	Arun Kumar Neelakantam <aneela@codeaurora.org>,
	Andy Gross <agross@kernel.org>, Ohad Ben-Cohen <ohad@wizery.com>
Subject: Re: [PATCH V6 2/4] rpmsg: glink: Add support to handle signals command
Date: Thu, 6 May 2021 22:47:17 +0530	[thread overview]
Message-ID: <9095e858-61c3-1115-dc59-d290d81a4b4b@codeaurora.org> (raw)
In-Reply-To: <1593182819-30747-3-git-send-email-deesin@codeaurora.org>

Please ignore this instance. Wrongly pushed.

On 5/6/2021 10:36 PM, Deepak Kumar Singh wrote:
> From: Arun Kumar Neelakantam <aneela@codeaurora.org>
>
> Remote peripherals send signal notifications over glink with commandID 15.
>
> Add support to send and receive the signal command and convert the signals
> from NATIVE to TIOCM while receiving and vice versa while sending.
>
> Signed-off-by: Chris Lew <clew@codeaurora.org>
> Signed-off-by: Deepak Kumar Singh <deesin@codeaurora.org>
> Signed-off-by: Arun Kumar Neelakantam <aneela@codeaurora.org>
> ---
>   drivers/rpmsg/qcom_glink_native.c | 125 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 125 insertions(+)
>
> diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
> index 0e8a28c0..1bf3235 100644
> --- a/drivers/rpmsg/qcom_glink_native.c
> +++ b/drivers/rpmsg/qcom_glink_native.c
> @@ -17,6 +17,7 @@
>   #include <linux/rpmsg.h>
>   #include <linux/sizes.h>
>   #include <linux/slab.h>
> +#include <linux/termios.h>
>   #include <linux/workqueue.h>
>   #include <linux/mailbox_client.h>
>   
> @@ -150,6 +151,8 @@ enum {
>    * @intent_req_lock: Synchronises multiple intent requests
>    * @intent_req_result: Result of intent request
>    * @intent_req_comp: Completion for intent_req signalling
> + * @lsigs:	local side signals
> + * @rsigs:	remote side signals
>    */
>   struct glink_channel {
>   	struct rpmsg_endpoint ept;
> @@ -181,6 +184,10 @@ struct glink_channel {
>   	struct mutex intent_req_lock;
>   	bool intent_req_result;
>   	struct completion intent_req_comp;
> +
> +	unsigned int lsigs;
> +	unsigned int rsigs;
> +
>   };
>   
>   #define to_glink_channel(_ept) container_of(_ept, struct glink_channel, ept)
> @@ -201,9 +208,15 @@ static const struct rpmsg_endpoint_ops glink_endpoint_ops;
>   #define RPM_CMD_TX_DATA_CONT		12
>   #define RPM_CMD_READ_NOTIF		13
>   #define RPM_CMD_RX_DONE_W_REUSE		14
> +#define RPM_CMD_SIGNALS			15
>   
>   #define GLINK_FEATURE_INTENTLESS	BIT(1)
>   
> +#define NATIVE_DTR_SIG			BIT(31)
> +#define NATIVE_CTS_SIG			BIT(30)
> +#define NATIVE_CD_SIG			BIT(29)
> +#define NATIVE_RI_SIG			BIT(28)
> +
>   static void qcom_glink_rx_done_work(struct work_struct *work);
>   
>   static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink,
> @@ -975,6 +988,76 @@ static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid)
>   	return 0;
>   }
>   
> +/**
> + * qcom_glink_send_signals() - convert a signal cmd to wire format and transmit
> + * @glink:	The transport to transmit on.
> + * @channel:	The glink channel
> + * @sigs:	The signals to encode.
> + *
> + * Return: 0 on success or standard Linux error code.
> + */
> +static int qcom_glink_send_signals(struct qcom_glink *glink,
> +				   struct glink_channel *channel,
> +				   u32 sigs)
> +{
> +	struct glink_msg msg;
> +
> +	/* convert signals from TIOCM to NATIVE */
> +	sigs &= 0x0fff;
> +	if (sigs & TIOCM_DTR)
> +		sigs |= NATIVE_DTR_SIG;
> +	if (sigs & TIOCM_RTS)
> +		sigs |= NATIVE_CTS_SIG;
> +	if (sigs & TIOCM_CD)
> +		sigs |= NATIVE_CD_SIG;
> +	if (sigs & TIOCM_RI)
> +		sigs |= NATIVE_RI_SIG;
> +
> +	msg.cmd = cpu_to_le16(RPM_CMD_SIGNALS);
> +	msg.param1 = cpu_to_le16(channel->lcid);
> +	msg.param2 = cpu_to_le32(sigs);
> +
> +	return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true);
> +}
> +
> +static int qcom_glink_handle_signals(struct qcom_glink *glink,
> +				     unsigned int rcid, unsigned int signals)
> +{
> +	struct glink_channel *channel;
> +	unsigned long flags;
> +	u32 old;
> +
> +	spin_lock_irqsave(&glink->idr_lock, flags);
> +	channel = idr_find(&glink->rcids, rcid);
> +	spin_unlock_irqrestore(&glink->idr_lock, flags);
> +	if (!channel) {
> +		dev_err(glink->dev, "signal for non-existing channel\n");
> +		return -EINVAL;
> +	}
> +
> +	old = channel->rsigs;
> +
> +	/* convert signals from NATIVE to TIOCM */
> +	if (signals & NATIVE_DTR_SIG)
> +		signals |= TIOCM_DSR;
> +	if (signals & NATIVE_CTS_SIG)
> +		signals |= TIOCM_CTS;
> +	if (signals & NATIVE_CD_SIG)
> +		signals |= TIOCM_CD;
> +	if (signals & NATIVE_RI_SIG)
> +		signals |= TIOCM_RI;
> +	signals &= 0x0fff;
> +
> +	channel->rsigs = signals;
> +
> +	if (channel->ept.sig_cb) {
> +		channel->ept.sig_cb(channel->ept.rpdev, channel->ept.priv,
> +				    old, channel->rsigs);
> +	}
> +
> +	return 0;
> +}
> +
>   static irqreturn_t qcom_glink_native_intr(int irq, void *data)
>   {
>   	struct qcom_glink *glink = data;
> @@ -1036,6 +1119,10 @@ static irqreturn_t qcom_glink_native_intr(int irq, void *data)
>   			qcom_glink_handle_intent_req_ack(glink, param1, param2);
>   			qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
>   			break;
> +		case RPM_CMD_SIGNALS:
> +			qcom_glink_handle_signals(glink, param1, param2);
> +			qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8));
> +			break;
>   		default:
>   			dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd);
>   			ret = -EINVAL;
> @@ -1332,6 +1419,42 @@ static int qcom_glink_trysend(struct rpmsg_endpoint *ept, void *data, int len)
>   	return __qcom_glink_send(channel, data, len, false);
>   }
>   
> +static int qcom_glink_get_sigs(struct rpmsg_endpoint *ept)
> +{
> +	struct glink_channel *channel = to_glink_channel(ept);
> +
> +	return channel->rsigs;
> +}
> +
> +static int qcom_glink_set_sigs(struct rpmsg_endpoint *ept, u32 set, u32 clear)
> +{
> +	struct glink_channel *channel = to_glink_channel(ept);
> +	struct qcom_glink *glink = channel->glink;
> +	u32 sigs = channel->lsigs;
> +
> +	if (set & TIOCM_DTR)
> +		sigs |= TIOCM_DTR;
> +	if (set & TIOCM_RTS)
> +		sigs |= TIOCM_RTS;
> +	if (set & TIOCM_CD)
> +		sigs |= TIOCM_CD;
> +	if (set & TIOCM_RI)
> +		sigs |= TIOCM_RI;
> +
> +	if (clear & TIOCM_DTR)
> +		sigs &= ~TIOCM_DTR;
> +	if (clear & TIOCM_RTS)
> +		sigs &= ~TIOCM_RTS;
> +	if (clear & TIOCM_CD)
> +		sigs &= ~TIOCM_CD;
> +	if (clear & TIOCM_RI)
> +		sigs &= ~TIOCM_RI;
> +
> +	channel->lsigs = sigs;
> +
> +	return qcom_glink_send_signals(glink, channel, sigs);
> +}
> +
>   /*
>    * Finds the device_node for the glink child interested in this channel.
>    */
> @@ -1365,6 +1488,8 @@ static const struct rpmsg_endpoint_ops glink_endpoint_ops = {
>   	.destroy_ept = qcom_glink_destroy_ept,
>   	.send = qcom_glink_send,
>   	.trysend = qcom_glink_trysend,
> +	.get_signals = qcom_glink_get_sigs,
> +	.set_signals = qcom_glink_set_sigs,
>   };
>   
>   static void qcom_glink_rpdev_release(struct device *dev)
>

  reply	other threads:[~2021-05-06 17:17 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-26 14:46 [PATCH V5 0/4] Signaling api support in glink/rpmsg clients Deepak Kumar Singh
2020-06-26 14:46 ` [PATCH V6 1/4] rpmsg: core: Add signal API support Deepak Kumar Singh
2021-05-06 17:18   ` Deepak Kumar Singh
2020-06-26 14:46 ` [PATCH V6 2/4] rpmsg: glink: Add support to handle signals command Deepak Kumar Singh
2021-05-06 17:17   ` Deepak Kumar Singh [this message]
2020-06-26 14:46 ` [PATCH V6 3/4] rpmsg: char: Add TIOCMGET/TIOCMSET ioctl support Deepak Kumar Singh
2020-06-26 14:46 ` [PATCH V6 4/4] rpmsg: char: Add signal callback and POLLPRI support Deepak Kumar Singh
2020-07-06 18:04 ` [PATCH V5 0/4] Signaling api support in glink/rpmsg clients Mathieu Poirier
2020-09-02 16:30   ` Deepak Kumar Singh
2020-09-02 16:40     ` Mathieu Poirier
2021-05-06 17:06 [PATCH V3 0/2] soc: qcom: aoss: Expose send for generic usecase Deepak Kumar Singh
2021-05-06 17:06 ` [PATCH V3 1/2] " Deepak Kumar Singh
2021-05-28  3:32   ` Bjorn Andersson
2021-06-07 11:42   ` Sibi Sankar
2021-05-06 17:06 ` [PATCH V3 2/2] soc: qcom: aoss: Add debugfs entry Deepak Kumar Singh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9095e858-61c3-1115-dc59-d290d81a4b4b@codeaurora.org \
    --to=deesin@codeaurora.org \
    --cc=agross@kernel.org \
    --cc=aneela@codeaurora.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=clew@codeaurora.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=manivannan.sadhasivam@linaro.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=ohad@wizery.com \
    --cc=sibis@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.