/*
 * Driver for the VINO (Video In No Out) system found in SGI Indys.
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License version 2 as published by the Free Software Foundation.
 *
 * Copyright (C) 1999 Ulf Karlsson <ulfc@bun.falkenberg.se>
 * Copyright (C) 2003 Ladislav Michl <ladis@linux-mips.org>
 */

#ifndef _VINO_H_
#define _VINO_H_

#define VINO_BASE	0x00080000	/* Vino is in the EISA address space,
					 * but it is not an EISA bus card */
#define VINO_PAGE_SIZE	4096

struct sgi_vino_channel {
	u32 _pad_alpha;
	volatile u32 alpha;

#define VINO_CLIP_X(x)		((x) & 0x3ff)		/* bits 0:9 */
#define VINO_CLIP_ODD(x)	(((x) & 0x1ff) << 10)	/* bits 10:18 */
#define VINO_CLIP_EVEN(x)	(((x) & 0x1ff) << 19)	/* bits 19:27 */
	u32 _pad_clip_start;
	volatile u32 clip_start;
	u32 _pad_clip_end;
	volatile u32 clip_end;

#define VINO_FRAMERT_FULL	0xfff
#define VINO_FRAMERT_PAL	(1<<0)			/* 0=NTSC 1=PAL */
#define VINO_FRAMERT_RT(x)	(((x) & 0xfff) << 1)	/* bits 1:12 */
	u32 _pad_frame_rate;
	volatile u32 frame_rate;

	u32 _pad_field_counter;
	volatile u32 field_counter;
	u32 _pad_line_size;
	volatile u32 line_size;
	u32 _pad_line_count;
	volatile u32 line_count;
	u32 _pad_page_index;
	volatile u32 page_index;
	u32 _pad_next_4_desc;
	volatile u32 next_4_desc;
	u32 _pad_start_desc_tbl;
	volatile u32 start_desc_tbl;

#define VINO_DESC_JUMP		(1<<30)
#define VINO_DESC_STOP		(1<<31)
#define VINO_DESC_VALID		(1<<32)
	u32 _pad_desc_0;
	volatile u32 desc_0;
	u32 _pad_desc_1;
	volatile u32 desc_1;
	u32 _pad_desc_2;
	volatile u32 desc_2;
	u32 _pad_Bdesc_3;
	volatile u32 desc_3;

	u32 _pad_fifo_thres;
	volatile u32 fifo_thres;
	u32 _pad_fifo_read;
	volatile u32 fifo_read;
	u32 _pad_fifo_write;
	volatile u32 fifo_write;
};

struct sgi_vino {
#define VINO_CHIP_ID		0xb
#define VINO_REV_NUM(x)		((x) & 0x0f)
#define VINO_ID_VALUE(x)	(((x) & 0xf0) >> 4)
	u32 _pad_rev_id;
	volatile u32 rev_id;

#define VINO_CTRL_LITTLE_ENDIAN		(1<<0)
#define VINO_CTRL_A_EOF_INT		(1<<1)	/* Field transferred int */
#define VINO_CTRL_A_FIFO_INT		(1<<2)	/* FIFO overflow int */
#define VINO_CTRL_A_EOD_INT		(1<<3)	/* End of desc table int */
#define VINO_CTRL_A_INT			(VINO_CTRL_A_EOF_INT | \
					 VINO_CTRL_A_FIFO_INT | \
					 VINO_CTRL_A_EOD_INT)
#define VINO_CTRL_B_EOF_INT		(1<<4)	/* Field transferred int */
#define VINO_CTRL_B_FIFO_INT		(1<<5)	/* FIFO overflow int */
#define VINO_CTRL_B_EOD_INT		(1<<6)	/* End of desc table int */
#define VINO_CTRL_B_INT			(VINO_CTRL_B_EOF_INT | \
					 VINO_CTRL_B_FIFO_INT | \
					 VINO_CTRL_B_EOD_INT)
#define VINO_CTRL_A_DMA_ENBL		(1<<7)
#define VINO_CTRL_A_INTERLEAVE_ENBL	(1<<8)
#define VINO_CTRL_A_SYNC_ENBL		(1<<9)
#define VINO_CTRL_A_SELECT		(1<<10)	/* 1=D1 0=Philips */
#define VINO_CTRL_A_RGB			(1<<11)	/* 1=RGB 0=YUV */
#define VINO_CTRL_A_LUMA_ONLY		(1<<12)
#define VINO_CTRL_A_DEC_ENBL		(1<<13)	/* Decimation */
#define VINO_CTRL_A_DEC_SCALE_MASK	0x1c000	/* bits 14:17 */
#define VINO_CTRL_A_DEC_SCALE_SHIFT	(14)
#define VINO_CTRL_A_DEC_HOR_ONLY	(1<<17)	/* Horizontal only */
#define VINO_CTRL_A_DITHER		(1<<18)	/* 24 -> 8 bit dither */
#define VINO_CTRL_B_DMA_ENBL		(1<<19)
#define VINO_CTRL_B_INTERLEAVE_ENBL	(1<<20)
#define VINO_CTRL_B_SYNC_ENBL		(1<<21)
#define VINO_CTRL_B_SELECT		(1<<22)	/* 1=D1 0=Philips */
#define VINO_CTRL_B_RGB			(1<<23)	/* 1=RGB 0=YUV */
#define VINO_CTRL_B_LUMA_ONLY		(1<<24)
#define VINO_CTRL_B_DEC_ENBL		(1<<25)	/* Decimation */
#define VINO_CTRL_B_DEC_SCALE_MASK	0x1c000000	/* bits 26:28 */
#define VINO_CTRL_B_DEC_SCALE_SHIFT	(26)
#define VINO_CTRL_B_DEC_HOR_ONLY	(1<<29)	/* Decimation horizontal only */
#define VINO_CTRL_B_DITHER		(1<<30)	/* ChanB 24 -> 8 bit dither */
	u32 _pad_control;
	volatile u32 control;

#define VINO_INTSTAT_A_EOF		(1<<0)	/* Field transferred int */
#define VINO_INTSTAT_A_FIFO		(1<<1)	/* FIFO overflow int */
#define VINO_INTSTAT_A_EOD		(1<<2)	/* End of desc table int */
#define VINO_INTSTAT_A			(VINO_INTSTAT_A_EOF | \
					 VINO_INTSTAT_A_FIFO | \
					 VINO_INTSTAT_A_EOD)
#define VINO_INTSTAT_B_EOF		(1<<3)	/* Field transferred int */
#define VINO_INTSTAT_B_FIFO		(1<<4)	/* FIFO overflow int */
#define VINO_INTSTAT_B_EOD		(1<<5)	/* End of desc table int */
#define VINO_INTSTAT_B			(VINO_INTSTAT_B_EOF | \
					 VINO_INTSTAT_B_FIFO | \
					 VINO_INTSTAT_B_EOD)
	u32 _pad_intr_status;
	volatile u32 intr_status;

	u32 _pad_i2c_control;
	volatile u32 i2c_control;
	u32 _pad_i2c_data;
	volatile u32 i2c_data;

	struct sgi_vino_channel a;
	struct sgi_vino_channel b;
};

#endif
