18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  cx18 init/start/stop/exit stream functions
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Derived from ivtv-streams.h
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci *  Copyright (C) 2007  Hans Verkuil <hverkuil@xs4all.nl>
88c2ecf20Sopenharmony_ci *  Copyright (C) 2008  Andy Walls <awalls@md.metrocast.net>
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ciu32 cx18_find_handle(struct cx18 *cx);
128c2ecf20Sopenharmony_cistruct cx18_stream *cx18_handle_to_stream(struct cx18 *cx, u32 handle);
138c2ecf20Sopenharmony_ciint cx18_streams_setup(struct cx18 *cx);
148c2ecf20Sopenharmony_ciint cx18_streams_register(struct cx18 *cx);
158c2ecf20Sopenharmony_civoid cx18_streams_cleanup(struct cx18 *cx, int unregister);
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define CX18_ENC_STREAM_TYPE_IDX_FW_MDL_MIN (3)
188c2ecf20Sopenharmony_civoid cx18_stream_rotate_idx_mdls(struct cx18 *cx);
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistatic inline bool cx18_stream_enabled(struct cx18_stream *s)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	return s->video_dev.v4l2_dev ||
238c2ecf20Sopenharmony_ci	       (s->dvb && s->dvb->enabled) ||
248c2ecf20Sopenharmony_ci	       (s->type == CX18_ENC_STREAM_TYPE_IDX &&
258c2ecf20Sopenharmony_ci		s->cx->stream_buffers[CX18_ENC_STREAM_TYPE_IDX] != 0);
268c2ecf20Sopenharmony_ci}
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/* Related to submission of mdls to firmware */
298c2ecf20Sopenharmony_cistatic inline void cx18_stream_load_fw_queue(struct cx18_stream *s)
308c2ecf20Sopenharmony_ci{
318c2ecf20Sopenharmony_ci	schedule_work(&s->out_work_order);
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistatic inline void cx18_stream_put_mdl_fw(struct cx18_stream *s,
358c2ecf20Sopenharmony_ci					  struct cx18_mdl *mdl)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	/* Put mdl on q_free; the out work handler will move mdl(s) to q_busy */
388c2ecf20Sopenharmony_ci	cx18_enqueue(s, mdl, &s->q_free);
398c2ecf20Sopenharmony_ci	cx18_stream_load_fw_queue(s);
408c2ecf20Sopenharmony_ci}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_civoid cx18_out_work_handler(struct work_struct *work);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci/* Capture related */
458c2ecf20Sopenharmony_ciint cx18_start_v4l2_encode_stream(struct cx18_stream *s);
468c2ecf20Sopenharmony_ciint cx18_stop_v4l2_encode_stream(struct cx18_stream *s, int gop_end);
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_civoid cx18_stop_all_captures(struct cx18 *cx);
49