162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#ifndef __PVRUSB2_CONTEXT_H
762306a36Sopenharmony_ci#define __PVRUSB2_CONTEXT_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/mutex.h>
1062306a36Sopenharmony_ci#include <linux/usb.h>
1162306a36Sopenharmony_ci#include <linux/workqueue.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistruct pvr2_hdw;     /* hardware interface - defined elsewhere */
1462306a36Sopenharmony_cistruct pvr2_stream;  /* stream interface - defined elsewhere */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct pvr2_context;        /* All central state */
1762306a36Sopenharmony_cistruct pvr2_channel;        /* One I/O pathway to a user */
1862306a36Sopenharmony_cistruct pvr2_context_stream; /* Wrapper for a stream */
1962306a36Sopenharmony_cistruct pvr2_ioread;         /* Low level stream structure */
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistruct pvr2_context_stream {
2262306a36Sopenharmony_ci	struct pvr2_channel *user;
2362306a36Sopenharmony_ci	struct pvr2_stream *stream;
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct pvr2_context {
2762306a36Sopenharmony_ci	struct pvr2_channel *mc_first;
2862306a36Sopenharmony_ci	struct pvr2_channel *mc_last;
2962306a36Sopenharmony_ci	struct pvr2_context *exist_next;
3062306a36Sopenharmony_ci	struct pvr2_context *exist_prev;
3162306a36Sopenharmony_ci	struct pvr2_context *notify_next;
3262306a36Sopenharmony_ci	struct pvr2_context *notify_prev;
3362306a36Sopenharmony_ci	struct pvr2_hdw *hdw;
3462306a36Sopenharmony_ci	struct pvr2_context_stream video_stream;
3562306a36Sopenharmony_ci	struct mutex mutex;
3662306a36Sopenharmony_ci	int notify_flag;
3762306a36Sopenharmony_ci	int initialized_flag;
3862306a36Sopenharmony_ci	int disconnect_flag;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	/* Called after pvr2_context initialization is complete */
4162306a36Sopenharmony_ci	void (*setup_func)(struct pvr2_context *);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct pvr2_channel {
4662306a36Sopenharmony_ci	struct pvr2_context *mc_head;
4762306a36Sopenharmony_ci	struct pvr2_channel *mc_next;
4862306a36Sopenharmony_ci	struct pvr2_channel *mc_prev;
4962306a36Sopenharmony_ci	struct pvr2_context_stream *stream;
5062306a36Sopenharmony_ci	struct pvr2_hdw *hdw;
5162306a36Sopenharmony_ci	unsigned int input_mask;
5262306a36Sopenharmony_ci	void (*check_func)(struct pvr2_channel *);
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct pvr2_context *pvr2_context_create(struct usb_interface *intf,
5662306a36Sopenharmony_ci					 const struct usb_device_id *devid,
5762306a36Sopenharmony_ci					 void (*setup_func)(struct pvr2_context *));
5862306a36Sopenharmony_civoid pvr2_context_disconnect(struct pvr2_context *);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_civoid pvr2_channel_init(struct pvr2_channel *,struct pvr2_context *);
6162306a36Sopenharmony_civoid pvr2_channel_done(struct pvr2_channel *);
6262306a36Sopenharmony_ciint pvr2_channel_limit_inputs(struct pvr2_channel *,unsigned int);
6362306a36Sopenharmony_ciunsigned int pvr2_channel_get_limited_inputs(struct pvr2_channel *);
6462306a36Sopenharmony_ciint pvr2_channel_claim_stream(struct pvr2_channel *,
6562306a36Sopenharmony_ci			      struct pvr2_context_stream *);
6662306a36Sopenharmony_cistruct pvr2_ioread *pvr2_channel_create_mpeg_stream(
6762306a36Sopenharmony_ci	struct pvr2_context_stream *);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciint pvr2_context_global_init(void);
7062306a36Sopenharmony_civoid pvr2_context_global_done(void);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#endif /* __PVRUSB2_CONTEXT_H */
73