Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd8b281a authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (6093): ivtv: reorganized and cleanup ivtv struct

parent 33c0fcad
Loading
Loading
Loading
Loading
+4 −11
Original line number Diff line number Diff line
@@ -667,7 +667,7 @@ static int __devinit ivtv_init_struct1(struct ivtv *itv)
	cx2341x_fill_defaults(&itv->params);
	itv->params.port = CX2341X_PORT_MEMORY;
	itv->params.capabilities = CX2341X_CAP_HAS_SLICED_VBI;
	init_waitqueue_head(&itv->cap_w);
	init_waitqueue_head(&itv->eos_waitq);
	init_waitqueue_head(&itv->event_waitq);
	init_waitqueue_head(&itv->vsync_waitq);
	init_waitqueue_head(&itv->dma_waitq);
@@ -713,14 +713,6 @@ static void __devinit ivtv_init_struct2(struct ivtv *itv)
			break;
	itv->nof_audio_inputs = i;

	/* 0x00EF = saa7114(239) 0x00F0 = saa7115(240) 0x0106 = micro */
	if (itv->card->hw_all & (IVTV_HW_SAA7115 | IVTV_HW_SAA717X))
		itv->digitizer = 0xF1;
	else if (itv->card->hw_all & IVTV_HW_SAA7114)
		itv->digitizer = 0xEF;
	else /* cx25840 */
		itv->digitizer = 0x140;

	if (itv->card->hw_all & IVTV_HW_CX25840) {
		itv->vbi.sliced_size = 288;  /* multiple of 16, real size = 284 */
	} else {
@@ -749,6 +741,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev,
			  const struct pci_device_id *pci_id)
{
	u16 cmd;
	u8 card_rev;
	unsigned char pci_latency;

	IVTV_DEBUG_INFO("Enabling pci device\n");
@@ -795,7 +788,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev,
	}
	IVTV_DEBUG_INFO("Bus Mastering Enabled.\n");

	pci_read_config_byte(dev, PCI_CLASS_REVISION, &itv->card_rev);
	pci_read_config_byte(dev, PCI_CLASS_REVISION, &card_rev);
	pci_read_config_byte(dev, PCI_LATENCY_TIMER, &pci_latency);

	if (pci_latency < 64 && ivtv_pci_latency) {
@@ -812,7 +805,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev,

	IVTV_DEBUG_INFO("%d (rev %d) at %02x:%02x.%x, "
		   "irq: %d, latency: %d, memory: 0x%lx\n",
		   itv->dev->device, itv->card_rev, dev->bus->number,
		   itv->dev->device, card_rev, dev->bus->number,
		   PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
		   itv->dev->irq, pci_latency, (unsigned long)itv->base_addr);

+122 −121
Original line number Diff line number Diff line
@@ -550,133 +550,134 @@ struct ivtv_card;

/* Struct to hold info about ivtv cards */
struct ivtv {
	/* General fixed card data */
	int num;			/* board number, -1 during init! */
	char name[8];			/* board name for printk and interrupts (e.g. 'ivtv0') */
	struct pci_dev *dev;		/* PCI device */
	const struct ivtv_card *card;	/* card information */
	const char *card_name;          /* full name of the card */
	u8 has_cx23415;			/* 1 if it is a cx23415 based card, 0 for cx23416 */
	u8 is_50hz;
	u8 is_60hz;
	u8 is_out_50hz;
	u8 is_out_60hz;
	u8 pvr150_workaround;           /* 1 if the cx25840 needs to workaround a PVR150 bug */
	u8 nof_inputs;			/* number of video inputs */
	u8 nof_audio_inputs;		/* number of audio inputs */
	u32 v4l2_cap;			/* V4L2 capabilities of card */
	u32 hw_flags; 		/* Hardware description of the board */
	int tunerid;		/* Userspace tuner ID for experimental Xceive tuner support */

	/* controlling Video decoder function */
	u32 hw_flags; 			/* hardware description of the board */
	int tunerid;			/* userspace tuner ID for experimental Xceive tuner support */
	v4l2_std_id tuner_std;		/* the norm of the card's tuner (fixed) */
					/* controlling video decoder function */
	int (*video_dec_func)(struct ivtv *, unsigned int, void *);
	u32 base_addr;                  /* PCI resource base address */
	volatile void __iomem *enc_mem; /* pointer to mapped encoder memory */
	volatile void __iomem *dec_mem; /* pointer to mapped decoder memory */
	volatile void __iomem *reg_mem; /* pointer to mapped registers */
	struct ivtv_options options; 	/* user options */


	struct ivtv_options options; 	/* User options */
	int stream_buf_size[IVTV_MAX_STREAMS]; /* Stream buffer size */
	struct ivtv_stream streams[IVTV_MAX_STREAMS]; 	/* Stream data */
	int speed;
	u8 speed_mute_audio;
	/* High-level state info */
	unsigned long i_flags;          /* global ivtv flags */
	u8 is_50hz;                     /* 1 if the current capture standard is 50 Hz */
	u8 is_60hz                      /* 1 if the current capture standard is 60 Hz */;
	u8 is_out_50hz                  /* 1 if the current TV output standard is 50 Hz */;
	u8 is_out_60hz                  /* 1 if the current TV output standard is 60 Hz */;
	int output_mode;                /* decoder output mode: NONE, MPG, YUV, UDMA YUV, passthrough */
	u32 audio_input;                /* current audio input */
	u32 active_input;               /* current video input */
	u32 active_output;              /* current video output */
	v4l2_std_id std;                /* current capture TV standard */
	v4l2_std_id std_out;            /* current TV output standard */
	u8 audio_stereo_mode;           /* decoder setting how to handle stereo MPEG audio */
	u8 audio_bilingual_mode;        /* decoder setting how to handle bilingual MPEG audio */
	struct cx2341x_mpeg_params params;              /* current encoder parameters */


	/* Locking */
	spinlock_t lock;                /* lock access to this struct */
					/* mutex used to serialize open/close/start/stop/ioctl operations */
	struct mutex serialize_lock;


	/* Streams */
	int stream_buf_size[IVTV_MAX_STREAMS];          /* stream buffer size */
	struct ivtv_stream streams[IVTV_MAX_STREAMS]; 	/* stream data */
	atomic_t capturing;		/* count number of active capture streams */
	atomic_t decoding;		/* count number of active decoding streams */
	u32 irq_rr_idx; /* Round-robin stream index */
	int cur_dma_stream;	/* index of stream doing DMA */
	int cur_pio_stream;	/* index of stream doing PIO */
	u32 dma_data_req_offset;
	u32 dma_data_req_size;
	int dma_retries;
	int output_mode;        /* NONE, MPG, YUV, UDMA YUV, passthrough */
	spinlock_t lock;        /* lock access to this struct */
	int search_pack_header;

	spinlock_t dma_reg_lock; /* lock access to DMA engine registers */
	struct mutex serialize_lock;  /* lock used to serialize starting streams */

	/* User based DMA for OSD */
	struct ivtv_user_dma udma;
	/* Interrupts & DMA */
	u32 irqmask;                    /* active interrupts */
	u32 irq_rr_idx;                 /* round-robin stream index */
	struct workqueue_struct *irq_work_queues;       /* workqueue for PIO/YUV/VBI actions */
	struct work_struct irq_work_queue;              /* work entry */
	spinlock_t dma_reg_lock;        /* lock access to DMA engine registers */
	int cur_dma_stream;		/* index of current stream doing DMA (-1 if none) */
	int cur_pio_stream;		/* index of current stream doing PIO (-1 if none) */
	u32 dma_data_req_offset;        /* store offset in decoder memory of current DMA request */
	u32 dma_data_req_size;          /* store size of current DMA request */
	int dma_retries;                /* current DMA retry attempt */
	struct ivtv_user_dma udma;      /* user based DMA for OSD */
	struct timer_list dma_timer;    /* timer used to catch unfinished DMAs */
	u32 last_vsync_frame;           /* last seen vsync field */
	wait_queue_head_t dma_waitq;    /* wake up when the current DMA is finished */
	wait_queue_head_t eos_waitq;    /* wake up when EOS arrives */
	wait_queue_head_t event_waitq;  /* wake up when the next decoder event arrives */
	wait_queue_head_t vsync_waitq;  /* wake up when the next decoder vsync arrives */


	/* Mailbox */
	struct ivtv_mailbox_data enc_mbox;              /* encoder mailboxes */
	struct ivtv_mailbox_data dec_mbox;              /* decoder mailboxes */
	struct ivtv_api_cache api_cache[256]; 		/* cached API commands */


	/* I2C */
	struct i2c_adapter i2c_adap;
	struct i2c_algo_bit_data i2c_algo;
	struct i2c_client i2c_client;
	struct i2c_client *i2c_clients[I2C_CLIENTS_MAX];/* pointers to all I2C clients */
	int i2c_state;                  /* i2c bit state */
	struct mutex i2c_bus_lock;      /* lock i2c bus */

	int open_id;		/* incremented each time an open occurs, used as unique ID.
				   starts at 1, so 0 can be used as uninitialized value
				   in the stream->id. */

	u32 base_addr;
	u32 irqmask;
	/* Program Index information */
	u32 pgm_info_offset;            /* start of pgm info in encoder memory */
	u32 pgm_info_num;               /* number of elements in the pgm cyclic buffer in encoder memory */
	u32 pgm_info_write_idx;         /* last index written by the card that was transferred to pgm_info[] */
	u32 pgm_info_read_idx;          /* last index in pgm_info read by the application */
	struct v4l2_enc_idx_entry pgm_info[IVTV_MAX_PGM_INDEX]; /* filled from the pgm cyclic buffer on the card */

	struct v4l2_prio_state prio;
	struct workqueue_struct *irq_work_queues;
	struct work_struct irq_work_queue;
	struct timer_list dma_timer; /* Timer used to catch unfinished DMAs */

	struct vbi_info vbi;
	/* Miscellaneous */
	u32 open_id;			/* incremented each time an open occurs, is >= 1 */
	struct v4l2_prio_state prio;    /* priority state */
	int search_pack_header;         /* 1 if ivtv_copy_buf_to_user() is scanning for a pack header (0xba) */
	int speed;                      /* current playback speed setting */
	u8 speed_mute_audio;            /* 1 if audio should be muted when fast forward */
	u64 mpg_data_received;          /* number of bytes received from the MPEG stream */
	u64 vbi_data_inserted;          /* number of VBI bytes inserted into the MPEG stream */
	u32 last_dec_timing[3];         /* cache last retrieved pts/scr/frame values */
	unsigned long dualwatch_jiffies;/* jiffies value of the previous dualwatch check */
	u16 dualwatch_stereo_mode;      /* current detected dualwatch stereo mode */

	struct ivtv_mailbox_data enc_mbox;
	struct ivtv_mailbox_data dec_mbox;
	struct ivtv_api_cache api_cache[256]; 	/* Cached API Commands */

	u8 card_rev;
	volatile void __iomem *enc_mem, *dec_mem, *reg_mem;
	/* VBI state info */
	struct vbi_info vbi;            /* VBI-specific data */

	u32 pgm_info_offset;
	u32 pgm_info_num;
	u32 pgm_info_write_idx;
	u32 pgm_info_read_idx;
	struct v4l2_enc_idx_entry pgm_info[IVTV_MAX_PGM_INDEX];

	u64 mpg_data_received;
	u64 vbi_data_inserted;
	/* YUV playback */
	struct yuv_playback_info yuv_info;              /* YUV playback data */

	wait_queue_head_t cap_w;
	/* when the next decoder event arrives this queue is woken up */
	wait_queue_head_t event_waitq;
	/* when the next decoder vsync arrives this queue is woken up */
	wait_queue_head_t vsync_waitq;
	/* when the current DMA is finished this queue is woken up */
	wait_queue_head_t dma_waitq;

	/* OSD support */
	unsigned long osd_video_pbase;
	int osd_global_alpha_state; /* 0=off : 1=on */
	int osd_local_alpha_state;  /* 0=off : 1=on */
	int osd_color_key_state;    /* 0=off : 1=on */
	u8  osd_global_alpha;       /* Current global alpha */
	u32 osd_color_key;          /* Current color key */
	u32 osd_pixelformat; 	    /* Current pixel format */
	struct v4l2_rect osd_rect;  /* Current OSD position and size */
	struct v4l2_rect main_rect; /* Current Main window position and size */

	u32 last_dec_timing[3];     /* Store last retrieved pts/scr/frame values */

	/* i2c */
	struct i2c_adapter i2c_adap;
	struct i2c_algo_bit_data i2c_algo;
	struct i2c_client i2c_client;
	struct mutex i2c_bus_lock;
	int i2c_state;
	struct i2c_client *i2c_clients[I2C_CLIENTS_MAX];

	/* v4l2 and User settings */

	/* codec settings */
	struct cx2341x_mpeg_params params;
	u32 audio_input;
	u32 active_input;
	u32 active_output;
	v4l2_std_id std;
	v4l2_std_id std_out;
	v4l2_std_id tuner_std;	/* The norm of the tuner (fixed) */
	u8 audio_stereo_mode;
	u8 audio_bilingual_mode;

	/* dualwatch */
	unsigned long dualwatch_jiffies;
	u16 dualwatch_stereo_mode;

	/* Digitizer type */
	int digitizer;		/* 0x00EF = saa7114 0x00FO = saa7115 0x0106 = mic */

	u32 lastVsyncFrame;

	struct yuv_playback_info yuv_info;
	struct osd_info *osd_info;
	int osd_global_alpha_state;     /* 1 = global alpha is on */
	int osd_local_alpha_state;      /* 1 = local alpha is on */
	int osd_chroma_key_state;       /* 1 = chroma-keying is on */
	u8  osd_global_alpha;           /* current global alpha */
	u32 osd_chroma_key;             /* current chroma key */
	u32 osd_pixelformat; 		/* current pixel format */
	struct v4l2_rect osd_rect;      /* current OSD position and size */
	struct v4l2_rect main_rect;     /* current Main window position and size */
	struct osd_info *osd_info;      /* ivtv-fb private OSD info */
};

/* Globals */
+1 −1
Original line number Diff line number Diff line
@@ -405,7 +405,7 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
			if (itv->is_50hz && trace > 312) trace -= 312;
			else if (itv->is_60hz && trace > 262) trace -= 262;
			if (trace == 1) vblank.flags |= FB_VBLANK_VSYNCING;
			vblank.count = itv->lastVsyncFrame;
			vblank.count = itv->last_vsync_frame;
			vblank.vcount = trace;
			vblank.hcount = 0;
			if (copy_to_user((void __user *)arg, &vblank, sizeof(vblank)))
+5 −5
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ void ivtv_set_osd_alpha(struct ivtv *itv)
{
	ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
		itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
	ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_color_key_state, itv->osd_color_key);
	ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
}

