1*2504ba9fSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
20c0d06caSMauro Carvalho Chehab /*
30c0d06caSMauro Carvalho Chehab  *
40c0d06caSMauro Carvalho Chehab  *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
50c0d06caSMauro Carvalho Chehab  */
60c0d06caSMauro Carvalho Chehab #ifndef __PVRUSB2_HDW_INTERNAL_H
70c0d06caSMauro Carvalho Chehab #define __PVRUSB2_HDW_INTERNAL_H
80c0d06caSMauro Carvalho Chehab 
90c0d06caSMauro Carvalho Chehab /*
100c0d06caSMauro Carvalho Chehab 
110c0d06caSMauro Carvalho Chehab   This header sets up all the internal structures and definitions needed to
120c0d06caSMauro Carvalho Chehab   track and coordinate the driver's interaction with the hardware.  ONLY
130c0d06caSMauro Carvalho Chehab   source files which actually implement part of that whole circus should be
140c0d06caSMauro Carvalho Chehab   including this header.  Higher levels, like the external layers to the
150c0d06caSMauro Carvalho Chehab   various public APIs (V4L, sysfs, etc) should NOT ever include this
160c0d06caSMauro Carvalho Chehab   private, internal header.  This means that pvrusb2-hdw, pvrusb2-encoder,
170c0d06caSMauro Carvalho Chehab   etc will include this, but pvrusb2-v4l should not.
180c0d06caSMauro Carvalho Chehab 
190c0d06caSMauro Carvalho Chehab */
200c0d06caSMauro Carvalho Chehab 
210c0d06caSMauro Carvalho Chehab #include <linux/videodev2.h>
220c0d06caSMauro Carvalho Chehab #include <linux/i2c.h>
230c0d06caSMauro Carvalho Chehab #include <linux/workqueue.h>
240c0d06caSMauro Carvalho Chehab #include <linux/mutex.h>
250c0d06caSMauro Carvalho Chehab #include "pvrusb2-hdw.h"
260c0d06caSMauro Carvalho Chehab #include "pvrusb2-io.h"
270c0d06caSMauro Carvalho Chehab #include <media/v4l2-device.h>
28d647f0b7SMauro Carvalho Chehab #include <media/drv-intf/cx2341x.h>
29b5dcee22SMauro Carvalho Chehab #include <media/i2c/ir-kbd-i2c.h>
300c0d06caSMauro Carvalho Chehab #include "pvrusb2-devattr.h"
310c0d06caSMauro Carvalho Chehab 
320c0d06caSMauro Carvalho Chehab /* Legal values for PVR2_CID_HSM */
330c0d06caSMauro Carvalho Chehab #define PVR2_CVAL_HSM_FAIL 0
340c0d06caSMauro Carvalho Chehab #define PVR2_CVAL_HSM_FULL 1
350c0d06caSMauro Carvalho Chehab #define PVR2_CVAL_HSM_HIGH 2
360c0d06caSMauro Carvalho Chehab 
370c0d06caSMauro Carvalho Chehab #define PVR2_VID_ENDPOINT        0x84
380c0d06caSMauro Carvalho Chehab #define PVR2_UNK_ENDPOINT        0x86    /* maybe raw yuv ? */
390c0d06caSMauro Carvalho Chehab #define PVR2_VBI_ENDPOINT        0x88
400c0d06caSMauro Carvalho Chehab 
410c0d06caSMauro Carvalho Chehab #define PVR2_CTL_BUFFSIZE        64
420c0d06caSMauro Carvalho Chehab 
430c0d06caSMauro Carvalho Chehab #define FREQTABLE_SIZE 500
440c0d06caSMauro Carvalho Chehab 
450c0d06caSMauro Carvalho Chehab #define LOCK_TAKE(x) do { mutex_lock(&x##_mutex); x##_held = !0; } while (0)
460c0d06caSMauro Carvalho Chehab #define LOCK_GIVE(x) do { x##_held = 0; mutex_unlock(&x##_mutex); } while (0)
470c0d06caSMauro Carvalho Chehab 
480c0d06caSMauro Carvalho Chehab typedef int (*pvr2_ctlf_is_dirty)(struct pvr2_ctrl *);
490c0d06caSMauro Carvalho Chehab typedef void (*pvr2_ctlf_clear_dirty)(struct pvr2_ctrl *);
500c0d06caSMauro Carvalho Chehab typedef int (*pvr2_ctlf_check_value)(struct pvr2_ctrl *,int);
510c0d06caSMauro Carvalho Chehab typedef int (*pvr2_ctlf_get_value)(struct pvr2_ctrl *,int *);
520c0d06caSMauro Carvalho Chehab typedef int (*pvr2_ctlf_set_value)(struct pvr2_ctrl *,int msk,int val);
530c0d06caSMauro Carvalho Chehab typedef int (*pvr2_ctlf_val_to_sym)(struct pvr2_ctrl *,int msk,int val,
540c0d06caSMauro Carvalho Chehab 				    char *,unsigned int,unsigned int *);
550c0d06caSMauro Carvalho Chehab typedef int (*pvr2_ctlf_sym_to_val)(struct pvr2_ctrl *,
560c0d06caSMauro Carvalho Chehab 				    const char *,unsigned int,
570c0d06caSMauro Carvalho Chehab 				    int *mskp,int *valp);
580c0d06caSMauro Carvalho Chehab typedef unsigned int (*pvr2_ctlf_get_v4lflags)(struct pvr2_ctrl *);
590c0d06caSMauro Carvalho Chehab 
600c0d06caSMauro Carvalho Chehab /* This structure describes a specific control.  A table of these is set up
610c0d06caSMauro Carvalho Chehab    in pvrusb2-hdw.c. */
620c0d06caSMauro Carvalho Chehab struct pvr2_ctl_info {
630c0d06caSMauro Carvalho Chehab 	/* Control's name suitable for use as an identifier */
640c0d06caSMauro Carvalho Chehab 	const char *name;
650c0d06caSMauro Carvalho Chehab 
660c0d06caSMauro Carvalho Chehab 	/* Short description of control */
670c0d06caSMauro Carvalho Chehab 	const char *desc;
680c0d06caSMauro Carvalho Chehab 
690c0d06caSMauro Carvalho Chehab 	/* Control's implementation */
700c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_get_value get_value;      /* Get its value */
710c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_get_value get_def_value;  /* Get its default value */
720c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_get_value get_min_value;  /* Get minimum allowed value */
730c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_get_value get_max_value;  /* Get maximum allowed value */
740c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_set_value set_value;      /* Set its value */
750c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_check_value check_value;  /* Check that value is valid */
760c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_val_to_sym val_to_sym;    /* Custom convert value->symbol */
770c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_sym_to_val sym_to_val;    /* Custom convert symbol->value */
780c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_is_dirty is_dirty;        /* Return true if dirty */
790c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_clear_dirty clear_dirty;  /* Clear dirty state */
800c0d06caSMauro Carvalho Chehab 	pvr2_ctlf_get_v4lflags get_v4lflags;/* Retrieve v4l flags */
810c0d06caSMauro Carvalho Chehab 
820c0d06caSMauro Carvalho Chehab 	/* Control's type (int, enum, bitmask) */
830c0d06caSMauro Carvalho Chehab 	enum pvr2_ctl_type type;
840c0d06caSMauro Carvalho Chehab 
850c0d06caSMauro Carvalho Chehab 	/* Associated V4L control ID, if any */
860c0d06caSMauro Carvalho Chehab 	int v4l_id;
870c0d06caSMauro Carvalho Chehab 
880c0d06caSMauro Carvalho Chehab 	/* Associated driver internal ID, if any */
890c0d06caSMauro Carvalho Chehab 	int internal_id;
900c0d06caSMauro Carvalho Chehab 
910c0d06caSMauro Carvalho Chehab 	/* Don't implicitly initialize this control's value */
920c0d06caSMauro Carvalho Chehab 	int skip_init;
930c0d06caSMauro Carvalho Chehab 
940c0d06caSMauro Carvalho Chehab 	/* Starting value for this control */
950c0d06caSMauro Carvalho Chehab 	int default_value;
960c0d06caSMauro Carvalho Chehab 
970c0d06caSMauro Carvalho Chehab 	/* Type-specific control information */
980c0d06caSMauro Carvalho Chehab 	union {
990c0d06caSMauro Carvalho Chehab 		struct { /* Integer control */
1000c0d06caSMauro Carvalho Chehab 			long min_value; /* lower limit */
1010c0d06caSMauro Carvalho Chehab 			long max_value; /* upper limit */
1020c0d06caSMauro Carvalho Chehab 		} type_int;
1030c0d06caSMauro Carvalho Chehab 		struct { /* enumerated control */
1040c0d06caSMauro Carvalho Chehab 			unsigned int count;       /* enum value count */
1050c0d06caSMauro Carvalho Chehab 			const char * const *value_names; /* symbol names */
1060c0d06caSMauro Carvalho Chehab 		} type_enum;
1070c0d06caSMauro Carvalho Chehab 		struct { /* bitmask control */
1080c0d06caSMauro Carvalho Chehab 			unsigned int valid_bits; /* bits in use */
1090c0d06caSMauro Carvalho Chehab 			const char **bit_names;  /* symbol name/bit */
1100c0d06caSMauro Carvalho Chehab 		} type_bitmask;
1110c0d06caSMauro Carvalho Chehab 	} def;
1120c0d06caSMauro Carvalho Chehab };
1130c0d06caSMauro Carvalho Chehab 
1140c0d06caSMauro Carvalho Chehab 
1150c0d06caSMauro Carvalho Chehab /* Same as pvr2_ctl_info, but includes storage for the control description */
1160c0d06caSMauro Carvalho Chehab #define PVR2_CTLD_INFO_DESC_SIZE 32
1170c0d06caSMauro Carvalho Chehab struct pvr2_ctld_info {
1180c0d06caSMauro Carvalho Chehab 	struct pvr2_ctl_info info;
1190c0d06caSMauro Carvalho Chehab 	char desc[PVR2_CTLD_INFO_DESC_SIZE];
1200c0d06caSMauro Carvalho Chehab };
1210c0d06caSMauro Carvalho Chehab 
1220c0d06caSMauro Carvalho Chehab struct pvr2_ctrl {
1230c0d06caSMauro Carvalho Chehab 	const struct pvr2_ctl_info *info;
1240c0d06caSMauro Carvalho Chehab 	struct pvr2_hdw *hdw;
1250c0d06caSMauro Carvalho Chehab };
1260c0d06caSMauro Carvalho Chehab 
1270c0d06caSMauro Carvalho Chehab 
1280c0d06caSMauro Carvalho Chehab 
1290c0d06caSMauro Carvalho Chehab /* Disposition of firmware1 loading situation */
1300c0d06caSMauro Carvalho Chehab #define FW1_STATE_UNKNOWN 0
1310c0d06caSMauro Carvalho Chehab #define FW1_STATE_MISSING 1
1320c0d06caSMauro Carvalho Chehab #define FW1_STATE_FAILED 2
1330c0d06caSMauro Carvalho Chehab #define FW1_STATE_RELOAD 3
1340c0d06caSMauro Carvalho Chehab #define FW1_STATE_OK 4
1350c0d06caSMauro Carvalho Chehab 
1360c0d06caSMauro Carvalho Chehab /* What state the device is in if it is a hybrid */
1370c0d06caSMauro Carvalho Chehab #define PVR2_PATHWAY_UNKNOWN 0
1380c0d06caSMauro Carvalho Chehab #define PVR2_PATHWAY_ANALOG 1
1390c0d06caSMauro Carvalho Chehab #define PVR2_PATHWAY_DIGITAL 2
1400c0d06caSMauro Carvalho Chehab 
1410c0d06caSMauro Carvalho Chehab typedef int (*pvr2_i2c_func)(struct pvr2_hdw *,u8,u8 *,u16,u8 *, u16);
1420c0d06caSMauro Carvalho Chehab #define PVR2_I2C_FUNC_CNT 128
1430c0d06caSMauro Carvalho Chehab 
1440c0d06caSMauro Carvalho Chehab /* This structure contains all state data directly needed to
1450c0d06caSMauro Carvalho Chehab    manipulate the hardware (as opposed to complying with a kernel
1460c0d06caSMauro Carvalho Chehab    interface) */
1470c0d06caSMauro Carvalho Chehab struct pvr2_hdw {
1480c0d06caSMauro Carvalho Chehab 	/* Underlying USB device handle */
1490c0d06caSMauro Carvalho Chehab 	struct usb_device *usb_dev;
1500c0d06caSMauro Carvalho Chehab 	struct usb_interface *usb_intf;
1510c0d06caSMauro Carvalho Chehab 
1520c0d06caSMauro Carvalho Chehab 	/* Our handle into the v4l2 sub-device architecture */
1530c0d06caSMauro Carvalho Chehab 	struct v4l2_device v4l2_dev;
1540c0d06caSMauro Carvalho Chehab 	/* Device description, anything that must adjust behavior based on
1550c0d06caSMauro Carvalho Chehab 	   device specific info will use information held here. */
1560c0d06caSMauro Carvalho Chehab 	const struct pvr2_device_desc *hdw_desc;
1570c0d06caSMauro Carvalho Chehab 
1580c0d06caSMauro Carvalho Chehab 	/* Kernel worker thread handling */
1590c0d06caSMauro Carvalho Chehab 	struct work_struct workpoll;     /* Update driver state */
1600c0d06caSMauro Carvalho Chehab 
1610c0d06caSMauro Carvalho Chehab 	/* Video spigot */
1620c0d06caSMauro Carvalho Chehab 	struct pvr2_stream *vid_stream;
1630c0d06caSMauro Carvalho Chehab 
1640c0d06caSMauro Carvalho Chehab 	/* Mutex for all hardware state control */
1650c0d06caSMauro Carvalho Chehab 	struct mutex big_lock_mutex;
1660c0d06caSMauro Carvalho Chehab 	int big_lock_held;  /* For debugging */
1670c0d06caSMauro Carvalho Chehab 
1680c0d06caSMauro Carvalho Chehab 	/* This is a simple string which identifies the instance of this
1690c0d06caSMauro Carvalho Chehab 	   driver.  It is unique within the set of existing devices, but
1700c0d06caSMauro Carvalho Chehab 	   there is no attempt to keep the name consistent with the same
1710c0d06caSMauro Carvalho Chehab 	   physical device each time. */
1720c0d06caSMauro Carvalho Chehab 	char name[32];
1730c0d06caSMauro Carvalho Chehab 
1740c0d06caSMauro Carvalho Chehab 	/* This is a simple string which identifies the physical device
1750c0d06caSMauro Carvalho Chehab 	   instance itself - if possible.  (If not possible, then it is
1760c0d06caSMauro Carvalho Chehab 	   based on the specific driver instance, similar to name above.)
1770c0d06caSMauro Carvalho Chehab 	   The idea here is that userspace might hopefully be able to use
1780c0d06caSMauro Carvalho Chehab 	   this recognize specific tuners.  It will encode a serial number,
1790c0d06caSMauro Carvalho Chehab 	   if available. */
1800c0d06caSMauro Carvalho Chehab 	char identifier[32];
1810c0d06caSMauro Carvalho Chehab 
1820c0d06caSMauro Carvalho Chehab 	/* I2C stuff */
1830c0d06caSMauro Carvalho Chehab 	struct i2c_adapter i2c_adap;
1840c0d06caSMauro Carvalho Chehab 	struct i2c_algorithm i2c_algo;
1850c0d06caSMauro Carvalho Chehab 	pvr2_i2c_func i2c_func[PVR2_I2C_FUNC_CNT];
1860c0d06caSMauro Carvalho Chehab 	int i2c_cx25840_hack_state;
1870c0d06caSMauro Carvalho Chehab 	int i2c_linked;
1880c0d06caSMauro Carvalho Chehab 
1890c0d06caSMauro Carvalho Chehab 	/* IR related */
1900c0d06caSMauro Carvalho Chehab 	unsigned int ir_scheme_active; /* IR scheme as seen from the outside */
1910c0d06caSMauro Carvalho Chehab 	struct IR_i2c_init_data ir_init_data; /* params passed to IR modules */
1920c0d06caSMauro Carvalho Chehab 
1930c0d06caSMauro Carvalho Chehab 	/* Frequency table */
1940c0d06caSMauro Carvalho Chehab 	unsigned int freqTable[FREQTABLE_SIZE];
1950c0d06caSMauro Carvalho Chehab 	unsigned int freqProgSlot;
1960c0d06caSMauro Carvalho Chehab 
1970c0d06caSMauro Carvalho Chehab 	/* Stuff for handling low level control interaction with device */
1980c0d06caSMauro Carvalho Chehab 	struct mutex ctl_lock_mutex;
1990c0d06caSMauro Carvalho Chehab 	int ctl_lock_held;  /* For debugging */
2000c0d06caSMauro Carvalho Chehab 	struct urb *ctl_write_urb;
2010c0d06caSMauro Carvalho Chehab 	struct urb *ctl_read_urb;
2020c0d06caSMauro Carvalho Chehab 	unsigned char *ctl_write_buffer;
2030c0d06caSMauro Carvalho Chehab 	unsigned char *ctl_read_buffer;
2040c0d06caSMauro Carvalho Chehab 	int ctl_write_pend_flag;
2050c0d06caSMauro Carvalho Chehab 	int ctl_read_pend_flag;
2060c0d06caSMauro Carvalho Chehab 	int ctl_timeout_flag;
2070c0d06caSMauro Carvalho Chehab 	struct completion ctl_done;
2080c0d06caSMauro Carvalho Chehab 	unsigned char cmd_buffer[PVR2_CTL_BUFFSIZE];
2090c0d06caSMauro Carvalho Chehab 	int cmd_debug_state;               // Low level command debugging info
2100c0d06caSMauro Carvalho Chehab 	unsigned char cmd_debug_code;      //
2110c0d06caSMauro Carvalho Chehab 	unsigned int cmd_debug_write_len;  //
2120c0d06caSMauro Carvalho Chehab 	unsigned int cmd_debug_read_len;   //
2130c0d06caSMauro Carvalho Chehab 
2140c0d06caSMauro Carvalho Chehab 	/* Bits of state that describe what is going on with various parts
2150c0d06caSMauro Carvalho Chehab 	   of the driver. */
2160c0d06caSMauro Carvalho Chehab 	int state_pathway_ok;         /* Pathway config is ok */
2170c0d06caSMauro Carvalho Chehab 	int state_encoder_ok;         /* Encoder is operational */
2180c0d06caSMauro Carvalho Chehab 	int state_encoder_run;        /* Encoder is running */
2190c0d06caSMauro Carvalho Chehab 	int state_encoder_config;     /* Encoder is configured */
2200c0d06caSMauro Carvalho Chehab 	int state_encoder_waitok;     /* Encoder pre-wait done */
2210c0d06caSMauro Carvalho Chehab 	int state_encoder_runok;      /* Encoder has run for >= .25 sec */
2220c0d06caSMauro Carvalho Chehab 	int state_decoder_run;        /* Decoder is running */
2230c0d06caSMauro Carvalho Chehab 	int state_decoder_ready;      /* Decoder is stabilized & streamable */
2240c0d06caSMauro Carvalho Chehab 	int state_usbstream_run;      /* FX2 is streaming */
2250c0d06caSMauro Carvalho Chehab 	int state_decoder_quiescent;  /* Decoder idle for minimal interval */
2260c0d06caSMauro Carvalho Chehab 	int state_pipeline_config;    /* Pipeline is configured */
2270c0d06caSMauro Carvalho Chehab 	int state_pipeline_req;       /* Somebody wants to stream */
2280c0d06caSMauro Carvalho Chehab 	int state_pipeline_pause;     /* Pipeline must be paused */
2290c0d06caSMauro Carvalho Chehab 	int state_pipeline_idle;      /* Pipeline not running */
2300c0d06caSMauro Carvalho Chehab 
2310c0d06caSMauro Carvalho Chehab 	/* This is the master state of the driver.  It is the combined
2320c0d06caSMauro Carvalho Chehab 	   result of other bits of state.  Examining this will indicate the
2330c0d06caSMauro Carvalho Chehab 	   overall state of the driver.  Values here are one of
2340c0d06caSMauro Carvalho Chehab 	   PVR2_STATE_xxxx */
2350c0d06caSMauro Carvalho Chehab 	unsigned int master_state;
2360c0d06caSMauro Carvalho Chehab 
2370c0d06caSMauro Carvalho Chehab 	/* True if device led is currently on */
2380c0d06caSMauro Carvalho Chehab 	int led_on;
2390c0d06caSMauro Carvalho Chehab 
2400c0d06caSMauro Carvalho Chehab 	/* True if states must be re-evaluated */
2410c0d06caSMauro Carvalho Chehab 	int state_stale;
2420c0d06caSMauro Carvalho Chehab 
2430c0d06caSMauro Carvalho Chehab 	void (*state_func)(void *);
2440c0d06caSMauro Carvalho Chehab 	void *state_data;
2450c0d06caSMauro Carvalho Chehab 
2460c0d06caSMauro Carvalho Chehab 	/* Timer for measuring required decoder settling time before we're
2470c0d06caSMauro Carvalho Chehab 	   allowed to fire it up again. */
2480c0d06caSMauro Carvalho Chehab 	struct timer_list quiescent_timer;
2490c0d06caSMauro Carvalho Chehab 
2500c0d06caSMauro Carvalho Chehab 	/* Timer for measuring decoder stabilization time, which is the
2510c0d06caSMauro Carvalho Chehab 	   amount of time we need to let the decoder run before we can
2520c0d06caSMauro Carvalho Chehab 	   trust its output (otherwise the encoder might see garbage and
2530c0d06caSMauro Carvalho Chehab 	   then fail to start correctly). */
2540c0d06caSMauro Carvalho Chehab 	struct timer_list decoder_stabilization_timer;
2550c0d06caSMauro Carvalho Chehab 
2560c0d06caSMauro Carvalho Chehab 	/* Timer for measuring encoder pre-wait time */
2570c0d06caSMauro Carvalho Chehab 	struct timer_list encoder_wait_timer;
2580c0d06caSMauro Carvalho Chehab 
2590c0d06caSMauro Carvalho Chehab 	/* Timer for measuring encoder minimum run time */
2600c0d06caSMauro Carvalho Chehab 	struct timer_list encoder_run_timer;
2610c0d06caSMauro Carvalho Chehab 
2620c0d06caSMauro Carvalho Chehab 	/* Place to block while waiting for state changes */
2630c0d06caSMauro Carvalho Chehab 	wait_queue_head_t state_wait_data;
2640c0d06caSMauro Carvalho Chehab 
2650c0d06caSMauro Carvalho Chehab 
2660c0d06caSMauro Carvalho Chehab 	int force_dirty;        /* consider all controls dirty if true */
2670c0d06caSMauro Carvalho Chehab 	int flag_ok;            /* device in known good state */
2680c0d06caSMauro Carvalho Chehab 	int flag_modulefail;    /* true if at least one module failed to load */
2690c0d06caSMauro Carvalho Chehab 	int flag_disconnected;  /* flag_ok == 0 due to disconnect */
2700c0d06caSMauro Carvalho Chehab 	int flag_init_ok;       /* true if structure is fully initialized */
2710c0d06caSMauro Carvalho Chehab 	int fw1_state;          /* current situation with fw1 */
2720c0d06caSMauro Carvalho Chehab 	int pathway_state;      /* one of PVR2_PATHWAY_xxx */
2730c0d06caSMauro Carvalho Chehab 	int flag_decoder_missed;/* We've noticed missing decoder */
2740c0d06caSMauro Carvalho Chehab 	int flag_tripped;       /* Indicates overall failure to start */
2750c0d06caSMauro Carvalho Chehab 
2760c0d06caSMauro Carvalho Chehab 	unsigned int decoder_client_id;
2770c0d06caSMauro Carvalho Chehab 
2780c0d06caSMauro Carvalho Chehab 	// CPU firmware info (used to help find / save firmware data)
2790c0d06caSMauro Carvalho Chehab 	char *fw_buffer;
2800c0d06caSMauro Carvalho Chehab 	unsigned int fw_size;
2810c0d06caSMauro Carvalho Chehab 	int fw_cpu_flag; /* True if we are dealing with the CPU */
2820c0d06caSMauro Carvalho Chehab 
2830c0d06caSMauro Carvalho Chehab 	/* Tuner / frequency control stuff */
2840c0d06caSMauro Carvalho Chehab 	unsigned int tuner_type;
2850c0d06caSMauro Carvalho Chehab 	int tuner_updated;
2860c0d06caSMauro Carvalho Chehab 	unsigned int freqValTelevision;  /* Current freq for tv mode */
2870c0d06caSMauro Carvalho Chehab 	unsigned int freqValRadio;       /* Current freq for radio mode */
2880c0d06caSMauro Carvalho Chehab 	unsigned int freqSlotTelevision; /* Current slot for tv mode */
2890c0d06caSMauro Carvalho Chehab 	unsigned int freqSlotRadio;      /* Current slot for radio mode */
2900c0d06caSMauro Carvalho Chehab 	unsigned int freqSelector;       /* 0=radio 1=television */
2910c0d06caSMauro Carvalho Chehab 	int freqDirty;
2920c0d06caSMauro Carvalho Chehab 
2930c0d06caSMauro Carvalho Chehab 	/* Current tuner info - this information is polled from the I2C bus */
2940c0d06caSMauro Carvalho Chehab 	struct v4l2_tuner tuner_signal_info;
2950c0d06caSMauro Carvalho Chehab 	int tuner_signal_stale;
2960c0d06caSMauro Carvalho Chehab 
2970c0d06caSMauro Carvalho Chehab 	/* Cropping capability info */
2980c0d06caSMauro Carvalho Chehab 	struct v4l2_cropcap cropcap_info;
2990c0d06caSMauro Carvalho Chehab 	int cropcap_stale;
3000c0d06caSMauro Carvalho Chehab 
3010c0d06caSMauro Carvalho Chehab 	/* Video standard handling */
3020c0d06caSMauro Carvalho Chehab 	v4l2_std_id std_mask_eeprom; // Hardware supported selections
3030c0d06caSMauro Carvalho Chehab 	v4l2_std_id std_mask_avail;  // Which standards we may select from
3040c0d06caSMauro Carvalho Chehab 	v4l2_std_id std_mask_cur;    // Currently selected standard(s)
3050c0d06caSMauro Carvalho Chehab 	int std_enum_cur;            // selected standard enumeration value
3060c0d06caSMauro Carvalho Chehab 	int std_dirty;               // True if std_mask_cur has changed
3070c0d06caSMauro Carvalho Chehab 	struct pvr2_ctl_info std_info_enum;
3080c0d06caSMauro Carvalho Chehab 	struct pvr2_ctl_info std_info_avail;
3090c0d06caSMauro Carvalho Chehab 	struct pvr2_ctl_info std_info_cur;
3100c0d06caSMauro Carvalho Chehab 	struct pvr2_ctl_info std_info_detect;
3110c0d06caSMauro Carvalho Chehab 
3120c0d06caSMauro Carvalho Chehab 	// Generated string names, one per actual V4L2 standard
3130c0d06caSMauro Carvalho Chehab 	const char *std_mask_ptrs[32];
3140c0d06caSMauro Carvalho Chehab 	char std_mask_names[32][16];
3150c0d06caSMauro Carvalho Chehab 
3160c0d06caSMauro Carvalho Chehab 	int unit_number;             /* ID for driver instance */
3170c0d06caSMauro Carvalho Chehab 	unsigned long serial_number; /* ID for hardware itself */
3180c0d06caSMauro Carvalho Chehab 
3190c0d06caSMauro Carvalho Chehab 	char bus_info[32]; /* Bus location info */
3200c0d06caSMauro Carvalho Chehab 
3210c0d06caSMauro Carvalho Chehab 	/* Minor numbers used by v4l logic (yes, this is a hack, as there
3220c0d06caSMauro Carvalho Chehab 	   should be no v4l junk here).  Probably a better way to do this. */
3230c0d06caSMauro Carvalho Chehab 	int v4l_minor_number_video;
3240c0d06caSMauro Carvalho Chehab 	int v4l_minor_number_vbi;
3250c0d06caSMauro Carvalho Chehab 	int v4l_minor_number_radio;
3260c0d06caSMauro Carvalho Chehab 
3270c0d06caSMauro Carvalho Chehab 	/* Bit mask of PVR2_CVAL_INPUT choices which are valid for the hardware */
3280c0d06caSMauro Carvalho Chehab 	unsigned int input_avail_mask;
3290c0d06caSMauro Carvalho Chehab 	/* Bit mask of PVR2_CVAL_INPUT choices which are currently allowed */
3300c0d06caSMauro Carvalho Chehab 	unsigned int input_allowed_mask;
3310c0d06caSMauro Carvalho Chehab 
3320c0d06caSMauro Carvalho Chehab 	/* Location of eeprom or a negative number if none */
3330c0d06caSMauro Carvalho Chehab 	int eeprom_addr;
3340c0d06caSMauro Carvalho Chehab 
3350c0d06caSMauro Carvalho Chehab 	enum pvr2_config active_stream_type;
3360c0d06caSMauro Carvalho Chehab 	enum pvr2_config desired_stream_type;
3370c0d06caSMauro Carvalho Chehab 
3380c0d06caSMauro Carvalho Chehab 	/* Control state needed for cx2341x module */
3390c0d06caSMauro Carvalho Chehab 	struct cx2341x_mpeg_params enc_cur_state;
3400c0d06caSMauro Carvalho Chehab 	struct cx2341x_mpeg_params enc_ctl_state;
3410c0d06caSMauro Carvalho Chehab 	/* True if an encoder attribute has changed */
3420c0d06caSMauro Carvalho Chehab 	int enc_stale;
3430c0d06caSMauro Carvalho Chehab 	/* True if an unsafe encoder attribute has changed */
3440c0d06caSMauro Carvalho Chehab 	int enc_unsafe_stale;
3450c0d06caSMauro Carvalho Chehab 	/* True if enc_cur_state is valid */
3460c0d06caSMauro Carvalho Chehab 	int enc_cur_valid;
3470c0d06caSMauro Carvalho Chehab 
3480c0d06caSMauro Carvalho Chehab 	/* Control state */
3490c0d06caSMauro Carvalho Chehab #define VCREATE_DATA(lab) int lab##_val; int lab##_dirty
3500c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(brightness);
3510c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(contrast);
3520c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(saturation);
3530c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(hue);
3540c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(volume);
3550c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(balance);
3560c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(bass);
3570c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(treble);
3580c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(mute);
3590c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(cropl);
3600c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(cropt);
3610c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(cropw);
3620c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(croph);
3630c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(input);
3640c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(audiomode);
3650c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(res_hor);
3660c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(res_ver);
3670c0d06caSMauro Carvalho Chehab 	VCREATE_DATA(srate);
3680c0d06caSMauro Carvalho Chehab #undef VCREATE_DATA
3690c0d06caSMauro Carvalho Chehab 
3700c0d06caSMauro Carvalho Chehab 	struct pvr2_ctld_info *mpeg_ctrl_info;
3710c0d06caSMauro Carvalho Chehab 
3720c0d06caSMauro Carvalho Chehab 	struct pvr2_ctrl *controls;
3730c0d06caSMauro Carvalho Chehab 	unsigned int control_cnt;
3740c0d06caSMauro Carvalho Chehab };
3750c0d06caSMauro Carvalho Chehab 
3760c0d06caSMauro Carvalho Chehab /* This function gets the current frequency */
3770c0d06caSMauro Carvalho Chehab unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *);
3780c0d06caSMauro Carvalho Chehab 
3790c0d06caSMauro Carvalho Chehab void pvr2_hdw_status_poll(struct pvr2_hdw *);
3800c0d06caSMauro Carvalho Chehab 
3810c0d06caSMauro Carvalho Chehab #endif /* __PVRUSB2_HDW_INTERNAL_H */
382