1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Driver for the NXP SAA7164 PCIe bridge 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2010-2015 Steven Toth <stoth@kernellabs.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* TODO: Retest the driver with errors expressed as negatives */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* Result codes */ 11*4882a593Smuzhiyun #define SAA_OK 0 12*4882a593Smuzhiyun #define SAA_ERR_BAD_PARAMETER 0x09 13*4882a593Smuzhiyun #define SAA_ERR_NO_RESOURCES 0x0c 14*4882a593Smuzhiyun #define SAA_ERR_NOT_SUPPORTED 0x13 15*4882a593Smuzhiyun #define SAA_ERR_BUSY 0x15 16*4882a593Smuzhiyun #define SAA_ERR_READ 0x17 17*4882a593Smuzhiyun #define SAA_ERR_TIMEOUT 0x1f 18*4882a593Smuzhiyun #define SAA_ERR_OVERFLOW 0x20 19*4882a593Smuzhiyun #define SAA_ERR_EMPTY 0x22 20*4882a593Smuzhiyun #define SAA_ERR_NOT_STARTED 0x23 21*4882a593Smuzhiyun #define SAA_ERR_ALREADY_STARTED 0x24 22*4882a593Smuzhiyun #define SAA_ERR_NOT_STOPPED 0x25 23*4882a593Smuzhiyun #define SAA_ERR_ALREADY_STOPPED 0x26 24*4882a593Smuzhiyun #define SAA_ERR_INVALID_COMMAND 0x3e 25*4882a593Smuzhiyun #define SAA_ERR_NULL_PACKET 0x59 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* Errors and flags from the silicon */ 28*4882a593Smuzhiyun #define PVC_ERRORCODE_UNKNOWN 0x00 29*4882a593Smuzhiyun #define PVC_ERRORCODE_INVALID_COMMAND 0x01 30*4882a593Smuzhiyun #define PVC_ERRORCODE_INVALID_CONTROL 0x02 31*4882a593Smuzhiyun #define PVC_ERRORCODE_INVALID_DATA 0x03 32*4882a593Smuzhiyun #define PVC_ERRORCODE_TIMEOUT 0x04 33*4882a593Smuzhiyun #define PVC_ERRORCODE_NAK 0x05 34*4882a593Smuzhiyun #define PVC_RESPONSEFLAG_ERROR 0x01 35*4882a593Smuzhiyun #define PVC_RESPONSEFLAG_OVERFLOW 0x02 36*4882a593Smuzhiyun #define PVC_RESPONSEFLAG_RESET 0x04 37*4882a593Smuzhiyun #define PVC_RESPONSEFLAG_INTERFACE 0x08 38*4882a593Smuzhiyun #define PVC_RESPONSEFLAG_CONTINUED 0x10 39*4882a593Smuzhiyun #define PVC_CMDFLAG_INTERRUPT 0x02 40*4882a593Smuzhiyun #define PVC_CMDFLAG_INTERFACE 0x04 41*4882a593Smuzhiyun #define PVC_CMDFLAG_SERIALIZE 0x08 42*4882a593Smuzhiyun #define PVC_CMDFLAG_CONTINUE 0x10 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* Silicon Commands */ 45*4882a593Smuzhiyun #define GET_DESCRIPTORS_CONTROL 0x01 46*4882a593Smuzhiyun #define GET_STRING_CONTROL 0x03 47*4882a593Smuzhiyun #define GET_LANGUAGE_CONTROL 0x05 48*4882a593Smuzhiyun #define SET_POWER_CONTROL 0x07 49*4882a593Smuzhiyun #define GET_FW_STATUS_CONTROL 0x08 50*4882a593Smuzhiyun #define GET_FW_VERSION_CONTROL 0x09 51*4882a593Smuzhiyun #define SET_DEBUG_LEVEL_CONTROL 0x0B 52*4882a593Smuzhiyun #define GET_DEBUG_DATA_CONTROL 0x0C 53*4882a593Smuzhiyun #define GET_PRODUCTION_INFO_CONTROL 0x0D 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* cmd defines */ 56*4882a593Smuzhiyun #define SAA_CMDFLAG_CONTINUE 0x10 57*4882a593Smuzhiyun #define SAA_CMD_MAX_MSG_UNITS 256 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* Some defines */ 60*4882a593Smuzhiyun #define SAA_BUS_TIMEOUT 50 61*4882a593Smuzhiyun #define SAA_DEVICE_TIMEOUT 5000 62*4882a593Smuzhiyun #define SAA_DEVICE_MAXREQUESTSIZE 256 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* Register addresses */ 65*4882a593Smuzhiyun #define SAA_DEVICE_VERSION 0x30 66*4882a593Smuzhiyun #define SAA_DOWNLOAD_FLAGS 0x34 67*4882a593Smuzhiyun #define SAA_DOWNLOAD_FLAG 0x34 68*4882a593Smuzhiyun #define SAA_DOWNLOAD_FLAG_ACK 0x38 69*4882a593Smuzhiyun #define SAA_DATAREADY_FLAG 0x3C 70*4882a593Smuzhiyun #define SAA_DATAREADY_FLAG_ACK 0x40 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* Boot loader register and bit definitions */ 73*4882a593Smuzhiyun #define SAA_BOOTLOADERERROR_FLAGS 0x44 74*4882a593Smuzhiyun #define SAA_DEVICE_IMAGE_SEARCHING 0x01 75*4882a593Smuzhiyun #define SAA_DEVICE_IMAGE_LOADING 0x02 76*4882a593Smuzhiyun #define SAA_DEVICE_IMAGE_BOOTING 0x03 77*4882a593Smuzhiyun #define SAA_DEVICE_IMAGE_CORRUPT 0x04 78*4882a593Smuzhiyun #define SAA_DEVICE_MEMORY_CORRUPT 0x08 79*4882a593Smuzhiyun #define SAA_DEVICE_NO_IMAGE 0x10 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* Register addresses */ 82*4882a593Smuzhiyun #define SAA_DEVICE_2ND_VERSION 0x50 83*4882a593Smuzhiyun #define SAA_DEVICE_2ND_DOWNLOADFLAG_OFFSET 0x54 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* Register addresses */ 86*4882a593Smuzhiyun #define SAA_SECONDSTAGEERROR_FLAGS 0x64 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* Bootloader regs and flags */ 89*4882a593Smuzhiyun #define SAA_DEVICE_DEADLOCK_DETECTED_OFFSET 0x6C 90*4882a593Smuzhiyun #define SAA_DEVICE_DEADLOCK_DETECTED 0xDEADDEAD 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* Basic firmware status registers */ 93*4882a593Smuzhiyun #define SAA_DEVICE_SYSINIT_STATUS_OFFSET 0x70 94*4882a593Smuzhiyun #define SAA_DEVICE_SYSINIT_STATUS 0x70 95*4882a593Smuzhiyun #define SAA_DEVICE_SYSINIT_MODE 0x74 96*4882a593Smuzhiyun #define SAA_DEVICE_SYSINIT_SPEC 0x78 97*4882a593Smuzhiyun #define SAA_DEVICE_SYSINIT_INST 0x7C 98*4882a593Smuzhiyun #define SAA_DEVICE_SYSINIT_CPULOAD 0x80 99*4882a593Smuzhiyun #define SAA_DEVICE_SYSINIT_REMAINHEAP 0x84 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define SAA_DEVICE_DOWNLOAD_OFFSET 0x1000 102*4882a593Smuzhiyun #define SAA_DEVICE_BUFFERBLOCKSIZE 0x1000 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define SAA_DEVICE_2ND_BUFFERBLOCKSIZE 0x100000 105*4882a593Smuzhiyun #define SAA_DEVICE_2ND_DOWNLOAD_OFFSET 0x200000 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* Descriptors */ 108*4882a593Smuzhiyun #define CS_INTERFACE 0x24 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* Descriptor subtypes */ 111*4882a593Smuzhiyun #define VC_INPUT_TERMINAL 0x02 112*4882a593Smuzhiyun #define VC_OUTPUT_TERMINAL 0x03 113*4882a593Smuzhiyun #define VC_SELECTOR_UNIT 0x04 114*4882a593Smuzhiyun #define VC_PROCESSING_UNIT 0x05 115*4882a593Smuzhiyun #define FEATURE_UNIT 0x06 116*4882a593Smuzhiyun #define TUNER_UNIT 0x09 117*4882a593Smuzhiyun #define ENCODER_UNIT 0x0A 118*4882a593Smuzhiyun #define EXTENSION_UNIT 0x0B 119*4882a593Smuzhiyun #define VC_TUNER_PATH 0xF0 120*4882a593Smuzhiyun #define PVC_HARDWARE_DESCRIPTOR 0xF1 121*4882a593Smuzhiyun #define PVC_INTERFACE_DESCRIPTOR 0xF2 122*4882a593Smuzhiyun #define PVC_INFRARED_UNIT 0xF3 123*4882a593Smuzhiyun #define DRM_UNIT 0xF4 124*4882a593Smuzhiyun #define GENERAL_REQUEST 0xF5 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Format Types */ 127*4882a593Smuzhiyun #define VS_FORMAT_TYPE 0x02 128*4882a593Smuzhiyun #define VS_FORMAT_TYPE_I 0x01 129*4882a593Smuzhiyun #define VS_FORMAT_UNCOMPRESSED 0x04 130*4882a593Smuzhiyun #define VS_FRAME_UNCOMPRESSED 0x05 131*4882a593Smuzhiyun #define VS_FORMAT_MPEG2PS 0x09 132*4882a593Smuzhiyun #define VS_FORMAT_MPEG2TS 0x0A 133*4882a593Smuzhiyun #define VS_FORMAT_MPEG4SL 0x0B 134*4882a593Smuzhiyun #define VS_FORMAT_WM9 0x0C 135*4882a593Smuzhiyun #define VS_FORMAT_DIVX 0x0D 136*4882a593Smuzhiyun #define VS_FORMAT_VBI 0x0E 137*4882a593Smuzhiyun #define VS_FORMAT_RDS 0x0F 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* Device extension commands */ 140*4882a593Smuzhiyun #define EXU_REGISTER_ACCESS_CONTROL 0x00 141*4882a593Smuzhiyun #define EXU_GPIO_CONTROL 0x01 142*4882a593Smuzhiyun #define EXU_GPIO_GROUP_CONTROL 0x02 143*4882a593Smuzhiyun #define EXU_INTERRUPT_CONTROL 0x03 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /* State Transition and args */ 146*4882a593Smuzhiyun #define SAA_PROBE_CONTROL 0x01 147*4882a593Smuzhiyun #define SAA_COMMIT_CONTROL 0x02 148*4882a593Smuzhiyun #define SAA_STATE_CONTROL 0x03 149*4882a593Smuzhiyun #define SAA_DMASTATE_STOP 0x00 150*4882a593Smuzhiyun #define SAA_DMASTATE_ACQUIRE 0x01 151*4882a593Smuzhiyun #define SAA_DMASTATE_PAUSE 0x02 152*4882a593Smuzhiyun #define SAA_DMASTATE_RUN 0x03 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /* A/V Mux Input Selector */ 155*4882a593Smuzhiyun #define SU_INPUT_SELECT_CONTROL 0x01 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* Encoder Profiles */ 158*4882a593Smuzhiyun #define EU_PROFILE_PS_DVD 0x06 159*4882a593Smuzhiyun #define EU_PROFILE_TS_HQ 0x09 160*4882a593Smuzhiyun #define EU_VIDEO_FORMAT_MPEG_2 0x02 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun /* Tuner */ 163*4882a593Smuzhiyun #define TU_AUDIO_MODE_CONTROL 0x17 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* Video Formats */ 166*4882a593Smuzhiyun #define TU_STANDARD_CONTROL 0x00 167*4882a593Smuzhiyun #define TU_STANDARD_AUTO_CONTROL 0x01 168*4882a593Smuzhiyun #define TU_STANDARD_NONE 0x00 169*4882a593Smuzhiyun #define TU_STANDARD_NTSC_M 0x01 170*4882a593Smuzhiyun #define TU_STANDARD_PAL_I 0x08 171*4882a593Smuzhiyun #define TU_STANDARD_MANUAL 0x00 172*4882a593Smuzhiyun #define TU_STANDARD_AUTO 0x01 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun /* Video Controls */ 175*4882a593Smuzhiyun #define PU_BRIGHTNESS_CONTROL 0x02 176*4882a593Smuzhiyun #define PU_CONTRAST_CONTROL 0x03 177*4882a593Smuzhiyun #define PU_HUE_CONTROL 0x06 178*4882a593Smuzhiyun #define PU_SATURATION_CONTROL 0x07 179*4882a593Smuzhiyun #define PU_SHARPNESS_CONTROL 0x08 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Audio Controls */ 182*4882a593Smuzhiyun #define MUTE_CONTROL 0x01 183*4882a593Smuzhiyun #define VOLUME_CONTROL 0x02 184*4882a593Smuzhiyun #define AUDIO_DEFAULT_CONTROL 0x0D 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* Default Volume Levels */ 187*4882a593Smuzhiyun #define TMHW_LEV_ADJ_DECLEV_DEFAULT 0x00 188*4882a593Smuzhiyun #define TMHW_LEV_ADJ_MONOLEV_DEFAULT 0x00 189*4882a593Smuzhiyun #define TMHW_LEV_ADJ_NICLEV_DEFAULT 0x00 190*4882a593Smuzhiyun #define TMHW_LEV_ADJ_SAPLEV_DEFAULT 0x00 191*4882a593Smuzhiyun #define TMHW_LEV_ADJ_ADCLEV_DEFAULT 0x00 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* Encoder Related Commands */ 194*4882a593Smuzhiyun #define EU_PROFILE_CONTROL 0x00 195*4882a593Smuzhiyun #define EU_VIDEO_FORMAT_CONTROL 0x01 196*4882a593Smuzhiyun #define EU_VIDEO_BIT_RATE_CONTROL 0x02 197*4882a593Smuzhiyun #define EU_VIDEO_RESOLUTION_CONTROL 0x03 198*4882a593Smuzhiyun #define EU_VIDEO_GOP_STRUCTURE_CONTROL 0x04 199*4882a593Smuzhiyun #define EU_VIDEO_INPUT_ASPECT_CONTROL 0x0A 200*4882a593Smuzhiyun #define EU_AUDIO_FORMAT_CONTROL 0x0C 201*4882a593Smuzhiyun #define EU_AUDIO_BIT_RATE_CONTROL 0x0D 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* Firmware Debugging */ 204*4882a593Smuzhiyun #define SET_DEBUG_LEVEL_CONTROL 0x0B 205*4882a593Smuzhiyun #define GET_DEBUG_DATA_CONTROL 0x0C 206