diff options
author | Patrick Boettcher <pb@linuxtv.org> | 2006-09-30 09:53:48 (GMT) |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-10-03 18:10:54 (GMT) |
commit | 4d43e13f723e12734257277cc38497fab1efc605 (patch) | |
tree | 7debc4f9b7997f7d768dcf387210436b532198f4 /drivers/media/dvb/dvb-usb/dvb-usb.h | |
parent | 8ccb3dcd1f8e80e8702642e1de26541b52f6bb7c (diff) | |
download | linux-4d43e13f723e12734257277cc38497fab1efc605.tar.xz |
V4L/DVB (4643): Multi-input patch for DVB-USB device
This patch is the first commit of the Multiple Input Patch for the DVB-USB frame
work.
It changes the DVB-USB-device to be able to have more than one streaming input
(e.g. multiple DVB-T sources) on one device. This is a necessary feature for
the upcoming DiB7700 driven devices.
Signed-off-by: Patrick Boettcher <pb@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/dvb/dvb-usb/dvb-usb.h')
-rw-r--r-- | drivers/media/dvb/dvb-usb/dvb-usb.h | 266 |
1 files changed, 162 insertions, 104 deletions
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h index 97f8ea9..5546554 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb.h @@ -1,9 +1,11 @@ /* dvb-usb.h is part of the DVB USB library. * - * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de) + * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de) * see dvb-usb-init.c for copyright information. * * the headerfile, all dvb-usb-drivers have to include. + * + * TODO: clean-up the structures for unused fields and update the comments */ #ifndef __DVB_USB_H__ #define __DVB_USB_H__ @@ -84,36 +86,83 @@ struct dvb_usb_rc_key { }; struct dvb_usb_device; +struct dvb_usb_adapter; +struct usb_data_stream; /** - * struct dvb_usb_properties - properties of a dvb-usb-device + * Properties of USB streaming - TODO this structure does not belong here actually + * describes the kind of USB transfer used for MPEG2-TS-streaming. + * (BULK or ISOC) + */ +struct usb_data_stream_properties { +#define USB_BULK 1 +#define USB_ISOC 2 + int type; + int count; + int endpoint; + + union { + struct { + int buffersize; /* per URB */ + } bulk; + struct { + int framesperurb; + int framesize; + int interval; + } isoc; + } u; +}; + +/** + * struct dvb_usb_adapter_properties - properties of a dvb-usb-adapter. + * A DVB-USB-Adapter is basically a dvb_adapter which is present on a USB-device. * @caps: capabilities of the DVB USB device. * @pid_filter_count: number of PID filter position in the optional hardware * PID-filter. - * + * @streaming_crtl: called to start and stop the MPEG2-TS streaming of the + * device (not URB submitting/killing). + * @pid_filter_ctrl: called to en/disable the PID filter, if any. + * @pid_filter: called to set/unset a PID for filtering. + * @frontend_attach: called to attach the possible frontends (fill fe-field + * of struct dvb_usb_device). + * @tuner_attach: called to attach the correct tuner and to fill pll_addr, + * pll_desc and pll_init_buf of struct dvb_usb_device). + * @stream: configuration of the USB streaming + */ +struct dvb_usb_adapter_properties { +#define DVB_USB_ADAP_HAS_PID_FILTER 0x01 +#define DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF 0x02 +#define DVB_USB_ADAP_NEED_PID_FILTERING 0x04 + int caps; + int pid_filter_count; + + int (*streaming_ctrl) (struct dvb_usb_adapter *, int); + int (*pid_filter_ctrl) (struct dvb_usb_adapter *, int); + int (*pid_filter) (struct dvb_usb_adapter *, int, u16, int); + + int (*frontend_attach) (struct dvb_usb_adapter *); + int (*tuner_attach) (struct dvb_usb_adapter *); + + struct usb_data_stream_properties stream; + + int size_of_priv; +}; + +/** + * struct dvb_usb_device_properties - properties of a dvb-usb-device * @usb_ctrl: which USB device-side controller is in use. Needed for firmware * download. * @firmware: name of the firmware file. * @download_firmware: called to download the firmware when the usb_ctrl is * DEVICE_SPECIFIC. * @no_reconnect: device doesn't do a reconnect after downloading the firmware, - so do the warm initialization right after it - + * so do the warm initialization right after it + * * @size_of_priv: how many bytes shall be allocated for the private field * of struct dvb_usb_device. * * @power_ctrl: called to enable/disable power of the device. - * @streaming_crtl: called to start and stop the MPEG2-TS streaming of the - * device (not URB submitting/killing). - * @pid_filter_ctrl: called to en/disable the PID filter, if any. - * @pid_filter: called to set/unset a PID for filtering. - * * @read_mac_address: called to read the MAC address of the device. - * - * @frontend_attach: called to attach the possible frontends (fill fe-field - * of struct dvb_usb_device). - * @tuner_attach: called to attach the correct tuner and to fill pll_addr, - * pll_desc and pll_init_buf of struct dvb_usb_device). * @identify_state: called to determine the state (cold or warm), when it * is not distinguishable by the USB IDs. * @@ -130,21 +179,15 @@ struct dvb_usb_device; * is non-zero, one can use dvb_usb_generic_rw and dvb_usb_generic_write- * helper functions. * - * @urb: describes the kind of USB transfer used for MPEG2-TS-streaming. - * (BULK or ISOC) - * * @num_device_descs: number of struct dvb_usb_device_description in @devices * @devices: array of struct dvb_usb_device_description compatibles with these * properties. */ -struct dvb_usb_properties { +#define MAX_NO_OF_ADAPTER_PER_DEVICE 2 +struct dvb_usb_device_properties { -#define DVB_USB_HAS_PID_FILTER 0x01 -#define DVB_USB_PID_FILTER_CAN_BE_TURNED_OFF 0x02 -#define DVB_USB_NEED_PID_FILTERING 0x04 -#define DVB_USB_IS_AN_I2C_ADAPTER 0x08 +#define DVB_USB_IS_AN_I2C_ADAPTER 0x01 int caps; - int pid_filter_count; #define DEVICE_SPECIFIC 0 #define CYPRESS_AN2135 1 @@ -157,16 +200,12 @@ struct dvb_usb_properties { int size_of_priv; - int (*power_ctrl) (struct dvb_usb_device *, int); - int (*streaming_ctrl) (struct dvb_usb_device *, int); - int (*pid_filter_ctrl) (struct dvb_usb_device *, int); - int (*pid_filter) (struct dvb_usb_device *, int, u16, int); + int num_adapters; + struct dvb_usb_adapter_properties adapter[MAX_NO_OF_ADAPTER_PER_DEVICE]; + int (*power_ctrl) (struct dvb_usb_device *, int); int (*read_mac_address) (struct dvb_usb_device *, u8 []); - int (*frontend_attach) (struct dvb_usb_device *); - int (*tuner_attach) (struct dvb_usb_device *); - - int (*identify_state) (struct usb_device *, struct dvb_usb_properties *, + int (*identify_state) (struct usb_device *, struct dvb_usb_device_properties *, struct dvb_usb_device_description **, int *); /* remote control properties */ @@ -182,40 +221,12 @@ struct dvb_usb_properties { int generic_bulk_ctrl_endpoint; - struct { -#define DVB_USB_BULK 1 -#define DVB_USB_ISOC 2 - int type; - int count; - int endpoint; - - union { - struct { - int buffersize; /* per URB */ - } bulk; - struct { - int framesperurb; - int framesize; - int interval; - } isoc; - } u; - } urb; - int num_device_descs; struct dvb_usb_device_description devices[9]; }; - /** - * struct dvb_usb_device - object of a DVB USB device - * @props: copy of the struct dvb_usb_properties this device belongs to. - * @desc: pointer to the device's struct dvb_usb_device_description. - * @state: initialization and runtime state of the device. - * - * @udev: pointer to the device's struct usb_device. - * @urb_list: array of dynamically allocated struct urb for the MPEG2-TS- - * streaming. - * + * struct usb_data_stream - generic object of an USB stream * @buf_num: number of buffer allocated. * @buf_size: size of each buffer in buf_list. * @buf_list: array containing all allocate buffers for streaming. @@ -224,19 +235,44 @@ struct dvb_usb_properties { * @urbs_initialized: number of URBs initialized. * @urbs_submitted: number of URBs submitted. * + * TODO put this in the correct place. + */ +#define MAX_NO_URBS_FOR_DATA_STREAM 10 +struct usb_data_stream { + struct usb_device *udev; + struct usb_data_stream_properties props; + +#define USB_STATE_INIT 0x00 +#define USB_STATE_URB_BUF 0x01 + int state; + + void (*complete) (struct usb_data_stream *, u8 *, size_t); + + struct urb *urb_list[MAX_NO_URBS_FOR_DATA_STREAM]; + + int buf_num; + unsigned long buf_size; + u8 *buf_list[MAX_NO_URBS_FOR_DATA_STREAM]; + dma_addr_t dma_addr[MAX_NO_URBS_FOR_DATA_STREAM]; + + int urbs_initialized; + int urbs_submitted; + + void *user_priv; +}; + +/** + * struct dvb_usb_adapter - a DVB adapter on a USB device + * @id: index of this adapter (starting with 0). + * * @feedcount: number of reqested feeds (used for streaming-activation) * @pid_filtering: is hardware pid_filtering used or not. * - * @usb_mutex: semaphore of USB control messages (reading needs two messages) - * @i2c_mutex: semaphore for i2c-transfers - * - * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB * @pll_addr: I2C address of the tuner for programming * @pll_init: array containing the initialization buffer * @pll_desc: pointer to the appropriate struct dvb_pll_desc * * @tuner_pass_ctrl: called to (de)activate tuner passthru of the demod or the board - * * @dvb_adap: device's dvb_adapter. * @dmxdev: device's dmxdev. * @demux: device's software demuxer. @@ -246,6 +282,56 @@ struct dvb_usb_properties { * device * @fe_sleep: rerouted frontend-sleep function. * @fe_init: rerouted frontend-init (wakeup) function. + * @stream: the usb data stream. + */ +struct dvb_usb_adapter { + struct dvb_usb_device *dev; + struct dvb_usb_adapter_properties props; + +#define DVB_USB_ADAP_STATE_INIT 0x000 +#define DVB_USB_ADAP_STATE_DVB 0x001 + int state; + + int id; + + int feedcount; + int pid_filtering; + + /* tuner programming information */ + u8 pll_addr; + u8 pll_init[4]; + struct dvb_pll_desc *pll_desc; + int (*tuner_pass_ctrl) (struct dvb_frontend *, int, u8); + + /* dvb */ + struct dvb_adapter dvb_adap; + struct dmxdev dmxdev; + struct dvb_demux demux; + struct dvb_net dvb_net; + struct dvb_frontend *fe; + int max_feed_count; + + int (*fe_sleep) (struct dvb_frontend *); + int (*fe_init) (struct dvb_frontend *); + + struct usb_data_stream stream; + + void *priv; +}; + +/** + * struct dvb_usb_device - object of a DVB USB device + * @props: copy of the struct dvb_usb_properties this device belongs to. + * @desc: pointer to the device's struct dvb_usb_device_description. + * @state: initialization and runtime state of the device. + * + * @udev: pointer to the device's struct usb_device. + * + * @usb_mutex: semaphore of USB control messages (reading needs two messages) + * @i2c_mutex: semaphore for i2c-transfers + * + * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB + * * @rc_input_dev: input device for the remote control. * @rc_query_work: struct work_struct frequent rc queries * @last_event: last triggered event @@ -255,32 +341,18 @@ struct dvb_usb_properties { * in size_of_priv of dvb_usb_properties). */ struct dvb_usb_device { - struct dvb_usb_properties props; + struct dvb_usb_device_properties props; struct dvb_usb_device_description *desc; -#define DVB_USB_STATE_INIT 0x000 -#define DVB_USB_STATE_URB_LIST 0x001 -#define DVB_USB_STATE_URB_BUF 0x002 -#define DVB_USB_STATE_DVB 0x004 -#define DVB_USB_STATE_I2C 0x008 -#define DVB_USB_STATE_REMOTE 0x010 -#define DVB_USB_STATE_URB_SUBMIT 0x020 - int state; - - /* usb */ struct usb_device *udev; - struct urb **urb_list; - - int buf_num; - unsigned long buf_size; - u8 **buf_list; - dma_addr_t *dma_addr; - int urbs_initialized; - int urbs_submitted; +#define DVB_USB_STATE_INIT 0x000 +#define DVB_USB_STATE_I2C 0x001 +#define DVB_USB_STATE_DVB 0x002 +#define DVB_USB_STATE_REMOTE 0x004 + int state; - int feedcount; - int pid_filtering; + int powered; /* locking */ struct mutex usb_mutex; @@ -289,22 +361,8 @@ struct dvb_usb_device { struct mutex i2c_mutex; struct i2c_adapter i2c_adap; - /* tuner programming information */ - u8 pll_addr; - u8 pll_init[4]; - struct dvb_pll_desc *pll_desc; - int (*tuner_pass_ctrl)(struct dvb_frontend *, int, u8); - - /* dvb */ - struct dvb_adapter dvb_adap; - struct dmxdev dmxdev; - struct dvb_demux demux; - struct dvb_net dvb_net; - struct dvb_frontend* fe; - int max_feed_count; - - int (*fe_sleep) (struct dvb_frontend *); - int (*fe_init) (struct dvb_frontend *); + int num_adapters_initialized; + struct dvb_usb_adapter adapter[MAX_NO_OF_ADAPTER_PER_DEVICE]; /* remote control */ struct input_dev *rc_input_dev; @@ -318,7 +376,7 @@ struct dvb_usb_device { void *priv; }; -extern int dvb_usb_device_init(struct usb_interface *, struct dvb_usb_properties *, struct module *, struct dvb_usb_device **); +extern int dvb_usb_device_init(struct usb_interface *, struct dvb_usb_device_properties *, struct module *, struct dvb_usb_device **); extern void dvb_usb_device_exit(struct usb_interface *); /* the generic read/write method for device control */ |