^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * ngene.h: nGene PCIe bridge driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2005-2007 Micronas
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef _NGENE_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define _NGENE_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/dma.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/scatterlist.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/dvb/frontend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <media/dmxdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <media/dvbdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <media/dvb_demux.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <media/dvb_ca_en50221.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <media/dvb_frontend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <media/dvb_ringbuffer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <media/dvb_net.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "cxd2099.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define DEVICE_NAME "ngene"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define NGENE_VID 0x18c3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define NGENE_PID 0x0720
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #ifndef VIDEO_CAP_VC1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define VIDEO_CAP_AVC 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define VIDEO_CAP_H264 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define VIDEO_CAP_VC1 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define VIDEO_CAP_WMV9 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define VIDEO_CAP_MPEG4 512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define DEMOD_TYPE_STV090X 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define DEMOD_TYPE_DRXK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define DEMOD_TYPE_STV0367 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define DEMOD_TYPE_XO2 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define DEMOD_TYPE_STV0910 (DEMOD_TYPE_XO2 + 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define DEMOD_TYPE_SONY_CT2 (DEMOD_TYPE_XO2 + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define DEMOD_TYPE_SONY_ISDBT (DEMOD_TYPE_XO2 + 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define DEMOD_TYPE_SONY_C2T2 (DEMOD_TYPE_XO2 + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define DEMOD_TYPE_ST_ATSC (DEMOD_TYPE_XO2 + 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define DEMOD_TYPE_SONY_C2T2I (DEMOD_TYPE_XO2 + 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define NGENE_XO2_TYPE_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define NGENE_XO2_TYPE_DUOFLEX 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define NGENE_XO2_TYPE_CI 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) enum STREAM {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) STREAM_VIDEOIN1 = 0, /* ITU656 or TS Input */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) STREAM_VIDEOIN2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) STREAM_AUDIOIN1, /* I2S or SPI Input */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) STREAM_AUDIOIN2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) STREAM_AUDIOOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) MAX_STREAM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) enum SMODE_BITS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) SMODE_AUDIO_SPDIF = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) SMODE_AVSYNC = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) SMODE_TRANSPORT_STREAM = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) SMODE_AUDIO_CAPTURE = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) SMODE_VBI_CAPTURE = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) SMODE_VIDEO_CAPTURE = 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) enum STREAM_FLAG_BITS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) SFLAG_CHROMA_FORMAT_2COMP = 0x01, /* Chroma Format : 2's complement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) SFLAG_CHROMA_FORMAT_OFFSET = 0x00, /* Chroma Format : Binary offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) SFLAG_ORDER_LUMA_CHROMA = 0x02, /* Byte order: Y,Cb,Y,Cr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) SFLAG_ORDER_CHROMA_LUMA = 0x00, /* Byte order: Cb,Y,Cr,Y */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) SFLAG_COLORBAR = 0x04, /* Select colorbar */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define PROGRAM_ROM 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define PROGRAM_SRAM 0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define PERIPHERALS0 0x8000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define PERIPHERALS1 0x9000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define SHARED_BUFFER 0xC000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define HOST_TO_NGENE (SHARED_BUFFER+0x0000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define NGENE_TO_HOST (SHARED_BUFFER+0x0100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define NGENE_COMMAND (SHARED_BUFFER+0x0200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define NGENE_COMMAND_HI (SHARED_BUFFER+0x0204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define NGENE_STATUS (SHARED_BUFFER+0x0208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define NGENE_STATUS_HI (SHARED_BUFFER+0x020C)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define NGENE_EVENT (SHARED_BUFFER+0x0210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define NGENE_EVENT_HI (SHARED_BUFFER+0x0214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define VARIABLES (SHARED_BUFFER+0x0210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define NGENE_INT_COUNTS (SHARED_BUFFER+0x0260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define NGENE_INT_ENABLE (SHARED_BUFFER+0x0264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define NGENE_VBI_LINE_COUNT (SHARED_BUFFER+0x0268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define BUFFER_GP_XMIT (SHARED_BUFFER+0x0800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define BUFFER_GP_RECV (SHARED_BUFFER+0x0900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define EEPROM_AREA (SHARED_BUFFER+0x0A00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define SG_V_IN_1 (SHARED_BUFFER+0x0A80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define SG_VBI_1 (SHARED_BUFFER+0x0B00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define SG_A_IN_1 (SHARED_BUFFER+0x0B80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define SG_V_IN_2 (SHARED_BUFFER+0x0C00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define SG_VBI_2 (SHARED_BUFFER+0x0C80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define SG_A_IN_2 (SHARED_BUFFER+0x0D00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define SG_V_OUT (SHARED_BUFFER+0x0D80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define SG_A_OUT2 (SHARED_BUFFER+0x0E00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define DATA_A_IN_1 (SHARED_BUFFER+0x0E80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define DATA_A_IN_2 (SHARED_BUFFER+0x0F00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define DATA_A_OUT (SHARED_BUFFER+0x0F80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define DATA_V_IN_1 (SHARED_BUFFER+0x1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define DATA_V_IN_2 (SHARED_BUFFER+0x2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define DATA_V_OUT (SHARED_BUFFER+0x3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define DATA_FIFO_AREA (SHARED_BUFFER+0x1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define TIMESTAMPS 0xA000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SCRATCHPAD 0xA080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define FORCE_INT 0xA088
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define FORCE_NMI 0xA090
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define INT_STATUS 0xA0A0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define DEV_VER 0x9004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define FW_DEBUG_DEFAULT (PROGRAM_SRAM+0x00FF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct SG_ADDR {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) u64 start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) u64 curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) u16 curr_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) u16 elements;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) u32 pad[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) struct SHARED_MEMORY {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* C000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) u32 HostToNgene[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* C100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) u32 NgeneToHost[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* C200 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) u64 NgeneCommand;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) u64 NgeneStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) u64 NgeneEvent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* C210 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) u8 pad1[0xc260 - 0xc218];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* C260 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) u32 IntCounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) u32 IntEnable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* C268 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) u8 pad2[0xd000 - 0xc268];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) struct BUFFER_STREAM_RESULTS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) u32 Clock; /* Stream time in 100ns units */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) u16 RemainingLines; /* Remaining lines in this field.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 0 for complete field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) u8 FieldCount; /* Video field number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) u8 Flags; /* Bit 7 = Done, Bit 6 = seen, Bit 5 = overflow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) Bit 0 = FieldID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) u16 BlockCount; /* Audio block count (unused) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) u8 Reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) u32 DTOUpdate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct HW_SCATTER_GATHER_ELEMENT {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) u64 Address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) u32 Length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) u32 Reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct BUFFER_HEADER {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) u64 Next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct BUFFER_STREAM_RESULTS SR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) u32 Number_of_entries_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) u32 Reserved5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) u64 Address_of_first_entry_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) u32 Number_of_entries_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) u32 Reserved7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) u64 Address_of_first_entry_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct EVENT_BUFFER {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) u32 TimeStamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) u8 GPIOStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) u8 UARTStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) u8 RXCharacter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) u8 EventStatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) u32 Reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /* Firmware commands. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) enum OPCODES {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) CMD_NOP = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) CMD_FWLOAD_PREPARE = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) CMD_FWLOAD_FINISH = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) CMD_I2C_READ = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) CMD_I2C_WRITE = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) CMD_I2C_WRITE_NOSTOP = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) CMD_I2C_CONTINUE_WRITE = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) CMD_I2C_CONTINUE_WRITE_NOSTOP = 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) CMD_DEBUG_OUTPUT = 0x09,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) CMD_CONTROL = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) CMD_CONFIGURE_BUFFER = 0x11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) CMD_CONFIGURE_FREE_BUFFER = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) CMD_SPI_READ = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) CMD_SPI_WRITE = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) CMD_MEM_READ = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) CMD_MEM_WRITE = 0x21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) CMD_SFR_READ = 0x22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) CMD_SFR_WRITE = 0x23,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) CMD_IRAM_READ = 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) CMD_IRAM_WRITE = 0x25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) CMD_SET_GPIO_PIN = 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) CMD_SET_GPIO_INT = 0x27,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) CMD_CONFIGURE_UART = 0x28,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) CMD_WRITE_UART = 0x29,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) MAX_CMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) enum RESPONSES {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) OK = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) ERROR = 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct FW_HEADER {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) u8 Opcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) u8 Length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) struct FW_I2C_WRITE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) u8 Device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) u8 Data[250];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) struct FW_I2C_CONTINUE_WRITE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) u8 Data[250];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct FW_I2C_READ {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) u8 Device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) u8 Data[252]; /* followed by two bytes of read data count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct FW_SPI_WRITE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) u8 ModeSelect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) u8 Data[250];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) struct FW_SPI_READ {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u8 ModeSelect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) u8 Data[252]; /* followed by two bytes of read data count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) struct FW_FWLOAD_PREPARE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) struct FW_FWLOAD_FINISH {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) u16 Address; /* address of final block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) u16 Length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * Meaning of FW_STREAM_CONTROL::Mode bits:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) * Bit 7: Loopback PEXin to PEXout using TVOut channel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * Bit 6: AVLOOP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * Bit 5: Audio select; 0=I2S, 1=SPDIF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * Bit 4: AVSYNC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) * Bit 3: Enable transport stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * Bit 2: Enable audio capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * Bit 1: Enable ITU-Video VBI capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) * Bit 0: Enable ITU-Video capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) * Meaning of FW_STREAM_CONTROL::Control bits (see UVI1_CTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) * Bit 7: continuous capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) * Bit 6: capture one field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * Bit 5: capture one frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * Bit 4: unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * Bit 3: starting field; 0=odd, 1=even
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) * Bit 2: sample size; 0=8-bit, 1=10-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * Bit 1: data format; 0=UYVY, 1=YUY2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) * Bit 0: resets buffer pointers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) enum FSC_MODE_BITS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) SMODE_LOOPBACK = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) SMODE_AVLOOP = 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) _SMODE_AUDIO_SPDIF = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) _SMODE_AVSYNC = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) _SMODE_TRANSPORT_STREAM = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) _SMODE_AUDIO_CAPTURE = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) _SMODE_VBI_CAPTURE = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) _SMODE_VIDEO_CAPTURE = 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /* Meaning of FW_STREAM_CONTROL::Stream bits:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) * Bit 3: Audio sample count: 0 = relative, 1 = absolute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * Bit 2: color bar select; 1=color bars, 0=CV3 decoder
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) * Bits 1-0: stream select, UVI1, UVI2, TVOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) struct FW_STREAM_CONTROL {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) u8 Stream; /* Stream number (UVI1, UVI2, TVOUT) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) u8 Control; /* Value written to UVI1_CTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) u8 Mode; /* Controls clock source */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) u8 SetupDataLen; /* Length of setup data, MSB=1 write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) backwards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) u16 CaptureBlockCount; /* Blocks (a 256 Bytes) to capture per buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) for TS and Audio */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) u64 Buffer_Address; /* Address of first buffer header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) u16 BytesPerVideoLine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) u16 MaxLinesPerField;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) u16 MinLinesPerField;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) u16 Reserved_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) u16 BytesPerVBILine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) u16 MaxVBILinesPerField;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) u16 MinVBILinesPerField;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) u16 SetupDataAddr; /* ngene relative address of setup data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) u8 SetupData[32]; /* setup data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) } __attribute__((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define AUDIO_BLOCK_SIZE 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define TS_BLOCK_SIZE 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) struct FW_MEM_READ {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) u16 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct FW_MEM_WRITE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) u16 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct FW_SFR_IRAM_READ {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) u8 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct FW_SFR_IRAM_WRITE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) u8 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) u8 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) struct FW_SET_GPIO_PIN {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) u8 select;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct FW_SET_GPIO_INT {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) u8 select;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) struct FW_SET_DEBUGMODE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) u8 debug_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) struct FW_CONFIGURE_BUFFERS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) u8 config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) enum _BUFFER_CONFIGS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /* 4k UVI1, 4k UVI2, 2k AUD1, 2k AUD2 (standard usage) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) BUFFER_CONFIG_4422 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /* 3k UVI1, 3k UVI2, 3k AUD1, 3k AUD2 (4x TS input usage) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) BUFFER_CONFIG_3333 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) /* 8k UVI1, 0k UVI2, 2k AUD1, 2k I2SOut (HDTV decoder usage) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) BUFFER_CONFIG_8022 = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) BUFFER_CONFIG_FW17 = 255, /* Use new FW 17 command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) struct FW_CONFIGURE_FREE_BUFFERS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) u8 UVI1_BufferLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) u8 UVI2_BufferLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) u8 TVO_BufferLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) u8 AUD1_BufferLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) u8 AUD2_BufferLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) u8 TVA_BufferLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) } __packed config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) struct FW_CONFIGURE_UART {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) u8 UartControl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) enum _UART_CONFIG {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) _UART_BAUDRATE_19200 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) _UART_BAUDRATE_9600 = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) _UART_BAUDRATE_4800 = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) _UART_BAUDRATE_2400 = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) _UART_RX_ENABLE = 0x40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) _UART_TX_ENABLE = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) struct FW_WRITE_UART {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) u8 Data[252];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) struct ngene_command {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) u32 in_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) u32 out_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) u32 raw[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) u8 raw8[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) struct FW_HEADER hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) struct FW_I2C_WRITE I2CWrite;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) struct FW_I2C_CONTINUE_WRITE I2CContinueWrite;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) struct FW_I2C_READ I2CRead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) struct FW_STREAM_CONTROL StreamControl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) struct FW_FWLOAD_PREPARE FWLoadPrepare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) struct FW_FWLOAD_FINISH FWLoadFinish;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) struct FW_MEM_READ MemoryRead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) struct FW_MEM_WRITE MemoryWrite;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) struct FW_SFR_IRAM_READ SfrIramRead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) struct FW_SFR_IRAM_WRITE SfrIramWrite;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) struct FW_SPI_WRITE SPIWrite;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) struct FW_SPI_READ SPIRead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) struct FW_SET_GPIO_PIN SetGpioPin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) struct FW_SET_GPIO_INT SetGpioInt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) struct FW_SET_DEBUGMODE SetDebugMode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) struct FW_CONFIGURE_BUFFERS ConfigureBuffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct FW_CONFIGURE_FREE_BUFFERS ConfigureFreeBuffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) struct FW_CONFIGURE_UART ConfigureUart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) struct FW_WRITE_UART WriteUart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) } cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) } __attribute__ ((__packed__));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) #define NGENE_INTERFACE_VERSION 0x103
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) #define MAX_VIDEO_BUFFER_SIZE (417792) /* 288*1440 rounded up to next page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) #define MAX_AUDIO_BUFFER_SIZE (8192) /* Gives room for about 23msec@48KHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) #define MAX_VBI_BUFFER_SIZE (28672) /* 1144*18 rounded up to next page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) #define MAX_TS_BUFFER_SIZE (98304) /* 512*188 rounded up to next page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) #define MAX_HDTV_BUFFER_SIZE (2080768) /* 541*1920*2 rounded up to next page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) Max: (1920x1080i60) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) #define OVERFLOW_BUFFER_SIZE (8192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) #define RING_SIZE_VIDEO 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) #define RING_SIZE_AUDIO 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) #define RING_SIZE_TS 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) #define NUM_SCATTER_GATHER_ENTRIES 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) #define MAX_DMA_LENGTH (((MAX_VIDEO_BUFFER_SIZE + MAX_VBI_BUFFER_SIZE) * \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) RING_SIZE_VIDEO * 2) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) (MAX_AUDIO_BUFFER_SIZE * RING_SIZE_AUDIO * 2) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) (MAX_TS_BUFFER_SIZE * RING_SIZE_TS * 4) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) (RING_SIZE_VIDEO * PAGE_SIZE * 2) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) (RING_SIZE_AUDIO * PAGE_SIZE * 2) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) (RING_SIZE_TS * PAGE_SIZE * 4) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 8 * PAGE_SIZE + OVERFLOW_BUFFER_SIZE + PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) #define EVENT_QUEUE_SIZE 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) /* Gathers the current state of a single channel. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct SBufferHeader {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct BUFFER_HEADER ngeneBuffer; /* Physical descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) struct SBufferHeader *Next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) void *Buffer1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) struct HW_SCATTER_GATHER_ELEMENT *scList1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) void *Buffer2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) struct HW_SCATTER_GATHER_ELEMENT *scList2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) /* Sizeof SBufferHeader aligned to next 64 Bit boundary (hw restriction) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) #define SIZEOF_SBufferHeader ((sizeof(struct SBufferHeader) + 63) & ~63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) enum HWSTATE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) HWSTATE_STOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) HWSTATE_STARTUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) HWSTATE_RUN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) HWSTATE_PAUSE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) enum KSSTATE {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) KSSTATE_STOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) KSSTATE_ACQUIRE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) KSSTATE_PAUSE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) KSSTATE_RUN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) struct SRingBufferDescriptor {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) struct SBufferHeader *Head; /* Points to first buffer in ring buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) structure*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) u64 PAHead; /* Physical address of first buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) u32 MemSize; /* Memory size of allocated ring buffers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) (needed for freeing) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) u32 NumBuffers; /* Number of buffers in the ring */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) u32 Buffer1Length; /* Allocated length of Buffer 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) u32 Buffer2Length; /* Allocated length of Buffer 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) void *SCListMem; /* Memory to hold scatter gather lists for this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) ring */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) u64 PASCListMem; /* Physical address .. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) u32 SCListMemSize; /* Size of this memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) enum STREAMMODEFLAGS {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) StreamMode_NONE = 0, /* Stream not used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) StreamMode_ANALOG = 1, /* Analog: Stream 0,1 = Video, 2,3 = Audio */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) StreamMode_TSIN = 2, /* Transport stream input (all) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) StreamMode_HDTV = 4, /* HDTV: Maximum 1920x1080p30,1920x1080i60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) (only stream 0) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) StreamMode_TSOUT = 8, /* Transport stream output (only stream 3) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) enum BufferExchangeFlags {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) BEF_EVEN_FIELD = 0x00000001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) BEF_CONTINUATION = 0x00000002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) BEF_MORE_DATA = 0x00000004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) BEF_OVERFLOW = 0x00000008,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) DF_SWAP32 = 0x00010000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) typedef void *(IBufferExchange)(void *, void *, u32, u32, u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) struct MICI_STREAMINFO {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) IBufferExchange *pExchange;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) IBufferExchange *pExchangeVBI; /* Secondary (VBI, ancillary) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) u8 Stream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) u8 Flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) u8 Mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) u8 Reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) u16 nLinesVideo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) u16 nBytesPerLineVideo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) u16 nLinesVBI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) u16 nBytesPerLineVBI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) u32 CaptureLength; /* Used for audio and transport stream */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) /****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) /* STRUCTS ******************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) /****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) /* sound hardware definition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) #define MIXER_ADDR_TVTUNER 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) #define MIXER_ADDR_LAST 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) struct ngene_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) /*struct sound chip*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct mychip {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) struct ngene_channel *chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) struct snd_card *card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) struct pci_dev *pci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) struct snd_pcm_substream *substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) unsigned long port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) spinlock_t mixer_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) int mixer_volume[MIXER_ADDR_LAST + 1][2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) int capture_source[MIXER_ADDR_LAST + 1][2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) #ifdef NGENE_V4L
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) struct ngene_overlay {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) int tvnorm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct v4l2_rect w;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) enum v4l2_field field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) struct v4l2_clip *clips;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) int nclips;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) int setup_ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) struct ngene_tvnorm {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) int v4l2_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) u16 swidth, sheight; /* scaled standard width, height */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) int tuner_norm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) int soundstd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) struct ngene_vopen {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) struct ngene_channel *ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) enum v4l2_priority prio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) int width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) int height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) int depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) struct videobuf_queue vbuf_q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) struct videobuf_queue vbi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) int fourcc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) int picxcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) int resources;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) enum v4l2_buf_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) const struct ngene_format *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) const struct ngene_format *ovfmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) struct ngene_overlay ov;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) struct ngene_channel {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) struct device device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) struct i2c_adapter i2c_adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) struct i2c_client *i2c_client[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) int i2c_client_fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) struct ngene *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) int number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) int type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) bool has_adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) bool has_demux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) int demod_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) int (*gate_ctrl)(struct dvb_frontend *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) struct dvb_frontend *fe2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) struct dmxdev dmxdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) struct dvb_demux demux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) struct dvb_net dvbnet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) struct dmx_frontend hw_frontend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) struct dmx_frontend mem_frontend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) int users;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) struct video_device *v4l_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) struct dvb_device *ci_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) struct tasklet_struct demux_tasklet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) struct SBufferHeader *nextBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) enum KSSTATE State;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) enum HWSTATE HWState;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) u8 Stream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) u8 Flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) u8 Mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) IBufferExchange *pBufferExchange;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) IBufferExchange *pBufferExchange2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) spinlock_t state_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) u16 nLines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) u16 nBytesPerLine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) u16 nVBILines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) u16 nBytesPerVBILine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) u16 itumode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) u32 Capture1Length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) u32 Capture2Length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct SRingBufferDescriptor RingBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct SRingBufferDescriptor TSRingBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) struct SRingBufferDescriptor TSIdleBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) u32 DataFormatFlags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) int AudioDTOUpdated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) u32 AudioDTOValue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) int (*set_tone)(struct dvb_frontend *, enum fe_sec_tone_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) u8 lnbh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) /* stuff from analog driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) int minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) struct mychip *mychip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) struct snd_card *soundcard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) u8 *evenbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) u8 dma_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) int soundstreamon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) int audiomute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) int soundbuffisallocated;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) int sndbuffflag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) int tun_rdy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) int dec_rdy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) int tun_dec_rdy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) int lastbufferflag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) struct ngene_tvnorm *tvnorms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) int tvnorm_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) int tvnorm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) #ifdef NGENE_V4L
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) int videousers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) struct v4l2_prio_state prio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) struct ngene_vopen init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) int resources;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) struct v4l2_framebuffer fbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) struct ngene_buffer *screen; /* overlay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct list_head capture; /* video capture queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) spinlock_t s_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) struct semaphore reslock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) int running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) int tsin_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) u8 tsin_buffer[188];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct ngene_ci {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) struct device device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) struct i2c_adapter i2c_adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) struct ngene *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) struct dvb_ca_en50221 *en;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) struct ngene;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) typedef void (rx_cb_t)(struct ngene *, u32, u8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) typedef void (tx_cb_t)(struct ngene *, u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) struct ngene {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) int nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) struct pci_dev *pci_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) unsigned char __iomem *iomem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) /*struct i2c_adapter i2c_adapter;*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) u32 device_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) u32 fw_interface_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) u32 icounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) bool msi_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) bool cmd_timeout_workaround;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) u8 *CmdDoneByte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) int BootFirmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) void *OverflowBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) dma_addr_t PAOverflowBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) void *FWInterfaceBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) dma_addr_t PAFWInterfaceBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) u8 *ngenetohost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) u8 *hosttongene;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) struct EVENT_BUFFER EventQueue[EVENT_QUEUE_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) int EventQueueOverflowCount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) int EventQueueOverflowFlag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) struct tasklet_struct event_tasklet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) struct EVENT_BUFFER *EventBuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) int EventQueueWriteIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) int EventQueueReadIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) wait_queue_head_t cmd_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) int cmd_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) struct mutex cmd_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct mutex stream_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) struct semaphore pll_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) struct mutex i2c_switch_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) int i2c_current_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) int i2c_current_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) spinlock_t cmd_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) struct dvb_adapter adapter[MAX_STREAM];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) struct dvb_adapter *first_adapter; /* "one_adapter" modprobe opt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) struct ngene_channel channel[MAX_STREAM];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) struct ngene_info *card_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) tx_cb_t *TxEventNotify;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) rx_cb_t *RxEventNotify;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) int tx_busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) wait_queue_head_t tx_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) wait_queue_head_t rx_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) #define UART_RBUF_LEN 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) u8 uart_rbuf[UART_RBUF_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) int uart_rp, uart_wp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) #define TS_FILLER 0x6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) u8 *tsout_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) #define TSOUT_BUF_SIZE (512*188*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) struct dvb_ringbuffer tsout_rbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) u8 *tsin_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) #define TSIN_BUF_SIZE (512*188*8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) struct dvb_ringbuffer tsin_rbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) u8 *ain_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) #define AIN_BUF_SIZE (128*1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) struct dvb_ringbuffer ain_rbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) u8 *vin_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) #define VIN_BUF_SIZE (4*1920*1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) struct dvb_ringbuffer vin_rbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) unsigned long exp_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) int prev_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) struct ngene_ci ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct ngene_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) int type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) #define NGENE_APP 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) #define NGENE_TERRATEC 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) #define NGENE_SIDEWINDER 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) #define NGENE_RACER 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) #define NGENE_VIPER 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) #define NGENE_PYTHON 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) #define NGENE_VBOX_V1 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) #define NGENE_VBOX_V2 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) int fw_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) bool msi_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) int io_type[MAX_STREAM];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) #define NGENE_IO_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) #define NGENE_IO_TV 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) #define NGENE_IO_HDTV 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) #define NGENE_IO_TSIN 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) #define NGENE_IO_TSOUT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) #define NGENE_IO_AIN 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) void *fe_config[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) void *tuner_config[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) int (*demod_attach[4])(struct ngene_channel *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) int (*tuner_attach[4])(struct ngene_channel *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) u8 avf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) u8 msp[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) u8 demoda[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) u8 lnb[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) int i2c_access;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) u8 ntsc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) u8 tsf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) u8 i2s[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) int (*gate_ctrl)(struct dvb_frontend *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) int (*switch_ctrl)(struct ngene_channel *, int, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) #ifdef NGENE_V4L
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct ngene_format {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) int fourcc; /* video4linux 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) int btformat; /* BT848_COLOR_FMT_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) int format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) int btswap; /* BT848_COLOR_CTL_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) int depth; /* bit/pixel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) int hshift, vshift; /* for planar modes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) int palette;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) #define RESOURCE_OVERLAY 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) #define RESOURCE_VIDEO 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) #define RESOURCE_VBI 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) struct ngene_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) /* common v4l buffer stuff -- must be first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) struct videobuf_buffer vb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) /* ngene specific */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) const struct ngene_format *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) int tvnorm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) int btformat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) int btswap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) /* Provided by ngene-core.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) int ngene_probe(struct pci_dev *pci_dev, const struct pci_device_id *id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) void ngene_remove(struct pci_dev *pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) void ngene_shutdown(struct pci_dev *pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) int ngene_command(struct ngene *dev, struct ngene_command *com);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) void set_transfer(struct ngene_channel *chan, int state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) void FillTSBuffer(void *Buffer, int Length, u32 Flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) /* Provided by ngene-cards.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) int ngene_port_has_cxd2099(struct i2c_adapter *i2c, u8 *type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) /* Provided by ngene-i2c.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) int ngene_i2c_init(struct ngene *dev, int dev_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) /* Provided by ngene-dvb.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) extern struct dvb_device ngene_dvbdev_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) int my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) int (*start_feed)(struct dvb_demux_feed *),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) int (*stop_feed)(struct dvb_demux_feed *),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) int my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) struct dvb_demux *dvbdemux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) struct dmx_frontend *hw_frontend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) struct dmx_frontend *mem_frontend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) struct dvb_adapter *dvb_adapter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) /* LocalWords: Endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) */