Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9219c292 authored by Sujeev Dias's avatar Sujeev Dias
Browse files

mhi: core: add support for bi-direction or directionless channels



MHI channels are not always unidirectional. Some offload
channels are either bi-directional or has no direction
associate with it, add support for such channels.

CRs-Fixed: 2229699
Change-Id: I6cb3b879eb3d90e9bbf8704805a16f1b43306e0d
Signed-off-by: default avatarSujeev Dias <sdias@codeaurora.org>
parent 3ddce5d8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -22,8 +22,10 @@ Main node properties:
	2nd element: Transfer ring length in elements
	3rd element: Event ring associated with this channel
	4th element: Channel direction as defined by enum dma_data_direction
		0 = Bidirectional data transfer
		1 = UL data transfer
		2 = DL data transfer
		3 = No direction, not a regular data transfer channel
	5th element: Channel doorbell mode configuration as defined by
	enum MHI_BRSTMODE
		2 = burst mode disabled
+18 −1
Original line number Diff line number Diff line
@@ -616,7 +616,19 @@ int mhi_device_configure(struct mhi_device *mhi_dev,
	struct mhi_chan_ctxt *ch_ctxt;
	int er_index, chan;

	mhi_chan = (dir == DMA_TO_DEVICE) ? mhi_dev->ul_chan : mhi_dev->dl_chan;
	switch (dir) {
	case DMA_TO_DEVICE:
		mhi_chan = mhi_dev->ul_chan;
		break;
	case DMA_BIDIRECTIONAL:
	case DMA_FROM_DEVICE:
	case DMA_NONE:
		mhi_chan = mhi_dev->dl_chan;
		break;
	default:
		return -EINVAL;
	}

	er_index = mhi_chan->er_index;
	chan = mhi_chan->chan;

@@ -830,6 +842,11 @@ static int of_parse_ch_cfg(struct mhi_controller *mhi_cntrl,
		     mhi_chan->xfer_type != MHI_XFER_BUFFER))
			goto error_chan_cfg;

		/* bi-dir and dirctionless channels must be a offload chan */
		if ((mhi_chan->dir == DMA_BIDIRECTIONAL ||
		     mhi_chan->dir == DMA_NONE) && !mhi_chan->offload_ch)
			goto error_chan_cfg;

		/* if mhi host allocate the buffers then client cannot queue */
		if (mhi_chan->pre_alloc)
			mhi_chan->queue_xfer = mhi_queue_nop;
+8 −2
Original line number Diff line number Diff line
@@ -525,12 +525,18 @@ void mhi_create_devices(struct mhi_controller *mhi_cntrl)
		if (!mhi_dev)
			return;

		if (mhi_chan->dir == DMA_TO_DEVICE) {
		switch (mhi_chan->dir) {
		case DMA_TO_DEVICE:
			mhi_dev->ul_chan = mhi_chan;
			mhi_dev->ul_chan_id = mhi_chan->chan;
			mhi_dev->ul_xfer = mhi_chan->queue_xfer;
			mhi_dev->ul_event_id = mhi_chan->er_index;
		} else {
			break;
		case DMA_NONE:
		case DMA_BIDIRECTIONAL:
			mhi_dev->ul_chan_id = mhi_chan->chan;
		case DMA_FROM_DEVICE:
			/* we use dl_chan for offload channels */
			mhi_dev->dl_chan = mhi_chan;
			mhi_dev->dl_chan_id = mhi_chan->chan;
			mhi_dev->dl_xfer = mhi_chan->queue_xfer;