Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / media / pci / ttpci / av7110_hw.h
diff --git a/kernel/drivers/media/pci/ttpci/av7110_hw.h b/kernel/drivers/media/pci/ttpci/av7110_hw.h
new file mode 100644 (file)
index 0000000..1634aba
--- /dev/null
@@ -0,0 +1,495 @@
+#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_ */