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

Commit cce87121 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mhi: core: fix incorrect mhi device probe failure"

parents d508e358 945dddaf
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -22,8 +22,10 @@ Main node properties:
	2nd element: Transfer ring length in elements
	2nd element: Transfer ring length in elements
	3rd element: Event ring associated with this channel
	3rd element: Event ring associated with this channel
	4th element: Channel direction as defined by enum dma_data_direction
	4th element: Channel direction as defined by enum dma_data_direction
		0 = Bidirectional data transfer
		1 = UL data transfer
		1 = UL data transfer
		2 = DL data transfer
		2 = DL data transfer
		3 = No direction, not a regular data transfer channel
	5th element: Channel doorbell mode configuration as defined by
	5th element: Channel doorbell mode configuration as defined by
	enum MHI_BRSTMODE
	enum MHI_BRSTMODE
		2 = burst mode disabled
		2 = burst mode disabled
+35 −13
Original line number Original line Diff line number Diff line
@@ -616,7 +616,19 @@ int mhi_device_configure(struct mhi_device *mhi_dev,
	struct mhi_chan_ctxt *ch_ctxt;
	struct mhi_chan_ctxt *ch_ctxt;
	int er_index, chan;
	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;
	er_index = mhi_chan->er_index;
	chan = mhi_chan->chan;
	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))
		     mhi_chan->xfer_type != MHI_XFER_BUFFER))
			goto error_chan_cfg;
			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 host allocate the buffers then client cannot queue */
		if (mhi_chan->pre_alloc)
		if (mhi_chan->pre_alloc)
			mhi_chan->queue_xfer = mhi_queue_nop;
			mhi_chan->queue_xfer = mhi_queue_nop;
@@ -1122,26 +1139,27 @@ static int mhi_driver_probe(struct device *dev)
	struct mhi_event *mhi_event;
	struct mhi_event *mhi_event;
	struct mhi_chan *ul_chan = mhi_dev->ul_chan;
	struct mhi_chan *ul_chan = mhi_dev->ul_chan;
	struct mhi_chan *dl_chan = mhi_dev->dl_chan;
	struct mhi_chan *dl_chan = mhi_dev->dl_chan;
	bool offload_ch = ((ul_chan && ul_chan->offload_ch) ||
			   (dl_chan && dl_chan->offload_ch));


	/* all offload channels require status_cb to be defined */

	if (offload_ch) {
	if (ul_chan) {
		if (!mhi_dev->status_cb)
		/* lpm notification require status_cb */
		if (ul_chan->lpm_notify && !mhi_drv->status_cb)
			return -EINVAL;
			return -EINVAL;
		mhi_dev->status_cb = mhi_drv->status_cb;
	}


	if (ul_chan && !offload_ch) {
		if (!ul_chan->offload_ch && !mhi_drv->ul_xfer_cb)
		if (!mhi_drv->ul_xfer_cb)
			return -EINVAL;
			return -EINVAL;

		ul_chan->xfer_cb = mhi_drv->ul_xfer_cb;
		ul_chan->xfer_cb = mhi_drv->ul_xfer_cb;
		mhi_dev->status_cb = mhi_drv->status_cb;
	}
	}


	if (dl_chan && !offload_ch) {
	if (dl_chan) {
		if (!mhi_drv->dl_xfer_cb)
		if (dl_chan->lpm_notify && !mhi_drv->status_cb)
			return -EINVAL;
			return -EINVAL;
		dl_chan->xfer_cb = mhi_drv->dl_xfer_cb;

		if (!dl_chan->offload_ch && !mhi_drv->dl_xfer_cb)
			return -EINVAL;

		mhi_event = &mhi_cntrl->mhi_event[dl_chan->er_index];
		mhi_event = &mhi_cntrl->mhi_event[dl_chan->er_index];


		/*
		/*
@@ -1151,6 +1169,10 @@ static int mhi_driver_probe(struct device *dev)
		 */
		 */
		if (mhi_event->cl_manage && !mhi_drv->status_cb)
		if (mhi_event->cl_manage && !mhi_drv->status_cb)
			return -EINVAL;
			return -EINVAL;

		dl_chan->xfer_cb = mhi_drv->dl_xfer_cb;

		/* ul & dl uses same status cb */
		mhi_dev->status_cb = mhi_drv->status_cb;
		mhi_dev->status_cb = mhi_drv->status_cb;
	}
	}


+8 −2
Original line number Original line Diff line number Diff line
@@ -525,12 +525,18 @@ void mhi_create_devices(struct mhi_controller *mhi_cntrl)
		if (!mhi_dev)
		if (!mhi_dev)
			return;
			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 = mhi_chan;
			mhi_dev->ul_chan_id = mhi_chan->chan;
			mhi_dev->ul_chan_id = mhi_chan->chan;
			mhi_dev->ul_xfer = mhi_chan->queue_xfer;
			mhi_dev->ul_xfer = mhi_chan->queue_xfer;
			mhi_dev->ul_event_id = mhi_chan->er_index;
			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 = mhi_chan;
			mhi_dev->dl_chan_id = mhi_chan->chan;
			mhi_dev->dl_chan_id = mhi_chan->chan;
			mhi_dev->dl_xfer = mhi_chan->queue_xfer;
			mhi_dev->dl_xfer = mhi_chan->queue_xfer;