| #ifndef _AV7110_HW_H_ | 
 | #define _AV7110_HW_H_ | 
 |  | 
 | #include "av7110.h" | 
 |  | 
 | /* DEBI transfer mode defs */ | 
 |  | 
 | #define DEBINOSWAP 0x000e0000 | 
 | #define DEBISWAB   0x001e0000 | 
 | #define DEBISWAP   0x002e0000 | 
 |  | 
 | #define ARM_WAIT_FREE  (HZ) | 
 | #define ARM_WAIT_SHAKE (HZ/5) | 
 | #define ARM_WAIT_OSD (HZ) | 
 |  | 
 |  | 
 | enum av7110_bootstate | 
 | { | 
 | 	BOOTSTATE_BUFFER_EMPTY	= 0, | 
 | 	BOOTSTATE_BUFFER_FULL	= 1, | 
 | 	BOOTSTATE_AV7110_BOOT_COMPLETE	= 2 | 
 | }; | 
 |  | 
 | enum av7110_type_rec_play_format | 
 | {	RP_None, | 
 | 	AudioPES, | 
 | 	AudioMp2, | 
 | 	AudioPCM, | 
 | 	VideoPES, | 
 | 	AV_PES | 
 | }; | 
 |  | 
 | enum av7110_osd_palette_type | 
 | { | 
 | 	NoPalet =  0,	   /* No palette */ | 
 | 	Pal1Bit =  2,	   /* 2 colors for 1 Bit Palette    */ | 
 | 	Pal2Bit =  4,	   /* 4 colors for 2 bit palette    */ | 
 | 	Pal4Bit =  16,	   /* 16 colors for 4 bit palette   */ | 
 | 	Pal8Bit =  256	   /* 256 colors for 16 bit palette */ | 
 | }; | 
 |  | 
 | /* switch defines */ | 
 | #define SB_GPIO 3 | 
 | #define SB_OFF	SAA7146_GPIO_OUTLO  /* SlowBlank off (TV-Mode) */ | 
 | #define SB_ON	SAA7146_GPIO_INPUT  /* SlowBlank on  (AV-Mode) */ | 
 | #define SB_WIDE SAA7146_GPIO_OUTHI  /* SlowBlank 6V  (16/9-Mode) (not implemented) */ | 
 |  | 
 | #define FB_GPIO 1 | 
 | #define FB_OFF	SAA7146_GPIO_LO     /* FastBlank off (CVBS-Mode) */ | 
 | #define FB_ON	SAA7146_GPIO_OUTHI  /* FastBlank on  (RGB-Mode) */ | 
 | #define FB_LOOP	SAA7146_GPIO_INPUT  /* FastBlank loop-through (PC graphics ???) */ | 
 |  | 
 | enum av7110_video_output_mode | 
 | { | 
 | 	NO_OUT	     = 0,		/* disable analog output */ | 
 | 	CVBS_RGB_OUT = 1, | 
 | 	CVBS_YC_OUT  = 2, | 
 | 	YC_OUT	     = 3 | 
 | }; | 
 |  | 
 | /* firmware internal msg q status: */ | 
 | #define GPMQFull	0x0001		/* Main Message Queue Full */ | 
 | #define GPMQOver	0x0002		/* Main Message Queue Overflow */ | 
 | #define HPQFull		0x0004		/* High Priority Msg Queue Full */ | 
 | #define HPQOver		0x0008 | 
 | #define OSDQFull	0x0010		/* OSD Queue Full */ | 
 | #define OSDQOver	0x0020 | 
 | #define GPMQBusy	0x0040		/* Queue not empty, FW >= 261d */ | 
 | #define HPQBusy		0x0080 | 
 | #define OSDQBusy	0x0100 | 
 |  | 
 | /* hw section filter flags */ | 
 | #define	SECTION_EIT		0x01 | 
 | #define	SECTION_SINGLE		0x00 | 
 | #define	SECTION_CYCLE		0x02 | 
 | #define	SECTION_CONTINUOS	0x04 | 
 | #define	SECTION_MODE		0x06 | 
 | #define SECTION_IPMPE		0x0C	/* size up to 4k */ | 
 | #define SECTION_HIGH_SPEED	0x1C	/* larger buffer */ | 
 | #define DATA_PIPING_FLAG	0x20	/* for Data Piping Filter */ | 
 |  | 
 | #define	PBUFSIZE_NONE 0x0000 | 
 | #define	PBUFSIZE_1P   0x0100 | 
 | #define	PBUFSIZE_2P   0x0200 | 
 | #define	PBUFSIZE_1K   0x0300 | 
 | #define	PBUFSIZE_2K   0x0400 | 
 | #define	PBUFSIZE_4K   0x0500 | 
 | #define	PBUFSIZE_8K   0x0600 | 
 | #define PBUFSIZE_16K  0x0700 | 
 | #define PBUFSIZE_32K  0x0800 | 
 |  | 
 |  | 
 | /* firmware command codes */ | 
 | enum av7110_osd_command { | 
 | 	WCreate, | 
 | 	WDestroy, | 
 | 	WMoveD, | 
 | 	WMoveA, | 
 | 	WHide, | 
 | 	WTop, | 
 | 	DBox, | 
 | 	DLine, | 
 | 	DText, | 
 | 	Set_Font, | 
 | 	SetColor, | 
 | 	SetBlend, | 
 | 	SetWBlend, | 
 | 	SetCBlend, | 
 | 	SetNonBlend, | 
 | 	LoadBmp, | 
 | 	BlitBmp, | 
 | 	ReleaseBmp, | 
 | 	SetWTrans, | 
 | 	SetWNoTrans, | 
 | 	Set_Palette | 
 | }; | 
 |  | 
 | enum av7110_pid_command { | 
 | 	MultiPID, | 
 | 	VideoPID, | 
 | 	AudioPID, | 
 | 	InitFilt, | 
 | 	FiltError, | 
 | 	NewVersion, | 
 | 	CacheError, | 
 | 	AddPIDFilter, | 
 | 	DelPIDFilter, | 
 | 	Scan, | 
 | 	SetDescr, | 
 | 	SetIR, | 
 | 	FlushTSQueue | 
 | }; | 
 |  | 
 | enum av7110_mpeg_command { | 
 | 	SelAudChannels | 
 | }; | 
 |  | 
 | enum av7110_audio_command { | 
 | 	AudioDAC, | 
 | 	CabADAC, | 
 | 	ON22K, | 
 | 	OFF22K, | 
 | 	MainSwitch, | 
 | 	ADSwitch, | 
 | 	SendDiSEqC, | 
 | 	SetRegister, | 
 | 	SpdifSwitch | 
 | }; | 
 |  | 
 | enum av7110_request_command { | 
 | 	AudioState, | 
 | 	AudioBuffState, | 
 | 	VideoState1, | 
 | 	VideoState2, | 
 | 	VideoState3, | 
 | 	CrashCounter, | 
 | 	ReqVersion, | 
 | 	ReqVCXO, | 
 | 	ReqRegister, | 
 | 	ReqSecFilterError, | 
 | 	ReqSTC | 
 | }; | 
 |  | 
 | enum av7110_encoder_command { | 
 | 	SetVidMode, | 
 | 	SetTestMode, | 
 | 	LoadVidCode, | 
 | 	SetMonitorType, | 
 | 	SetPanScanType, | 
 | 	SetFreezeMode, | 
 | 	SetWSSConfig | 
 | }; | 
 |  | 
 | enum av7110_rec_play_state { | 
 | 	__Record, | 
 | 	__Stop, | 
 | 	__Play, | 
 | 	__Pause, | 
 | 	__Slow, | 
 | 	__FF_IP, | 
 | 	__Scan_I, | 
 | 	__Continue | 
 | }; | 
 |  | 
 | enum av7110_fw_cmd_misc { | 
 | 	AV7110_FW_VIDEO_ZOOM = 1, | 
 | 	AV7110_FW_VIDEO_COMMAND, | 
 | 	AV7110_FW_AUDIO_COMMAND | 
 | }; | 
 |  | 
 | enum av7110_command_type { | 
 | 	COMTYPE_NOCOM, | 
 | 	COMTYPE_PIDFILTER, | 
 | 	COMTYPE_MPEGDECODER, | 
 | 	COMTYPE_OSD, | 
 | 	COMTYPE_BMP, | 
 | 	COMTYPE_ENCODER, | 
 | 	COMTYPE_AUDIODAC, | 
 | 	COMTYPE_REQUEST, | 
 | 	COMTYPE_SYSTEM, | 
 | 	COMTYPE_REC_PLAY, | 
 | 	COMTYPE_COMMON_IF, | 
 | 	COMTYPE_PID_FILTER, | 
 | 	COMTYPE_PES, | 
 | 	COMTYPE_TS, | 
 | 	COMTYPE_VIDEO, | 
 | 	COMTYPE_AUDIO, | 
 | 	COMTYPE_CI_LL, | 
 | 	COMTYPE_MISC = 0x80 | 
 | }; | 
 |  | 
 | #define VID_NONE_PREF		0x00	/* No aspect ration processing preferred */ | 
 | #define VID_PAN_SCAN_PREF	0x01	/* Pan and Scan Display preferred */ | 
 | #define VID_VERT_COMP_PREF	0x02	/* Vertical compression display preferred */ | 
 | #define VID_VC_AND_PS_PREF	0x03	/* PanScan and vertical Compression if allowed */ | 
 | #define VID_CENTRE_CUT_PREF	0x05	/* PanScan with zero vector */ | 
 |  | 
 | /* MPEG video decoder commands */ | 
 | #define AV_VIDEO_CMD_STOP	0x000e | 
 | #define AV_VIDEO_CMD_PLAY	0x000d | 
 | #define AV_VIDEO_CMD_FREEZE	0x0102 | 
 | #define AV_VIDEO_CMD_FFWD	0x0016 | 
 | #define AV_VIDEO_CMD_SLOW	0x0022 | 
 |  | 
 | /* MPEG audio decoder commands */ | 
 | #define AUDIO_CMD_MUTE		0x0001 | 
 | #define AUDIO_CMD_UNMUTE	0x0002 | 
 | #define AUDIO_CMD_PCM16		0x0010 | 
 | #define AUDIO_CMD_STEREO	0x0080 | 
 | #define AUDIO_CMD_MONO_L	0x0100 | 
 | #define AUDIO_CMD_MONO_R	0x0200 | 
 | #define AUDIO_CMD_SYNC_OFF	0x000e | 
 | #define AUDIO_CMD_SYNC_ON	0x000f | 
 |  | 
 | /* firmware data interface codes */ | 
 | #define DATA_NONE		 0x00 | 
 | #define DATA_FSECTION		 0x01 | 
 | #define DATA_IPMPE		 0x02 | 
 | #define DATA_MPEG_RECORD	 0x03 | 
 | #define DATA_DEBUG_MESSAGE	 0x04 | 
 | #define DATA_COMMON_INTERFACE	 0x05 | 
 | #define DATA_MPEG_PLAY		 0x06 | 
 | #define DATA_BMP_LOAD		 0x07 | 
 | #define DATA_IRCOMMAND		 0x08 | 
 | #define DATA_PIPING		 0x09 | 
 | #define DATA_STREAMING		 0x0a | 
 | #define DATA_CI_GET		 0x0b | 
 | #define DATA_CI_PUT		 0x0c | 
 | #define DATA_MPEG_VIDEO_EVENT	 0x0d | 
 |  | 
 | #define DATA_PES_RECORD		 0x10 | 
 | #define DATA_PES_PLAY		 0x11 | 
 | #define DATA_TS_RECORD		 0x12 | 
 | #define DATA_TS_PLAY		 0x13 | 
 |  | 
 | /* ancient CI command codes, only two are actually still used | 
 |  * by the link level CI firmware */ | 
 | #define CI_CMD_ERROR		 0x00 | 
 | #define CI_CMD_ACK		 0x01 | 
 | #define CI_CMD_SYSTEM_READY	 0x02 | 
 | #define CI_CMD_KEYPRESS		 0x03 | 
 | #define CI_CMD_ON_TUNED		 0x04 | 
 | #define CI_CMD_ON_SWITCH_PROGRAM 0x05 | 
 | #define CI_CMD_SECTION_ARRIVED	 0x06 | 
 | #define CI_CMD_SECTION_TIMEOUT	 0x07 | 
 | #define CI_CMD_TIME		 0x08 | 
 | #define CI_CMD_ENTER_MENU	 0x09 | 
 | #define CI_CMD_FAST_PSI		 0x0a | 
 | #define CI_CMD_GET_SLOT_INFO	 0x0b | 
 |  | 
 | #define CI_MSG_NONE		 0x00 | 
 | #define CI_MSG_CI_INFO		 0x01 | 
 | #define CI_MSG_MENU		 0x02 | 
 | #define CI_MSG_LIST		 0x03 | 
 | #define CI_MSG_TEXT		 0x04 | 
 | #define CI_MSG_REQUEST_INPUT	 0x05 | 
 | #define CI_MSG_INPUT_COMPLETE	 0x06 | 
 | #define CI_MSG_LIST_MORE	 0x07 | 
 | #define CI_MSG_MENU_MORE	 0x08 | 
 | #define CI_MSG_CLOSE_MMI_IMM	 0x09 | 
 | #define CI_MSG_SECTION_REQUEST	 0x0a | 
 | #define CI_MSG_CLOSE_FILTER	 0x0b | 
 | #define CI_PSI_COMPLETE		 0x0c | 
 | #define CI_MODULE_READY		 0x0d | 
 | #define CI_SWITCH_PRG_REPLY	 0x0e | 
 | #define CI_MSG_TEXT_MORE	 0x0f | 
 |  | 
 | #define CI_MSG_CA_PMT		 0xe0 | 
 | #define CI_MSG_ERROR		 0xf0 | 
 |  | 
 |  | 
 | /* base address of the dual ported RAM which serves as communication | 
 |  * area between PCI bus and av7110, | 
 |  * as seen by the DEBI bus of the saa7146 */ | 
 | #define	DPRAM_BASE 0x4000 | 
 |  | 
 | /* boot protocol area */ | 
 | #define AV7110_BOOT_STATE	(DPRAM_BASE + 0x3F8) | 
 | #define AV7110_BOOT_SIZE	(DPRAM_BASE + 0x3FA) | 
 | #define AV7110_BOOT_BASE	(DPRAM_BASE + 0x3FC) | 
 | #define AV7110_BOOT_BLOCK	(DPRAM_BASE + 0x400) | 
 | #define AV7110_BOOT_MAX_SIZE	0xc00 | 
 |  | 
 | /* firmware command protocol area */ | 
 | #define IRQ_STATE	(DPRAM_BASE + 0x0F4) | 
 | #define IRQ_STATE_EXT	(DPRAM_BASE + 0x0F6) | 
 | #define MSGSTATE	(DPRAM_BASE + 0x0F8) | 
 | #define COMMAND		(DPRAM_BASE + 0x0FC) | 
 | #define COM_BUFF	(DPRAM_BASE + 0x100) | 
 | #define COM_BUFF_SIZE	0x20 | 
 |  | 
 | /* various data buffers */ | 
 | #define BUFF1_BASE	(DPRAM_BASE + 0x120) | 
 | #define BUFF1_SIZE	0xE0 | 
 |  | 
 | #define DATA_BUFF0_BASE	(DPRAM_BASE + 0x200) | 
 | #define DATA_BUFF0_SIZE	0x0800 | 
 |  | 
 | #define DATA_BUFF1_BASE	(DATA_BUFF0_BASE+DATA_BUFF0_SIZE) | 
 | #define DATA_BUFF1_SIZE	0x0800 | 
 |  | 
 | #define DATA_BUFF2_BASE	(DATA_BUFF1_BASE+DATA_BUFF1_SIZE) | 
 | #define DATA_BUFF2_SIZE	0x0800 | 
 |  | 
 | #define DATA_BUFF3_BASE (DATA_BUFF2_BASE+DATA_BUFF2_SIZE) | 
 | #define DATA_BUFF3_SIZE 0x0400 | 
 |  | 
 | #define Reserved	(DPRAM_BASE + 0x1E00) | 
 | #define Reserved_SIZE	0x1C0 | 
 |  | 
 |  | 
 | /* firmware status area */ | 
 | #define STATUS_BASE	(DPRAM_BASE + 0x1FC0) | 
 | #define STATUS_LOOPS	(STATUS_BASE + 0x08) | 
 |  | 
 | #define STATUS_MPEG_WIDTH     (STATUS_BASE + 0x0C) | 
 | /* ((aspect_ratio & 0xf) << 12) | (height & 0xfff) */ | 
 | #define STATUS_MPEG_HEIGHT_AR (STATUS_BASE + 0x0E) | 
 |  | 
 | /* firmware data protocol area */ | 
 | #define RX_TYPE		(DPRAM_BASE + 0x1FE8) | 
 | #define RX_LEN		(DPRAM_BASE + 0x1FEA) | 
 | #define TX_TYPE		(DPRAM_BASE + 0x1FEC) | 
 | #define TX_LEN		(DPRAM_BASE + 0x1FEE) | 
 |  | 
 | #define RX_BUFF		(DPRAM_BASE + 0x1FF4) | 
 | #define TX_BUFF		(DPRAM_BASE + 0x1FF6) | 
 |  | 
 | #define HANDSHAKE_REG	(DPRAM_BASE + 0x1FF8) | 
 | #define COM_IF_LOCK	(DPRAM_BASE + 0x1FFA) | 
 |  | 
 | #define IRQ_RX		(DPRAM_BASE + 0x1FFC) | 
 | #define IRQ_TX		(DPRAM_BASE + 0x1FFE) | 
 |  | 
 | /* used by boot protocol to load firmware into av7110 DRAM */ | 
 | #define DRAM_START_CODE		0x2e000404 | 
 | #define DRAM_MAX_CODE_SIZE	0x00100000 | 
 |  | 
 | /* saa7146 gpio lines */ | 
 | #define RESET_LINE		2 | 
 | #define DEBI_DONE_LINE		1 | 
 | #define ARM_IRQ_LINE		0 | 
 |  | 
 |  | 
 |  | 
 | extern int av7110_bootarm(struct av7110 *av7110); | 
 | extern int av7110_firmversion(struct av7110 *av7110); | 
 | #define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000) | 
 | #define FW_4M_SDRAM(arm_app)      ((arm_app) & 0x40000000) | 
 | #define FW_VERSION(arm_app)	  ((arm_app) & 0x0000FFFF) | 
 |  | 
 | extern int av7110_wait_msgstate(struct av7110 *av7110, u16 flags); | 
 | extern int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...); | 
 | extern int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, | 
 | 			     int request_buf_len, u16 *reply_buf, int reply_buf_len); | 
 |  | 
 |  | 
 | /* DEBI (saa7146 data extension bus interface) access */ | 
 | extern int av7110_debiwrite(struct av7110 *av7110, u32 config, | 
 | 			    int addr, u32 val, int count); | 
 | extern u32 av7110_debiread(struct av7110 *av7110, u32 config, | 
 | 			   int addr, int count); | 
 |  | 
 |  | 
 | /* DEBI during interrupt */ | 
 | /* single word writes */ | 
 | static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) | 
 | { | 
 | 	av7110_debiwrite(av7110, config, addr, val, count); | 
 | } | 
 |  | 
 | /* buffer writes */ | 
 | static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, | 
 | 			  const u8 *val, int count) | 
 | { | 
 | 	memcpy(av7110->debi_virt, val, count); | 
 | 	av7110_debiwrite(av7110, config, addr, 0, count); | 
 | } | 
 |  | 
 | static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) | 
 | { | 
 | 	u32 res; | 
 |  | 
 | 	res=av7110_debiread(av7110, config, addr, count); | 
 | 	if (count<=4) | 
 | 		memcpy(av7110->debi_virt, (char *) &res, count); | 
 | 	return res; | 
 | } | 
 |  | 
 | /* DEBI outside interrupts, only for count <= 4! */ | 
 | static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) | 
 | { | 
 | 	unsigned long flags; | 
 |  | 
 | 	spin_lock_irqsave(&av7110->debilock, flags); | 
 | 	av7110_debiwrite(av7110, config, addr, val, count); | 
 | 	spin_unlock_irqrestore(&av7110->debilock, flags); | 
 | } | 
 |  | 
 | static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) | 
 | { | 
 | 	unsigned long flags; | 
 | 	u32 res; | 
 |  | 
 | 	spin_lock_irqsave(&av7110->debilock, flags); | 
 | 	res=av7110_debiread(av7110, config, addr, count); | 
 | 	spin_unlock_irqrestore(&av7110->debilock, flags); | 
 | 	return res; | 
 | } | 
 |  | 
 | /* handle mailbox registers of the dual ported RAM */ | 
 | static inline void ARM_ResetMailBox(struct av7110 *av7110) | 
 | { | 
 | 	unsigned long flags; | 
 |  | 
 | 	spin_lock_irqsave(&av7110->debilock, flags); | 
 | 	av7110_debiread(av7110, DEBINOSWAP, IRQ_RX, 2); | 
 | 	av7110_debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2); | 
 | 	spin_unlock_irqrestore(&av7110->debilock, flags); | 
 | } | 
 |  | 
 | static inline void ARM_ClearMailBox(struct av7110 *av7110) | 
 | { | 
 | 	iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); | 
 | } | 
 |  | 
 | static inline void ARM_ClearIrq(struct av7110 *av7110) | 
 | { | 
 | 	irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2); | 
 | } | 
 |  | 
 | /**************************************************************************** | 
 |  * Firmware commands | 
 |  ****************************************************************************/ | 
 |  | 
 | static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data) | 
 | { | 
 | 	return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data); | 
 | } | 
 |  | 
 | static inline int av7710_set_video_mode(struct av7110 *av7110, int mode) | 
 | { | 
 | 	return av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode); | 
 | } | 
 |  | 
 | static inline int vidcom(struct av7110 *av7110, u32 com, u32 arg) | 
 | { | 
 | 	return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_VIDEO_COMMAND, 4, | 
 | 			     (com>>16), (com&0xffff), | 
 | 			     (arg>>16), (arg&0xffff)); | 
 | } | 
 |  | 
 | static inline int audcom(struct av7110 *av7110, u32 com) | 
 | { | 
 | 	return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_AUDIO_COMMAND, 2, | 
 | 			     (com>>16), (com&0xffff)); | 
 | } | 
 |  | 
 | static inline int Set22K(struct av7110 *av7110, int state) | 
 | { | 
 | 	return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0); | 
 | } | 
 |  | 
 |  | 
 | extern int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long burst); | 
 |  | 
 |  | 
 | #ifdef CONFIG_DVB_AV7110_OSD | 
 | extern int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc); | 
 | extern int av7110_osd_capability(struct av7110 *av7110, osd_cap_t *cap); | 
 | #endif /* CONFIG_DVB_AV7110_OSD */ | 
 |  | 
 |  | 
 |  | 
 | #endif /* _AV7110_HW_H_ */ |