int ivtv_set_speed(struct ivtv *itv, int speed)
@@ -426,7 +426,7 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm
	case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
			return -EINVAL;
		fmt->fmt.win.chromakey = itv->osd_color_key;
		fmt->fmt.win.chromakey = itv->osd_chroma_key;
		fmt->fmt.win.global_alpha = itv->osd_global_alpha;
		break;

@@ -546,7 +546,7 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype,
		if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
			return -EINVAL;
		if (set_fmt) {
			itv->osd_color_key = fmt->fmt.win.chromakey;
			itv->osd_chroma_key = fmt->fmt.win.chromakey;
			itv->osd_global_alpha = fmt->fmt.win.global_alpha;
			ivtv_set_osd_alpha(itv);
		}
@@ -1197,7 +1197,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
			fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
		if (itv->osd_local_alpha_state)
			fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
		if (itv->osd_color_key_state)
		if (itv->osd_chroma_key_state)
			fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
		break;
	}
@@ -1209,7 +1209,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
			return -EINVAL;
		itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
		itv->osd_local_alpha_state = (fb->flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) != 0;
		itv->osd_color_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
		itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
		ivtv_set_osd_alpha(itv);
		break;
	}
+6 −6
Original line number Diff line number Diff line
@@ -750,8 +750,8 @@ static void ivtv_irq_vsync(struct ivtv *itv)
	if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");

	if (((frame ^ itv->yuv_info.sync_field[last_dma_frame]) == 0 &&
		((itv->lastVsyncFrame & 1) ^ itv->yuv_info.sync_field[last_dma_frame])) ||
			(frame != (itv->lastVsyncFrame & 1) && !itv->yuv_info.frame_interlaced)) {
		((itv->last_vsync_frame & 1) ^ itv->yuv_info.sync_field[last_dma_frame])) ||
			(frame != (itv->last_vsync_frame & 1) && !itv->yuv_info.frame_interlaced)) {
		int next_dma_frame = last_dma_frame;

		if (!(itv->yuv_info.frame_interlaced && itv->yuv_info.field_delay[next_dma_frame] && itv->yuv_info.fields_lapsed < 1)) {
@@ -766,10 +766,10 @@ static void ivtv_irq_vsync(struct ivtv *itv)
			}
		}
	}
	if (frame != (itv->lastVsyncFrame & 1)) {
	if (frame != (itv->last_vsync_frame & 1)) {
		struct ivtv_stream *s = ivtv_get_output_stream(itv);

		itv->lastVsyncFrame += 1;
		itv->last_vsync_frame += 1;
		if (frame == 0) {
			clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
			clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
@@ -834,7 +834,7 @@ irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
		 */
		if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
			/* vsync is enabled, see if we're in a new field */
			if ((itv->lastVsyncFrame & 1) != (read_reg(0x28c0) & 1)) {
			if ((itv->last_vsync_frame & 1) != (read_reg(0x28c0) & 1)) {
				/* New field, looks like we missed it */
				IVTV_DEBUG_YUV("VSync interrupt missed %d\n",read_reg(0x28c0)>>16);
				vsync_force = 1;
@@ -888,7 +888,7 @@ irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
	if (combo & IVTV_IRQ_ENC_EOS) {
		IVTV_DEBUG_IRQ("ENC EOS\n");
		set_bit(IVTV_F_I_EOS, &itv->i_flags);
		wake_up(&itv->cap_w);
		wake_up(&itv->eos_waitq);
	}

	if (combo & IVTV_IRQ_DEC_DATA_REQ) {
Loading