Lines Matching refs:mhi_cntrl

25 static int mhi_ep_create_device(struct mhi_ep_cntrl *mhi_cntrl, u32 ch_id);
28 static int mhi_ep_send_event(struct mhi_ep_cntrl *mhi_cntrl, u32 ring_idx, in mhi_ep_send_event() argument
31 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_send_event()
36 mutex_lock(&mhi_cntrl->event_lock); in mhi_ep_send_event()
37 ring = &mhi_cntrl->mhi_event[ring_idx].ring; in mhi_ep_send_event()
38 ctx = (union mhi_ep_ring_ctx *)&mhi_cntrl->ev_ctx_cache[ring_idx]; in mhi_ep_send_event()
40 ret = mhi_ep_ring_start(mhi_cntrl, ring, ctx); in mhi_ep_send_event()
54 mutex_unlock(&mhi_cntrl->event_lock); in mhi_ep_send_event()
61 mhi_cntrl->raise_irq(mhi_cntrl, ring->irq_vector); in mhi_ep_send_event()
66 mutex_unlock(&mhi_cntrl->event_lock); in mhi_ep_send_event()
71 static int mhi_ep_send_completion_event(struct mhi_ep_cntrl *mhi_cntrl, struct mhi_ep_ring *ring, in mhi_ep_send_completion_event() argument
80 return mhi_ep_send_event(mhi_cntrl, ring->er_index, &event, MHI_TRE_DATA_GET_BEI(tre)); in mhi_ep_send_completion_event()
83 int mhi_ep_send_state_change_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_state state) in mhi_ep_send_state_change_event() argument
90 return mhi_ep_send_event(mhi_cntrl, 0, &event, 0); in mhi_ep_send_state_change_event()
93 int mhi_ep_send_ee_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_ee_type exec_env) in mhi_ep_send_ee_event() argument
100 return mhi_ep_send_event(mhi_cntrl, 0, &event, 0); in mhi_ep_send_ee_event()
103 static int mhi_ep_send_cmd_comp_event(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_ev_ccs code) in mhi_ep_send_cmd_comp_event() argument
105 struct mhi_ep_ring *ring = &mhi_cntrl->mhi_cmd->ring; in mhi_ep_send_cmd_comp_event()
112 return mhi_ep_send_event(mhi_cntrl, 0, &event, 0); in mhi_ep_send_cmd_comp_event()
117 struct mhi_ep_cntrl *mhi_cntrl = ring->mhi_cntrl; in mhi_ep_process_cmd_ring() local
118 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_process_cmd_ring()
126 mhi_chan = &mhi_cntrl->mhi_chan[ch_id]; in mhi_ep_process_cmd_ring()
127 ch_ring = &mhi_cntrl->mhi_chan[ch_id].ring; in mhi_ep_process_cmd_ring()
136 ret = mhi_ep_ring_start(mhi_cntrl, ch_ring, in mhi_ep_process_cmd_ring()
137 (union mhi_ep_ring_ctx *)&mhi_cntrl->ch_ctx_cache[ch_id]); in mhi_ep_process_cmd_ring()
140 ret = mhi_ep_send_cmd_comp_event(mhi_cntrl, in mhi_ep_process_cmd_ring()
151 tmp = le32_to_cpu(mhi_cntrl->ch_ctx_cache[ch_id].chcfg); in mhi_ep_process_cmd_ring()
154 mhi_cntrl->ch_ctx_cache[ch_id].chcfg = cpu_to_le32(tmp); in mhi_ep_process_cmd_ring()
156 ret = mhi_ep_send_cmd_comp_event(mhi_cntrl, MHI_EV_CC_SUCCESS); in mhi_ep_process_cmd_ring()
175 ret = mhi_ep_create_device(mhi_cntrl, ch_id); in mhi_ep_process_cmd_ring()
178 mhi_ep_handle_syserr(mhi_cntrl); in mhi_ep_process_cmd_ring()
184 mhi_ep_mmio_enable_chdb(mhi_cntrl, ch_id); in mhi_ep_process_cmd_ring()
196 mhi_ep_mmio_disable_chdb(mhi_cntrl, ch_id); in mhi_ep_process_cmd_ring()
205 tmp = le32_to_cpu(mhi_cntrl->ch_ctx_cache[ch_id].chcfg); in mhi_ep_process_cmd_ring()
208 mhi_cntrl->ch_ctx_cache[ch_id].chcfg = cpu_to_le32(tmp); in mhi_ep_process_cmd_ring()
210 ret = mhi_ep_send_cmd_comp_event(mhi_cntrl, MHI_EV_CC_SUCCESS); in mhi_ep_process_cmd_ring()
228 mhi_ep_ring_reset(mhi_cntrl, ch_ring); in mhi_ep_process_cmd_ring()
237 tmp = le32_to_cpu(mhi_cntrl->ch_ctx_cache[ch_id].chcfg); in mhi_ep_process_cmd_ring()
240 mhi_cntrl->ch_ctx_cache[ch_id].chcfg = cpu_to_le32(tmp); in mhi_ep_process_cmd_ring()
242 ret = mhi_ep_send_cmd_comp_event(mhi_cntrl, MHI_EV_CC_SUCCESS); in mhi_ep_process_cmd_ring()
269 struct mhi_ep_cntrl *mhi_cntrl = mhi_dev->mhi_cntrl; in mhi_ep_queue_is_empty() local
270 struct mhi_ep_ring *ring = &mhi_cntrl->mhi_chan[mhi_chan->chan].ring; in mhi_ep_queue_is_empty()
276 static int mhi_ep_read_channel(struct mhi_ep_cntrl *mhi_cntrl, in mhi_ep_read_channel() argument
281 struct mhi_ep_chan *mhi_chan = &mhi_cntrl->mhi_chan[ring->ch_id]; in mhi_ep_read_channel()
282 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_read_channel()
320 ret = mhi_cntrl->read_from_host(mhi_cntrl, read_addr, write_addr, tr_len); in mhi_ep_read_channel()
348 ret = mhi_ep_send_completion_event(mhi_cntrl, ring, el, in mhi_ep_read_channel()
364 ret = mhi_ep_send_completion_event(mhi_cntrl, ring, el, in mhi_ep_read_channel()
388 struct mhi_ep_cntrl *mhi_cntrl = ring->mhi_cntrl; in mhi_ep_process_ch_ring() local
394 mhi_chan = &mhi_cntrl->mhi_chan[ring->ch_id]; in mhi_ep_process_ch_ring()
416 ret = mhi_ep_read_channel(mhi_cntrl, ring, &result, len); in mhi_ep_process_ch_ring()
440 struct mhi_ep_cntrl *mhi_cntrl = mhi_dev->mhi_cntrl; in mhi_ep_queue_skb() local
454 ring = &mhi_cntrl->mhi_chan[mhi_chan->chan].ring; in mhi_ep_queue_skb()
481 ret = mhi_cntrl->write_to_host(mhi_cntrl, read_addr, write_addr, tr_len); in mhi_ep_queue_skb()
499 ret = mhi_ep_send_completion_event(mhi_cntrl, ring, el, tr_len, code); in mhi_ep_queue_skb()
519 static int mhi_ep_cache_host_cfg(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_cache_host_cfg() argument
522 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_cache_host_cfg()
526 mhi_ep_mmio_update_ner(mhi_cntrl); in mhi_ep_cache_host_cfg()
529 mhi_cntrl->event_rings, mhi_cntrl->hw_event_rings); in mhi_ep_cache_host_cfg()
531 ch_ctx_host_size = sizeof(struct mhi_chan_ctxt) * mhi_cntrl->max_chan; in mhi_ep_cache_host_cfg()
532 ev_ctx_host_size = sizeof(struct mhi_event_ctxt) * mhi_cntrl->event_rings; in mhi_ep_cache_host_cfg()
536 mhi_ep_mmio_get_chc_base(mhi_cntrl); in mhi_ep_cache_host_cfg()
539 ret = mhi_cntrl->alloc_map(mhi_cntrl, mhi_cntrl->ch_ctx_host_pa, in mhi_ep_cache_host_cfg()
540 &mhi_cntrl->ch_ctx_cache_phys, in mhi_ep_cache_host_cfg()
541 (void __iomem **) &mhi_cntrl->ch_ctx_cache, in mhi_ep_cache_host_cfg()
549 mhi_ep_mmio_get_erc_base(mhi_cntrl); in mhi_ep_cache_host_cfg()
552 ret = mhi_cntrl->alloc_map(mhi_cntrl, mhi_cntrl->ev_ctx_host_pa, in mhi_ep_cache_host_cfg()
553 &mhi_cntrl->ev_ctx_cache_phys, in mhi_ep_cache_host_cfg()
554 (void __iomem **) &mhi_cntrl->ev_ctx_cache, in mhi_ep_cache_host_cfg()
562 mhi_ep_mmio_get_crc_base(mhi_cntrl); in mhi_ep_cache_host_cfg()
565 ret = mhi_cntrl->alloc_map(mhi_cntrl, mhi_cntrl->cmd_ctx_host_pa, in mhi_ep_cache_host_cfg()
566 &mhi_cntrl->cmd_ctx_cache_phys, in mhi_ep_cache_host_cfg()
567 (void __iomem **) &mhi_cntrl->cmd_ctx_cache, in mhi_ep_cache_host_cfg()
575 ret = mhi_ep_ring_start(mhi_cntrl, &mhi_cntrl->mhi_cmd->ring, in mhi_ep_cache_host_cfg()
576 (union mhi_ep_ring_ctx *)mhi_cntrl->cmd_ctx_cache); in mhi_ep_cache_host_cfg()
585 mhi_cntrl->unmap_free(mhi_cntrl, mhi_cntrl->cmd_ctx_host_pa, mhi_cntrl->cmd_ctx_cache_phys, in mhi_ep_cache_host_cfg()
586 (void __iomem *) mhi_cntrl->cmd_ctx_cache, cmd_ctx_host_size); in mhi_ep_cache_host_cfg()
589 mhi_cntrl->unmap_free(mhi_cntrl, mhi_cntrl->ev_ctx_host_pa, mhi_cntrl->ev_ctx_cache_phys, in mhi_ep_cache_host_cfg()
590 (void __iomem *) mhi_cntrl->ev_ctx_cache, ev_ctx_host_size); in mhi_ep_cache_host_cfg()
593 mhi_cntrl->unmap_free(mhi_cntrl, mhi_cntrl->ch_ctx_host_pa, mhi_cntrl->ch_ctx_cache_phys, in mhi_ep_cache_host_cfg()
594 (void __iomem *) mhi_cntrl->ch_ctx_cache, ch_ctx_host_size); in mhi_ep_cache_host_cfg()
599 static void mhi_ep_free_host_cfg(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_free_host_cfg() argument
603 ch_ctx_host_size = sizeof(struct mhi_chan_ctxt) * mhi_cntrl->max_chan; in mhi_ep_free_host_cfg()
604 ev_ctx_host_size = sizeof(struct mhi_event_ctxt) * mhi_cntrl->event_rings; in mhi_ep_free_host_cfg()
607 mhi_cntrl->unmap_free(mhi_cntrl, mhi_cntrl->cmd_ctx_host_pa, mhi_cntrl->cmd_ctx_cache_phys, in mhi_ep_free_host_cfg()
608 (void __iomem *) mhi_cntrl->cmd_ctx_cache, cmd_ctx_host_size); in mhi_ep_free_host_cfg()
610 mhi_cntrl->unmap_free(mhi_cntrl, mhi_cntrl->ev_ctx_host_pa, mhi_cntrl->ev_ctx_cache_phys, in mhi_ep_free_host_cfg()
611 (void __iomem *) mhi_cntrl->ev_ctx_cache, ev_ctx_host_size); in mhi_ep_free_host_cfg()
613 mhi_cntrl->unmap_free(mhi_cntrl, mhi_cntrl->ch_ctx_host_pa, mhi_cntrl->ch_ctx_cache_phys, in mhi_ep_free_host_cfg()
614 (void __iomem *) mhi_cntrl->ch_ctx_cache, ch_ctx_host_size); in mhi_ep_free_host_cfg()
617 static void mhi_ep_enable_int(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_enable_int() argument
624 mhi_ep_mmio_enable_ctrl_interrupt(mhi_cntrl); in mhi_ep_enable_int()
625 mhi_ep_mmio_enable_cmdb_interrupt(mhi_cntrl); in mhi_ep_enable_int()
628 static int mhi_ep_enable(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_enable() argument
630 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_enable()
639 mhi_ep_mmio_get_mhi_state(mhi_cntrl, &state, &mhi_reset); in mhi_ep_enable()
642 mhi_ep_mmio_clear_reset(mhi_cntrl); in mhi_ep_enable()
653 ret = mhi_ep_cache_host_cfg(mhi_cntrl); in mhi_ep_enable()
659 mhi_ep_mmio_set_env(mhi_cntrl, MHI_EE_AMSS); in mhi_ep_enable()
662 mhi_ep_enable_int(mhi_cntrl); in mhi_ep_enable()
669 struct mhi_ep_cntrl *mhi_cntrl = container_of(work, struct mhi_ep_cntrl, cmd_ring_work); in mhi_ep_cmd_ring_worker() local
670 struct mhi_ep_ring *ring = &mhi_cntrl->mhi_cmd->ring; in mhi_ep_cmd_ring_worker()
671 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_cmd_ring_worker()
703 struct mhi_ep_cntrl *mhi_cntrl = container_of(work, struct mhi_ep_cntrl, ch_ring_work); in mhi_ep_ch_ring_worker() local
704 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_ch_ring_worker()
713 spin_lock_irqsave(&mhi_cntrl->list_lock, flags); in mhi_ep_ch_ring_worker()
714 list_splice_tail_init(&mhi_cntrl->ch_db_list, &head); in mhi_ep_ch_ring_worker()
715 spin_unlock_irqrestore(&mhi_cntrl->list_lock, flags); in mhi_ep_ch_ring_worker()
737 chan = &mhi_cntrl->mhi_chan[ring->ch_id]; in mhi_ep_ch_ring_worker()
757 struct mhi_ep_cntrl *mhi_cntrl = container_of(work, struct mhi_ep_cntrl, state_work); in mhi_ep_state_worker() local
758 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_state_worker()
764 spin_lock_irqsave(&mhi_cntrl->list_lock, flags); in mhi_ep_state_worker()
765 list_splice_tail_init(&mhi_cntrl->st_transition_list, &head); in mhi_ep_state_worker()
766 spin_unlock_irqrestore(&mhi_cntrl->list_lock, flags); in mhi_ep_state_worker()
775 ret = mhi_ep_set_m0_state(mhi_cntrl); in mhi_ep_state_worker()
780 ret = mhi_ep_set_m3_state(mhi_cntrl); in mhi_ep_state_worker()
792 static void mhi_ep_queue_channel_db(struct mhi_ep_cntrl *mhi_cntrl, unsigned long ch_int, in mhi_ep_queue_channel_db() argument
806 ring = &mhi_cntrl->mhi_chan[ch_id].ring; in mhi_ep_queue_channel_db()
817 spin_lock(&mhi_cntrl->list_lock); in mhi_ep_queue_channel_db()
818 list_splice_tail_init(&head, &mhi_cntrl->ch_db_list); in mhi_ep_queue_channel_db()
819 spin_unlock(&mhi_cntrl->list_lock); in mhi_ep_queue_channel_db()
821 queue_work(mhi_cntrl->wq, &mhi_cntrl->ch_ring_work); in mhi_ep_queue_channel_db()
830 static void mhi_ep_check_channel_interrupt(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_check_channel_interrupt() argument
835 if (!mhi_ep_mmio_read_chdb_status_interrupts(mhi_cntrl)) in mhi_ep_check_channel_interrupt()
842 ch_int = mhi_cntrl->chdb[i].status & mhi_cntrl->chdb[i].mask; in mhi_ep_check_channel_interrupt()
844 mhi_ep_queue_channel_db(mhi_cntrl, ch_int, ch_idx); in mhi_ep_check_channel_interrupt()
845 mhi_ep_mmio_write(mhi_cntrl, MHI_CHDB_INT_CLEAR_n(i), in mhi_ep_check_channel_interrupt()
846 mhi_cntrl->chdb[i].status); in mhi_ep_check_channel_interrupt()
851 static void mhi_ep_process_ctrl_interrupt(struct mhi_ep_cntrl *mhi_cntrl, in mhi_ep_process_ctrl_interrupt() argument
861 spin_lock(&mhi_cntrl->list_lock); in mhi_ep_process_ctrl_interrupt()
862 list_add_tail(&item->node, &mhi_cntrl->st_transition_list); in mhi_ep_process_ctrl_interrupt()
863 spin_unlock(&mhi_cntrl->list_lock); in mhi_ep_process_ctrl_interrupt()
865 queue_work(mhi_cntrl->wq, &mhi_cntrl->state_work); in mhi_ep_process_ctrl_interrupt()
875 struct mhi_ep_cntrl *mhi_cntrl = data; in mhi_ep_irq() local
876 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_irq()
882 int_value = mhi_ep_mmio_read(mhi_cntrl, MHI_CTRL_INT_STATUS); in mhi_ep_irq()
883 mhi_ep_mmio_write(mhi_cntrl, MHI_CTRL_INT_CLEAR, int_value); in mhi_ep_irq()
888 mhi_ep_mmio_get_mhi_state(mhi_cntrl, &state, &mhi_reset); in mhi_ep_irq()
891 disable_irq_nosync(mhi_cntrl->irq); in mhi_ep_irq()
892 schedule_work(&mhi_cntrl->reset_work); in mhi_ep_irq()
896 mhi_ep_process_ctrl_interrupt(mhi_cntrl, state); in mhi_ep_irq()
902 queue_work(mhi_cntrl->wq, &mhi_cntrl->cmd_ring_work); in mhi_ep_irq()
906 mhi_ep_check_channel_interrupt(mhi_cntrl); in mhi_ep_irq()
911 static void mhi_ep_abort_transfer(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_abort_transfer() argument
919 for (i = 0; i < mhi_cntrl->max_chan; i++) { in mhi_ep_abort_transfer()
920 mhi_chan = &mhi_cntrl->mhi_chan[i]; in mhi_ep_abort_transfer()
936 flush_workqueue(mhi_cntrl->wq); in mhi_ep_abort_transfer()
939 device_for_each_child(&mhi_cntrl->mhi_dev->dev, NULL, mhi_ep_destroy_device); in mhi_ep_abort_transfer()
942 for (i = 0; i < mhi_cntrl->max_chan; i++) { in mhi_ep_abort_transfer()
943 mhi_chan = &mhi_cntrl->mhi_chan[i]; in mhi_ep_abort_transfer()
947 ch_ring = &mhi_cntrl->mhi_chan[i].ring; in mhi_ep_abort_transfer()
949 mhi_ep_ring_reset(mhi_cntrl, ch_ring); in mhi_ep_abort_transfer()
954 for (i = 0; i < mhi_cntrl->event_rings; i++) { in mhi_ep_abort_transfer()
955 ev_ring = &mhi_cntrl->mhi_event[i].ring; in mhi_ep_abort_transfer()
959 mutex_lock(&mhi_cntrl->event_lock); in mhi_ep_abort_transfer()
960 mhi_ep_ring_reset(mhi_cntrl, ev_ring); in mhi_ep_abort_transfer()
961 mutex_unlock(&mhi_cntrl->event_lock); in mhi_ep_abort_transfer()
965 mhi_ep_ring_reset(mhi_cntrl, &mhi_cntrl->mhi_cmd->ring); in mhi_ep_abort_transfer()
967 mhi_ep_free_host_cfg(mhi_cntrl); in mhi_ep_abort_transfer()
968 mhi_ep_mmio_mask_interrupts(mhi_cntrl); in mhi_ep_abort_transfer()
970 mhi_cntrl->enabled = false; in mhi_ep_abort_transfer()
975 struct mhi_ep_cntrl *mhi_cntrl = container_of(work, struct mhi_ep_cntrl, reset_work); in mhi_ep_reset_worker() local
976 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_reset_worker()
980 mhi_ep_abort_transfer(mhi_cntrl); in mhi_ep_reset_worker()
982 spin_lock_bh(&mhi_cntrl->state_lock); in mhi_ep_reset_worker()
984 mhi_ep_mmio_reset(mhi_cntrl); in mhi_ep_reset_worker()
985 cur_state = mhi_cntrl->mhi_state; in mhi_ep_reset_worker()
986 spin_unlock_bh(&mhi_cntrl->state_lock); in mhi_ep_reset_worker()
994 mhi_ep_mmio_init(mhi_cntrl); in mhi_ep_reset_worker()
997 mhi_ep_mmio_set_env(mhi_cntrl, MHI_EE_AMSS); in mhi_ep_reset_worker()
1000 ret = mhi_ep_set_ready_state(mhi_cntrl); in mhi_ep_reset_worker()
1006 ret = mhi_ep_enable(mhi_cntrl); in mhi_ep_reset_worker()
1012 enable_irq(mhi_cntrl->irq); in mhi_ep_reset_worker()
1021 void mhi_ep_handle_syserr(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_handle_syserr() argument
1023 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_handle_syserr()
1026 ret = mhi_ep_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR); in mhi_ep_handle_syserr()
1031 ret = mhi_ep_send_state_change_event(mhi_cntrl, MHI_STATE_SYS_ERR); in mhi_ep_handle_syserr()
1036 int mhi_ep_power_up(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_power_up() argument
1038 struct device *dev = &mhi_cntrl->mhi_dev->dev; in mhi_ep_power_up()
1045 mhi_ep_mmio_mask_interrupts(mhi_cntrl); in mhi_ep_power_up()
1046 mhi_ep_mmio_init(mhi_cntrl); in mhi_ep_power_up()
1048 mhi_cntrl->mhi_event = kzalloc(mhi_cntrl->event_rings * (sizeof(*mhi_cntrl->mhi_event)), in mhi_ep_power_up()
1050 if (!mhi_cntrl->mhi_event) in mhi_ep_power_up()
1054 mhi_ep_ring_init(&mhi_cntrl->mhi_cmd->ring, RING_TYPE_CMD, 0); in mhi_ep_power_up()
1055 for (i = 0; i < mhi_cntrl->max_chan; i++) in mhi_ep_power_up()
1056 mhi_ep_ring_init(&mhi_cntrl->mhi_chan[i].ring, RING_TYPE_CH, i); in mhi_ep_power_up()
1057 for (i = 0; i < mhi_cntrl->event_rings; i++) in mhi_ep_power_up()
1058 mhi_ep_ring_init(&mhi_cntrl->mhi_event[i].ring, RING_TYPE_ER, i); in mhi_ep_power_up()
1060 mhi_cntrl->mhi_state = MHI_STATE_RESET; in mhi_ep_power_up()
1063 mhi_ep_mmio_set_env(mhi_cntrl, MHI_EE_AMSS); in mhi_ep_power_up()
1066 ret = mhi_ep_set_ready_state(mhi_cntrl); in mhi_ep_power_up()
1072 ret = mhi_ep_enable(mhi_cntrl); in mhi_ep_power_up()
1078 enable_irq(mhi_cntrl->irq); in mhi_ep_power_up()
1079 mhi_cntrl->enabled = true; in mhi_ep_power_up()
1084 kfree(mhi_cntrl->mhi_event); in mhi_ep_power_up()
1090 void mhi_ep_power_down(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_power_down() argument
1092 if (mhi_cntrl->enabled) in mhi_ep_power_down()
1093 mhi_ep_abort_transfer(mhi_cntrl); in mhi_ep_power_down()
1095 kfree(mhi_cntrl->mhi_event); in mhi_ep_power_down()
1096 disable_irq(mhi_cntrl->irq); in mhi_ep_power_down()
1100 void mhi_ep_suspend_channels(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_suspend_channels() argument
1106 for (i = 0; i < mhi_cntrl->max_chan; i++) { in mhi_ep_suspend_channels()
1107 mhi_chan = &mhi_cntrl->mhi_chan[i]; in mhi_ep_suspend_channels()
1114 tmp = le32_to_cpu(mhi_cntrl->ch_ctx_cache[i].chcfg); in mhi_ep_suspend_channels()
1124 mhi_cntrl->ch_ctx_cache[i].chcfg = cpu_to_le32(tmp); in mhi_ep_suspend_channels()
1129 void mhi_ep_resume_channels(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_resume_channels() argument
1135 for (i = 0; i < mhi_cntrl->max_chan; i++) { in mhi_ep_resume_channels()
1136 mhi_chan = &mhi_cntrl->mhi_chan[i]; in mhi_ep_resume_channels()
1143 tmp = le32_to_cpu(mhi_cntrl->ch_ctx_cache[i].chcfg); in mhi_ep_resume_channels()
1153 mhi_cntrl->ch_ctx_cache[i].chcfg = cpu_to_le32(tmp); in mhi_ep_resume_channels()
1163 mhi_dev->mhi_cntrl->mhi_dev = NULL; in mhi_ep_release_device()
1179 static struct mhi_ep_device *mhi_ep_alloc_device(struct mhi_ep_cntrl *mhi_cntrl, in mhi_ep_alloc_device() argument
1197 dev->parent = mhi_cntrl->cntrl_dev; in mhi_ep_alloc_device()
1200 dev->parent = &mhi_cntrl->mhi_dev->dev; in mhi_ep_alloc_device()
1202 mhi_dev->mhi_cntrl = mhi_cntrl; in mhi_ep_alloc_device()
1214 static int mhi_ep_create_device(struct mhi_ep_cntrl *mhi_cntrl, u32 ch_id) in mhi_ep_create_device() argument
1216 struct mhi_ep_chan *mhi_chan = &mhi_cntrl->mhi_chan[ch_id]; in mhi_ep_create_device()
1217 struct device *dev = mhi_cntrl->cntrl_dev; in mhi_ep_create_device()
1228 mhi_dev = mhi_ep_alloc_device(mhi_cntrl, MHI_DEVICE_XFER); in mhi_ep_create_device()
1246 dev_name(&mhi_cntrl->mhi_dev->dev), in mhi_ep_create_device()
1263 struct mhi_ep_cntrl *mhi_cntrl; in mhi_ep_destroy_device() local
1270 mhi_cntrl = mhi_dev->mhi_cntrl; in mhi_ep_destroy_device()
1285 dev_dbg(&mhi_cntrl->mhi_dev->dev, "Destroying device for chan:%s\n", in mhi_ep_destroy_device()
1295 static int mhi_ep_chan_init(struct mhi_ep_cntrl *mhi_cntrl, in mhi_ep_chan_init() argument
1299 struct device *dev = mhi_cntrl->cntrl_dev; in mhi_ep_chan_init()
1303 mhi_cntrl->max_chan = config->max_channels; in mhi_ep_chan_init()
1309 mhi_cntrl->mhi_chan = kcalloc(mhi_cntrl->max_chan, sizeof(*mhi_cntrl->mhi_chan), in mhi_ep_chan_init()
1311 if (!mhi_cntrl->mhi_chan) in mhi_ep_chan_init()
1320 if (chan >= mhi_cntrl->max_chan) { in mhi_ep_chan_init()
1322 chan, mhi_cntrl->max_chan); in mhi_ep_chan_init()
1333 mhi_chan = &mhi_cntrl->mhi_chan[chan]; in mhi_ep_chan_init()
1343 kfree(mhi_cntrl->mhi_chan); in mhi_ep_chan_init()
1352 int mhi_ep_register_controller(struct mhi_ep_cntrl *mhi_cntrl, in mhi_ep_register_controller() argument
1358 if (!mhi_cntrl || !mhi_cntrl->cntrl_dev || !mhi_cntrl->mmio || !mhi_cntrl->irq) in mhi_ep_register_controller()
1361 ret = mhi_ep_chan_init(mhi_cntrl, config); in mhi_ep_register_controller()
1365 mhi_cntrl->mhi_cmd = kcalloc(NR_OF_CMD_RINGS, sizeof(*mhi_cntrl->mhi_cmd), GFP_KERNEL); in mhi_ep_register_controller()
1366 if (!mhi_cntrl->mhi_cmd) { in mhi_ep_register_controller()
1371 INIT_WORK(&mhi_cntrl->state_work, mhi_ep_state_worker); in mhi_ep_register_controller()
1372 INIT_WORK(&mhi_cntrl->reset_work, mhi_ep_reset_worker); in mhi_ep_register_controller()
1373 INIT_WORK(&mhi_cntrl->cmd_ring_work, mhi_ep_cmd_ring_worker); in mhi_ep_register_controller()
1374 INIT_WORK(&mhi_cntrl->ch_ring_work, mhi_ep_ch_ring_worker); in mhi_ep_register_controller()
1376 mhi_cntrl->wq = alloc_workqueue("mhi_ep_wq", 0, 0); in mhi_ep_register_controller()
1377 if (!mhi_cntrl->wq) { in mhi_ep_register_controller()
1382 INIT_LIST_HEAD(&mhi_cntrl->st_transition_list); in mhi_ep_register_controller()
1383 INIT_LIST_HEAD(&mhi_cntrl->ch_db_list); in mhi_ep_register_controller()
1384 spin_lock_init(&mhi_cntrl->state_lock); in mhi_ep_register_controller()
1385 spin_lock_init(&mhi_cntrl->list_lock); in mhi_ep_register_controller()
1386 mutex_init(&mhi_cntrl->event_lock); in mhi_ep_register_controller()
1389 mhi_ep_mmio_write(mhi_cntrl, EP_MHIVER, config->mhi_version); in mhi_ep_register_controller()
1390 mhi_ep_mmio_set_env(mhi_cntrl, MHI_EE_AMSS); in mhi_ep_register_controller()
1397 mhi_cntrl->index = ret; in mhi_ep_register_controller()
1399 irq_set_status_flags(mhi_cntrl->irq, IRQ_NOAUTOEN); in mhi_ep_register_controller()
1400 ret = request_irq(mhi_cntrl->irq, mhi_ep_irq, IRQF_TRIGGER_HIGH, in mhi_ep_register_controller()
1401 "doorbell_irq", mhi_cntrl); in mhi_ep_register_controller()
1403 dev_err(mhi_cntrl->cntrl_dev, "Failed to request Doorbell IRQ\n"); in mhi_ep_register_controller()
1408 mhi_dev = mhi_ep_alloc_device(mhi_cntrl, MHI_DEVICE_CONTROLLER); in mhi_ep_register_controller()
1410 dev_err(mhi_cntrl->cntrl_dev, "Failed to allocate controller device\n"); in mhi_ep_register_controller()
1415 ret = dev_set_name(&mhi_dev->dev, "mhi_ep%u", mhi_cntrl->index); in mhi_ep_register_controller()
1420 mhi_cntrl->mhi_dev = mhi_dev; in mhi_ep_register_controller()
1433 free_irq(mhi_cntrl->irq, mhi_cntrl); in mhi_ep_register_controller()
1435 ida_free(&mhi_ep_cntrl_ida, mhi_cntrl->index); in mhi_ep_register_controller()
1437 destroy_workqueue(mhi_cntrl->wq); in mhi_ep_register_controller()
1439 kfree(mhi_cntrl->mhi_cmd); in mhi_ep_register_controller()
1441 kfree(mhi_cntrl->mhi_chan); in mhi_ep_register_controller()
1451 void mhi_ep_unregister_controller(struct mhi_ep_cntrl *mhi_cntrl) in mhi_ep_unregister_controller() argument
1453 struct mhi_ep_device *mhi_dev = mhi_cntrl->mhi_dev; in mhi_ep_unregister_controller()
1455 destroy_workqueue(mhi_cntrl->wq); in mhi_ep_unregister_controller()
1457 free_irq(mhi_cntrl->irq, mhi_cntrl); in mhi_ep_unregister_controller()
1459 kfree(mhi_cntrl->mhi_cmd); in mhi_ep_unregister_controller()
1460 kfree(mhi_cntrl->mhi_chan); in mhi_ep_unregister_controller()
1465 ida_free(&mhi_ep_cntrl_ida, mhi_cntrl->index); in mhi_ep_unregister_controller()