162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* dvb-usb.h is part of the DVB USB library.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@posteo.de)
562306a36Sopenharmony_ci * see dvb-usb-init.c for copyright information.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * the headerfile, all dvb-usb-drivers have to include.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * TODO: clean-up the structures for unused fields and update the comments
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci#ifndef __DVB_USB_H__
1262306a36Sopenharmony_ci#define __DVB_USB_H__
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/input.h>
1562306a36Sopenharmony_ci#include <linux/usb.h>
1662306a36Sopenharmony_ci#include <linux/firmware.h>
1762306a36Sopenharmony_ci#include <linux/mutex.h>
1862306a36Sopenharmony_ci#include <media/rc-core.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <media/dvb_frontend.h>
2162306a36Sopenharmony_ci#include <media/dvb_demux.h>
2262306a36Sopenharmony_ci#include <media/dvb_net.h>
2362306a36Sopenharmony_ci#include <media/dmxdev.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#include "dvb-pll.h"
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#include <media/dvb-usb-ids.h>
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* debug */
3062306a36Sopenharmony_ci#ifdef CONFIG_DVB_USB_DEBUG
3162306a36Sopenharmony_ci#define dprintk(var, level, args...) \
3262306a36Sopenharmony_ci	    do { if (((var) & (level))) { printk(args); } } while (0)
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define debug_dump(b, l, func) {\
3562306a36Sopenharmony_ci	int loop_; \
3662306a36Sopenharmony_ci	for (loop_ = 0; loop_ < (l); loop_++) \
3762306a36Sopenharmony_ci		func("%02x ", b[loop_]); \
3862306a36Sopenharmony_ci	func("\n");\
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci#define DVB_USB_DEBUG_STATUS
4162306a36Sopenharmony_ci#else
4262306a36Sopenharmony_ci#define dprintk(var, level, args...) no_printk(args)
4362306a36Sopenharmony_ci#define debug_dump(b, l, func) do { } while (0)
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define DVB_USB_DEBUG_STATUS " (debugging is not enabled)"
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#endif
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* generic log methods - taken from usb.h */
5062306a36Sopenharmony_ci#ifndef DVB_USB_LOG_PREFIX
5162306a36Sopenharmony_ci #define DVB_USB_LOG_PREFIX "dvb-usb (please define a log prefix)"
5262306a36Sopenharmony_ci#endif
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#undef err
5562306a36Sopenharmony_ci#define err(format, arg...)  printk(KERN_ERR     DVB_USB_LOG_PREFIX ": " format "\n" , ## arg)
5662306a36Sopenharmony_ci#undef info
5762306a36Sopenharmony_ci#define info(format, arg...) printk(KERN_INFO    DVB_USB_LOG_PREFIX ": " format "\n" , ## arg)
5862306a36Sopenharmony_ci#undef warn
5962306a36Sopenharmony_ci#define warn(format, arg...) printk(KERN_WARNING DVB_USB_LOG_PREFIX ": " format "\n" , ## arg)
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/**
6262306a36Sopenharmony_ci * struct dvb_usb_device_description - name and its according USB IDs
6362306a36Sopenharmony_ci * @name: real name of the box, regardless which DVB USB device class is in use
6462306a36Sopenharmony_ci * @cold_ids: array of struct usb_device_id which describe the device in
6562306a36Sopenharmony_ci *  pre-firmware state
6662306a36Sopenharmony_ci * @warm_ids: array of struct usb_device_id which describe the device in
6762306a36Sopenharmony_ci *  post-firmware state
6862306a36Sopenharmony_ci *
6962306a36Sopenharmony_ci * Each DVB USB device class can have one or more actual devices, this struct
7062306a36Sopenharmony_ci * assigns a name to it.
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_cistruct dvb_usb_device_description {
7362306a36Sopenharmony_ci	const char *name;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define DVB_USB_ID_MAX_NUM 15
7662306a36Sopenharmony_ci	struct usb_device_id *cold_ids[DVB_USB_ID_MAX_NUM];
7762306a36Sopenharmony_ci	struct usb_device_id *warm_ids[DVB_USB_ID_MAX_NUM];
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic inline u8 rc5_custom(struct rc_map_table *key)
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci	return (key->scancode >> 8) & 0xff;
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic inline u8 rc5_data(struct rc_map_table *key)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	return key->scancode & 0xff;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline u16 rc5_scan(struct rc_map_table *key)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	return key->scancode & 0xffff;
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistruct dvb_usb_device;
9662306a36Sopenharmony_cistruct dvb_usb_adapter;
9762306a36Sopenharmony_cistruct usb_data_stream;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/*
10062306a36Sopenharmony_ci * Properties of USB streaming - TODO this structure should be somewhere else
10162306a36Sopenharmony_ci * describes the kind of USB transfer used for data-streaming.
10262306a36Sopenharmony_ci *  (BULK or ISOC)
10362306a36Sopenharmony_ci */
10462306a36Sopenharmony_cistruct usb_data_stream_properties {
10562306a36Sopenharmony_ci#define USB_BULK  1
10662306a36Sopenharmony_ci#define USB_ISOC  2
10762306a36Sopenharmony_ci	int type;
10862306a36Sopenharmony_ci	int count;
10962306a36Sopenharmony_ci	int endpoint;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	union {
11262306a36Sopenharmony_ci		struct {
11362306a36Sopenharmony_ci			int buffersize; /* per URB */
11462306a36Sopenharmony_ci		} bulk;
11562306a36Sopenharmony_ci		struct {
11662306a36Sopenharmony_ci			int framesperurb;
11762306a36Sopenharmony_ci			int framesize;
11862306a36Sopenharmony_ci			int interval;
11962306a36Sopenharmony_ci		} isoc;
12062306a36Sopenharmony_ci	} u;
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/**
12462306a36Sopenharmony_ci * struct dvb_usb_adapter_fe_properties - properties of a dvb-usb-adapter.
12562306a36Sopenharmony_ci *    A DVB-USB-Adapter is basically a dvb_adapter which is present on a USB-device.
12662306a36Sopenharmony_ci * @caps: capabilities of the DVB USB device.
12762306a36Sopenharmony_ci * @pid_filter_count: number of PID filter position in the optional hardware
12862306a36Sopenharmony_ci *  PID-filter.
12962306a36Sopenharmony_ci * @num_frontends: number of frontends of the DVB USB adapter.
13062306a36Sopenharmony_ci * @frontend_ctrl: called to power on/off active frontend.
13162306a36Sopenharmony_ci * @streaming_ctrl: called to start and stop the MPEG2-TS streaming of the
13262306a36Sopenharmony_ci *  device (not URB submitting/killing).
13362306a36Sopenharmony_ci *  This callback will be called without data URBs being active - data URBs
13462306a36Sopenharmony_ci *  will be submitted only after streaming_ctrl(1) returns successfully and
13562306a36Sopenharmony_ci *  they will be killed before streaming_ctrl(0) gets called.
13662306a36Sopenharmony_ci * @pid_filter_ctrl: called to en/disable the PID filter, if any.
13762306a36Sopenharmony_ci * @pid_filter: called to set/unset a PID for filtering.
13862306a36Sopenharmony_ci * @frontend_attach: called to attach the possible frontends (fill fe-field
13962306a36Sopenharmony_ci *  of struct dvb_usb_device).
14062306a36Sopenharmony_ci * @tuner_attach: called to attach the correct tuner and to fill pll_addr,
14162306a36Sopenharmony_ci *  pll_desc and pll_init_buf of struct dvb_usb_device).
14262306a36Sopenharmony_ci * @stream: configuration of the USB streaming
14362306a36Sopenharmony_ci * @size_of_priv: size of the priv memory in struct dvb_usb_adapter
14462306a36Sopenharmony_ci */
14562306a36Sopenharmony_cistruct dvb_usb_adapter_fe_properties {
14662306a36Sopenharmony_ci#define DVB_USB_ADAP_HAS_PID_FILTER               0x01
14762306a36Sopenharmony_ci#define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02
14862306a36Sopenharmony_ci#define DVB_USB_ADAP_NEED_PID_FILTERING           0x04
14962306a36Sopenharmony_ci#define DVB_USB_ADAP_RECEIVES_204_BYTE_TS         0x08
15062306a36Sopenharmony_ci#define DVB_USB_ADAP_RECEIVES_RAW_PAYLOAD         0x10
15162306a36Sopenharmony_ci	int caps;
15262306a36Sopenharmony_ci	int pid_filter_count;
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	int (*streaming_ctrl)  (struct dvb_usb_adapter *, int);
15562306a36Sopenharmony_ci	int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int);
15662306a36Sopenharmony_ci	int (*pid_filter)      (struct dvb_usb_adapter *, int, u16, int);
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	int (*frontend_attach) (struct dvb_usb_adapter *);
15962306a36Sopenharmony_ci	int (*tuner_attach)    (struct dvb_usb_adapter *);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	struct usb_data_stream_properties stream;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	int size_of_priv;
16462306a36Sopenharmony_ci};
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci#define MAX_NO_OF_FE_PER_ADAP 3
16762306a36Sopenharmony_cistruct dvb_usb_adapter_properties {
16862306a36Sopenharmony_ci	int size_of_priv;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	int (*frontend_ctrl)   (struct dvb_frontend *, int);
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	int num_frontends;
17362306a36Sopenharmony_ci	struct dvb_usb_adapter_fe_properties fe[MAX_NO_OF_FE_PER_ADAP];
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci/**
17762306a36Sopenharmony_ci * struct dvb_rc_legacy - old properties of remote controller
17862306a36Sopenharmony_ci * @rc_map_table: a hard-wired array of struct rc_map_table (NULL to disable
17962306a36Sopenharmony_ci *  remote control handling).
18062306a36Sopenharmony_ci * @rc_map_size: number of items in @rc_map_table.
18162306a36Sopenharmony_ci * @rc_query: called to query an event event.
18262306a36Sopenharmony_ci * @rc_interval: time in ms between two queries.
18362306a36Sopenharmony_ci */
18462306a36Sopenharmony_cistruct dvb_rc_legacy {
18562306a36Sopenharmony_ci/* remote control properties */
18662306a36Sopenharmony_ci#define REMOTE_NO_KEY_PRESSED      0x00
18762306a36Sopenharmony_ci#define REMOTE_KEY_PRESSED         0x01
18862306a36Sopenharmony_ci#define REMOTE_KEY_REPEAT          0x02
18962306a36Sopenharmony_ci	struct rc_map_table  *rc_map_table;
19062306a36Sopenharmony_ci	int rc_map_size;
19162306a36Sopenharmony_ci	int (*rc_query) (struct dvb_usb_device *, u32 *, int *);
19262306a36Sopenharmony_ci	int rc_interval;
19362306a36Sopenharmony_ci};
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci/**
19662306a36Sopenharmony_ci * struct dvb_rc - properties of remote controller, using rc-core
19762306a36Sopenharmony_ci * @rc_codes: name of rc codes table
19862306a36Sopenharmony_ci * @protocol: type of protocol(s) currently used by the driver
19962306a36Sopenharmony_ci * @allowed_protos: protocol(s) supported by the driver
20062306a36Sopenharmony_ci * @driver_type: Used to point if a device supports raw mode
20162306a36Sopenharmony_ci * @change_protocol: callback to change protocol
20262306a36Sopenharmony_ci * @module_name: module name
20362306a36Sopenharmony_ci * @rc_query: called to query an event event.
20462306a36Sopenharmony_ci * @rc_interval: time in ms between two queries.
20562306a36Sopenharmony_ci * @bulk_mode: device supports bulk mode for RC (disable polling mode)
20662306a36Sopenharmony_ci * @scancode_mask: scancode mask
20762306a36Sopenharmony_ci */
20862306a36Sopenharmony_cistruct dvb_rc {
20962306a36Sopenharmony_ci	char *rc_codes;
21062306a36Sopenharmony_ci	u64 protocol;
21162306a36Sopenharmony_ci	u64 allowed_protos;
21262306a36Sopenharmony_ci	enum rc_driver_type driver_type;
21362306a36Sopenharmony_ci	int (*change_protocol)(struct rc_dev *dev, u64 *rc_proto);
21462306a36Sopenharmony_ci	char *module_name;
21562306a36Sopenharmony_ci	int (*rc_query) (struct dvb_usb_device *d);
21662306a36Sopenharmony_ci	int rc_interval;
21762306a36Sopenharmony_ci	bool bulk_mode;				/* uses bulk mode */
21862306a36Sopenharmony_ci	u32 scancode_mask;
21962306a36Sopenharmony_ci};
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci/**
22262306a36Sopenharmony_ci * enum dvb_usb_mode - Specifies if it is using a legacy driver or a new one
22362306a36Sopenharmony_ci *		       based on rc-core
22462306a36Sopenharmony_ci * This is initialized/used only inside dvb-usb-remote.c.
22562306a36Sopenharmony_ci * It shouldn't be set by the drivers.
22662306a36Sopenharmony_ci *
22762306a36Sopenharmony_ci * @DVB_RC_LEGACY: legacy driver
22862306a36Sopenharmony_ci * @DVB_RC_CORE: rc-core driver
22962306a36Sopenharmony_ci */
23062306a36Sopenharmony_cienum dvb_usb_mode {
23162306a36Sopenharmony_ci	DVB_RC_LEGACY,
23262306a36Sopenharmony_ci	DVB_RC_CORE,
23362306a36Sopenharmony_ci};
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci/**
23662306a36Sopenharmony_ci * struct dvb_usb_device_properties - properties of a dvb-usb-device
23762306a36Sopenharmony_ci * @caps: capabilities
23862306a36Sopenharmony_ci * @usb_ctrl: which USB device-side controller is in use. Needed for firmware
23962306a36Sopenharmony_ci *  download.
24062306a36Sopenharmony_ci * @firmware: name of the firmware file.
24162306a36Sopenharmony_ci * @download_firmware: called to download the firmware when the usb_ctrl is
24262306a36Sopenharmony_ci *  DEVICE_SPECIFIC.
24362306a36Sopenharmony_ci * @no_reconnect: device doesn't do a reconnect after downloading the firmware,
24462306a36Sopenharmony_ci *  so do the warm initialization right after it
24562306a36Sopenharmony_ci *
24662306a36Sopenharmony_ci * @size_of_priv: how many bytes shall be allocated for the private field
24762306a36Sopenharmony_ci *  of struct dvb_usb_device.
24862306a36Sopenharmony_ci * @priv_init: optional callback to initialize the variable that private field
24962306a36Sopenharmony_ci * of struct dvb_usb_device has pointer to just after it had been allocated and
25062306a36Sopenharmony_ci * zeroed.
25162306a36Sopenharmony_ci * @priv_destroy: just like priv_init, only called before deallocating
25262306a36Sopenharmony_ci * the memory pointed by private field of struct dvb_usb_device.
25362306a36Sopenharmony_ci *
25462306a36Sopenharmony_ci * @num_adapters: the number of adapters in @adapters
25562306a36Sopenharmony_ci * @adapter: the adapters
25662306a36Sopenharmony_ci * @power_ctrl: called to enable/disable power of the device.
25762306a36Sopenharmony_ci * @read_mac_address: called to read the MAC address of the device.
25862306a36Sopenharmony_ci * @identify_state: called to determine the state (cold or warm), when it
25962306a36Sopenharmony_ci *  is not distinguishable by the USB IDs.
26062306a36Sopenharmony_ci *
26162306a36Sopenharmony_ci * @rc: remote controller properties
26262306a36Sopenharmony_ci *
26362306a36Sopenharmony_ci * @i2c_algo: i2c_algorithm if the device has I2CoverUSB.
26462306a36Sopenharmony_ci *
26562306a36Sopenharmony_ci * @generic_bulk_ctrl_endpoint: most of the DVB USB devices have a generic
26662306a36Sopenharmony_ci *  endpoint which received control messages with bulk transfers. When this
26762306a36Sopenharmony_ci *  is non-zero, one can use dvb_usb_generic_rw and dvb_usb_generic_write-
26862306a36Sopenharmony_ci *  helper functions.
26962306a36Sopenharmony_ci *
27062306a36Sopenharmony_ci * @generic_bulk_ctrl_endpoint_response: some DVB USB devices use a separate
27162306a36Sopenharmony_ci *  endpoint for responses to control messages sent with bulk transfers via
27262306a36Sopenharmony_ci *  the generic_bulk_ctrl_endpoint. When this is non-zero, this will be used
27362306a36Sopenharmony_ci *  instead of the generic_bulk_ctrl_endpoint when reading usb responses in
27462306a36Sopenharmony_ci *  the dvb_usb_generic_rw helper function.
27562306a36Sopenharmony_ci *
27662306a36Sopenharmony_ci * @num_device_descs: number of struct dvb_usb_device_description in @devices
27762306a36Sopenharmony_ci * @devices: array of struct dvb_usb_device_description compatibles with these
27862306a36Sopenharmony_ci *  properties.
27962306a36Sopenharmony_ci */
28062306a36Sopenharmony_cistruct dvb_usb_device_properties {
28162306a36Sopenharmony_ci#define MAX_NO_OF_ADAPTER_PER_DEVICE 2
28262306a36Sopenharmony_ci#define DVB_USB_IS_AN_I2C_ADAPTER            0x01
28362306a36Sopenharmony_ci	int caps;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci#define DEVICE_SPECIFIC 0
28662306a36Sopenharmony_ci#define CYPRESS_AN2135  1
28762306a36Sopenharmony_ci#define CYPRESS_AN2235  2
28862306a36Sopenharmony_ci#define CYPRESS_FX2     3
28962306a36Sopenharmony_ci	int        usb_ctrl;
29062306a36Sopenharmony_ci	int        (*download_firmware) (struct usb_device *, const struct firmware *);
29162306a36Sopenharmony_ci	const char *firmware;
29262306a36Sopenharmony_ci	int        no_reconnect;
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	int size_of_priv;
29562306a36Sopenharmony_ci	int (*priv_init)(struct dvb_usb_device *);
29662306a36Sopenharmony_ci	void (*priv_destroy)(struct dvb_usb_device *);
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	int num_adapters;
29962306a36Sopenharmony_ci	struct dvb_usb_adapter_properties adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	int (*power_ctrl)       (struct dvb_usb_device *, int);
30262306a36Sopenharmony_ci	int (*read_mac_address) (struct dvb_usb_device *, u8 []);
30362306a36Sopenharmony_ci	int (*identify_state)(struct usb_device *udev,
30462306a36Sopenharmony_ci			      const struct dvb_usb_device_properties *props,
30562306a36Sopenharmony_ci			      const struct dvb_usb_device_description **desc,
30662306a36Sopenharmony_ci			      int *cold);
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	struct {
30962306a36Sopenharmony_ci		enum dvb_usb_mode mode;	/* Drivers shouldn't touch on it */
31062306a36Sopenharmony_ci		struct dvb_rc_legacy legacy;
31162306a36Sopenharmony_ci		struct dvb_rc core;
31262306a36Sopenharmony_ci	} rc;
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	struct i2c_algorithm *i2c_algo;
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	int generic_bulk_ctrl_endpoint;
31762306a36Sopenharmony_ci	int generic_bulk_ctrl_endpoint_response;
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	int num_device_descs;
32062306a36Sopenharmony_ci	struct dvb_usb_device_description devices[12];
32162306a36Sopenharmony_ci};
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci/**
32462306a36Sopenharmony_ci * struct usb_data_stream - generic object of an USB stream
32562306a36Sopenharmony_ci * @udev: the USB device
32662306a36Sopenharmony_ci * @props: data stream properties
32762306a36Sopenharmony_ci * @state: state of the stream
32862306a36Sopenharmony_ci * @complete: complete callback
32962306a36Sopenharmony_ci * @urb_list: list of URBs
33062306a36Sopenharmony_ci * @buf_num: number of buffer allocated.
33162306a36Sopenharmony_ci * @buf_size: size of each buffer in buf_list.
33262306a36Sopenharmony_ci * @buf_list: array containing all allocate buffers for streaming.
33362306a36Sopenharmony_ci * @dma_addr: list of dma_addr_t for each buffer in buf_list.
33462306a36Sopenharmony_ci *
33562306a36Sopenharmony_ci * @urbs_initialized: number of URBs initialized.
33662306a36Sopenharmony_ci * @urbs_submitted: number of URBs submitted.
33762306a36Sopenharmony_ci * @user_priv: for private use.
33862306a36Sopenharmony_ci */
33962306a36Sopenharmony_cistruct usb_data_stream {
34062306a36Sopenharmony_ci#define MAX_NO_URBS_FOR_DATA_STREAM 10
34162306a36Sopenharmony_ci	struct usb_device                 *udev;
34262306a36Sopenharmony_ci	struct usb_data_stream_properties  props;
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci#define USB_STATE_INIT    0x00
34562306a36Sopenharmony_ci#define USB_STATE_URB_BUF 0x01
34662306a36Sopenharmony_ci	int state;
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci	void (*complete) (struct usb_data_stream *, u8 *, size_t);
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci	struct urb    *urb_list[MAX_NO_URBS_FOR_DATA_STREAM];
35162306a36Sopenharmony_ci	int            buf_num;
35262306a36Sopenharmony_ci	unsigned long  buf_size;
35362306a36Sopenharmony_ci	u8            *buf_list[MAX_NO_URBS_FOR_DATA_STREAM];
35462306a36Sopenharmony_ci	dma_addr_t     dma_addr[MAX_NO_URBS_FOR_DATA_STREAM];
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	int urbs_initialized;
35762306a36Sopenharmony_ci	int urbs_submitted;
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	void *user_priv;
36062306a36Sopenharmony_ci};
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci/**
36362306a36Sopenharmony_ci * struct dvb_usb_fe_adapter - a DVB adapter on a USB device
36462306a36Sopenharmony_ci * @fe: frontend
36562306a36Sopenharmony_ci * @fe_init:  rerouted frontend-init (wakeup) function.
36662306a36Sopenharmony_ci * @fe_sleep: rerouted frontend-sleep function.
36762306a36Sopenharmony_ci * @stream: the usb data stream.
36862306a36Sopenharmony_ci * @pid_filtering: is hardware pid_filtering used or not.
36962306a36Sopenharmony_ci * @max_feed_count: how many feeds can be handled simultaneously by this
37062306a36Sopenharmony_ci *  device
37162306a36Sopenharmony_ci * @priv: private pointer
37262306a36Sopenharmony_ci */
37362306a36Sopenharmony_cistruct dvb_usb_fe_adapter {
37462306a36Sopenharmony_ci	struct dvb_frontend *fe;
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	int (*fe_init)  (struct dvb_frontend *);
37762306a36Sopenharmony_ci	int (*fe_sleep) (struct dvb_frontend *);
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	struct usb_data_stream stream;
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci	int pid_filtering;
38262306a36Sopenharmony_ci	int max_feed_count;
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci	void *priv;
38562306a36Sopenharmony_ci};
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci/**
38862306a36Sopenharmony_ci * struct dvb_usb_adapter - a DVB adapter on a USB device
38962306a36Sopenharmony_ci * @dev: DVB USB device pointer
39062306a36Sopenharmony_ci * @props: properties
39162306a36Sopenharmony_ci * @state: status
39262306a36Sopenharmony_ci * @id: index of this adapter (starting with 0).
39362306a36Sopenharmony_ci *
39462306a36Sopenharmony_ci * @feedcount: number of requested feeds (used for streaming-activation)
39562306a36Sopenharmony_ci *
39662306a36Sopenharmony_ci * @dvb_adap: device's dvb_adapter.
39762306a36Sopenharmony_ci * @dmxdev: device's dmxdev.
39862306a36Sopenharmony_ci * @demux: device's software demuxer.
39962306a36Sopenharmony_ci * @dvb_net: device's dvb_net interfaces.
40062306a36Sopenharmony_ci *
40162306a36Sopenharmony_ci * @fe_adap: frontend adapters
40262306a36Sopenharmony_ci * @active_fe: active frontend
40362306a36Sopenharmony_ci * @num_frontends_initialized: number of initialized frontends
40462306a36Sopenharmony_ci * @priv: private pointer
40562306a36Sopenharmony_ci */
40662306a36Sopenharmony_cistruct dvb_usb_adapter {
40762306a36Sopenharmony_ci	struct dvb_usb_device *dev;
40862306a36Sopenharmony_ci	struct dvb_usb_adapter_properties props;
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci#define DVB_USB_ADAP_STATE_INIT 0x000
41162306a36Sopenharmony_ci#define DVB_USB_ADAP_STATE_DVB  0x001
41262306a36Sopenharmony_ci	int state;
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci	u8  id;
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci	int feedcount;
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci	/* dvb */
41962306a36Sopenharmony_ci	struct dvb_adapter   dvb_adap;
42062306a36Sopenharmony_ci	struct dmxdev        dmxdev;
42162306a36Sopenharmony_ci	struct dvb_demux     demux;
42262306a36Sopenharmony_ci	struct dvb_net       dvb_net;
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci	struct dvb_usb_fe_adapter fe_adap[MAX_NO_OF_FE_PER_ADAP];
42562306a36Sopenharmony_ci	int active_fe;
42662306a36Sopenharmony_ci	int num_frontends_initialized;
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci	void *priv;
42962306a36Sopenharmony_ci};
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci/**
43262306a36Sopenharmony_ci * struct dvb_usb_device - object of a DVB USB device
43362306a36Sopenharmony_ci * @props: copy of the struct dvb_usb_properties this device belongs to.
43462306a36Sopenharmony_ci * @desc: pointer to the device's struct dvb_usb_device_description.
43562306a36Sopenharmony_ci * @state: initialization and runtime state of the device.
43662306a36Sopenharmony_ci *
43762306a36Sopenharmony_ci * @powered: indicated whether the device is power or not.
43862306a36Sopenharmony_ci *  Powered is in/decremented for each call to modify the state.
43962306a36Sopenharmony_ci * @udev: pointer to the device's struct usb_device.
44062306a36Sopenharmony_ci *
44162306a36Sopenharmony_ci * @data_mutex: mutex to protect the data structure used to store URB data
44262306a36Sopenharmony_ci * @usb_mutex: mutex of USB control messages (reading needs two messages).
44362306a36Sopenharmony_ci *	Please notice that this mutex is used internally at the generic
44462306a36Sopenharmony_ci *	URB control functions. So, drivers using dvb_usb_generic_rw() and
44562306a36Sopenharmony_ci *	derivated functions should not lock it internally.
44662306a36Sopenharmony_ci * @i2c_mutex: mutex for i2c-transfers
44762306a36Sopenharmony_ci *
44862306a36Sopenharmony_ci * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB
44962306a36Sopenharmony_ci *
45062306a36Sopenharmony_ci * @num_adapters_initialized: number of initialized adapters
45162306a36Sopenharmony_ci * @adapter: adapters
45262306a36Sopenharmony_ci *
45362306a36Sopenharmony_ci * @rc_dev: rc device for the remote control (rc-core mode)
45462306a36Sopenharmony_ci * @input_dev: input device for the remote control (legacy mode)
45562306a36Sopenharmony_ci * @rc_phys: rc device path
45662306a36Sopenharmony_ci * @rc_query_work: struct work_struct frequent rc queries
45762306a36Sopenharmony_ci * @last_event: last triggered event
45862306a36Sopenharmony_ci * @last_state: last state (no, pressed, repeat)
45962306a36Sopenharmony_ci * @owner: owner of the dvb_adapter
46062306a36Sopenharmony_ci * @priv: private data of the actual driver (allocate by dvb-usb, size defined
46162306a36Sopenharmony_ci *  in size_of_priv of dvb_usb_properties).
46262306a36Sopenharmony_ci */
46362306a36Sopenharmony_cistruct dvb_usb_device {
46462306a36Sopenharmony_ci	struct dvb_usb_device_properties props;
46562306a36Sopenharmony_ci	const struct dvb_usb_device_description *desc;
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	struct usb_device *udev;
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci#define DVB_USB_STATE_INIT        0x000
47062306a36Sopenharmony_ci#define DVB_USB_STATE_I2C         0x001
47162306a36Sopenharmony_ci#define DVB_USB_STATE_DVB         0x002
47262306a36Sopenharmony_ci#define DVB_USB_STATE_REMOTE      0x004
47362306a36Sopenharmony_ci	int state;
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	int powered;
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci	/* locking */
47862306a36Sopenharmony_ci	struct mutex data_mutex;
47962306a36Sopenharmony_ci	struct mutex usb_mutex;
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci	/* i2c */
48262306a36Sopenharmony_ci	struct mutex i2c_mutex;
48362306a36Sopenharmony_ci	struct i2c_adapter i2c_adap;
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci	int                    num_adapters_initialized;
48662306a36Sopenharmony_ci	struct dvb_usb_adapter adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_ci	/* remote control */
48962306a36Sopenharmony_ci	struct rc_dev *rc_dev;
49062306a36Sopenharmony_ci	struct input_dev *input_dev;
49162306a36Sopenharmony_ci	char rc_phys[64];
49262306a36Sopenharmony_ci	struct delayed_work rc_query_work;
49362306a36Sopenharmony_ci	u32 last_event;
49462306a36Sopenharmony_ci	int last_state;
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	struct module *owner;
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci	void *priv;
49962306a36Sopenharmony_ci};
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ciextern int dvb_usb_device_init(struct usb_interface *,
50262306a36Sopenharmony_ci			       const struct dvb_usb_device_properties *,
50362306a36Sopenharmony_ci			       struct module *, struct dvb_usb_device **,
50462306a36Sopenharmony_ci			       short *adapter_nums);
50562306a36Sopenharmony_ciextern void dvb_usb_device_exit(struct usb_interface *);
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci/* the generic read/write method for device control */
50862306a36Sopenharmony_ciextern int __must_check
50962306a36Sopenharmony_cidvb_usb_generic_rw(struct dvb_usb_device *, u8 *, u16, u8 *, u16, int);
51062306a36Sopenharmony_ciextern int __must_check
51162306a36Sopenharmony_cidvb_usb_generic_write(struct dvb_usb_device *, u8 *, u16);
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci/* commonly used remote control parsing */
51462306a36Sopenharmony_ciint dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *d, u8 keybuf[5],
51562306a36Sopenharmony_ci				u32 *event, int *state);
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci/* commonly used firmware download types and function */
51862306a36Sopenharmony_cistruct hexline {
51962306a36Sopenharmony_ci	u8 len;
52062306a36Sopenharmony_ci	u32 addr;
52162306a36Sopenharmony_ci	u8 type;
52262306a36Sopenharmony_ci	u8 data[255];
52362306a36Sopenharmony_ci	u8 chk;
52462306a36Sopenharmony_ci};
52562306a36Sopenharmony_ciextern int usb_cypress_load_firmware(struct usb_device *udev, const struct firmware *fw, int type);
52662306a36Sopenharmony_ciextern int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx, int *pos);
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_ci#endif
530