Lines Matching refs:ch

399 u16 dim_dbr_space(struct dim_channel *ch)
404 if (ch->addr != dbr->ch_addr)
407 cur_rpc = dim2_rpc(ch->addr);
598 static void isoc_init(struct dim_channel *ch, u8 ch_addr, u16 packet_length)
600 state_init(&ch->state);
602 ch->addr = ch_addr;
604 ch->packet_length = packet_length;
605 ch->bytes_per_frame = 0;
606 ch->done_sw_buffers_number = 0;
609 static void sync_init(struct dim_channel *ch, u8 ch_addr, u16 bytes_per_frame)
611 state_init(&ch->state);
613 ch->addr = ch_addr;
615 ch->packet_length = 0;
616 ch->bytes_per_frame = bytes_per_frame;
617 ch->done_sw_buffers_number = 0;
620 static void channel_init(struct dim_channel *ch, u8 ch_addr)
622 state_init(&ch->state);
624 ch->addr = ch_addr;
626 ch->packet_length = 0;
627 ch->bytes_per_frame = 0;
628 ch->done_sw_buffers_number = 0;
632 static bool channel_service_interrupt(struct dim_channel *ch)
634 struct int_ch_state *const state = &ch->state;
636 if (!service_channel(ch->addr, state->idx2))
644 static bool channel_start(struct dim_channel *ch, u32 buf_addr, u16 buf_size)
646 struct int_ch_state *const state = &ch->state;
651 if (ch->packet_length == 0 && ch->bytes_per_frame == 0 &&
656 if (ch->packet_length &&
657 buf_size != norm_isoc_buffer_size(buf_size, ch->packet_length))
661 if (ch->bytes_per_frame &&
662 buf_size != norm_sync_buffer_size(buf_size, ch->bytes_per_frame))
671 if (ch->addr == g.atx_dbr.ch_addr)
674 if (ch->packet_length || ch->bytes_per_frame)
675 dim2_start_isoc_sync(ch->addr, state->idx1, buf_addr, buf_size);
677 dim2_start_ctrl_async(ch->addr, state->idx1, buf_addr,
684 static u8 channel_service(struct dim_channel *ch)
686 struct int_ch_state *const state = &ch->state;
694 ch->done_sw_buffers_number++;
700 static bool channel_detach_buffers(struct dim_channel *ch, u16 buffers_number)
702 if (buffers_number > ch->done_sw_buffers_number)
705 ch->done_sw_buffers_number -= buffers_number;
751 static u8 init_ctrl_async(struct dim_channel *ch, u8 type, u8 is_tx,
754 if (!g.dim_is_initialized || !ch)
760 if (!ch->dbr_size)
761 ch->dbr_size = ROUND_UP_TO(hw_buffer_size, DBR_BLOCK_SIZE);
762 ch->dbr_addr = alloc_dbr(ch->dbr_size);
763 if (ch->dbr_addr >= DBR_SIZE)
766 channel_init(ch, ch_address / 2);
768 dim2_configure_channel(ch->addr, type, is_tx,
769 ch->dbr_addr, ch->dbr_size, 0);
808 u8 dim_init_control(struct dim_channel *ch, u8 is_tx, u16 ch_address,
811 return init_ctrl_async(ch, CAT_CT_VAL_CONTROL, is_tx, ch_address,
815 u8 dim_init_async(struct dim_channel *ch, u8 is_tx, u16 ch_address,
818 u8 ret = init_ctrl_async(ch, CAT_CT_VAL_ASYNC, is_tx, ch_address,
822 g.atx_dbr.ch_addr = ch->addr;
823 dbrcnt_init(ch->addr, ch->dbr_size);
830 u8 dim_init_isoc(struct dim_channel *ch, u8 is_tx, u16 ch_address,
833 if (!g.dim_is_initialized || !ch)
842 if (!ch->dbr_size)
843 ch->dbr_size = packet_length * ISOC_DBR_FACTOR;
844 ch->dbr_addr = alloc_dbr(ch->dbr_size);
845 if (ch->dbr_addr >= DBR_SIZE)
848 isoc_init(ch, ch_address / 2, packet_length);
850 dim2_configure_channel(ch->addr, CAT_CT_VAL_ISOC, is_tx, ch->dbr_addr,
851 ch->dbr_size, packet_length);
856 u8 dim_init_sync(struct dim_channel *ch, u8 is_tx, u16 ch_address,
861 if (!g.dim_is_initialized || !ch)
870 if (!ch->dbr_size)
871 ch->dbr_size = bytes_per_frame << bd_factor;
872 ch->dbr_addr = alloc_dbr(ch->dbr_size);
873 if (ch->dbr_addr >= DBR_SIZE)
876 sync_init(ch, ch_address / 2, bytes_per_frame);
878 dim2_clear_dbr(ch->dbr_addr, ch->dbr_size);
879 dim2_configure_channel(ch->addr, CAT_CT_VAL_SYNC, is_tx,
880 ch->dbr_addr, ch->dbr_size, 0);
885 u8 dim_destroy_channel(struct dim_channel *ch)
887 if (!g.dim_is_initialized || !ch)
890 if (ch->addr == g.atx_dbr.ch_addr) {
895 dim2_clear_channel(ch->addr);
896 if (ch->dbr_addr < DBR_SIZE)
897 free_dbr(ch->dbr_addr, ch->dbr_size);
898 ch->dbr_addr = DBR_SIZE;
926 struct dim_channel *const *ch = channels;
930 while (*ch) {
931 state_changed |= channel_service_interrupt(*ch);
932 ++ch;
937 u8 dim_service_channel(struct dim_channel *ch)
939 if (!g.dim_is_initialized || !ch)
942 return channel_service(ch);
945 struct dim_ch_state *dim_get_channel_state(struct dim_channel *ch,
948 if (!ch || !state_ptr)
951 state_ptr->ready = ch->state.level < 2;
952 state_ptr->done_buffers = ch->done_sw_buffers_number;
957 bool dim_enqueue_buffer(struct dim_channel *ch, u32 buffer_addr,
960 if (!ch)
964 return channel_start(ch, buffer_addr, buffer_size);
967 bool dim_detach_buffers(struct dim_channel *ch, u16 buffers_number)
969 if (!ch)
973 return channel_detach_buffers(ch, buffers_number);