Loading Documentation/devicetree/bindings/bus/mhi.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading drivers/bus/mhi/core/mhi_init.c +35 −13 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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]; /* /* Loading @@ -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; } } Loading drivers/bus/mhi/core/mhi_main.c +8 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading
Documentation/devicetree/bindings/bus/mhi.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
drivers/bus/mhi/core/mhi_init.c +35 −13 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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]; /* /* Loading @@ -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; } } Loading
drivers/bus/mhi/core/mhi_main.c +8 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading