mhi.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: gregkh@linuxfoundation.org
Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
	elder@linaro.org, mhi@lists.linux.dev, quic_hemantk@quicinc.com,
	quic_bbhatt@quicinc.com, quic_jhugo@quicinc.com,
	bjorn.andersson@linaro.org, dmitry.baryshkov@linaro.org,
	Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Subject: [PATCH 03/18] bus: mhi: ep: Add support for creating and destroying MHI EP devices
Date: Tue,  5 Apr 2022 19:27:39 +0530	[thread overview]
Message-ID: <20220405135754.6622-4-manivannan.sadhasivam@linaro.org> (raw)
In-Reply-To: <20220405135754.6622-1-manivannan.sadhasivam@linaro.org>

This commit adds support for creating and destroying MHI endpoint devices.
The MHI endpoint devices binds to the MHI endpoint channels and are used
to transfer data between MHI host and endpoint device.

There is a single MHI EP device for each channel pair. The devices will be
created when the corresponding channels has been started by the host and
will be destroyed during MHI EP power down and reset.

Reviewed-by: Alex Elder <elder@linaro.org>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
 drivers/bus/mhi/ep/main.c | 83 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)

diff --git a/drivers/bus/mhi/ep/main.c b/drivers/bus/mhi/ep/main.c
index f7d5f75fc083..6c64745e8a06 100644
--- a/drivers/bus/mhi/ep/main.c
+++ b/drivers/bus/mhi/ep/main.c
@@ -68,6 +68,89 @@ static struct mhi_ep_device *mhi_ep_alloc_device(struct mhi_ep_cntrl *mhi_cntrl,
 	return mhi_dev;
 }
 
+/*
+ * MHI channels are always defined in pairs with UL as the even numbered
+ * channel and DL as odd numbered one. This function gets UL channel (primary)
+ * as the ch_id and always looks after the next entry in channel list for
+ * the corresponding DL channel (secondary).
+ */
+static int mhi_ep_create_device(struct mhi_ep_cntrl *mhi_cntrl, u32 ch_id)
+{
+	struct mhi_ep_chan *mhi_chan = &mhi_cntrl->mhi_chan[ch_id];
+	struct device *dev = mhi_cntrl->cntrl_dev;
+	struct mhi_ep_device *mhi_dev;
+	int ret;
+
+	/* Check if the channel name is same for both UL and DL */
+	if (strcmp(mhi_chan->name, mhi_chan[1].name)) {
+		dev_err(dev, "UL and DL channel names are not same: (%s) != (%s)\n",
+			mhi_chan->name, mhi_chan[1].name);
+		return -EINVAL;
+	}
+
+	mhi_dev = mhi_ep_alloc_device(mhi_cntrl, MHI_DEVICE_XFER);
+	if (IS_ERR(mhi_dev))
+		return PTR_ERR(mhi_dev);
+
+	/* Configure primary channel */
+	mhi_dev->ul_chan = mhi_chan;
+	get_device(&mhi_dev->dev);
+	mhi_chan->mhi_dev = mhi_dev;
+
+	/* Configure secondary channel as well */
+	mhi_chan++;
+	mhi_dev->dl_chan = mhi_chan;
+	get_device(&mhi_dev->dev);
+	mhi_chan->mhi_dev = mhi_dev;
+
+	/* Channel name is same for both UL and DL */
+	mhi_dev->name = mhi_chan->name;
+	dev_set_name(&mhi_dev->dev, "%s_%s",
+		     dev_name(&mhi_cntrl->mhi_dev->dev),
+		     mhi_dev->name);
+
+	ret = device_add(&mhi_dev->dev);
+	if (ret)
+		put_device(&mhi_dev->dev);
+
+	return ret;
+}
+
+static int mhi_ep_destroy_device(struct device *dev, void *data)
+{
+	struct mhi_ep_device *mhi_dev;
+	struct mhi_ep_cntrl *mhi_cntrl;
+	struct mhi_ep_chan *ul_chan, *dl_chan;
+
+	if (dev->bus != &mhi_ep_bus_type)
+		return 0;
+
+	mhi_dev = to_mhi_ep_device(dev);
+	mhi_cntrl = mhi_dev->mhi_cntrl;
+
+	/* Only destroy devices created for channels */
+	if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER)
+		return 0;
+
+	ul_chan = mhi_dev->ul_chan;
+	dl_chan = mhi_dev->dl_chan;
+
+	if (ul_chan)
+		put_device(&ul_chan->mhi_dev->dev);
+
+	if (dl_chan)
+		put_device(&dl_chan->mhi_dev->dev);
+
+	dev_dbg(&mhi_cntrl->mhi_dev->dev, "Destroying device for chan:%s\n",
+		 mhi_dev->name);
+
+	/* Notify the client and remove the device from MHI bus */
+	device_del(dev);
+	put_device(dev);
+
+	return 0;
+}
+
 static int mhi_ep_chan_init(struct mhi_ep_cntrl *mhi_cntrl,
 			    const struct mhi_ep_cntrl_config *config)
 {
-- 
2.25.1


  parent reply	other threads:[~2022-04-05 13:58 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-05 13:57 [PATCH 00/18] Add initial support for MHI endpoint stack Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 01/18] bus: mhi: ep: Add support for registering MHI endpoint controllers Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 02/18] bus: mhi: ep: Add support for registering MHI endpoint client drivers Manivannan Sadhasivam
2022-04-05 13:57 ` Manivannan Sadhasivam [this message]
2022-04-05 13:57 ` [PATCH 04/18] bus: mhi: ep: Add support for managing MMIO registers Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 05/18] bus: mhi: ep: Add support for ring management Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 06/18] bus: mhi: ep: Add support for sending events to the host Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 07/18] bus: mhi: ep: Add support for managing MHI state machine Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 08/18] bus: mhi: ep: Add support for processing MHI endpoint interrupts Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 09/18] bus: mhi: ep: Add support for powering up the MHI endpoint stack Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 10/18] bus: mhi: ep: Add support for powering down " Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 11/18] bus: mhi: ep: Add support for handling MHI_RESET Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 12/18] bus: mhi: ep: Add support for handling SYS_ERR condition Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 13/18] bus: mhi: ep: Add support for processing command rings Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 14/18] bus: mhi: ep: Add support for reading from the host Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 15/18] bus: mhi: ep: Add support for processing channel rings Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 16/18] bus: mhi: ep: Add support for queueing SKBs to the host Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 17/18] bus: mhi: ep: Add support for suspending and resuming channels Manivannan Sadhasivam
2022-04-05 13:57 ` [PATCH 18/18] bus: mhi: ep: Add uevent support for module autoloading Manivannan Sadhasivam
2022-04-26 11:19 ` [PATCH 00/18] Add initial support for MHI endpoint stack Greg KH

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=20220405135754.6622-4-manivannan.sadhasivam@linaro.org \
    --to=manivannan.sadhasivam@linaro.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=elder@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhi@lists.linux.dev \
    --cc=quic_bbhatt@quicinc.com \
    --cc=quic_hemantk@quicinc.com \
    --cc=quic_jhugo@quicinc.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).