1209ff23fSmrg/************************************************************************************* 2209ff23fSmrg * 3209ff23fSmrg * Copyright (C) 2005 Bogdan D. bogdand@users.sourceforge.net 4209ff23fSmrg * 5209ff23fSmrg * Permission is hereby granted, free of charge, to any person obtaining a copy of this 6209ff23fSmrg * software and associated documentation files (the "Software"), to deal in the Software 7209ff23fSmrg * without restriction, including without limitation the rights to use, copy, modify, 8209ff23fSmrg * merge, publish, distribute, sublicense, and/or sell copies of the Software, 9209ff23fSmrg * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10209ff23fSmrg * 11209ff23fSmrg * The above copyright notice and this permission notice shall be included in all copies or 12209ff23fSmrg * substantial portions of the Software. 13209ff23fSmrg * 14209ff23fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15209ff23fSmrg * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 16209ff23fSmrg * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, 17209ff23fSmrg * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18209ff23fSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 19209ff23fSmrg * 20209ff23fSmrg * Except as contained in this notice, the name of the author shall not be used in advertising or 21209ff23fSmrg * otherwise to promote the sale, use or other dealings in this Software without prior written 22209ff23fSmrg * authorization from the author. 23209ff23fSmrg * 24209ff23fSmrg * $Log: theatre200.c,v $ 2568105dcbSveego * Revision 1.1.1.4 2012/09/23 19:49:13 veego 2668105dcbSveego * initial import of xf86-video-ati-6.14.6. 2768105dcbSveego * 2868105dcbSveego * NetBSD note: The libdrm requirement seems to be KMS related which we do 2968105dcbSveego * not have. 3068105dcbSveego * 3168105dcbSveego * * 6.15.6 3268105dcbSveego * This version requires the latest libdrm 2.4.36 release, and fixes a few 3368105dcbSveego * other bugs seen since 6.14.5. 3468105dcbSveego * * 6.14.5 3568105dcbSveego * - add solid picture accel 3668105dcbSveego * - tiling fixes 3768105dcbSveego * - new pci ids 3868105dcbSveego * - 6xx-9xx Xv improvements 3968105dcbSveego * - support for upcoming xserver API changes 4068105dcbSveego * - bug fixes 41209ff23fSmrg * 42209ff23fSmrg * Revision 1.6 2006/03/22 22:30:14 krh 43209ff23fSmrg * 2006-03-22 Kristian Høgsberg <krh@redhat.com> 44209ff23fSmrg * 45209ff23fSmrg * * src/theatre200.c: Convert use of xf86fopen() and other xf86 46209ff23fSmrg * wrapped libc symbols to use libc symbols directly. The xf86* 47209ff23fSmrg * versions aren't supposed to be used directly. 48209ff23fSmrg * 49209ff23fSmrg * * src/ *.c: Drop libc wrapper; don't include xf86_ansic.h and add 50209ff23fSmrg * includes now missing. 51209ff23fSmrg * 52209ff23fSmrg * Revision 1.4 2005/08/28 18:00:23 bogdand 53209ff23fSmrg * Modified the licens type from GPL to a X/MIT one 54209ff23fSmrg * 55209ff23fSmrg * Revision 1.3 2005/07/11 02:29:45 ajax 56209ff23fSmrg * Prep for modular builds by adding guarded #include "config.h" everywhere. 57209ff23fSmrg * 58209ff23fSmrg * Revision 1.2 2005/07/01 22:43:11 daniels 59209ff23fSmrg * Change all misc.h and os.h references to <X11/foo.h>. 60209ff23fSmrg * 61209ff23fSmrg * 62209ff23fSmrg ************************************************************************************/ 63209ff23fSmrg 64209ff23fSmrg#ifdef HAVE_CONFIG_H 65209ff23fSmrg#include "config.h" 66209ff23fSmrg#endif 67209ff23fSmrg 68209ff23fSmrg#include <stdio.h> 69209ff23fSmrg#include <string.h> 70209ff23fSmrg 71209ff23fSmrg#include "xf86.h" 72209ff23fSmrg#include "generic_bus.h" 73209ff23fSmrg#include "radeon_reg.h" 74209ff23fSmrg#include "radeon.h" 75209ff23fSmrg#include "theatre_reg.h" 76209ff23fSmrg#include "theatre200.h" 77209ff23fSmrg#include "radeon_macros.h" 78209ff23fSmrg 79209ff23fSmrg#undef read 80209ff23fSmrg#undef write 81209ff23fSmrg#undef ioctl 82209ff23fSmrg 83209ff23fSmrgvoid DumpRageTheatreRegsByName(TheatrePtr t); 84209ff23fSmrg 85209ff23fSmrgstatic int DownloadMicrocode(TheatrePtr t); 86209ff23fSmrgstatic int microc_load (char* micro_path, char* micro_type, struct rt200_microc_data* microc_datap, int screen); 87209ff23fSmrgstatic void microc_clean(struct rt200_microc_data* microc_datap, int screen); 88209ff23fSmrgstatic int dsp_init(TheatrePtr t, struct rt200_microc_data* microc_datap); 89209ff23fSmrgstatic int dsp_load(TheatrePtr t, struct rt200_microc_data* microc_datap); 90209ff23fSmrg 91209ff23fSmrgstatic uint32_t dsp_send_command(TheatrePtr t, uint32_t fb_scratch1, uint32_t fb_scratch0); 92209ff23fSmrgstatic uint32_t dsp_set_video_input_connector(TheatrePtr t, uint32_t connector); 93209ff23fSmrg//static uint32_t dsp_reset(TheatrePtr t); 94209ff23fSmrgstatic uint32_t dsp_set_lowpowerstate(TheatrePtr t, uint32_t pstate); 95209ff23fSmrgstatic uint32_t dsp_set_video_standard(TheatrePtr t, uint32_t standard); 96209ff23fSmrgstatic uint32_t dsp_set_videostreamformat(TheatrePtr t, uint32_t format); 97209ff23fSmrgstatic uint32_t dsp_video_standard_detection(TheatrePtr t); 98209ff23fSmrg//static uint32_t dsp_get_signallockstatus(TheatrePtr t); 99209ff23fSmrg//static uint32_t dsp_get_signallinenumber(TheatrePtr t); 100209ff23fSmrg 101209ff23fSmrgstatic uint32_t dsp_set_brightness(TheatrePtr t, uint8_t brightness); 102209ff23fSmrgstatic uint32_t dsp_set_contrast(TheatrePtr t, uint8_t contrast); 103209ff23fSmrg//static uint32_t dsp_set_sharpness(TheatrePtr t, int sharpness); 104209ff23fSmrgstatic uint32_t dsp_set_tint(TheatrePtr t, uint8_t tint); 105209ff23fSmrgstatic uint32_t dsp_set_saturation(TheatrePtr t, uint8_t saturation); 106209ff23fSmrgstatic uint32_t dsp_set_video_scaler_horizontal(TheatrePtr t, uint16_t output_width, uint16_t horz_start, uint16_t horz_end); 107209ff23fSmrgstatic uint32_t dsp_set_video_scaler_vertical(TheatrePtr t, uint16_t output_height, uint16_t vert_start, uint16_t vert_end); 108209ff23fSmrgstatic uint32_t dsp_audio_mute(TheatrePtr t, uint8_t left, uint8_t right); 109209ff23fSmrgstatic uint32_t dsp_set_audio_volume(TheatrePtr t, uint8_t left, uint8_t right, uint8_t auto_mute); 110209ff23fSmrg//static uint32_t dsp_audio_detection(TheatrePtr t, uint8_t option); 111209ff23fSmrgstatic uint32_t dsp_configure_i2s_port(TheatrePtr t, uint8_t tx_mode, uint8_t rx_mode, uint8_t clk_mode); 112209ff23fSmrgstatic uint32_t dsp_configure_spdif_port(TheatrePtr t, uint8_t state); 113209ff23fSmrg 114209ff23fSmrgstatic Bool theatre_read(TheatrePtr t,uint32_t reg, uint32_t *data) 115209ff23fSmrg{ 116209ff23fSmrg if(t->theatre_num<0)return FALSE; 117209ff23fSmrg return t->VIP->read(t->VIP, ((t->theatre_num & 0x3)<<14) | reg,4, (uint8_t *) data); 118209ff23fSmrg} 119209ff23fSmrg 120209ff23fSmrgstatic Bool theatre_write(TheatrePtr t,uint32_t reg, uint32_t data) 121209ff23fSmrg{ 122209ff23fSmrg if(t->theatre_num<0)return FALSE; 123209ff23fSmrg return t->VIP->write(t->VIP,((t->theatre_num & 0x03)<<14) | reg,4, (uint8_t *) &data); 124209ff23fSmrg} 125209ff23fSmrg 126209ff23fSmrgstatic Bool theatre_fifo_read(TheatrePtr t,uint32_t fifo, uint8_t *data) 127209ff23fSmrg{ 128209ff23fSmrg if(t->theatre_num<0)return FALSE; 129209ff23fSmrg return t->VIP->fifo_read(t->VIP, ((t->theatre_num & 0x3)<<14) | fifo,1, (uint8_t *) data); 130209ff23fSmrg} 131209ff23fSmrg 132209ff23fSmrgstatic Bool theatre_fifo_write(TheatrePtr t,uint32_t fifo, uint32_t count, uint8_t* buffer) 133209ff23fSmrg{ 134209ff23fSmrg if(t->theatre_num<0)return FALSE; 135209ff23fSmrg return t->VIP->fifo_write(t->VIP,((t->theatre_num & 0x03)<<14) | fifo,count, (uint8_t *)buffer); 136209ff23fSmrg} 137209ff23fSmrg 138209ff23fSmrg#define RT_regr(reg,data) theatre_read(t,(reg),(data)) 139209ff23fSmrg#define RT_regw(reg,data) theatre_write(t,(reg),(data)) 140209ff23fSmrg#define RT_fifor(fifo,data) theatre_fifo_read(t,(fifo),(data)) 141209ff23fSmrg#define RT_fifow(fifo,count,data) theatre_fifo_write(t,(fifo),(count),(data)) 142209ff23fSmrg#define VIP_TYPE "ATI VIP BUS" 143209ff23fSmrg 144209ff23fSmrgstatic int microc_load (char* micro_path, char* micro_type, struct rt200_microc_data* microc_datap, int screen) 145209ff23fSmrg{ 146209ff23fSmrg FILE* file; 147209ff23fSmrg struct rt200_microc_head* microc_headp = µc_datap->microc_head; 148209ff23fSmrg struct rt200_microc_seg* seg_list = NULL; 149209ff23fSmrg struct rt200_microc_seg* curr_seg = NULL; 150209ff23fSmrg struct rt200_microc_seg* prev_seg = NULL; 151209ff23fSmrg int i; 152209ff23fSmrg 153209ff23fSmrg if (micro_path == NULL) 154209ff23fSmrg return -1; 155209ff23fSmrg 156209ff23fSmrg if (micro_type == NULL) 157209ff23fSmrg return -1; 158209ff23fSmrg 159209ff23fSmrg file = fopen(micro_path, "r"); 160209ff23fSmrg if (file == NULL) { 161209ff23fSmrg ERROR_0("Cannot open microcode file\n"); 162209ff23fSmrg return -1; 163209ff23fSmrg } 164209ff23fSmrg 165209ff23fSmrg if (!strcmp(micro_type, "BINARY")) 166209ff23fSmrg { 167209ff23fSmrg if (fread(microc_headp, sizeof(struct rt200_microc_head), 1, file) != 1) 168209ff23fSmrg { 169209ff23fSmrg ERROR("Cannot read header from file: %s\n", micro_path); 170209ff23fSmrg goto fail_exit; 171209ff23fSmrg } 172209ff23fSmrg 173209ff23fSmrg DEBUG("Microcode: num_seg: %x\n", microc_headp->num_seg); 174209ff23fSmrg 175209ff23fSmrg if (microc_headp->num_seg == 0) 176209ff23fSmrg goto fail_exit; 177209ff23fSmrg 178209ff23fSmrg for (i = 0; i < microc_headp->num_seg; i++) 179209ff23fSmrg { 180209ff23fSmrg int ret; 181209ff23fSmrg 1820974d292Smrg curr_seg = (struct rt200_microc_seg*)malloc(sizeof(struct rt200_microc_seg)); 183209ff23fSmrg if (curr_seg == NULL) 184209ff23fSmrg { 185209ff23fSmrg ERROR_0("Cannot allocate memory\n"); 186209ff23fSmrg goto fail_exit; 187209ff23fSmrg } 188209ff23fSmrg 189209ff23fSmrg ret = fread(&curr_seg->num_bytes, 4, 1, file); 190209ff23fSmrg ret += fread(&curr_seg->download_dst, 4, 1, file); 191209ff23fSmrg ret += fread(&curr_seg->crc_val, 4, 1, file); 192209ff23fSmrg if (ret != 3) 193209ff23fSmrg { 194209ff23fSmrg ERROR("Cannot read segment from microcode file: %s\n", micro_path); 195209ff23fSmrg goto fail_exit; 196209ff23fSmrg } 197209ff23fSmrg 1980974d292Smrg curr_seg->data = (unsigned char*)malloc(curr_seg->num_bytes); 199209ff23fSmrg if (curr_seg->data == NULL) 200209ff23fSmrg { 201209ff23fSmrg ERROR_0("cannot allocate memory\n"); 202209ff23fSmrg goto fail_exit; 203209ff23fSmrg } 204209ff23fSmrg 205209ff23fSmrg DEBUG("Microcode: segment number: %x\n", i); 206209ff23fSmrg DEBUG("Microcode: curr_seg->num_bytes: %x\n", curr_seg->num_bytes); 207209ff23fSmrg DEBUG("Microcode: curr_seg->download_dst: %x\n", curr_seg->download_dst); 208209ff23fSmrg DEBUG("Microcode: curr_seg->crc_val: %x\n", curr_seg->crc_val); 209209ff23fSmrg 210209ff23fSmrg if (seg_list) 211209ff23fSmrg { 212209ff23fSmrg prev_seg->next = curr_seg; 213209ff23fSmrg curr_seg->next = NULL; 214209ff23fSmrg prev_seg = curr_seg; 215209ff23fSmrg } 216209ff23fSmrg else 217209ff23fSmrg seg_list = prev_seg = curr_seg; 218209ff23fSmrg 219209ff23fSmrg } 220209ff23fSmrg 221209ff23fSmrg curr_seg = seg_list; 222209ff23fSmrg while (curr_seg) 223209ff23fSmrg { 224209ff23fSmrg if (fread(curr_seg->data, curr_seg->num_bytes, 1, file) != 1) 225209ff23fSmrg { 226209ff23fSmrg ERROR_0("Cannot read segment data\n"); 227209ff23fSmrg goto fail_exit; 228209ff23fSmrg } 229209ff23fSmrg 230209ff23fSmrg curr_seg = curr_seg->next; 231209ff23fSmrg } 232209ff23fSmrg } 233209ff23fSmrg else if (!strcmp(micro_type, "ASCII")) 234209ff23fSmrg { 235209ff23fSmrg char tmp1[12], tmp2[12], tmp3[12], tmp4[12]; 236209ff23fSmrg unsigned int ltmp; 237209ff23fSmrg 238209ff23fSmrg if ((fgets(tmp1, 12, file) != NULL) && 239209ff23fSmrg (fgets(tmp2, 12, file) != NULL) && 240209ff23fSmrg (fgets(tmp3, 12, file) != NULL) && 241209ff23fSmrg fgets(tmp4, 12, file) != NULL) 242209ff23fSmrg { 243209ff23fSmrg microc_headp->device_id = strtoul(tmp1, NULL, 16); 244209ff23fSmrg microc_headp->vendor_id = strtoul(tmp2, NULL, 16); 245209ff23fSmrg microc_headp->revision_id = strtoul(tmp3, NULL, 16); 246209ff23fSmrg microc_headp->num_seg = strtoul(tmp4, NULL, 16); 247209ff23fSmrg } 248209ff23fSmrg else 249209ff23fSmrg { 250209ff23fSmrg ERROR("Cannot read header from file: %s\n", micro_path); 251209ff23fSmrg goto fail_exit; 252209ff23fSmrg } 253209ff23fSmrg 254209ff23fSmrg DEBUG("Microcode: num_seg: %x\n", microc_headp->num_seg); 255209ff23fSmrg 256209ff23fSmrg if (microc_headp->num_seg == 0) 257209ff23fSmrg goto fail_exit; 258209ff23fSmrg 259209ff23fSmrg for (i = 0; i < microc_headp->num_seg; i++) 260209ff23fSmrg { 2610974d292Smrg curr_seg = (struct rt200_microc_seg*)malloc(sizeof(struct rt200_microc_seg)); 262209ff23fSmrg if (curr_seg == NULL) 263209ff23fSmrg { 264209ff23fSmrg ERROR_0("Cannot allocate memory\n"); 265209ff23fSmrg goto fail_exit; 266209ff23fSmrg } 267209ff23fSmrg 268209ff23fSmrg if (fgets(tmp1, 12, file) != NULL && 269209ff23fSmrg fgets(tmp2, 12, file) != NULL && 270209ff23fSmrg fgets(tmp3, 12, file) != NULL) 271209ff23fSmrg { 272209ff23fSmrg curr_seg->num_bytes = strtoul(tmp1, NULL, 16); 273209ff23fSmrg curr_seg->download_dst = strtoul(tmp2, NULL, 16); 274209ff23fSmrg curr_seg->crc_val = strtoul(tmp3, NULL, 16); 275209ff23fSmrg } 276209ff23fSmrg else 277209ff23fSmrg { 278209ff23fSmrg ERROR("Cannot read segment from microcode file: %s\n", micro_path); 279209ff23fSmrg goto fail_exit; 280209ff23fSmrg } 281209ff23fSmrg 2820974d292Smrg curr_seg->data = (unsigned char*)malloc(curr_seg->num_bytes); 283209ff23fSmrg if (curr_seg->data == NULL) 284209ff23fSmrg { 285209ff23fSmrg ERROR_0("cannot allocate memory\n"); 286209ff23fSmrg goto fail_exit; 287209ff23fSmrg } 288209ff23fSmrg 289209ff23fSmrg DEBUG("Microcode: segment number: %x\n", i); 290209ff23fSmrg DEBUG("Microcode: curr_seg->num_bytes: %x\n", curr_seg->num_bytes); 291209ff23fSmrg DEBUG("Microcode: curr_seg->download_dst: %x\n", curr_seg->download_dst); 292209ff23fSmrg DEBUG("Microcode: curr_seg->crc_val: %x\n", curr_seg->crc_val); 293209ff23fSmrg 294209ff23fSmrg if (seg_list) 295209ff23fSmrg { 296209ff23fSmrg curr_seg->next = NULL; 297209ff23fSmrg prev_seg->next = curr_seg; 298209ff23fSmrg prev_seg = curr_seg; 299209ff23fSmrg } 300209ff23fSmrg else 301209ff23fSmrg seg_list = prev_seg = curr_seg; 302209ff23fSmrg } 303209ff23fSmrg 304209ff23fSmrg curr_seg = seg_list; 305209ff23fSmrg while (curr_seg) 306209ff23fSmrg { 307209ff23fSmrg for ( i = 0; i < curr_seg->num_bytes; i+=4) 308209ff23fSmrg { 309209ff23fSmrg 310209ff23fSmrg if (fgets(tmp1, 12, file) == NULL) 311209ff23fSmrg { 312209ff23fSmrg ERROR_0("Cannot read from file\n"); 313209ff23fSmrg goto fail_exit; 314209ff23fSmrg } 315209ff23fSmrg ltmp = strtoul(tmp1, NULL, 16); 316209ff23fSmrg 317209ff23fSmrg *(unsigned int*)(curr_seg->data + i) = ltmp; 318209ff23fSmrg } 319209ff23fSmrg 320209ff23fSmrg curr_seg = curr_seg->next; 321209ff23fSmrg } 322209ff23fSmrg 323209ff23fSmrg } 324209ff23fSmrg else 325209ff23fSmrg { 326209ff23fSmrg ERROR("File type %s unknown\n", micro_type); 327209ff23fSmrg } 328209ff23fSmrg 329209ff23fSmrg microc_datap->microc_seg_list = seg_list; 330209ff23fSmrg 331209ff23fSmrg fclose(file); 332209ff23fSmrg return 0; 333209ff23fSmrg 334209ff23fSmrgfail_exit: 335209ff23fSmrg curr_seg = seg_list; 336209ff23fSmrg while(curr_seg) 337209ff23fSmrg { 3382f39173dSmrg free(curr_seg->data); 339209ff23fSmrg prev_seg = curr_seg; 340209ff23fSmrg curr_seg = curr_seg->next; 3412f39173dSmrg free(prev_seg); 342209ff23fSmrg } 343209ff23fSmrg fclose(file); 344209ff23fSmrg 345209ff23fSmrg return -1; 346209ff23fSmrg} 347209ff23fSmrg 348209ff23fSmrgstatic void microc_clean(struct rt200_microc_data* microc_datap, int screen) 349209ff23fSmrg{ 350209ff23fSmrg struct rt200_microc_seg* seg_list = microc_datap->microc_seg_list; 351209ff23fSmrg struct rt200_microc_seg* prev_seg; 352209ff23fSmrg 353209ff23fSmrg while(seg_list) 354209ff23fSmrg { 3552f39173dSmrg free(seg_list->data); 356209ff23fSmrg prev_seg = seg_list; 357209ff23fSmrg seg_list = seg_list->next; 3582f39173dSmrg free(prev_seg); 359209ff23fSmrg } 360209ff23fSmrg} 361209ff23fSmrg 362209ff23fSmrgstatic int dsp_init(TheatrePtr t, struct rt200_microc_data* microc_datap) 363209ff23fSmrg{ 364209ff23fSmrg uint32_t data; 365209ff23fSmrg int i = 0; 36668105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 367209ff23fSmrg 368209ff23fSmrg /* Map FIFOD to DSP Port I/O port */ 369209ff23fSmrg RT_regr(VIP_HOSTINTF_PORT_CNTL, &data); 370209ff23fSmrg RT_regw(VIP_HOSTINTF_PORT_CNTL, data & (~VIP_HOSTINTF_PORT_CNTL__FIFO_RW_MODE)); 371209ff23fSmrg 372209ff23fSmrg /* The default endianess is LE. It matches the ost one for x86 */ 373209ff23fSmrg RT_regr(VIP_HOSTINTF_PORT_CNTL, &data); 374209ff23fSmrg RT_regw(VIP_HOSTINTF_PORT_CNTL, data & (~VIP_HOSTINTF_PORT_CNTL__FIFOD_ENDIAN_SWAP)); 375209ff23fSmrg 376209ff23fSmrg /* Wait until Shuttle bus channel 14 is available */ 377209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 378209ff23fSmrg while(((data & VIP_TC_STATUS__TC_CHAN_BUSY) & 0x00004000) && (i++ < 10000)) 379209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 380209ff23fSmrg 381209ff23fSmrg DEBUG_0("Microcode: dsp_init: channel 14 available\n"); 382209ff23fSmrg 383209ff23fSmrg return 0; 384209ff23fSmrg} 385209ff23fSmrg 386209ff23fSmrgstatic int dsp_load(TheatrePtr t, struct rt200_microc_data* microc_datap) 387209ff23fSmrg{ 388209ff23fSmrg struct rt200_microc_seg* seg_list = microc_datap->microc_seg_list; 389209ff23fSmrg uint8_t data8; 390209ff23fSmrg uint32_t data, fb_scratch0, fb_scratch1; 391209ff23fSmrg uint32_t i; 392209ff23fSmrg uint32_t tries = 0; 393209ff23fSmrg uint32_t result = 0; 394209ff23fSmrg uint32_t seg_id = 0; 39568105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 396209ff23fSmrg 397209ff23fSmrg DEBUG("Microcode: before everything: %x\n", data8); 398209ff23fSmrg 399209ff23fSmrg if (RT_fifor(0x000, &data8)) 400209ff23fSmrg DEBUG("Microcode: FIFO status0: %x\n", data8); 401209ff23fSmrg else 402209ff23fSmrg { 403209ff23fSmrg ERROR_0("Microcode: error reading FIFO status0\n"); 404209ff23fSmrg return -1; 405209ff23fSmrg } 406209ff23fSmrg 407209ff23fSmrg 408209ff23fSmrg if (RT_fifor(0x100, &data8)) 409209ff23fSmrg DEBUG("Microcode: FIFO status1: %x\n", data8); 410209ff23fSmrg else 411209ff23fSmrg { 412209ff23fSmrg ERROR_0("Microcode: error reading FIFO status1\n"); 413209ff23fSmrg return -1; 414209ff23fSmrg } 415209ff23fSmrg 416209ff23fSmrg /* 417209ff23fSmrg * Download the Boot Code and CRC Checking Code (first segment) 418209ff23fSmrg */ 419209ff23fSmrg seg_id = 1; 420209ff23fSmrg while(result != DSP_OK && tries < 10) 421209ff23fSmrg { 422209ff23fSmrg /* Put DSP in reset before download (0x02) */ 423209ff23fSmrg RT_regr(VIP_TC_DOWNLOAD, &data); 424209ff23fSmrg RT_regw(VIP_TC_DOWNLOAD, (data & ~VIP_TC_DOWNLOAD__TC_RESET_MODE) | (0x02 << 17)); 425209ff23fSmrg 426209ff23fSmrg /* 427209ff23fSmrg * Configure shuttle bus for tranfer between DSP I/O "Program Interface" 428209ff23fSmrg * and Program Memory at address 0 429209ff23fSmrg */ 430209ff23fSmrg 431209ff23fSmrg RT_regw(VIP_TC_SOURCE, 0x90000000); 432209ff23fSmrg RT_regw(VIP_TC_DESTINATION, 0x00000000); 433209ff23fSmrg RT_regw(VIP_TC_COMMAND, 0xe0000044 | ((seg_list->num_bytes - 1) << 7)); 434209ff23fSmrg 435209ff23fSmrg /* Load first segment */ 436209ff23fSmrg DEBUG_0("Microcode: Loading first segment\n"); 437209ff23fSmrg 438209ff23fSmrg if (!RT_fifow(0x700, seg_list->num_bytes, seg_list->data)) 439209ff23fSmrg { 440209ff23fSmrg ERROR_0("Microcode: write to FIFOD failed\n"); 441209ff23fSmrg return -1; 442209ff23fSmrg } 443209ff23fSmrg 444209ff23fSmrg /* Wait until Shuttle bus channel 14 is available */ 445209ff23fSmrg i = data = 0; 446209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 447209ff23fSmrg while(((data & VIP_TC_STATUS__TC_CHAN_BUSY) & 0x00004000) && (i++ < 10000)) 448209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 449209ff23fSmrg 450209ff23fSmrg if (i >= 10000) 451209ff23fSmrg { 452209ff23fSmrg ERROR_0("Microcode: channel 14 timeout\n"); 453209ff23fSmrg return -1; 454209ff23fSmrg } 455209ff23fSmrg 456209ff23fSmrg DEBUG_0("Microcode: dsp_load: checkpoint 1\n"); 457209ff23fSmrg DEBUG("Microcode: TC_STATUS: %x\n", data); 458209ff23fSmrg 459209ff23fSmrg /* transfer the code from program memory to data memory */ 460209ff23fSmrg RT_regw(VIP_TC_SOURCE, 0x00000000); 461209ff23fSmrg RT_regw(VIP_TC_DESTINATION, 0x10000000); 462209ff23fSmrg RT_regw(VIP_TC_COMMAND, 0xe0000006 | ((seg_list->num_bytes - 1) << 7)); 463209ff23fSmrg 464209ff23fSmrg /* Wait until Shuttle bus channel 14 is available */ 465209ff23fSmrg i = data = 0; 466209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 467209ff23fSmrg while(((data & VIP_TC_STATUS__TC_CHAN_BUSY) & 0x00004000) && (i++ < 10000)) 468209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 469209ff23fSmrg 470209ff23fSmrg if (i >= 10000) 471209ff23fSmrg { 472209ff23fSmrg ERROR_0("Microcode: channel 14 timeout\n"); 473209ff23fSmrg return -1; 474209ff23fSmrg } 475209ff23fSmrg DEBUG_0("Microcode: dsp_load: checkpoint 2\n"); 476209ff23fSmrg DEBUG("Microcode: TC_STATUS: %x\n", data); 477209ff23fSmrg 478209ff23fSmrg /* Take DSP out from reset (0x0) */ 479209ff23fSmrg data = 0; 480209ff23fSmrg RT_regr(VIP_TC_DOWNLOAD, &data); 481209ff23fSmrg RT_regw(VIP_TC_DOWNLOAD, data & ~VIP_TC_DOWNLOAD__TC_RESET_MODE); 482209ff23fSmrg 483209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 484209ff23fSmrg DEBUG_0("Microcode: dsp_load: checkpoint 3\n"); 485209ff23fSmrg DEBUG("Microcode: TC_STATUS: %x\n", data); 486209ff23fSmrg 487209ff23fSmrg /* send dsp_download_check_CRC */ 488209ff23fSmrg fb_scratch0 = ((seg_list->num_bytes << 16) & 0xffff0000) | ((seg_id << 8) & 0xff00) | (0xff & 193); 489209ff23fSmrg fb_scratch1 = (unsigned int)seg_list->crc_val; 490209ff23fSmrg 491209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 492209ff23fSmrg 493209ff23fSmrg DEBUG_0("Microcode: dsp_load: checkpoint 4\n"); 494209ff23fSmrg } 495209ff23fSmrg 496209ff23fSmrg if (tries >= 10) 497209ff23fSmrg { 498209ff23fSmrg ERROR_0("Microcode: Download of boot degment failed\n"); 499209ff23fSmrg return -1; 500209ff23fSmrg } 501209ff23fSmrg 502209ff23fSmrg DEBUG_0("Microcode: Download of boot code succeeded\n"); 503209ff23fSmrg 504209ff23fSmrg while((seg_list = seg_list->next) != NULL) 505209ff23fSmrg { 506209ff23fSmrg seg_id++; 507209ff23fSmrg result = tries = 0; 508209ff23fSmrg while(result != DSP_OK && tries < 10) 509209ff23fSmrg { 510209ff23fSmrg /* 511209ff23fSmrg * Configure shuttle bus for tranfer between DSP I/O "Program Interface" 512209ff23fSmrg * and Data Memory at address 0 513209ff23fSmrg */ 514209ff23fSmrg 515209ff23fSmrg RT_regw(VIP_TC_SOURCE, 0x90000000); 516209ff23fSmrg RT_regw(VIP_TC_DESTINATION, 0x10000000); 517209ff23fSmrg RT_regw(VIP_TC_COMMAND, 0xe0000044 | ((seg_list->num_bytes - 1) << 7)); 518209ff23fSmrg 519209ff23fSmrg if (!RT_fifow(0x700, seg_list->num_bytes, seg_list->data)) 520209ff23fSmrg { 521209ff23fSmrg ERROR_0("Microcode: write to FIFOD failed\n"); 522209ff23fSmrg return -1; 523209ff23fSmrg } 524209ff23fSmrg 525209ff23fSmrg i = data = 0; 526209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 527209ff23fSmrg while(((data & VIP_TC_STATUS__TC_CHAN_BUSY) & 0x00004000) && (i++ < 10000)) 528209ff23fSmrg RT_regr(VIP_TC_STATUS, &data); 529209ff23fSmrg 530209ff23fSmrg /* send dsp_download_check_CRC */ 531209ff23fSmrg fb_scratch0 = ((seg_list->num_bytes << 16) & 0xffff0000) | ((seg_id << 8) & 0xff00) | (0xff & 193); 532209ff23fSmrg fb_scratch1 = (unsigned int)seg_list->crc_val; 533209ff23fSmrg 534209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 535209ff23fSmrg } 536209ff23fSmrg 537209ff23fSmrg if (i >=10) 538209ff23fSmrg { 539209ff23fSmrg ERROR("Microcode: DSP failed to move seg: %x from data to code memory\n", seg_id); 540209ff23fSmrg return -1; 541209ff23fSmrg } 542209ff23fSmrg 543209ff23fSmrg DEBUG("Microcode: segment: %x loaded\n", seg_id); 544209ff23fSmrg 545209ff23fSmrg /* 546209ff23fSmrg * The segment is downloaded correctly to data memory. Now move it to code memory 547209ff23fSmrg * by using dsp_download_code_transfer command. 548209ff23fSmrg */ 549209ff23fSmrg 550209ff23fSmrg fb_scratch0 = ((seg_list->num_bytes << 16) & 0xffff0000) | ((seg_id << 8) & 0xff00) | (0xff & 194); 551209ff23fSmrg fb_scratch1 = (unsigned int)seg_list->download_dst; 552209ff23fSmrg 553209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 554209ff23fSmrg 555209ff23fSmrg if (result != DSP_OK) 556209ff23fSmrg { 557209ff23fSmrg ERROR("Microcode: DSP failed to move seg: %x from data to code memory\n", seg_id); 558209ff23fSmrg return -1; 559209ff23fSmrg } 560209ff23fSmrg } 561209ff23fSmrg 562209ff23fSmrg DEBUG_0("Microcode: download complete\n"); 563209ff23fSmrg 564209ff23fSmrg /* 565209ff23fSmrg * The last step is sending dsp_download_check_CRC with "download complete" 566209ff23fSmrg */ 567209ff23fSmrg 568209ff23fSmrg fb_scratch0 = ((165 << 8) & 0xff00) | (0xff & 193); 569209ff23fSmrg fb_scratch1 = (unsigned int)0x11111; 570209ff23fSmrg 571209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 572209ff23fSmrg 573209ff23fSmrg if (result == DSP_OK) 574209ff23fSmrg DEBUG_0("Microcode: DSP microcode successfully loaded\n"); 575209ff23fSmrg else 576209ff23fSmrg { 577209ff23fSmrg ERROR_0("Microcode: DSP microcode UNsuccessfully loaded\n"); 578209ff23fSmrg return -1; 579209ff23fSmrg } 580209ff23fSmrg 581209ff23fSmrg return 0; 582209ff23fSmrg} 583209ff23fSmrg 584209ff23fSmrgstatic uint32_t dsp_send_command(TheatrePtr t, uint32_t fb_scratch1, uint32_t fb_scratch0) 585209ff23fSmrg{ 586209ff23fSmrg uint32_t data; 587209ff23fSmrg int i; 588209ff23fSmrg 589209ff23fSmrg /* 590209ff23fSmrg * Clear the FB_INT0 bit in INT_CNTL 591209ff23fSmrg */ 592209ff23fSmrg RT_regr(VIP_INT_CNTL, &data); 593209ff23fSmrg RT_regw(VIP_INT_CNTL, data | VIP_INT_CNTL__FB_INT0_CLR); 594209ff23fSmrg 595209ff23fSmrg /* 596209ff23fSmrg * Write FB_SCRATCHx registers. If FB_SCRATCH1==0 then we have a DWORD command. 597209ff23fSmrg */ 598209ff23fSmrg RT_regw(VIP_FB_SCRATCH0, fb_scratch0); 599209ff23fSmrg if (fb_scratch1 != 0) 600209ff23fSmrg RT_regw(VIP_FB_SCRATCH1, fb_scratch1); 601209ff23fSmrg 602209ff23fSmrg /* 603209ff23fSmrg * Attention DSP. We are talking to you. 604209ff23fSmrg */ 605209ff23fSmrg RT_regr(VIP_FB_INT, &data); 606209ff23fSmrg RT_regw(VIP_FB_INT, data | VIP_FB_INT__INT_7); 607209ff23fSmrg 608209ff23fSmrg /* 609209ff23fSmrg * Wait (by polling) for the DSP to process the command. 610209ff23fSmrg */ 611209ff23fSmrg i = 0; 612209ff23fSmrg RT_regr(VIP_INT_CNTL, &data); 613209ff23fSmrg while((!(data & VIP_INT_CNTL__FB_INT0)) /*&& (i++ < 10000)*/) 614209ff23fSmrg RT_regr(VIP_INT_CNTL, &data); 615209ff23fSmrg 616209ff23fSmrg /* 617209ff23fSmrg * The return code is in FB_SCRATCH0 618209ff23fSmrg */ 619209ff23fSmrg RT_regr(VIP_FB_SCRATCH0, &fb_scratch0); 620209ff23fSmrg 621209ff23fSmrg /* 622209ff23fSmrg * If we are here it means we got an answer. Clear the FB_INT0 bit. 623209ff23fSmrg */ 624209ff23fSmrg RT_regr(VIP_INT_CNTL, &data); 625209ff23fSmrg RT_regw(VIP_INT_CNTL, data | VIP_INT_CNTL__FB_INT0_CLR); 626209ff23fSmrg 627209ff23fSmrg 628209ff23fSmrg return fb_scratch0; 629209ff23fSmrg} 630209ff23fSmrg 631209ff23fSmrgstatic uint32_t dsp_set_video_input_connector(TheatrePtr t, uint32_t connector) 632209ff23fSmrg{ 633209ff23fSmrg uint32_t fb_scratch0 = 0; 634209ff23fSmrg uint32_t result; 63568105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 636209ff23fSmrg 637209ff23fSmrg fb_scratch0 = ((connector << 8) & 0xff00) | (55 & 0xff); 638209ff23fSmrg 639209ff23fSmrg result = dsp_send_command(t, 0, fb_scratch0); 640209ff23fSmrg 641209ff23fSmrg DEBUG_2("dsp_set_video_input_connector: %x, result: %x\n", connector, result); 642209ff23fSmrg 643209ff23fSmrg return result; 644209ff23fSmrg} 645209ff23fSmrg 646209ff23fSmrg#if 0 647209ff23fSmrgstatic uint32_t dsp_reset(TheatrePtr t) 648209ff23fSmrg{ 649209ff23fSmrg uint32_t fb_scratch0 = 0; 650209ff23fSmrg uint32_t result; 65168105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 652209ff23fSmrg 653209ff23fSmrg fb_scratch0 = ((2 << 8) & 0xff00) | (8 & 0xff); 654209ff23fSmrg 655209ff23fSmrg result = dsp_send_command(t, 0, fb_scratch0); 656209ff23fSmrg 657209ff23fSmrg DEBUG("dsp_reset: %x\n", result); 658209ff23fSmrg 659209ff23fSmrg return result; 660209ff23fSmrg} 661209ff23fSmrg#endif 662209ff23fSmrg 663209ff23fSmrgstatic uint32_t dsp_set_lowpowerstate(TheatrePtr t, uint32_t pstate) 664209ff23fSmrg{ 665209ff23fSmrg uint32_t fb_scratch0 = 0; 666209ff23fSmrg uint32_t result; 66768105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 668209ff23fSmrg 669209ff23fSmrg fb_scratch0 = ((pstate << 8) & 0xff00) | (82 & 0xff); 670209ff23fSmrg 671209ff23fSmrg result = dsp_send_command(t, 0, fb_scratch0); 672209ff23fSmrg 673209ff23fSmrg DEBUG("dsp_set_lowpowerstate: %x\n", result); 674209ff23fSmrg 675209ff23fSmrg return result; 676209ff23fSmrg} 677209ff23fSmrgstatic uint32_t dsp_set_video_standard(TheatrePtr t, uint32_t standard) 678209ff23fSmrg{ 679209ff23fSmrg uint32_t fb_scratch0 = 0; 680209ff23fSmrg uint32_t result; 68168105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 682209ff23fSmrg 683209ff23fSmrg fb_scratch0 = ((standard << 8) & 0xff00) | (52 & 0xff); 684209ff23fSmrg 685209ff23fSmrg result = dsp_send_command(t, 0, fb_scratch0); 686209ff23fSmrg 687209ff23fSmrg DEBUG("dsp_set_video_standard: %x\n", result); 688209ff23fSmrg 689209ff23fSmrg return result; 690209ff23fSmrg} 691209ff23fSmrg 692209ff23fSmrgstatic uint32_t dsp_set_videostreamformat(TheatrePtr t, uint32_t format) 693209ff23fSmrg{ 694209ff23fSmrg uint32_t fb_scratch0 = 0; 695209ff23fSmrg uint32_t result; 69668105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 697209ff23fSmrg 698209ff23fSmrg fb_scratch0 = ((format << 8) & 0xff00) | (65 & 0xff); 699209ff23fSmrg 700209ff23fSmrg result = dsp_send_command(t, 0, fb_scratch0); 701209ff23fSmrg 702209ff23fSmrg DEBUG("dsp_set_videostreamformat: %x\n", result); 703209ff23fSmrg 704209ff23fSmrg return result; 705209ff23fSmrg} 706209ff23fSmrg 707209ff23fSmrgstatic uint32_t dsp_video_standard_detection(TheatrePtr t) 708209ff23fSmrg{ 709209ff23fSmrg uint32_t fb_scratch0 = 0; 710209ff23fSmrg uint32_t result; 71168105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 712209ff23fSmrg 713209ff23fSmrg fb_scratch0 = 0 | (54 & 0xff); 714209ff23fSmrg 715209ff23fSmrg result = dsp_send_command(t, 0, fb_scratch0); 716209ff23fSmrg 717209ff23fSmrg DEBUG("dsp_video_standard_detection: %x\n", result); 718209ff23fSmrg 719209ff23fSmrg return result; 720209ff23fSmrg} 721209ff23fSmrg 722209ff23fSmrg#if 0 723209ff23fSmrgstatic uint32_t dsp_get_signallockstatus(TheatrePtr t) 724209ff23fSmrg{ 725209ff23fSmrg uint32_t fb_scratch1 = 0; 726209ff23fSmrg uint32_t fb_scratch0 = 0; 727209ff23fSmrg uint32_t result; 72868105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 729209ff23fSmrg 730209ff23fSmrg fb_scratch0 = 0 | (77 & 0xff); 731209ff23fSmrg 732209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 733209ff23fSmrg 734209ff23fSmrg DEBUG_3("dsp_get_signallockstatus: %x, h_pll: %x, v_pll: %x\n", \ 735209ff23fSmrg result, (result >> 8) & 0xff, (result >> 16) & 0xff); 736209ff23fSmrg 737209ff23fSmrg return result; 738209ff23fSmrg} 739209ff23fSmrg 740209ff23fSmrgstatic uint32_t dsp_get_signallinenumber(TheatrePtr t) 741209ff23fSmrg{ 742209ff23fSmrg uint32_t fb_scratch1 = 0; 743209ff23fSmrg uint32_t fb_scratch0 = 0; 744209ff23fSmrg uint32_t result; 74568105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 746209ff23fSmrg 747209ff23fSmrg fb_scratch0 = 0 | (78 & 0xff); 748209ff23fSmrg 749209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 750209ff23fSmrg 751209ff23fSmrg DEBUG_2("dsp_get_signallinenumber: %x, linenum: %x\n", \ 752209ff23fSmrg result, (result >> 8) & 0xffff); 753209ff23fSmrg 754209ff23fSmrg return result; 755209ff23fSmrg} 756209ff23fSmrg#endif 757209ff23fSmrg 758209ff23fSmrgstatic uint32_t dsp_set_brightness(TheatrePtr t, uint8_t brightness) 759209ff23fSmrg{ 760209ff23fSmrg uint32_t fb_scratch1 = 0; 761209ff23fSmrg uint32_t fb_scratch0 = 0; 762209ff23fSmrg uint32_t result; 76368105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 764209ff23fSmrg 765209ff23fSmrg fb_scratch0 = ((brightness << 8) & 0xff00) | (67 & 0xff); 766209ff23fSmrg 767209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 768209ff23fSmrg 769209ff23fSmrg DEBUG("dsp_set_brightness: %x\n", result); 770209ff23fSmrg 771209ff23fSmrg return result; 772209ff23fSmrg} 773209ff23fSmrg 774209ff23fSmrgstatic uint32_t dsp_set_contrast(TheatrePtr t, uint8_t contrast) 775209ff23fSmrg{ 776209ff23fSmrg uint32_t fb_scratch1 = 0; 777209ff23fSmrg uint32_t fb_scratch0 = 0; 778209ff23fSmrg uint32_t result; 77968105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 780209ff23fSmrg 781209ff23fSmrg fb_scratch0 = ((contrast << 8) & 0xff00) | (71 & 0xff); 782209ff23fSmrg 783209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 784209ff23fSmrg 785209ff23fSmrg DEBUG("dsp_set_contrast: %x\n", result); 786209ff23fSmrg 787209ff23fSmrg return result; 788209ff23fSmrg} 789209ff23fSmrg 790209ff23fSmrg#if 0 791209ff23fSmrgstatic uint32_t dsp_set_sharpness(TheatrePtr t, int sharpness) 792209ff23fSmrg{ 793209ff23fSmrg uint32_t fb_scratch1 = 0; 794209ff23fSmrg uint32_t fb_scratch0 = 0; 795209ff23fSmrg uint32_t result; 79668105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 797209ff23fSmrg 798209ff23fSmrg fb_scratch0 = 0 | (73 & 0xff); 799209ff23fSmrg 800209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 801209ff23fSmrg 802209ff23fSmrg DEBUG("dsp_set_sharpness: %x\n", result); 803209ff23fSmrg 804209ff23fSmrg return result; 805209ff23fSmrg} 806209ff23fSmrg#endif 807209ff23fSmrg 808209ff23fSmrgstatic uint32_t dsp_set_tint(TheatrePtr t, uint8_t tint) 809209ff23fSmrg{ 810209ff23fSmrg uint32_t fb_scratch1 = 0; 811209ff23fSmrg uint32_t fb_scratch0 = 0; 812209ff23fSmrg uint32_t result; 81368105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 814209ff23fSmrg 815209ff23fSmrg fb_scratch0 = ((tint << 8) & 0xff00) | (75 & 0xff); 816209ff23fSmrg 817209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 818209ff23fSmrg 819209ff23fSmrg DEBUG("dsp_set_tint: %x\n", result); 820209ff23fSmrg 821209ff23fSmrg return result; 822209ff23fSmrg} 823209ff23fSmrg 824209ff23fSmrgstatic uint32_t dsp_set_saturation(TheatrePtr t, uint8_t saturation) 825209ff23fSmrg{ 826209ff23fSmrg uint32_t fb_scratch1 = 0; 827209ff23fSmrg uint32_t fb_scratch0 = 0; 828209ff23fSmrg uint32_t result; 82968105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 830209ff23fSmrg 831209ff23fSmrg fb_scratch0 = ((saturation << 8) & 0xff00) | (69 & 0xff); 832209ff23fSmrg 833209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 834209ff23fSmrg 835209ff23fSmrg DEBUG("dsp_set_saturation: %x\n", result); 836209ff23fSmrg 837209ff23fSmrg return result; 838209ff23fSmrg} 839209ff23fSmrg 840209ff23fSmrgstatic uint32_t dsp_set_video_scaler_horizontal(TheatrePtr t, uint16_t output_width, uint16_t horz_start, uint16_t horz_end) 841209ff23fSmrg{ 842209ff23fSmrg uint32_t fb_scratch1 = 0; 843209ff23fSmrg uint32_t fb_scratch0 = 0; 844209ff23fSmrg uint32_t result; 84568105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 846209ff23fSmrg 847209ff23fSmrg fb_scratch0 = ((output_width << 8) & 0x00ffff00) | (195 & 0xff); 848209ff23fSmrg fb_scratch1 = ((horz_end << 16) & 0xffff0000) | (horz_start & 0xffff); 849209ff23fSmrg 850209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 851209ff23fSmrg 852209ff23fSmrg DEBUG("dsp_set_video_scaler_horizontal: %x\n", result); 853209ff23fSmrg 854209ff23fSmrg return result; 855209ff23fSmrg} 856209ff23fSmrg 857209ff23fSmrgstatic uint32_t dsp_set_video_scaler_vertical(TheatrePtr t, uint16_t output_height, uint16_t vert_start, uint16_t vert_end) 858209ff23fSmrg{ 859209ff23fSmrg uint32_t fb_scratch1 = 0; 860209ff23fSmrg uint32_t fb_scratch0 = 0; 861209ff23fSmrg uint32_t result; 86268105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 863209ff23fSmrg 864209ff23fSmrg fb_scratch0 = ((output_height << 8) & 0x00ffff00) | (196 & 0xff); 865209ff23fSmrg fb_scratch1 = ((vert_end << 16) & 0xffff0000) | (vert_start & 0xffff); 866209ff23fSmrg 867209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 868209ff23fSmrg 869209ff23fSmrg DEBUG("dsp_set_video_scaler_vertical: %x\n", result); 870209ff23fSmrg 871209ff23fSmrg return result; 872209ff23fSmrg} 873209ff23fSmrg 874209ff23fSmrgstatic uint32_t dsp_audio_mute(TheatrePtr t, uint8_t left, uint8_t right) 875209ff23fSmrg{ 876209ff23fSmrg uint32_t fb_scratch1 = 0; 877209ff23fSmrg uint32_t fb_scratch0 = 0; 878209ff23fSmrg uint32_t result; 87968105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 880209ff23fSmrg 881209ff23fSmrg fb_scratch0 = ((right << 16) & 0xff0000) | ((left << 8) & 0xff00) | (21 & 0xff); 882209ff23fSmrg 883209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 884209ff23fSmrg 885209ff23fSmrg DEBUG("dsp_audio_mute: %x\n", result); 886209ff23fSmrg 887209ff23fSmrg return result; 888209ff23fSmrg} 889209ff23fSmrg 890209ff23fSmrgstatic uint32_t dsp_set_audio_volume(TheatrePtr t, uint8_t left, uint8_t right, uint8_t auto_mute) 891209ff23fSmrg{ 892209ff23fSmrg uint32_t fb_scratch1 = 0; 893209ff23fSmrg uint32_t fb_scratch0 = 0; 894209ff23fSmrg uint32_t result; 89568105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 896209ff23fSmrg 897209ff23fSmrg fb_scratch0 = ((auto_mute << 24) & 0xff000000) | ((right << 16) & 0xff0000) | ((left << 8) & 0xff00) | (22 & 0xff); 898209ff23fSmrg 899209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 900209ff23fSmrg 901209ff23fSmrg DEBUG("dsp_set_audio_volume: %x\n", result); 902209ff23fSmrg 903209ff23fSmrg return result; 904209ff23fSmrg} 905209ff23fSmrg 906209ff23fSmrg#if 0 907209ff23fSmrgstatic uint32_t dsp_audio_detection(TheatrePtr t, uint8_t option) 908209ff23fSmrg{ 909209ff23fSmrg uint32_t fb_scratch1 = 0; 910209ff23fSmrg uint32_t fb_scratch0 = 0; 911209ff23fSmrg uint32_t result; 91268105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 913209ff23fSmrg 914209ff23fSmrg fb_scratch0 = ((option << 8) & 0xff00) | (16 & 0xff); 915209ff23fSmrg 916209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 917209ff23fSmrg 918209ff23fSmrg DEBUG("dsp_audio_detection: %x\n", result); 919209ff23fSmrg 920209ff23fSmrg return result; 921209ff23fSmrg} 922209ff23fSmrg#endif 923209ff23fSmrg 924209ff23fSmrgstatic uint32_t dsp_configure_i2s_port(TheatrePtr t, uint8_t tx_mode, uint8_t rx_mode, uint8_t clk_mode) 925209ff23fSmrg{ 926209ff23fSmrg uint32_t fb_scratch1 = 0; 927209ff23fSmrg uint32_t fb_scratch0 = 0; 928209ff23fSmrg uint32_t result; 92968105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 930209ff23fSmrg 931209ff23fSmrg fb_scratch0 = ((clk_mode << 24) & 0xff000000) | ((rx_mode << 16) & 0xff0000) | ((tx_mode << 8) & 0xff00) | (40 & 0xff); 932209ff23fSmrg 933209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 934209ff23fSmrg 935209ff23fSmrg DEBUG("dsp_configure_i2s_port: %x\n", result); 936209ff23fSmrg 937209ff23fSmrg return result; 938209ff23fSmrg} 939209ff23fSmrg 940209ff23fSmrgstatic uint32_t dsp_configure_spdif_port(TheatrePtr t, uint8_t state) 941209ff23fSmrg{ 942209ff23fSmrg uint32_t fb_scratch1 = 0; 943209ff23fSmrg uint32_t fb_scratch0 = 0; 944209ff23fSmrg uint32_t result; 94568105dcbSveego int screen = t->VIP->pScrn->scrnIndex; 946209ff23fSmrg 947209ff23fSmrg fb_scratch0 = ((state << 8) & 0xff00) | (41 & 0xff); 948209ff23fSmrg 949209ff23fSmrg result = dsp_send_command(t, fb_scratch1, fb_scratch0); 950209ff23fSmrg 951209ff23fSmrg DEBUG("dsp_configure_spdif_port: %x\n", result); 952209ff23fSmrg 953209ff23fSmrg return result; 954209ff23fSmrg} 955209ff23fSmrg 956209ff23fSmrgenum 957209ff23fSmrg{ 958209ff23fSmrgfld_tmpReg1=0, 959209ff23fSmrgfld_tmpReg2, 960209ff23fSmrgfld_tmpReg3, 961209ff23fSmrgfld_LP_CONTRAST, 962209ff23fSmrgfld_LP_BRIGHTNESS, 963209ff23fSmrgfld_CP_HUE_CNTL, 964209ff23fSmrgfld_LUMA_FILTER, 965209ff23fSmrgfld_H_SCALE_RATIO, 966209ff23fSmrgfld_H_SHARPNESS, 967209ff23fSmrgfld_V_SCALE_RATIO, 968209ff23fSmrgfld_V_DEINTERLACE_ON, 969209ff23fSmrgfld_V_BYPSS, 970209ff23fSmrgfld_V_DITHER_ON, 971209ff23fSmrgfld_EVENF_OFFSET, 972209ff23fSmrgfld_ODDF_OFFSET, 973209ff23fSmrgfld_INTERLACE_DETECTED, 974209ff23fSmrgfld_VS_LINE_COUNT, 975209ff23fSmrgfld_VS_DETECTED_LINES, 976209ff23fSmrgfld_VS_ITU656_VB, 977209ff23fSmrgfld_VBI_CC_DATA, 978209ff23fSmrgfld_VBI_CC_WT, 979209ff23fSmrgfld_VBI_CC_WT_ACK, 980209ff23fSmrgfld_VBI_CC_HOLD, 981209ff23fSmrgfld_VBI_DECODE_EN, 982209ff23fSmrgfld_VBI_CC_DTO_P, 983209ff23fSmrgfld_VBI_20BIT_DTO_P, 984209ff23fSmrgfld_VBI_CC_LEVEL, 985209ff23fSmrgfld_VBI_20BIT_LEVEL, 986209ff23fSmrgfld_VBI_CLK_RUNIN_GAIN, 987209ff23fSmrgfld_H_VBI_WIND_START, 988209ff23fSmrgfld_H_VBI_WIND_END, 989209ff23fSmrgfld_V_VBI_WIND_START, 990209ff23fSmrgfld_V_VBI_WIND_END, 991209ff23fSmrgfld_VBI_20BIT_DATA0, 992209ff23fSmrgfld_VBI_20BIT_DATA1, 993209ff23fSmrgfld_VBI_20BIT_WT, 994209ff23fSmrgfld_VBI_20BIT_WT_ACK, 995209ff23fSmrgfld_VBI_20BIT_HOLD, 996209ff23fSmrgfld_VBI_CAPTURE_ENABLE, 997209ff23fSmrgfld_VBI_EDS_DATA, 998209ff23fSmrgfld_VBI_EDS_WT, 999209ff23fSmrgfld_VBI_EDS_WT_ACK, 1000209ff23fSmrgfld_VBI_EDS_HOLD, 1001209ff23fSmrgfld_VBI_SCALING_RATIO, 1002209ff23fSmrgfld_VBI_ALIGNER_ENABLE, 1003209ff23fSmrgfld_H_ACTIVE_START, 1004209ff23fSmrgfld_H_ACTIVE_END, 1005209ff23fSmrgfld_V_ACTIVE_START, 1006209ff23fSmrgfld_V_ACTIVE_END, 1007209ff23fSmrgfld_CH_HEIGHT, 1008209ff23fSmrgfld_CH_KILL_LEVEL, 1009209ff23fSmrgfld_CH_AGC_ERROR_LIM, 1010209ff23fSmrgfld_CH_AGC_FILTER_EN, 1011209ff23fSmrgfld_CH_AGC_LOOP_SPEED, 1012209ff23fSmrgfld_HUE_ADJ, 1013209ff23fSmrgfld_STANDARD_SEL, 1014209ff23fSmrgfld_STANDARD_YC, 1015209ff23fSmrgfld_ADC_PDWN, 1016209ff23fSmrgfld_INPUT_SELECT, 1017209ff23fSmrgfld_ADC_PREFLO, 1018209ff23fSmrgfld_H_SYNC_PULSE_WIDTH, 1019209ff23fSmrgfld_HS_GENLOCKED, 1020209ff23fSmrgfld_HS_SYNC_IN_WIN, 1021209ff23fSmrgfld_VIN_ASYNC_RST, 1022209ff23fSmrgfld_DVS_ASYNC_RST, 1023209ff23fSmrgfld_VIP_VENDOR_ID, 1024209ff23fSmrgfld_VIP_DEVICE_ID, 1025209ff23fSmrgfld_VIP_REVISION_ID, 1026209ff23fSmrgfld_BLACK_INT_START, 1027209ff23fSmrgfld_BLACK_INT_LENGTH, 1028209ff23fSmrgfld_UV_INT_START, 1029209ff23fSmrgfld_U_INT_LENGTH, 1030209ff23fSmrgfld_V_INT_LENGTH, 1031209ff23fSmrgfld_CRDR_ACTIVE_GAIN, 1032209ff23fSmrgfld_CBDB_ACTIVE_GAIN, 1033209ff23fSmrgfld_DVS_DIRECTION, 1034209ff23fSmrgfld_DVS_VBI_UINT8_SWAP, 1035209ff23fSmrgfld_DVS_CLK_SELECT, 1036209ff23fSmrgfld_CONTINUOUS_STREAM, 1037209ff23fSmrgfld_DVSOUT_CLK_DRV, 1038209ff23fSmrgfld_DVSOUT_DATA_DRV, 1039209ff23fSmrgfld_COMB_CNTL0, 1040209ff23fSmrgfld_COMB_CNTL1, 1041209ff23fSmrgfld_COMB_CNTL2, 1042209ff23fSmrgfld_COMB_LENGTH, 1043209ff23fSmrgfld_SYNCTIP_REF0, 1044209ff23fSmrgfld_SYNCTIP_REF1, 1045209ff23fSmrgfld_CLAMP_REF, 1046209ff23fSmrgfld_AGC_PEAKWHITE, 1047209ff23fSmrgfld_VBI_PEAKWHITE, 1048209ff23fSmrgfld_WPA_THRESHOLD, 1049209ff23fSmrgfld_WPA_TRIGGER_LO, 1050209ff23fSmrgfld_WPA_TRIGGER_HIGH, 1051209ff23fSmrgfld_LOCKOUT_START, 1052209ff23fSmrgfld_LOCKOUT_END, 1053209ff23fSmrgfld_CH_DTO_INC, 1054209ff23fSmrgfld_PLL_SGAIN, 1055209ff23fSmrgfld_PLL_FGAIN, 1056209ff23fSmrgfld_CR_BURST_GAIN, 1057209ff23fSmrgfld_CB_BURST_GAIN, 1058209ff23fSmrgfld_VERT_LOCKOUT_START, 1059209ff23fSmrgfld_VERT_LOCKOUT_END, 1060209ff23fSmrgfld_H_IN_WIND_START, 1061209ff23fSmrgfld_V_IN_WIND_START, 1062209ff23fSmrgfld_H_OUT_WIND_WIDTH, 1063209ff23fSmrgfld_V_OUT_WIND_WIDTH, 1064209ff23fSmrgfld_HS_LINE_TOTAL, 1065209ff23fSmrgfld_MIN_PULSE_WIDTH, 1066209ff23fSmrgfld_MAX_PULSE_WIDTH, 1067209ff23fSmrgfld_WIN_CLOSE_LIMIT, 1068209ff23fSmrgfld_WIN_OPEN_LIMIT, 1069209ff23fSmrgfld_VSYNC_INT_TRIGGER, 1070209ff23fSmrgfld_VSYNC_INT_HOLD, 1071209ff23fSmrgfld_VIN_M0, 1072209ff23fSmrgfld_VIN_N0, 1073209ff23fSmrgfld_MNFLIP_EN, 1074209ff23fSmrgfld_VIN_P, 1075209ff23fSmrgfld_REG_CLK_SEL, 1076209ff23fSmrgfld_VIN_M1, 1077209ff23fSmrgfld_VIN_N1, 1078209ff23fSmrgfld_VIN_DRIVER_SEL, 1079209ff23fSmrgfld_VIN_MNFLIP_REQ, 1080209ff23fSmrgfld_VIN_MNFLIP_DONE, 1081209ff23fSmrgfld_TV_LOCK_TO_VIN, 1082209ff23fSmrgfld_TV_P_FOR_WINCLK, 1083209ff23fSmrgfld_VINRST, 1084209ff23fSmrgfld_VIN_CLK_SEL, 1085209ff23fSmrgfld_VS_FIELD_BLANK_START, 1086209ff23fSmrgfld_VS_FIELD_BLANK_END, 1087209ff23fSmrgfld_VS_FIELD_IDLOCATION, 1088209ff23fSmrgfld_VS_FRAME_TOTAL, 1089209ff23fSmrgfld_SYNC_TIP_START, 1090209ff23fSmrgfld_SYNC_TIP_LENGTH, 1091209ff23fSmrgfld_GAIN_FORCE_DATA, 1092209ff23fSmrgfld_GAIN_FORCE_EN, 1093209ff23fSmrgfld_I_CLAMP_SEL, 1094209ff23fSmrgfld_I_AGC_SEL, 1095209ff23fSmrgfld_EXT_CLAMP_CAP, 1096209ff23fSmrgfld_EXT_AGC_CAP, 1097209ff23fSmrgfld_DECI_DITHER_EN, 1098209ff23fSmrgfld_ADC_PREFHI, 1099209ff23fSmrgfld_ADC_CH_GAIN_SEL, 1100209ff23fSmrgfld_HS_PLL_SGAIN, 1101209ff23fSmrgfld_NREn, 1102209ff23fSmrgfld_NRGainCntl, 1103209ff23fSmrgfld_NRBWTresh, 1104209ff23fSmrgfld_NRGCTresh, 1105209ff23fSmrgfld_NRCoefDespeclMode, 1106209ff23fSmrgfld_GPIO_5_OE, 1107209ff23fSmrgfld_GPIO_6_OE, 1108209ff23fSmrgfld_GPIO_5_OUT, 1109209ff23fSmrgfld_GPIO_6_OUT, 1110209ff23fSmrg 1111209ff23fSmrgregRT_MAX_REGS 1112209ff23fSmrg} a; 1113209ff23fSmrg 1114209ff23fSmrg 1115209ff23fSmrgtypedef struct { 1116209ff23fSmrg uint8_t size; 1117209ff23fSmrg uint32_t fld_id; 1118209ff23fSmrg uint32_t dwRegAddrLSBs; 1119209ff23fSmrg uint32_t dwFldOffsetLSBs; 1120209ff23fSmrg uint32_t dwMaskLSBs; 1121209ff23fSmrg uint32_t addr2; 1122209ff23fSmrg uint32_t offs2; 1123209ff23fSmrg uint32_t mask2; 1124209ff23fSmrg uint32_t dwCurrValue; 1125209ff23fSmrg uint32_t rw; 1126209ff23fSmrg } RTREGMAP; 1127209ff23fSmrg 1128209ff23fSmrg#define READONLY 1 1129209ff23fSmrg#define WRITEONLY 2 1130209ff23fSmrg#define READWRITE 3 1131209ff23fSmrg 1132209ff23fSmrg/* Rage Theatre's Register Mappings, including the default values: */ 1133209ff23fSmrgRTREGMAP RT_RegMap[regRT_MAX_REGS]={ 1134209ff23fSmrg/* 1135209ff23fSmrg{size, fidname, AddrOfst, Ofst, Mask, Addr, Ofst, Mask, Cur, R/W 1136209ff23fSmrg*/ 1137209ff23fSmrg{32 , fld_tmpReg1 ,0x151 , 0, 0x0, 0, 0,0, 0,READWRITE }, 1138209ff23fSmrg{1 , fld_tmpReg2 ,VIP_VIP_SUB_VENDOR_DEVICE_ID , 3, 0xFFFFFFFF, 0, 0,0, 0,READWRITE }, 1139209ff23fSmrg{1 , fld_tmpReg3 ,VIP_VIP_COMMAND_STATUS , 3, 0xFFFFFFFF, 0, 0,0, 0,READWRITE }, 1140209ff23fSmrg{8 , fld_LP_CONTRAST ,VIP_LP_CONTRAST , 0, 0xFFFFFF00, 0, 0,0, fld_LP_CONTRAST_def ,READWRITE }, 1141209ff23fSmrg{14 , fld_LP_BRIGHTNESS ,VIP_LP_BRIGHTNESS , 0, 0xFFFFC000, 0, 0,0, fld_LP_BRIGHTNESS_def ,READWRITE }, 1142209ff23fSmrg{8 , fld_CP_HUE_CNTL ,VIP_CP_HUE_CNTL , 0, 0xFFFFFF00, 0, 0,0, fld_CP_HUE_CNTL_def ,READWRITE }, 1143209ff23fSmrg{1 , fld_LUMA_FILTER ,VIP_LP_BRIGHTNESS , 15, 0xFFFF7FFF, 0, 0,0, fld_LUMA_FILTER_def ,READWRITE }, 1144209ff23fSmrg{21 , fld_H_SCALE_RATIO ,VIP_H_SCALER_CONTROL , 0, 0xFFE00000, 0, 0,0, fld_H_SCALE_RATIO_def ,READWRITE }, 1145209ff23fSmrg{4 , fld_H_SHARPNESS ,VIP_H_SCALER_CONTROL , 25, 0xE1FFFFFF, 0, 0,0, fld_H_SHARPNESS_def ,READWRITE }, 1146209ff23fSmrg{12 , fld_V_SCALE_RATIO ,VIP_V_SCALER_CONTROL , 0, 0xFFFFF000, 0, 0,0, fld_V_SCALE_RATIO_def ,READWRITE }, 1147209ff23fSmrg{1 , fld_V_DEINTERLACE_ON,VIP_V_SCALER_CONTROL , 12, 0xFFFFEFFF, 0, 0,0, fld_V_DEINTERLACE_ON_def ,READWRITE }, 1148209ff23fSmrg{1 , fld_V_BYPSS ,VIP_V_SCALER_CONTROL , 14, 0xFFFFBFFF, 0, 0,0, fld_V_BYPSS_def ,READWRITE }, 1149209ff23fSmrg{1 , fld_V_DITHER_ON ,VIP_V_SCALER_CONTROL , 15, 0xFFFF7FFF, 0, 0,0, fld_V_DITHER_ON_def ,READWRITE }, 1150209ff23fSmrg{11 , fld_EVENF_OFFSET ,VIP_V_DEINTERLACE_CONTROL , 0, 0xFFFFF800, 0, 0,0, fld_EVENF_OFFSET_def ,READWRITE }, 1151209ff23fSmrg{11 , fld_ODDF_OFFSET ,VIP_V_DEINTERLACE_CONTROL , 11, 0xFFC007FF, 0, 0,0, fld_ODDF_OFFSET_def ,READWRITE }, 1152209ff23fSmrg{1 , fld_INTERLACE_DETECTED ,VIP_VS_LINE_COUNT , 15, 0xFFFF7FFF, 0, 0,0, fld_INTERLACE_DETECTED_def,READONLY }, 1153209ff23fSmrg{10 , fld_VS_LINE_COUNT ,VIP_VS_LINE_COUNT , 0, 0xFFFFFC00, 0, 0,0, fld_VS_LINE_COUNT_def ,READONLY }, 1154209ff23fSmrg{10 , fld_VS_DETECTED_LINES ,VIP_VS_LINE_COUNT , 16, 0xFC00FFFF, 0, 0,0, fld_VS_DETECTED_LINES_def ,READONLY }, 1155209ff23fSmrg{1 , fld_VS_ITU656_VB ,VIP_VS_LINE_COUNT , 13, 0xFFFFDFFF, 0, 0,0, fld_VS_ITU656_VB_def ,READONLY }, 1156209ff23fSmrg{16 , fld_VBI_CC_DATA ,VIP_VBI_CC_CNTL , 0, 0xFFFF0000, 0, 0,0, fld_VBI_CC_DATA_def ,READWRITE }, 1157209ff23fSmrg{1 , fld_VBI_CC_WT ,VIP_VBI_CC_CNTL , 24, 0xFEFFFFFF, 0, 0,0, fld_VBI_CC_WT_def ,READWRITE }, 1158209ff23fSmrg{1 , fld_VBI_CC_WT_ACK ,VIP_VBI_CC_CNTL , 25, 0xFDFFFFFF, 0, 0,0, fld_VBI_CC_WT_ACK_def ,READONLY }, 1159209ff23fSmrg{1 , fld_VBI_CC_HOLD ,VIP_VBI_CC_CNTL , 26, 0xFBFFFFFF, 0, 0,0, fld_VBI_CC_HOLD_def ,READWRITE }, 1160209ff23fSmrg{1 , fld_VBI_DECODE_EN ,VIP_VBI_CC_CNTL , 31, 0x7FFFFFFF, 0, 0,0, fld_VBI_DECODE_EN_def ,READWRITE }, 1161209ff23fSmrg{16 , fld_VBI_CC_DTO_P ,VIP_VBI_DTO_CNTL , 0, 0xFFFF0000, 0, 0,0, fld_VBI_CC_DTO_P_def ,READWRITE }, 1162209ff23fSmrg{16 ,fld_VBI_20BIT_DTO_P,VIP_VBI_DTO_CNTL , 16, 0x0000FFFF, 0, 0,0, fld_VBI_20BIT_DTO_P_def ,READWRITE }, 1163209ff23fSmrg{7 ,fld_VBI_CC_LEVEL ,VIP_VBI_LEVEL_CNTL , 0, 0xFFFFFF80, 0, 0,0, fld_VBI_CC_LEVEL_def ,READWRITE }, 1164209ff23fSmrg{7 ,fld_VBI_20BIT_LEVEL,VIP_VBI_LEVEL_CNTL , 8, 0xFFFF80FF, 0, 0,0, fld_VBI_20BIT_LEVEL_def ,READWRITE }, 1165209ff23fSmrg{9 ,fld_VBI_CLK_RUNIN_GAIN,VIP_VBI_LEVEL_CNTL , 16, 0xFE00FFFF, 0, 0,0, fld_VBI_CLK_RUNIN_GAIN_def,READWRITE }, 1166209ff23fSmrg{11 ,fld_H_VBI_WIND_START,VIP_H_VBI_WINDOW , 0, 0xFFFFF800, 0, 0,0, fld_H_VBI_WIND_START_def ,READWRITE }, 1167209ff23fSmrg{11 ,fld_H_VBI_WIND_END,VIP_H_VBI_WINDOW , 16, 0xF800FFFF, 0, 0,0, fld_H_VBI_WIND_END_def ,READWRITE }, 1168209ff23fSmrg{10 ,fld_V_VBI_WIND_START,VIP_V_VBI_WINDOW , 0, 0xFFFFFC00, 0, 0,0, fld_V_VBI_WIND_START_def ,READWRITE }, 1169209ff23fSmrg{10 ,fld_V_VBI_WIND_END,VIP_V_VBI_WINDOW , 16, 0xFC00FFFF, 0, 0,0, fld_V_VBI_WIND_END_def ,READWRITE }, /* CHK */ 1170209ff23fSmrg{16 ,fld_VBI_20BIT_DATA0,VIP_VBI_20BIT_CNTL , 0, 0xFFFF0000, 0, 0,0, fld_VBI_20BIT_DATA0_def ,READWRITE }, 1171209ff23fSmrg{4 ,fld_VBI_20BIT_DATA1,VIP_VBI_20BIT_CNTL , 16, 0xFFF0FFFF, 0, 0,0, fld_VBI_20BIT_DATA1_def ,READWRITE }, 1172209ff23fSmrg{1 ,fld_VBI_20BIT_WT ,VIP_VBI_20BIT_CNTL , 24, 0xFEFFFFFF, 0, 0,0, fld_VBI_20BIT_WT_def ,READWRITE }, 1173209ff23fSmrg{1 ,fld_VBI_20BIT_WT_ACK ,VIP_VBI_20BIT_CNTL , 25, 0xFDFFFFFF, 0, 0,0, fld_VBI_20BIT_WT_ACK_def ,READONLY }, 1174209ff23fSmrg{1 ,fld_VBI_20BIT_HOLD ,VIP_VBI_20BIT_CNTL , 26, 0xFBFFFFFF, 0, 0,0, fld_VBI_20BIT_HOLD_def ,READWRITE }, 1175209ff23fSmrg{2 ,fld_VBI_CAPTURE_ENABLE ,VIP_VBI_CONTROL , 0, 0xFFFFFFFC, 0, 0,0, fld_VBI_CAPTURE_ENABLE_def,READWRITE }, 1176209ff23fSmrg{16 ,fld_VBI_EDS_DATA ,VIP_VBI_EDS_CNTL , 0, 0xFFFF0000, 0, 0,0, fld_VBI_EDS_DATA_def ,READWRITE }, 1177209ff23fSmrg{1 ,fld_VBI_EDS_WT ,VIP_VBI_EDS_CNTL , 24, 0xFEFFFFFF, 0, 0,0, fld_VBI_EDS_WT_def ,READWRITE }, 1178209ff23fSmrg{1 ,fld_VBI_EDS_WT_ACK ,VIP_VBI_EDS_CNTL , 25, 0xFDFFFFFF, 0, 0,0, fld_VBI_EDS_WT_ACK_def ,READONLY }, 1179209ff23fSmrg{1 ,fld_VBI_EDS_HOLD ,VIP_VBI_EDS_CNTL , 26, 0xFBFFFFFF, 0, 0,0, fld_VBI_EDS_HOLD_def ,READWRITE }, 1180209ff23fSmrg{17 ,fld_VBI_SCALING_RATIO ,VIP_VBI_SCALER_CONTROL , 0, 0xFFFE0000, 0, 0,0, fld_VBI_SCALING_RATIO_def ,READWRITE }, 1181209ff23fSmrg{1 ,fld_VBI_ALIGNER_ENABLE ,VIP_VBI_SCALER_CONTROL , 17, 0xFFFDFFFF, 0, 0,0, fld_VBI_ALIGNER_ENABLE_def,READWRITE }, 1182209ff23fSmrg{11 ,fld_H_ACTIVE_START ,VIP_H_ACTIVE_WINDOW , 0, 0xFFFFF800, 0, 0,0, fld_H_ACTIVE_START_def ,READWRITE }, 1183209ff23fSmrg{11 ,fld_H_ACTIVE_END ,VIP_H_ACTIVE_WINDOW , 16, 0xF800FFFF, 0, 0,0, fld_H_ACTIVE_END_def ,READWRITE }, 1184209ff23fSmrg{10 ,fld_V_ACTIVE_START ,VIP_V_ACTIVE_WINDOW , 0, 0xFFFFFC00, 0, 0,0, fld_V_ACTIVE_START_def ,READWRITE }, 1185209ff23fSmrg{10 ,fld_V_ACTIVE_END ,VIP_V_ACTIVE_WINDOW , 16, 0xFC00FFFF, 0, 0,0, fld_V_ACTIVE_END_def ,READWRITE }, 1186209ff23fSmrg{8 ,fld_CH_HEIGHT ,VIP_CP_AGC_CNTL , 0, 0xFFFFFF00, 0, 0,0, fld_CH_HEIGHT_def ,READWRITE }, 1187209ff23fSmrg{8 ,fld_CH_KILL_LEVEL ,VIP_CP_AGC_CNTL , 8, 0xFFFF00FF, 0, 0,0, fld_CH_KILL_LEVEL_def ,READWRITE }, 1188209ff23fSmrg{2 ,fld_CH_AGC_ERROR_LIM ,VIP_CP_AGC_CNTL , 16, 0xFFFCFFFF, 0, 0,0, fld_CH_AGC_ERROR_LIM_def ,READWRITE }, 1189209ff23fSmrg{1 ,fld_CH_AGC_FILTER_EN ,VIP_CP_AGC_CNTL , 18, 0xFFFBFFFF, 0, 0,0, fld_CH_AGC_FILTER_EN_def ,READWRITE }, 1190209ff23fSmrg{1 ,fld_CH_AGC_LOOP_SPEED ,VIP_CP_AGC_CNTL , 19, 0xFFF7FFFF, 0, 0,0, fld_CH_AGC_LOOP_SPEED_def ,READWRITE }, 1191209ff23fSmrg{8 ,fld_HUE_ADJ ,VIP_CP_HUE_CNTL , 0, 0xFFFFFF00, 0, 0,0, fld_HUE_ADJ_def ,READWRITE }, 1192209ff23fSmrg{2 ,fld_STANDARD_SEL ,VIP_STANDARD_SELECT , 0, 0xFFFFFFFC, 0, 0,0, fld_STANDARD_SEL_def ,READWRITE }, 1193209ff23fSmrg{1 ,fld_STANDARD_YC ,VIP_STANDARD_SELECT , 2, 0xFFFFFFFB, 0, 0,0, fld_STANDARD_YC_def ,READWRITE }, 1194209ff23fSmrg{1 ,fld_ADC_PDWN ,VIP_ADC_CNTL , 7, 0xFFFFFF7F, 0, 0,0, fld_ADC_PDWN_def ,READWRITE }, 1195209ff23fSmrg{3 ,fld_INPUT_SELECT ,VIP_ADC_CNTL , 0, 0xFFFFFFF8, 0, 0,0, fld_INPUT_SELECT_def ,READWRITE }, 1196209ff23fSmrg{2 ,fld_ADC_PREFLO ,VIP_ADC_CNTL , 24, 0xFCFFFFFF, 0, 0,0, fld_ADC_PREFLO_def ,READWRITE }, 1197209ff23fSmrg{8 ,fld_H_SYNC_PULSE_WIDTH ,VIP_HS_PULSE_WIDTH , 0, 0xFFFFFF00, 0, 0,0, fld_H_SYNC_PULSE_WIDTH_def,READONLY }, 1198209ff23fSmrg{1 ,fld_HS_GENLOCKED ,VIP_HS_PULSE_WIDTH , 8, 0xFFFFFEFF, 0, 0,0, fld_HS_GENLOCKED_def ,READONLY }, 1199209ff23fSmrg{1 ,fld_HS_SYNC_IN_WIN ,VIP_HS_PULSE_WIDTH , 9, 0xFFFFFDFF, 0, 0,0, fld_HS_SYNC_IN_WIN_def ,READONLY }, 1200209ff23fSmrg{1 ,fld_VIN_ASYNC_RST ,VIP_MASTER_CNTL , 5, 0xFFFFFFDF, 0, 0,0, fld_VIN_ASYNC_RST_def ,READWRITE }, 1201209ff23fSmrg{1 ,fld_DVS_ASYNC_RST ,VIP_MASTER_CNTL , 7, 0xFFFFFF7F, 0, 0,0, fld_DVS_ASYNC_RST_def ,READWRITE }, 1202209ff23fSmrg{16 ,fld_VIP_VENDOR_ID ,VIP_VIP_VENDOR_DEVICE_ID, 0, 0xFFFF0000, 0, 0,0, fld_VIP_VENDOR_ID_def ,READONLY }, 1203209ff23fSmrg{16 ,fld_VIP_DEVICE_ID ,VIP_VIP_VENDOR_DEVICE_ID,16, 0x0000FFFF, 0, 0,0, fld_VIP_DEVICE_ID_def ,READONLY }, 1204209ff23fSmrg{16 ,fld_VIP_REVISION_ID ,VIP_VIP_REVISION_ID , 0, 0xFFFF0000, 0, 0,0, fld_VIP_REVISION_ID_def ,READONLY }, 1205209ff23fSmrg{8 ,fld_BLACK_INT_START ,VIP_SG_BLACK_GATE , 0, 0xFFFFFF00, 0, 0,0, fld_BLACK_INT_START_def ,READWRITE }, 1206209ff23fSmrg{4 ,fld_BLACK_INT_LENGTH ,VIP_SG_BLACK_GATE , 8, 0xFFFFF0FF, 0, 0,0, fld_BLACK_INT_LENGTH_def ,READWRITE }, 1207209ff23fSmrg{8 ,fld_UV_INT_START ,VIP_SG_UVGATE_GATE , 0, 0xFFFFFF00, 0, 0,0, fld_UV_INT_START_def ,READWRITE }, 1208209ff23fSmrg{4 ,fld_U_INT_LENGTH ,VIP_SG_UVGATE_GATE , 8, 0xFFFFF0FF, 0, 0,0, fld_U_INT_LENGTH_def ,READWRITE }, 1209209ff23fSmrg{4 ,fld_V_INT_LENGTH ,VIP_SG_UVGATE_GATE , 12, 0xFFFF0FFF, 0, 0,0, fld_V_INT_LENGTH_def ,READWRITE }, 1210209ff23fSmrg{10 ,fld_CRDR_ACTIVE_GAIN ,VIP_CP_ACTIVE_GAIN , 0, 0xFFFFFC00, 0, 0,0, fld_CRDR_ACTIVE_GAIN_def ,READWRITE }, 1211209ff23fSmrg{10 ,fld_CBDB_ACTIVE_GAIN ,VIP_CP_ACTIVE_GAIN , 16, 0xFC00FFFF, 0, 0,0, fld_CBDB_ACTIVE_GAIN_def ,READWRITE }, 1212209ff23fSmrg{1 ,fld_DVS_DIRECTION ,VIP_DVS_PORT_CTRL , 0, 0xFFFFFFFE, 0, 0,0, fld_DVS_DIRECTION_def ,READWRITE }, 1213209ff23fSmrg{1 ,fld_DVS_VBI_UINT8_SWAP ,VIP_DVS_PORT_CTRL , 1, 0xFFFFFFFD, 0, 0,0, fld_DVS_VBI_UINT8_SWAP_def ,READWRITE }, 1214209ff23fSmrg{1 ,fld_DVS_CLK_SELECT ,VIP_DVS_PORT_CTRL , 2, 0xFFFFFFFB, 0, 0,0, fld_DVS_CLK_SELECT_def ,READWRITE }, 1215209ff23fSmrg{1 ,fld_CONTINUOUS_STREAM ,VIP_DVS_PORT_CTRL , 3, 0xFFFFFFF7, 0, 0,0, fld_CONTINUOUS_STREAM_def ,READWRITE }, 1216209ff23fSmrg{1 ,fld_DVSOUT_CLK_DRV ,VIP_DVS_PORT_CTRL , 4, 0xFFFFFFEF, 0, 0,0, fld_DVSOUT_CLK_DRV_def ,READWRITE }, 1217209ff23fSmrg{1 ,fld_DVSOUT_DATA_DRV ,VIP_DVS_PORT_CTRL , 5, 0xFFFFFFDF, 0, 0,0, fld_DVSOUT_DATA_DRV_def ,READWRITE }, 1218209ff23fSmrg{32 ,fld_COMB_CNTL0 ,VIP_COMB_CNTL0 , 0, 0x00000000, 0, 0,0, fld_COMB_CNTL0_def ,READWRITE }, 1219209ff23fSmrg{32 ,fld_COMB_CNTL1 ,VIP_COMB_CNTL1 , 0, 0x00000000, 0, 0,0, fld_COMB_CNTL1_def ,READWRITE }, 1220209ff23fSmrg{32 ,fld_COMB_CNTL2 ,VIP_COMB_CNTL2 , 0, 0x00000000, 0, 0,0, fld_COMB_CNTL2_def ,READWRITE }, 1221209ff23fSmrg{32 ,fld_COMB_LENGTH ,VIP_COMB_LINE_LENGTH , 0, 0x00000000, 0, 0,0, fld_COMB_LENGTH_def ,READWRITE }, 1222209ff23fSmrg{8 ,fld_SYNCTIP_REF0 ,VIP_LP_AGC_CLAMP_CNTL0 , 0, 0xFFFFFF00, 0, 0,0, fld_SYNCTIP_REF0_def ,READWRITE }, 1223209ff23fSmrg{8 ,fld_SYNCTIP_REF1 ,VIP_LP_AGC_CLAMP_CNTL0 , 8, 0xFFFF00FF, 0, 0,0, fld_SYNCTIP_REF1_def ,READWRITE }, 1224209ff23fSmrg{8 ,fld_CLAMP_REF ,VIP_LP_AGC_CLAMP_CNTL0 , 16, 0xFF00FFFF, 0, 0,0, fld_CLAMP_REF_def ,READWRITE }, 1225209ff23fSmrg{8 ,fld_AGC_PEAKWHITE ,VIP_LP_AGC_CLAMP_CNTL0 , 24, 0x00FFFFFF, 0, 0,0, fld_AGC_PEAKWHITE_def ,READWRITE }, 1226209ff23fSmrg{8 ,fld_VBI_PEAKWHITE ,VIP_LP_AGC_CLAMP_CNTL1 , 0, 0xFFFFFF00, 0, 0,0, fld_VBI_PEAKWHITE_def ,READWRITE }, 1227209ff23fSmrg{11 ,fld_WPA_THRESHOLD ,VIP_LP_WPA_CNTL0 , 0, 0xFFFFF800, 0, 0,0, fld_WPA_THRESHOLD_def ,READWRITE }, 1228209ff23fSmrg{10 ,fld_WPA_TRIGGER_LO ,VIP_LP_WPA_CNTL1 , 0, 0xFFFFFC00, 0, 0,0, fld_WPA_TRIGGER_LO_def ,READWRITE }, 1229209ff23fSmrg{10 ,fld_WPA_TRIGGER_HIGH ,VIP_LP_WPA_CNTL1 , 16, 0xFC00FFFF, 0, 0,0, fld_WPA_TRIGGER_HIGH_def ,READWRITE }, 1230209ff23fSmrg{10 ,fld_LOCKOUT_START ,VIP_LP_VERT_LOCKOUT , 0, 0xFFFFFC00, 0, 0,0, fld_LOCKOUT_START_def ,READWRITE }, 1231209ff23fSmrg{10 ,fld_LOCKOUT_END ,VIP_LP_VERT_LOCKOUT , 16, 0xFC00FFFF, 0, 0,0, fld_LOCKOUT_END_def ,READWRITE }, 1232209ff23fSmrg{24 ,fld_CH_DTO_INC ,VIP_CP_PLL_CNTL0 , 0, 0xFF000000, 0, 0,0, fld_CH_DTO_INC_def ,READWRITE }, 1233209ff23fSmrg{4 ,fld_PLL_SGAIN ,VIP_CP_PLL_CNTL0 , 24, 0xF0FFFFFF, 0, 0,0, fld_PLL_SGAIN_def ,READWRITE }, 1234209ff23fSmrg{4 ,fld_PLL_FGAIN ,VIP_CP_PLL_CNTL0 , 28, 0x0FFFFFFF, 0, 0,0, fld_PLL_FGAIN_def ,READWRITE }, 1235209ff23fSmrg{9 ,fld_CR_BURST_GAIN ,VIP_CP_BURST_GAIN , 0, 0xFFFFFE00, 0, 0,0, fld_CR_BURST_GAIN_def ,READWRITE }, 1236209ff23fSmrg{9 ,fld_CB_BURST_GAIN ,VIP_CP_BURST_GAIN , 16, 0xFE00FFFF, 0, 0,0, fld_CB_BURST_GAIN_def ,READWRITE }, 1237209ff23fSmrg{10 ,fld_VERT_LOCKOUT_START ,VIP_CP_VERT_LOCKOUT , 0, 0xFFFFFC00, 0, 0,0, fld_VERT_LOCKOUT_START_def,READWRITE }, 1238209ff23fSmrg{10 ,fld_VERT_LOCKOUT_END ,VIP_CP_VERT_LOCKOUT , 16, 0xFC00FFFF, 0, 0,0, fld_VERT_LOCKOUT_END_def ,READWRITE }, 1239209ff23fSmrg{11 ,fld_H_IN_WIND_START ,VIP_SCALER_IN_WINDOW , 0, 0xFFFFF800, 0, 0,0, fld_H_IN_WIND_START_def ,READWRITE }, 1240209ff23fSmrg{10 ,fld_V_IN_WIND_START ,VIP_SCALER_IN_WINDOW , 16, 0xFC00FFFF, 0, 0,0, fld_V_IN_WIND_START_def ,READWRITE }, 1241209ff23fSmrg{10 ,fld_H_OUT_WIND_WIDTH ,VIP_SCALER_OUT_WINDOW , 0, 0xFFFFFC00, 0, 0,0, fld_H_OUT_WIND_WIDTH_def ,READWRITE }, 1242209ff23fSmrg{9 ,fld_V_OUT_WIND_WIDTH ,VIP_SCALER_OUT_WINDOW , 16, 0xFE00FFFF, 0, 0,0, fld_V_OUT_WIND_WIDTH_def ,READWRITE }, 1243209ff23fSmrg{11 ,fld_HS_LINE_TOTAL ,VIP_HS_PLINE , 0, 0xFFFFF800, 0, 0,0, fld_HS_LINE_TOTAL_def ,READWRITE }, 1244209ff23fSmrg{8 ,fld_MIN_PULSE_WIDTH ,VIP_HS_MINMAXWIDTH , 0, 0xFFFFFF00, 0, 0,0, fld_MIN_PULSE_WIDTH_def ,READWRITE }, 1245209ff23fSmrg{8 ,fld_MAX_PULSE_WIDTH ,VIP_HS_MINMAXWIDTH , 8, 0xFFFF00FF, 0, 0,0, fld_MAX_PULSE_WIDTH_def ,READWRITE }, 1246209ff23fSmrg{11 ,fld_WIN_CLOSE_LIMIT ,VIP_HS_WINDOW_LIMIT , 0, 0xFFFFF800, 0, 0,0, fld_WIN_CLOSE_LIMIT_def ,READWRITE }, 1247209ff23fSmrg{11 ,fld_WIN_OPEN_LIMIT ,VIP_HS_WINDOW_LIMIT , 16, 0xF800FFFF, 0, 0,0, fld_WIN_OPEN_LIMIT_def ,READWRITE }, 1248209ff23fSmrg{11 ,fld_VSYNC_INT_TRIGGER ,VIP_VS_DETECTOR_CNTL , 0, 0xFFFFF800, 0, 0,0, fld_VSYNC_INT_TRIGGER_def ,READWRITE }, 1249209ff23fSmrg{11 ,fld_VSYNC_INT_HOLD ,VIP_VS_DETECTOR_CNTL , 16, 0xF800FFFF, 0, 0,0, fld_VSYNC_INT_HOLD_def ,READWRITE }, 1250209ff23fSmrg{11 ,fld_VIN_M0 ,VIP_VIN_PLL_CNTL , 0, 0xFFFFF800, 0, 0,0, fld_VIN_M0_def ,READWRITE }, 1251209ff23fSmrg{11 ,fld_VIN_N0 ,VIP_VIN_PLL_CNTL , 11, 0xFFC007FF, 0, 0,0, fld_VIN_N0_def ,READWRITE }, 1252209ff23fSmrg{1 ,fld_MNFLIP_EN ,VIP_VIN_PLL_CNTL , 22, 0xFFBFFFFF, 0, 0,0, fld_MNFLIP_EN_def ,READWRITE }, 1253209ff23fSmrg{4 ,fld_VIN_P ,VIP_VIN_PLL_CNTL , 24, 0xF0FFFFFF, 0, 0,0, fld_VIN_P_def ,READWRITE }, 1254209ff23fSmrg{2 ,fld_REG_CLK_SEL ,VIP_VIN_PLL_CNTL , 30, 0x3FFFFFFF, 0, 0,0, fld_REG_CLK_SEL_def ,READWRITE }, 1255209ff23fSmrg{11 ,fld_VIN_M1 ,VIP_VIN_PLL_FINE_CNTL , 0, 0xFFFFF800, 0, 0,0, fld_VIN_M1_def ,READWRITE }, 1256209ff23fSmrg{11 ,fld_VIN_N1 ,VIP_VIN_PLL_FINE_CNTL , 11, 0xFFC007FF, 0, 0,0, fld_VIN_N1_def ,READWRITE }, 1257209ff23fSmrg{1 ,fld_VIN_DRIVER_SEL ,VIP_VIN_PLL_FINE_CNTL , 22, 0xFFBFFFFF, 0, 0,0, fld_VIN_DRIVER_SEL_def ,READWRITE }, 1258209ff23fSmrg{1 ,fld_VIN_MNFLIP_REQ ,VIP_VIN_PLL_FINE_CNTL , 23, 0xFF7FFFFF, 0, 0,0, fld_VIN_MNFLIP_REQ_def ,READWRITE }, 1259209ff23fSmrg{1 ,fld_VIN_MNFLIP_DONE ,VIP_VIN_PLL_FINE_CNTL , 24, 0xFEFFFFFF, 0, 0,0, fld_VIN_MNFLIP_DONE_def ,READONLY }, 1260209ff23fSmrg{1 ,fld_TV_LOCK_TO_VIN ,VIP_VIN_PLL_FINE_CNTL , 27, 0xF7FFFFFF, 0, 0,0, fld_TV_LOCK_TO_VIN_def ,READWRITE }, 1261209ff23fSmrg{4 ,fld_TV_P_FOR_WINCLK ,VIP_VIN_PLL_FINE_CNTL , 28, 0x0FFFFFFF, 0, 0,0, fld_TV_P_FOR_WINCLK_def ,READWRITE }, 1262209ff23fSmrg{1 ,fld_VINRST ,VIP_PLL_CNTL1 , 1, 0xFFFFFFFD, 0, 0,0, fld_VINRST_def ,READWRITE }, 1263209ff23fSmrg{1 ,fld_VIN_CLK_SEL ,VIP_CLOCK_SEL_CNTL , 7, 0xFFFFFF7F, 0, 0,0, fld_VIN_CLK_SEL_def ,READWRITE }, 1264209ff23fSmrg{10 ,fld_VS_FIELD_BLANK_START,VIP_VS_BLANKING_CNTL , 0, 0xFFFFFC00, 0, 0,0, fld_VS_FIELD_BLANK_START_def ,READWRITE }, 1265209ff23fSmrg{10 ,fld_VS_FIELD_BLANK_END,VIP_VS_BLANKING_CNTL , 16, 0xFC00FFFF, 0, 0,0, fld_VS_FIELD_BLANK_END_def ,READWRITE }, 1266209ff23fSmrg{9 ,fld_VS_FIELD_IDLOCATION,VIP_VS_FIELD_ID_CNTL , 0, 0xFFFFFE00, 0, 0,0, fld_VS_FIELD_IDLOCATION_def ,READWRITE }, 1267209ff23fSmrg{10 ,fld_VS_FRAME_TOTAL ,VIP_VS_FRAME_TOTAL , 0, 0xFFFFFC00, 0, 0,0, fld_VS_FRAME_TOTAL_def ,READWRITE }, 1268209ff23fSmrg{11 ,fld_SYNC_TIP_START ,VIP_SG_SYNCTIP_GATE , 0, 0xFFFFF800, 0, 0,0, fld_SYNC_TIP_START_def ,READWRITE }, 1269209ff23fSmrg{4 ,fld_SYNC_TIP_LENGTH ,VIP_SG_SYNCTIP_GATE , 12, 0xFFFF0FFF, 0, 0,0, fld_SYNC_TIP_LENGTH_def ,READWRITE }, 1270209ff23fSmrg{12 ,fld_GAIN_FORCE_DATA ,VIP_CP_DEBUG_FORCE , 0, 0xFFFFF000, 0, 0,0, fld_GAIN_FORCE_DATA_def ,READWRITE }, 1271209ff23fSmrg{1 ,fld_GAIN_FORCE_EN ,VIP_CP_DEBUG_FORCE , 12, 0xFFFFEFFF, 0, 0,0, fld_GAIN_FORCE_EN_def ,READWRITE }, 1272209ff23fSmrg{2 ,fld_I_CLAMP_SEL ,VIP_ADC_CNTL , 3, 0xFFFFFFE7, 0, 0,0, fld_I_CLAMP_SEL_def ,READWRITE }, 1273209ff23fSmrg{2 ,fld_I_AGC_SEL ,VIP_ADC_CNTL , 5, 0xFFFFFF9F, 0, 0,0, fld_I_AGC_SEL_def ,READWRITE }, 1274209ff23fSmrg{1 ,fld_EXT_CLAMP_CAP ,VIP_ADC_CNTL , 8, 0xFFFFFEFF, 0, 0,0, fld_EXT_CLAMP_CAP_def ,READWRITE }, 1275209ff23fSmrg{1 ,fld_EXT_AGC_CAP ,VIP_ADC_CNTL , 9, 0xFFFFFDFF, 0, 0,0, fld_EXT_AGC_CAP_def ,READWRITE }, 1276209ff23fSmrg{1 ,fld_DECI_DITHER_EN ,VIP_ADC_CNTL , 12, 0xFFFFEFFF, 0, 0,0, fld_DECI_DITHER_EN_def ,READWRITE }, 1277209ff23fSmrg{2 ,fld_ADC_PREFHI ,VIP_ADC_CNTL , 22, 0xFF3FFFFF, 0, 0,0, fld_ADC_PREFHI_def ,READWRITE }, 1278209ff23fSmrg{2 ,fld_ADC_CH_GAIN_SEL ,VIP_ADC_CNTL , 16, 0xFFFCFFFF, 0, 0,0, fld_ADC_CH_GAIN_SEL_def ,READWRITE }, 1279209ff23fSmrg{4 ,fld_HS_PLL_SGAIN ,VIP_HS_PLLGAIN , 0, 0xFFFFFFF0, 0, 0,0, fld_HS_PLL_SGAIN_def ,READWRITE }, 1280209ff23fSmrg{1 ,fld_NREn ,VIP_NOISE_CNTL0 , 0, 0xFFFFFFFE, 0, 0,0, fld_NREn_def ,READWRITE }, 1281209ff23fSmrg{3 ,fld_NRGainCntl ,VIP_NOISE_CNTL0 , 1, 0xFFFFFFF1, 0, 0,0, fld_NRGainCntl_def ,READWRITE }, 1282209ff23fSmrg{6 ,fld_NRBWTresh ,VIP_NOISE_CNTL0 , 4, 0xFFFFFC0F, 0, 0,0, fld_NRBWTresh_def ,READWRITE }, 1283209ff23fSmrg{5 ,fld_NRGCTresh ,VIP_NOISE_CNTL0 , 10, 0xFFFF83FF, 0, 0,0, fld_NRGCTresh_def ,READWRITE }, 1284209ff23fSmrg{1 ,fld_NRCoefDespeclMode ,VIP_NOISE_CNTL0 , 15, 0xFFFF7FFF, 0, 0,0, fld_NRCoefDespeclMode_def ,READWRITE }, 1285209ff23fSmrg{1 ,fld_GPIO_5_OE ,VIP_GPIO_CNTL , 5, 0xFFFFFFDF, 0, 0,0, fld_GPIO_5_OE_def ,READWRITE }, 1286209ff23fSmrg{1 ,fld_GPIO_6_OE ,VIP_GPIO_CNTL , 6, 0xFFFFFFBF, 0, 0,0, fld_GPIO_6_OE_def ,READWRITE }, 1287209ff23fSmrg{1 ,fld_GPIO_5_OUT ,VIP_GPIO_INOUT , 5, 0xFFFFFFDF, 0, 0,0, fld_GPIO_5_OUT_def ,READWRITE }, 1288209ff23fSmrg{1 ,fld_GPIO_6_OUT ,VIP_GPIO_INOUT , 6, 0xFFFFFFBF, 0, 0,0, fld_GPIO_6_OUT_def ,READWRITE }, 1289209ff23fSmrg}; 1290209ff23fSmrg 1291209ff23fSmrg/* Rage Theatre's register fields default values: */ 1292209ff23fSmrguint32_t RT_RegDef[regRT_MAX_REGS]= 1293209ff23fSmrg{ 1294209ff23fSmrgfld_tmpReg1_def, 1295209ff23fSmrgfld_tmpReg2_def, 1296209ff23fSmrgfld_tmpReg3_def, 1297209ff23fSmrgfld_LP_CONTRAST_def, 1298209ff23fSmrgfld_LP_BRIGHTNESS_def, 1299209ff23fSmrgfld_CP_HUE_CNTL_def, 1300209ff23fSmrgfld_LUMA_FILTER_def, 1301209ff23fSmrgfld_H_SCALE_RATIO_def, 1302209ff23fSmrgfld_H_SHARPNESS_def, 1303209ff23fSmrgfld_V_SCALE_RATIO_def, 1304209ff23fSmrgfld_V_DEINTERLACE_ON_def, 1305209ff23fSmrgfld_V_BYPSS_def, 1306209ff23fSmrgfld_V_DITHER_ON_def, 1307209ff23fSmrgfld_EVENF_OFFSET_def, 1308209ff23fSmrgfld_ODDF_OFFSET_def, 1309209ff23fSmrgfld_INTERLACE_DETECTED_def, 1310209ff23fSmrgfld_VS_LINE_COUNT_def, 1311209ff23fSmrgfld_VS_DETECTED_LINES_def, 1312209ff23fSmrgfld_VS_ITU656_VB_def, 1313209ff23fSmrgfld_VBI_CC_DATA_def, 1314209ff23fSmrgfld_VBI_CC_WT_def, 1315209ff23fSmrgfld_VBI_CC_WT_ACK_def, 1316209ff23fSmrgfld_VBI_CC_HOLD_def, 1317209ff23fSmrgfld_VBI_DECODE_EN_def, 1318209ff23fSmrgfld_VBI_CC_DTO_P_def, 1319209ff23fSmrgfld_VBI_20BIT_DTO_P_def, 1320209ff23fSmrgfld_VBI_CC_LEVEL_def, 1321209ff23fSmrgfld_VBI_20BIT_LEVEL_def, 1322209ff23fSmrgfld_VBI_CLK_RUNIN_GAIN_def, 1323209ff23fSmrgfld_H_VBI_WIND_START_def, 1324209ff23fSmrgfld_H_VBI_WIND_END_def, 1325209ff23fSmrgfld_V_VBI_WIND_START_def, 1326209ff23fSmrgfld_V_VBI_WIND_END_def, 1327209ff23fSmrgfld_VBI_20BIT_DATA0_def, 1328209ff23fSmrgfld_VBI_20BIT_DATA1_def, 1329209ff23fSmrgfld_VBI_20BIT_WT_def, 1330209ff23fSmrgfld_VBI_20BIT_WT_ACK_def, 1331209ff23fSmrgfld_VBI_20BIT_HOLD_def, 1332209ff23fSmrgfld_VBI_CAPTURE_ENABLE_def, 1333209ff23fSmrgfld_VBI_EDS_DATA_def, 1334209ff23fSmrgfld_VBI_EDS_WT_def, 1335209ff23fSmrgfld_VBI_EDS_WT_ACK_def, 1336209ff23fSmrgfld_VBI_EDS_HOLD_def, 1337209ff23fSmrgfld_VBI_SCALING_RATIO_def, 1338209ff23fSmrgfld_VBI_ALIGNER_ENABLE_def, 1339209ff23fSmrgfld_H_ACTIVE_START_def, 1340209ff23fSmrgfld_H_ACTIVE_END_def, 1341209ff23fSmrgfld_V_ACTIVE_START_def, 1342209ff23fSmrgfld_V_ACTIVE_END_def, 1343209ff23fSmrgfld_CH_HEIGHT_def, 1344209ff23fSmrgfld_CH_KILL_LEVEL_def, 1345209ff23fSmrgfld_CH_AGC_ERROR_LIM_def, 1346209ff23fSmrgfld_CH_AGC_FILTER_EN_def, 1347209ff23fSmrgfld_CH_AGC_LOOP_SPEED_def, 1348209ff23fSmrgfld_HUE_ADJ_def, 1349209ff23fSmrgfld_STANDARD_SEL_def, 1350209ff23fSmrgfld_STANDARD_YC_def, 1351209ff23fSmrgfld_ADC_PDWN_def, 1352209ff23fSmrgfld_INPUT_SELECT_def, 1353209ff23fSmrgfld_ADC_PREFLO_def, 1354209ff23fSmrgfld_H_SYNC_PULSE_WIDTH_def, 1355209ff23fSmrgfld_HS_GENLOCKED_def, 1356209ff23fSmrgfld_HS_SYNC_IN_WIN_def, 1357209ff23fSmrgfld_VIN_ASYNC_RST_def, 1358209ff23fSmrgfld_DVS_ASYNC_RST_def, 1359209ff23fSmrgfld_VIP_VENDOR_ID_def, 1360209ff23fSmrgfld_VIP_DEVICE_ID_def, 1361209ff23fSmrgfld_VIP_REVISION_ID_def, 1362209ff23fSmrgfld_BLACK_INT_START_def, 1363209ff23fSmrgfld_BLACK_INT_LENGTH_def, 1364209ff23fSmrgfld_UV_INT_START_def, 1365209ff23fSmrgfld_U_INT_LENGTH_def, 1366209ff23fSmrgfld_V_INT_LENGTH_def, 1367209ff23fSmrgfld_CRDR_ACTIVE_GAIN_def, 1368209ff23fSmrgfld_CBDB_ACTIVE_GAIN_def, 1369209ff23fSmrgfld_DVS_DIRECTION_def, 1370209ff23fSmrgfld_DVS_VBI_UINT8_SWAP_def, 1371209ff23fSmrgfld_DVS_CLK_SELECT_def, 1372209ff23fSmrgfld_CONTINUOUS_STREAM_def, 1373209ff23fSmrgfld_DVSOUT_CLK_DRV_def, 1374209ff23fSmrgfld_DVSOUT_DATA_DRV_def, 1375209ff23fSmrgfld_COMB_CNTL0_def, 1376209ff23fSmrgfld_COMB_CNTL1_def, 1377209ff23fSmrgfld_COMB_CNTL2_def, 1378209ff23fSmrgfld_COMB_LENGTH_def, 1379209ff23fSmrgfld_SYNCTIP_REF0_def, 1380209ff23fSmrgfld_SYNCTIP_REF1_def, 1381209ff23fSmrgfld_CLAMP_REF_def, 1382209ff23fSmrgfld_AGC_PEAKWHITE_def, 1383209ff23fSmrgfld_VBI_PEAKWHITE_def, 1384209ff23fSmrgfld_WPA_THRESHOLD_def, 1385209ff23fSmrgfld_WPA_TRIGGER_LO_def, 1386209ff23fSmrgfld_WPA_TRIGGER_HIGH_def, 1387209ff23fSmrgfld_LOCKOUT_START_def, 1388209ff23fSmrgfld_LOCKOUT_END_def, 1389209ff23fSmrgfld_CH_DTO_INC_def, 1390209ff23fSmrgfld_PLL_SGAIN_def, 1391209ff23fSmrgfld_PLL_FGAIN_def, 1392209ff23fSmrgfld_CR_BURST_GAIN_def, 1393209ff23fSmrgfld_CB_BURST_GAIN_def, 1394209ff23fSmrgfld_VERT_LOCKOUT_START_def, 1395209ff23fSmrgfld_VERT_LOCKOUT_END_def, 1396209ff23fSmrgfld_H_IN_WIND_START_def, 1397209ff23fSmrgfld_V_IN_WIND_START_def, 1398209ff23fSmrgfld_H_OUT_WIND_WIDTH_def, 1399209ff23fSmrgfld_V_OUT_WIND_WIDTH_def, 1400209ff23fSmrgfld_HS_LINE_TOTAL_def, 1401209ff23fSmrgfld_MIN_PULSE_WIDTH_def, 1402209ff23fSmrgfld_MAX_PULSE_WIDTH_def, 1403209ff23fSmrgfld_WIN_CLOSE_LIMIT_def, 1404209ff23fSmrgfld_WIN_OPEN_LIMIT_def, 1405209ff23fSmrgfld_VSYNC_INT_TRIGGER_def, 1406209ff23fSmrgfld_VSYNC_INT_HOLD_def, 1407209ff23fSmrgfld_VIN_M0_def, 1408209ff23fSmrgfld_VIN_N0_def, 1409209ff23fSmrgfld_MNFLIP_EN_def, 1410209ff23fSmrgfld_VIN_P_def, 1411209ff23fSmrgfld_REG_CLK_SEL_def, 1412209ff23fSmrgfld_VIN_M1_def, 1413209ff23fSmrgfld_VIN_N1_def, 1414209ff23fSmrgfld_VIN_DRIVER_SEL_def, 1415209ff23fSmrgfld_VIN_MNFLIP_REQ_def, 1416209ff23fSmrgfld_VIN_MNFLIP_DONE_def, 1417209ff23fSmrgfld_TV_LOCK_TO_VIN_def, 1418209ff23fSmrgfld_TV_P_FOR_WINCLK_def, 1419209ff23fSmrgfld_VINRST_def, 1420209ff23fSmrgfld_VIN_CLK_SEL_def, 1421209ff23fSmrgfld_VS_FIELD_BLANK_START_def, 1422209ff23fSmrgfld_VS_FIELD_BLANK_END_def, 1423209ff23fSmrgfld_VS_FIELD_IDLOCATION_def, 1424209ff23fSmrgfld_VS_FRAME_TOTAL_def, 1425209ff23fSmrgfld_SYNC_TIP_START_def, 1426209ff23fSmrgfld_SYNC_TIP_LENGTH_def, 1427209ff23fSmrgfld_GAIN_FORCE_DATA_def, 1428209ff23fSmrgfld_GAIN_FORCE_EN_def, 1429209ff23fSmrgfld_I_CLAMP_SEL_def, 1430209ff23fSmrgfld_I_AGC_SEL_def, 1431209ff23fSmrgfld_EXT_CLAMP_CAP_def, 1432209ff23fSmrgfld_EXT_AGC_CAP_def, 1433209ff23fSmrgfld_DECI_DITHER_EN_def, 1434209ff23fSmrgfld_ADC_PREFHI_def, 1435209ff23fSmrgfld_ADC_CH_GAIN_SEL_def, 1436209ff23fSmrgfld_HS_PLL_SGAIN_def, 1437209ff23fSmrgfld_NREn_def, 1438209ff23fSmrgfld_NRGainCntl_def, 1439209ff23fSmrgfld_NRBWTresh_def, 1440209ff23fSmrgfld_NRGCTresh_def, 1441209ff23fSmrgfld_NRCoefDespeclMode_def, 1442209ff23fSmrgfld_GPIO_5_OE_def, 1443209ff23fSmrgfld_GPIO_6_OE_def, 1444209ff23fSmrgfld_GPIO_5_OUT_def, 1445209ff23fSmrgfld_GPIO_6_OUT_def, 1446209ff23fSmrg}; 1447209ff23fSmrg 1448209ff23fSmrg/**************************************************************************** 1449209ff23fSmrg * WriteRT_fld (uint32_t dwReg, uint32_t dwData) * 1450209ff23fSmrg * Function: Writes a register field within Rage Theatre * 1451209ff23fSmrg * Inputs: uint32_t dwReg = register field to be written * 1452209ff23fSmrg * uint32_t dwData = data that will be written to the reg field * 1453209ff23fSmrg * Outputs: NONE * 1454209ff23fSmrg ****************************************************************************/ 1455209ff23fSmrgstatic void WriteRT_fld1 (TheatrePtr t, uint32_t dwReg, uint32_t dwData) 1456209ff23fSmrg{ 1457209ff23fSmrg uint32_t dwResult=0; 1458209ff23fSmrg uint32_t dwValue=0; 1459209ff23fSmrg 1460209ff23fSmrg if (RT_regr (RT_RegMap[dwReg].dwRegAddrLSBs, &dwResult) == TRUE) 1461209ff23fSmrg { 1462209ff23fSmrg dwValue = (dwResult & RT_RegMap[dwReg].dwMaskLSBs) | 1463209ff23fSmrg (dwData << RT_RegMap[dwReg].dwFldOffsetLSBs); 1464209ff23fSmrg 1465209ff23fSmrg if (RT_regw (RT_RegMap[dwReg].dwRegAddrLSBs, dwValue) == TRUE) 1466209ff23fSmrg { 1467209ff23fSmrg /* update the memory mapped registers */ 1468209ff23fSmrg RT_RegMap[dwReg].dwCurrValue = dwData; 1469209ff23fSmrg } 1470209ff23fSmrg } 1471209ff23fSmrg 1472209ff23fSmrg return; 1473209ff23fSmrg 1474209ff23fSmrg} /* WriteRT_fld ()... */ 1475209ff23fSmrg 1476209ff23fSmrg#if 0 1477209ff23fSmrg/**************************************************************************** 1478209ff23fSmrg * ReadRT_fld (uint32_t dwReg) * 1479209ff23fSmrg * Function: Reads a register field within Rage Theatre * 1480209ff23fSmrg * Inputs: uint32_t dwReg = register field to be read * 1481209ff23fSmrg * Outputs: uint32_t - value read from register field * 1482209ff23fSmrg ****************************************************************************/ 1483209ff23fSmrgstatic uint32_t ReadRT_fld1 (TheatrePtr t,uint32_t dwReg) 1484209ff23fSmrg{ 1485209ff23fSmrg uint32_t dwResult=0; 1486209ff23fSmrg 1487209ff23fSmrg if (RT_regr (RT_RegMap[dwReg].dwRegAddrLSBs, &dwResult) == TRUE) 1488209ff23fSmrg { 1489209ff23fSmrg RT_RegMap[dwReg].dwCurrValue = ((dwResult & ~RT_RegMap[dwReg].dwMaskLSBs) >> 1490209ff23fSmrg RT_RegMap[dwReg].dwFldOffsetLSBs); 1491209ff23fSmrg return (RT_RegMap[dwReg].dwCurrValue); 1492209ff23fSmrg } 1493209ff23fSmrg else 1494209ff23fSmrg { 1495209ff23fSmrg return (0xFFFFFFFF); 1496209ff23fSmrg } 1497209ff23fSmrg 1498209ff23fSmrg} /* ReadRT_fld ()... */ 1499209ff23fSmrg 1500209ff23fSmrg#define ReadRT_fld(a) ReadRT_fld1(t,(a)) 1501209ff23fSmrg#endif 1502209ff23fSmrg 1503209ff23fSmrg#define WriteRT_fld(a,b) WriteRT_fld1(t, (a), (b)) 1504209ff23fSmrg 1505209ff23fSmrg 1506209ff23fSmrg/**************************************************************************** 1507209ff23fSmrg * RT_SetTint (int hue) * 1508209ff23fSmrg * Function: sets the tint (hue) for the Rage Theatre video in * 1509209ff23fSmrg * Inputs: int hue - the hue value to be set. * 1510209ff23fSmrg * Outputs: NONE * 1511209ff23fSmrg ****************************************************************************/ 1512209ff23fSmrg_X_EXPORT void RT_SetTint (TheatrePtr t, int hue) 1513209ff23fSmrg{ 1514209ff23fSmrg /* Validate Hue level */ 1515209ff23fSmrg if (hue < -1000) 1516209ff23fSmrg { 1517209ff23fSmrg hue = -1000; 1518209ff23fSmrg } 1519209ff23fSmrg else if (hue > 1000) 1520209ff23fSmrg { 1521209ff23fSmrg hue = 1000; 1522209ff23fSmrg } 1523209ff23fSmrg 1524209ff23fSmrg t->iHue=hue; 1525209ff23fSmrg 1526209ff23fSmrg dsp_set_tint(t, (uint8_t)((hue*255)/2000 + 128)); 1527209ff23fSmrg 1528209ff23fSmrg} /* RT_SetTint ()... */ 1529209ff23fSmrg 1530209ff23fSmrg 1531209ff23fSmrg/**************************************************************************** 1532209ff23fSmrg * RT_SetSaturation (int Saturation) * 1533209ff23fSmrg * Function: sets the saturation level for the Rage Theatre video in * 1534209ff23fSmrg * Inputs: int Saturation - the saturation value to be set. * 1535209ff23fSmrg * Outputs: NONE * 1536209ff23fSmrg ****************************************************************************/ 1537209ff23fSmrg_X_EXPORT void RT_SetSaturation (TheatrePtr t, int Saturation) 1538209ff23fSmrg{ 1539209ff23fSmrg /* VALIDATE SATURATION LEVEL */ 1540209ff23fSmrg if (Saturation < -1000L) 1541209ff23fSmrg { 1542209ff23fSmrg Saturation = -1000; 1543209ff23fSmrg } 1544209ff23fSmrg else if (Saturation > 1000L) 1545209ff23fSmrg { 1546209ff23fSmrg Saturation = 1000; 1547209ff23fSmrg } 1548209ff23fSmrg 1549209ff23fSmrg t->iSaturation = Saturation; 1550209ff23fSmrg 1551209ff23fSmrg /* RT200 has saturation in range 0 to 255 with nominal value 128 */ 1552209ff23fSmrg dsp_set_saturation(t, (uint8_t)((Saturation*255)/2000 + 128)); 1553209ff23fSmrg 1554209ff23fSmrg return; 1555209ff23fSmrg} /* RT_SetSaturation ()...*/ 1556209ff23fSmrg 1557209ff23fSmrg/**************************************************************************** 1558209ff23fSmrg * RT_SetBrightness (int Brightness) * 1559209ff23fSmrg * Function: sets the brightness level for the Rage Theatre video in * 1560209ff23fSmrg * Inputs: int Brightness - the brightness value to be set. * 1561209ff23fSmrg * Outputs: NONE * 1562209ff23fSmrg ****************************************************************************/ 1563209ff23fSmrg_X_EXPORT void RT_SetBrightness (TheatrePtr t, int Brightness) 1564209ff23fSmrg{ 1565209ff23fSmrg /* VALIDATE BRIGHTNESS LEVEL */ 1566209ff23fSmrg if (Brightness < -1000) 1567209ff23fSmrg { 1568209ff23fSmrg Brightness = -1000; 1569209ff23fSmrg } 1570209ff23fSmrg else if (Brightness > 1000) 1571209ff23fSmrg { 1572209ff23fSmrg Brightness = 1000; 1573209ff23fSmrg } 1574209ff23fSmrg 1575209ff23fSmrg /* Save value */ 1576209ff23fSmrg t->iBrightness = Brightness; 1577209ff23fSmrg t->dbBrightnessRatio = (double) (Brightness+1000.0) / 10.0; 1578209ff23fSmrg 1579209ff23fSmrg /* RT200 is having brightness level from 0 to 255 with 128 nominal value */ 1580209ff23fSmrg dsp_set_brightness(t, (uint8_t)((Brightness*255)/2000 + 128)); 1581209ff23fSmrg 1582209ff23fSmrg return; 1583209ff23fSmrg} /* RT_SetBrightness ()... */ 1584209ff23fSmrg 1585209ff23fSmrg 1586209ff23fSmrg/**************************************************************************** 1587209ff23fSmrg * RT_SetSharpness (uint16_t wSharpness) * 1588209ff23fSmrg * Function: sets the sharpness level for the Rage Theatre video in * 1589209ff23fSmrg * Inputs: uint16_t wSharpness - the sharpness value to be set. * 1590209ff23fSmrg * Outputs: NONE * 1591209ff23fSmrg ****************************************************************************/ 1592209ff23fSmrg_X_EXPORT void RT_SetSharpness (TheatrePtr t, uint16_t wSharpness) 1593209ff23fSmrg{ 1594209ff23fSmrg switch (wSharpness) 1595209ff23fSmrg { 1596209ff23fSmrg case DEC_SMOOTH : 1597209ff23fSmrg WriteRT_fld (fld_H_SHARPNESS, RT_NORM_SHARPNESS); 1598209ff23fSmrg t->wSharpness = RT_NORM_SHARPNESS; 1599209ff23fSmrg break; 1600209ff23fSmrg case DEC_SHARP : 1601209ff23fSmrg WriteRT_fld (fld_H_SHARPNESS, RT_HIGH_SHARPNESS); 1602209ff23fSmrg t->wSharpness = RT_HIGH_SHARPNESS; 1603209ff23fSmrg break; 1604209ff23fSmrg default: 1605209ff23fSmrg break; 1606209ff23fSmrg } 1607209ff23fSmrg return; 1608209ff23fSmrg 1609209ff23fSmrg} /* RT_SetSharpness ()... */ 1610209ff23fSmrg 1611209ff23fSmrg 1612209ff23fSmrg/**************************************************************************** 1613209ff23fSmrg * RT_SetContrast (int Contrast) * 1614209ff23fSmrg * Function: sets the contrast level for the Rage Theatre video in * 1615209ff23fSmrg * Inputs: int Contrast - the contrast value to be set. * 1616209ff23fSmrg * Outputs: NONE * 1617209ff23fSmrg ****************************************************************************/ 1618209ff23fSmrg_X_EXPORT void RT_SetContrast (TheatrePtr t, int Contrast) 1619209ff23fSmrg{ 1620209ff23fSmrg /* VALIDATE CONTRAST LEVEL */ 1621209ff23fSmrg if (Contrast < -1000) 1622209ff23fSmrg { 1623209ff23fSmrg Contrast = -1000; 1624209ff23fSmrg } 1625209ff23fSmrg else if (Contrast > 1000) 1626209ff23fSmrg { 1627209ff23fSmrg Contrast = 1000; 1628209ff23fSmrg } 1629209ff23fSmrg 1630209ff23fSmrg /* Save contrast value */ 1631209ff23fSmrg t->iContrast = Contrast; 1632209ff23fSmrg t->dbContrast = (double) (Contrast+1000.0) / 1000.0; 1633209ff23fSmrg 1634209ff23fSmrg /* RT200 has contrast values between 0 to 255 with nominal value at 128 */ 1635209ff23fSmrg dsp_set_contrast(t, (uint8_t)((Contrast*255)/2000 + 128)); 1636209ff23fSmrg return; 1637209ff23fSmrg 1638209ff23fSmrg} /* RT_SetContrast ()... */ 1639209ff23fSmrg 1640209ff23fSmrg/**************************************************************************** 1641209ff23fSmrg * RT_SetInterlace (uint8_t bInterlace) * 1642209ff23fSmrg * Function: to set the interlacing pattern for the Rage Theatre video in * 1643209ff23fSmrg * Inputs: uint8_t bInterlace * 1644209ff23fSmrg * Outputs: NONE * 1645209ff23fSmrg ****************************************************************************/ 1646209ff23fSmrg_X_EXPORT void RT_SetInterlace (TheatrePtr t, uint8_t bInterlace) 1647209ff23fSmrg{ 1648209ff23fSmrg switch(bInterlace) 1649209ff23fSmrg { 1650209ff23fSmrg case (TRUE): /*DEC_INTERLACE */ 1651209ff23fSmrg WriteRT_fld (fld_V_DEINTERLACE_ON, 0x1); 1652209ff23fSmrg t->wInterlaced = (uint16_t) RT_DECINTERLACED; 1653209ff23fSmrg break; 1654209ff23fSmrg case (FALSE): /*DEC_NONINTERLACE */ 1655209ff23fSmrg WriteRT_fld (fld_V_DEINTERLACE_ON, RT_DECNONINTERLACED); 1656209ff23fSmrg t->wInterlaced = (uint16_t) RT_DECNONINTERLACED; 1657209ff23fSmrg break; 1658209ff23fSmrg default: 1659209ff23fSmrg break; 1660209ff23fSmrg } 1661209ff23fSmrg 1662209ff23fSmrg return; 1663209ff23fSmrg 1664209ff23fSmrg} /* RT_SetInterlace ()... */ 1665209ff23fSmrg 1666209ff23fSmrg 1667209ff23fSmrg/**************************************************************************** 1668209ff23fSmrg * RT_SetStandard (uint16_t wStandard) * 1669209ff23fSmrg * Function: to set the input standard for the Rage Theatre video in * 1670209ff23fSmrg * Inputs: uint16_t wStandard - input standard (NTSC, PAL, SECAM) * 1671209ff23fSmrg * Outputs: NONE * 1672209ff23fSmrg ****************************************************************************/ 1673209ff23fSmrg_X_EXPORT void RT_SetStandard (TheatrePtr t, uint16_t wStandard) 1674209ff23fSmrg{ 167568105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex,X_INFO,"Rage Theatre setting standard 0x%04x\n", 1676209ff23fSmrg wStandard); 1677209ff23fSmrg 1678209ff23fSmrg t->wStandard = wStandard; 1679209ff23fSmrg 1680209ff23fSmrg /* Program the new standards: */ 1681209ff23fSmrg switch (wStandard & 0x00FF) 1682209ff23fSmrg { 1683209ff23fSmrg case (DEC_NTSC): /*NTSC GROUP - 480 lines */ 1684209ff23fSmrg switch (wStandard & 0xFF00) 1685209ff23fSmrg { 1686209ff23fSmrg case (extNONE): 1687209ff23fSmrg case (extNTSC): 1688209ff23fSmrg dsp_set_video_standard(t, 2); 1689209ff23fSmrg break; 1690209ff23fSmrg case (extNTSC_J): 1691209ff23fSmrg dsp_set_video_standard(t, RT200_NTSC_J); 1692209ff23fSmrg break; 1693209ff23fSmrg case (extNTSC_443): 1694209ff23fSmrg dsp_set_video_standard(t, RT200_NTSC_433); 1695209ff23fSmrg break; 1696209ff23fSmrg default: 1697209ff23fSmrg dsp_video_standard_detection(t); 1698209ff23fSmrg break; 1699209ff23fSmrg } 1700209ff23fSmrg break; 1701209ff23fSmrg case (DEC_PAL): /*PAL GROUP - 625 lines */ 1702209ff23fSmrg switch (wStandard & 0xFF00) 1703209ff23fSmrg { 1704209ff23fSmrg case (extNONE): 1705209ff23fSmrg case (extPAL): 1706209ff23fSmrg case (extPAL_B): 1707209ff23fSmrg case (extPAL_BGHI): 1708209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_B); 1709209ff23fSmrg break; 1710209ff23fSmrg case (extPAL_D): 1711209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_D); 1712209ff23fSmrg break; 1713209ff23fSmrg case (extPAL_G): 1714209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_G); 1715209ff23fSmrg break; 1716209ff23fSmrg case (extPAL_H): 1717209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_H); 1718209ff23fSmrg break; 1719209ff23fSmrg case (extPAL_I): 1720209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_D); 1721209ff23fSmrg break; 1722209ff23fSmrg case (extPAL_N): 1723209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_N); 1724209ff23fSmrg break; 1725209ff23fSmrg case (extPAL_NCOMB): 1726209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_Ncomb); 1727209ff23fSmrg break; 1728209ff23fSmrg case (extPAL_M): 1729209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_M); 1730209ff23fSmrg break; 1731209ff23fSmrg case (extPAL_60): 1732209ff23fSmrg dsp_set_video_standard(t, RT200_PAL_60); 1733209ff23fSmrg break; 1734209ff23fSmrg default: 1735209ff23fSmrg dsp_video_standard_detection(t); 1736209ff23fSmrg break; 1737209ff23fSmrg } 1738209ff23fSmrg break; 1739209ff23fSmrg case (DEC_SECAM): /*SECAM GROUP*/ 1740209ff23fSmrg switch (wStandard & 0xFF00) 1741209ff23fSmrg { 1742209ff23fSmrg case (extNONE): 1743209ff23fSmrg case (extSECAM): 1744209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM); 1745209ff23fSmrg break; 1746209ff23fSmrg case (extSECAM_B): 1747209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_B); 1748209ff23fSmrg break; 1749209ff23fSmrg case (extSECAM_D): 1750209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_D); 1751209ff23fSmrg break; 1752209ff23fSmrg case (extSECAM_G): 1753209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_G); 1754209ff23fSmrg break; 1755209ff23fSmrg case (extSECAM_H): 1756209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_H); 1757209ff23fSmrg break; 1758209ff23fSmrg case (extSECAM_K): 1759209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_K); 1760209ff23fSmrg break; 1761209ff23fSmrg case (extSECAM_K1): 1762209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_K1); 1763209ff23fSmrg break; 1764209ff23fSmrg case (extSECAM_L): 1765209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_L); 1766209ff23fSmrg break; 1767209ff23fSmrg case (extSECAM_L1): 1768209ff23fSmrg dsp_set_video_standard(t, RT200_SECAM_L1); 1769209ff23fSmrg break; 1770209ff23fSmrg default: 1771209ff23fSmrg dsp_video_standard_detection(t); 1772209ff23fSmrg break; 1773209ff23fSmrg } 1774209ff23fSmrg break; 1775209ff23fSmrg default: 1776209ff23fSmrg dsp_video_standard_detection(t); 1777209ff23fSmrg } 1778209ff23fSmrg 1779209ff23fSmrg} /* RT_SetStandard ()... */ 1780209ff23fSmrg 1781209ff23fSmrg 1782209ff23fSmrg/**************************************************************************** 1783209ff23fSmrg * RT_SetOutputVideoSize (uint16_t wHorzSize, uint16_t wVertSize, * 1784209ff23fSmrg * uint8_t fCC_On, uint8_t fVBICap_On) * 1785209ff23fSmrg * Function: sets the output video size for the Rage Theatre video in * 1786209ff23fSmrg * Inputs: uint16_t wHorzSize - width of output in pixels * 1787209ff23fSmrg * uint16_t wVertSize - height of output in pixels (lines) * 1788209ff23fSmrg * uint8_t fCC_On - enable CC output * 1789209ff23fSmrg * uint8_t fVBI_Cap_On - enable VBI capture * 1790209ff23fSmrg * Outputs: NONE * 1791209ff23fSmrg ****************************************************************************/ 1792209ff23fSmrg_X_EXPORT void RT_SetOutputVideoSize (TheatrePtr t, uint16_t wHorzSize, uint16_t wVertSize, uint8_t fCC_On, uint8_t fVBICap_On) 1793209ff23fSmrg{ 1794209ff23fSmrg /* VBI is ignored now */ 1795209ff23fSmrg 1796209ff23fSmrg /* 1797209ff23fSmrg * If I pass the (wHorzSize, 0, 0) (wVertSize, 0, 0) the image does not synchronize 1798209ff23fSmrg */ 1799209ff23fSmrg dsp_set_video_scaler_horizontal(t, 0, 0, 0); 1800209ff23fSmrg dsp_set_video_scaler_vertical(t, 0, 0, 0); 1801209ff23fSmrg 1802209ff23fSmrg} /* RT_SetOutputVideoSize ()...*/ 1803209ff23fSmrg 1804209ff23fSmrg 1805209ff23fSmrg/**************************************************************************** 1806209ff23fSmrg * RT_SetConnector (uint16_t wStandard, int tunerFlag) * 1807209ff23fSmrg * Function: 1808209ff23fSmrg * Inputs: uint16_t wStandard - input standard (NTSC, PAL, SECAM) * 1809209ff23fSmrg * int tunerFlag 1810209ff23fSmrg * Outputs: NONE * 1811209ff23fSmrg ****************************************************************************/ 1812209ff23fSmrg_X_EXPORT void RT_SetConnector (TheatrePtr t, uint16_t wConnector, int tunerFlag) 1813209ff23fSmrg{ 1814209ff23fSmrg uint32_t data; 1815209ff23fSmrg 1816209ff23fSmrg t->wConnector = wConnector; 1817209ff23fSmrg 1818209ff23fSmrg theatre_read(t, VIP_GPIO_CNTL, &data); 181968105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex,X_INFO,"VIP_GPIO_CNTL: %x\n", 1820209ff23fSmrg (unsigned)data); 1821209ff23fSmrg 1822209ff23fSmrg theatre_read(t, VIP_GPIO_INOUT, &data); 182368105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex,X_INFO,"VIP_GPIO_INOUT: %x\n", 1824209ff23fSmrg (unsigned)data); 1825209ff23fSmrg 1826209ff23fSmrg switch (wConnector) 1827209ff23fSmrg { 1828209ff23fSmrg case (DEC_TUNER): /* Tuner*/ 1829209ff23fSmrg /* RT200 does not have any input connector 0 */ 1830209ff23fSmrg dsp_set_video_input_connector(t, t->wTunerConnector + 1); 1831209ff23fSmrg 1832209ff23fSmrg /* this is to set the analog mux used for sond */ 1833209ff23fSmrg theatre_read(t, VIP_GPIO_CNTL, &data); 1834209ff23fSmrg data &= ~0x10; 1835209ff23fSmrg theatre_write(t, VIP_GPIO_CNTL, data); 1836209ff23fSmrg 1837209ff23fSmrg theatre_read(t, VIP_GPIO_INOUT, &data); 1838209ff23fSmrg data &= ~0x10; 1839209ff23fSmrg theatre_write(t, VIP_GPIO_INOUT, data); 1840209ff23fSmrg 1841209ff23fSmrg break; 1842209ff23fSmrg case (DEC_COMPOSITE): /* Comp*/ 1843209ff23fSmrg dsp_set_video_input_connector(t, t->wComp0Connector); 1844209ff23fSmrg 1845209ff23fSmrg /* this is to set the analog mux used for sond */ 1846209ff23fSmrg theatre_read(t, VIP_GPIO_CNTL, &data); 1847209ff23fSmrg data |= 0x10; 1848209ff23fSmrg theatre_write(t, VIP_GPIO_CNTL, data); 1849209ff23fSmrg 1850209ff23fSmrg theatre_read(t, VIP_GPIO_INOUT, &data); 1851209ff23fSmrg data |= 0x10; 1852209ff23fSmrg theatre_write(t, VIP_GPIO_INOUT, data); 1853209ff23fSmrg 1854209ff23fSmrg break; 1855209ff23fSmrg case (DEC_SVIDEO): /* Svideo*/ 1856209ff23fSmrg dsp_set_video_input_connector(t, t->wSVideo0Connector); 1857209ff23fSmrg 1858209ff23fSmrg /* this is to set the analog mux used for sond */ 1859209ff23fSmrg theatre_read(t, VIP_GPIO_CNTL, &data); 1860209ff23fSmrg data |= 0x10; 1861209ff23fSmrg theatre_write(t, VIP_GPIO_CNTL, data); 1862209ff23fSmrg 1863209ff23fSmrg theatre_read(t, VIP_GPIO_INOUT, &data); 1864209ff23fSmrg data |= 0x10; 1865209ff23fSmrg theatre_write(t, VIP_GPIO_INOUT, data); 1866209ff23fSmrg 1867209ff23fSmrg break; 1868209ff23fSmrg default: 1869209ff23fSmrg dsp_set_video_input_connector(t, t->wComp0Connector); 1870209ff23fSmrg } 1871209ff23fSmrg 1872209ff23fSmrg theatre_read(t, VIP_GPIO_CNTL, &data); 187368105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex,X_INFO,"VIP_GPIO_CNTL: %x\n", 1874209ff23fSmrg (unsigned)data); 1875209ff23fSmrg 1876209ff23fSmrg theatre_read(t, VIP_GPIO_INOUT, &data); 187768105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex,X_INFO,"VIP_GPIO_INOUT: %x\n", 1878209ff23fSmrg (unsigned)data); 1879209ff23fSmrg 1880209ff23fSmrg 1881209ff23fSmrg dsp_configure_i2s_port(t, 0, 0, 0); 1882209ff23fSmrg dsp_configure_spdif_port(t, 0); 1883209ff23fSmrg 1884209ff23fSmrg /*dsp_audio_detection(t, 0);*/ 1885209ff23fSmrg dsp_audio_mute(t, 1, 1); 1886209ff23fSmrg dsp_set_audio_volume(t, 128, 128, 0); 1887209ff23fSmrg 1888209ff23fSmrg} /* RT_SetConnector ()...*/ 1889209ff23fSmrg 1890209ff23fSmrg 1891209ff23fSmrg_X_EXPORT void InitTheatre(TheatrePtr t) 1892209ff23fSmrg{ 1893209ff23fSmrg uint32_t data; 1894209ff23fSmrg uint32_t M, N, P; 1895209ff23fSmrg 1896209ff23fSmrg /* this will give 108Mhz at 27Mhz reference */ 1897209ff23fSmrg M = 28; 1898209ff23fSmrg N = 224; 1899209ff23fSmrg P = 1; 1900209ff23fSmrg 1901209ff23fSmrg ShutdownTheatre(t); 1902209ff23fSmrg usleep(100000); 1903209ff23fSmrg t->mode=MODE_INITIALIZATION_IN_PROGRESS; 1904209ff23fSmrg 1905209ff23fSmrg 1906209ff23fSmrg data = M | (N << 11) | (P <<24); 1907209ff23fSmrg RT_regw(VIP_DSP_PLL_CNTL, data); 1908209ff23fSmrg 1909209ff23fSmrg RT_regr(VIP_PLL_CNTL0, &data); 1910209ff23fSmrg data |= 0x2000; 1911209ff23fSmrg RT_regw(VIP_PLL_CNTL0, data); 1912209ff23fSmrg 1913209ff23fSmrg /* RT_regw(VIP_I2C_SLVCNTL, 0x249); */ 1914209ff23fSmrg RT_regr(VIP_PLL_CNTL1, &data); 1915209ff23fSmrg data |= 0x00030003; 1916209ff23fSmrg RT_regw(VIP_PLL_CNTL1, data); 1917209ff23fSmrg 1918209ff23fSmrg RT_regr(VIP_PLL_CNTL0, &data); 1919209ff23fSmrg data &= 0xfffffffc; 1920209ff23fSmrg RT_regw(VIP_PLL_CNTL0, data); 1921209ff23fSmrg usleep(15000); 1922209ff23fSmrg 1923209ff23fSmrg RT_regr(VIP_CLOCK_SEL_CNTL, &data); 1924209ff23fSmrg data |= 0x1b; 1925209ff23fSmrg RT_regw(VIP_CLOCK_SEL_CNTL, data); 1926209ff23fSmrg 1927209ff23fSmrg RT_regr(VIP_MASTER_CNTL, &data); 1928209ff23fSmrg data &= 0xffffff07; 1929209ff23fSmrg RT_regw(VIP_MASTER_CNTL, data); 1930209ff23fSmrg data &= 0xffffff03; 1931209ff23fSmrg RT_regw(VIP_MASTER_CNTL, data); 1932209ff23fSmrg usleep(1000); 1933209ff23fSmrg 1934209ff23fSmrg if (t->microc_path == NULL) 1935209ff23fSmrg { 1936209ff23fSmrg t->microc_path = DEFAULT_MICROC_PATH; 193768105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: Use default microcode path: %s\n", DEFAULT_MICROC_PATH); 1938209ff23fSmrg } 1939209ff23fSmrg else 194068105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: Use microcode path: %s\n", t->microc_path); 1941209ff23fSmrg 1942209ff23fSmrg 1943209ff23fSmrg if (t->microc_type == NULL) 1944209ff23fSmrg { 1945209ff23fSmrg t->microc_type = DEFAULT_MICROC_TYPE; 194668105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: Use default microcode type: %s\n", DEFAULT_MICROC_TYPE); 1947209ff23fSmrg } 1948209ff23fSmrg else 194968105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: Use microcode type: %s\n", t->microc_type); 1950209ff23fSmrg 1951209ff23fSmrg if (DownloadMicrocode(t) < 0) 1952209ff23fSmrg { 1953209ff23fSmrg ShutdownTheatre(t); 1954209ff23fSmrg return; 1955209ff23fSmrg } 1956209ff23fSmrg 1957209ff23fSmrg dsp_set_lowpowerstate(t, 1); 1958209ff23fSmrg dsp_set_videostreamformat(t, 1); 1959209ff23fSmrg 1960209ff23fSmrg t->mode=MODE_INITIALIZED_FOR_TV_IN; 1961209ff23fSmrg} 1962209ff23fSmrg 1963209ff23fSmrgstatic int DownloadMicrocode(TheatrePtr t) 1964209ff23fSmrg{ 1965209ff23fSmrg struct rt200_microc_data microc_data; 1966209ff23fSmrg microc_data.microc_seg_list = NULL; 1967209ff23fSmrg 196868105dcbSveego if (microc_load(t->microc_path, t->microc_type, µc_data, t->VIP->pScrn->scrnIndex) < 0) 1969209ff23fSmrg { 197068105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_ERROR, "Microcode: cannot load microcode\n"); 1971209ff23fSmrg goto err_exit; 1972209ff23fSmrg } 1973209ff23fSmrg else 1974209ff23fSmrg { 197568105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: device_id: %x\n", microc_data.microc_head.device_id); 197668105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: vendor_id: %x\n", microc_data.microc_head.vendor_id); 197768105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: rev_id: %x\n", microc_data.microc_head.revision_id); 197868105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: num_seg: %x\n", microc_data.microc_head.num_seg); 1979209ff23fSmrg } 1980209ff23fSmrg 1981209ff23fSmrg if (dsp_init(t, µc_data) < 0) 1982209ff23fSmrg { 198368105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_ERROR, "Microcode: dsp_init failed\n"); 1984209ff23fSmrg goto err_exit; 1985209ff23fSmrg } 1986209ff23fSmrg else 1987209ff23fSmrg { 198868105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: dsp_init OK\n"); 1989209ff23fSmrg } 1990209ff23fSmrg 1991209ff23fSmrg if (dsp_load(t, µc_data) < 0) 1992209ff23fSmrg { 199368105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_ERROR, "Microcode: dsp_download failed\n"); 1994209ff23fSmrg goto err_exit; 1995209ff23fSmrg } 1996209ff23fSmrg else 1997209ff23fSmrg { 199868105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, "Microcode: dsp_download OK\n"); 1999209ff23fSmrg } 2000209ff23fSmrg 200168105dcbSveego microc_clean(µc_data, t->VIP->pScrn->scrnIndex); 2002209ff23fSmrg return 0; 2003209ff23fSmrg 2004209ff23fSmrgerr_exit: 2005209ff23fSmrg 200668105dcbSveego microc_clean(µc_data, t->VIP->pScrn->scrnIndex); 2007209ff23fSmrg return -1; 2008209ff23fSmrg 2009209ff23fSmrg} 2010209ff23fSmrg 2011209ff23fSmrg 2012209ff23fSmrg_X_EXPORT void ShutdownTheatre(TheatrePtr t) 2013209ff23fSmrg{ 2014209ff23fSmrg#if 0 2015209ff23fSmrg WriteRT_fld (fld_VIN_ASYNC_RST, RT_ASYNC_DISABLE); 2016209ff23fSmrg WriteRT_fld (fld_VINRST , RT_VINRST_RESET); 2017209ff23fSmrg WriteRT_fld (fld_ADC_PDWN , RT_ADC_DISABLE); 2018209ff23fSmrg WriteRT_fld (fld_DVS_DIRECTION, RT_DVSDIR_IN); 2019209ff23fSmrg#endif 2020209ff23fSmrg t->mode=MODE_UNINITIALIZED; 2021209ff23fSmrg} 2022209ff23fSmrg 2023209ff23fSmrg_X_EXPORT void DumpRageTheatreRegs(TheatrePtr t) 2024209ff23fSmrg{ 2025209ff23fSmrg int i; 2026209ff23fSmrg uint32_t data; 2027209ff23fSmrg 2028209ff23fSmrg for(i=0;i<0x900;i+=4) 2029209ff23fSmrg { 2030209ff23fSmrg RT_regr(i, &data); 203168105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, 2032209ff23fSmrg "register 0x%04x is equal to 0x%08x\n", i, (unsigned)data); 2033209ff23fSmrg } 2034209ff23fSmrg 2035209ff23fSmrg} 2036209ff23fSmrg 2037209ff23fSmrgvoid DumpRageTheatreRegsByName(TheatrePtr t) 2038209ff23fSmrg{ 2039209ff23fSmrg int i; 2040209ff23fSmrg uint32_t data; 2041209ff23fSmrg struct { char *name; long addr; } rt_reg_list[]={ 2042209ff23fSmrg { "ADC_CNTL ", 0x0400 }, 2043209ff23fSmrg { "ADC_DEBUG ", 0x0404 }, 2044209ff23fSmrg { "AUD_CLK_DIVIDERS ", 0x00e8 }, 2045209ff23fSmrg { "AUD_DTO_INCREMENTS ", 0x00ec }, 2046209ff23fSmrg { "AUD_PLL_CNTL ", 0x00e0 }, 2047209ff23fSmrg { "AUD_PLL_FINE_CNTL ", 0x00e4 }, 2048209ff23fSmrg { "CLKOUT_CNTL ", 0x004c }, 2049209ff23fSmrg { "CLKOUT_GPIO_CNTL ", 0x0038 }, 2050209ff23fSmrg { "CLOCK_SEL_CNTL ", 0x00d0 }, 2051209ff23fSmrg { "COMB_CNTL0 ", 0x0440 }, 2052209ff23fSmrg { "COMB_CNTL1 ", 0x0444 }, 2053209ff23fSmrg { "COMB_CNTL2 ", 0x0448 }, 2054209ff23fSmrg { "COMB_LINE_LENGTH ", 0x044c }, 2055209ff23fSmrg { "CP_ACTIVE_GAIN ", 0x0594 }, 2056209ff23fSmrg { "CP_AGC_CNTL ", 0x0590 }, 2057209ff23fSmrg { "CP_BURST_GAIN ", 0x058c }, 2058209ff23fSmrg { "CP_DEBUG_FORCE ", 0x05b8 }, 2059209ff23fSmrg { "CP_HUE_CNTL ", 0x0588 }, 2060209ff23fSmrg { "CP_PLL_CNTL0 ", 0x0580 }, 2061209ff23fSmrg { "CP_PLL_CNTL1 ", 0x0584 }, 2062209ff23fSmrg { "CP_PLL_STATUS0 ", 0x0598 }, 2063209ff23fSmrg { "CP_PLL_STATUS1 ", 0x059c }, 2064209ff23fSmrg { "CP_PLL_STATUS2 ", 0x05a0 }, 2065209ff23fSmrg { "CP_PLL_STATUS3 ", 0x05a4 }, 2066209ff23fSmrg { "CP_PLL_STATUS4 ", 0x05a8 }, 2067209ff23fSmrg { "CP_PLL_STATUS5 ", 0x05ac }, 2068209ff23fSmrg { "CP_PLL_STATUS6 ", 0x05b0 }, 2069209ff23fSmrg { "CP_PLL_STATUS7 ", 0x05b4 }, 2070209ff23fSmrg { "CP_VERT_LOCKOUT ", 0x05bc }, 2071209ff23fSmrg { "CRC_CNTL ", 0x02c0 }, 2072209ff23fSmrg { "CRT_DTO_INCREMENTS ", 0x0394 }, 2073209ff23fSmrg { "CRT_PLL_CNTL ", 0x00c4 }, 2074209ff23fSmrg { "CRT_PLL_FINE_CNTL ", 0x00bc }, 2075209ff23fSmrg { "DECODER_DEBUG_CNTL ", 0x05d4 }, 2076209ff23fSmrg { "DELAY_ONE_MAP_A ", 0x0114 }, 2077209ff23fSmrg { "DELAY_ONE_MAP_B ", 0x0118 }, 2078209ff23fSmrg { "DELAY_ZERO_MAP_A ", 0x011c }, 2079209ff23fSmrg { "DELAY_ZERO_MAP_B ", 0x0120 }, 2080209ff23fSmrg { "DFCOUNT ", 0x00a4 }, 2081209ff23fSmrg { "DFRESTART ", 0x00a8 }, 2082209ff23fSmrg { "DHRESTART ", 0x00ac }, 2083209ff23fSmrg { "DVRESTART ", 0x00b0 }, 2084209ff23fSmrg { "DVS_PORT_CTRL ", 0x0610 }, 2085209ff23fSmrg { "DVS_PORT_READBACK ", 0x0614 }, 2086209ff23fSmrg { "FIFOA_CONFIG ", 0x0800 }, 2087209ff23fSmrg { "FIFOB_CONFIG ", 0x0804 }, 2088209ff23fSmrg { "FIFOC_CONFIG ", 0x0808 }, 2089209ff23fSmrg { "FRAME_LOCK_CNTL ", 0x0100 }, 2090209ff23fSmrg { "GAIN_LIMIT_SETTINGS ", 0x01e4 }, 2091209ff23fSmrg { "GPIO_CNTL ", 0x0034 }, 2092209ff23fSmrg { "GPIO_INOUT ", 0x0030 }, 2093209ff23fSmrg { "HCOUNT ", 0x0090 }, 2094209ff23fSmrg { "HDISP ", 0x0084 }, 2095209ff23fSmrg { "HOST_RD_WT_CNTL ", 0x0188 }, 2096209ff23fSmrg { "HOST_READ_DATA ", 0x0180 }, 2097209ff23fSmrg { "HOST_WRITE_DATA ", 0x0184 }, 2098209ff23fSmrg { "HSIZE ", 0x0088 }, 2099209ff23fSmrg { "HSTART ", 0x008c }, 2100209ff23fSmrg { "HS_DTOINC ", 0x0484 }, 2101209ff23fSmrg { "HS_GENLOCKDELAY ", 0x0490 }, 2102209ff23fSmrg { "HS_MINMAXWIDTH ", 0x048c }, 2103209ff23fSmrg { "HS_PLINE ", 0x0480 }, 2104209ff23fSmrg { "HS_PLLGAIN ", 0x0488 }, 2105209ff23fSmrg { "HS_PLL_ERROR ", 0x04a0 }, 2106209ff23fSmrg { "HS_PLL_FS_PATH ", 0x04a4 }, 2107209ff23fSmrg { "HS_PULSE_WIDTH ", 0x049c }, 2108209ff23fSmrg { "HS_WINDOW_LIMIT ", 0x0494 }, 2109209ff23fSmrg { "HS_WINDOW_OC_SPEED ", 0x0498 }, 2110209ff23fSmrg { "HTOTAL ", 0x0080 }, 2111209ff23fSmrg { "HW_DEBUG ", 0x0010 }, 2112209ff23fSmrg { "H_ACTIVE_WINDOW ", 0x05c0 }, 2113209ff23fSmrg { "H_SCALER_CONTROL ", 0x0600 }, 2114209ff23fSmrg { "H_VBI_WINDOW ", 0x05c8 }, 2115209ff23fSmrg { "I2C_CNTL ", 0x0054 }, 2116209ff23fSmrg { "I2C_CNTL_0 ", 0x0020 }, 2117209ff23fSmrg { "I2C_CNTL_1 ", 0x0024 }, 2118209ff23fSmrg { "I2C_DATA ", 0x0028 }, 2119209ff23fSmrg { "I2S_RECEIVE_CNTL ", 0x081c }, 2120209ff23fSmrg { "I2S_TRANSMIT_CNTL ", 0x0818 }, 2121209ff23fSmrg { "IIS_TX_CNT_REG ", 0x0824 }, 2122209ff23fSmrg { "INT_CNTL ", 0x002c }, 2123209ff23fSmrg { "L54_DTO_INCREMENTS ", 0x00f8 }, 2124209ff23fSmrg { "L54_PLL_CNTL ", 0x00f0 }, 2125209ff23fSmrg { "L54_PLL_FINE_CNTL ", 0x00f4 }, 2126209ff23fSmrg { "LINEAR_GAIN_SETTINGS ", 0x01e8 }, 2127209ff23fSmrg { "LP_AGC_CLAMP_CNTL0 ", 0x0500 }, 2128209ff23fSmrg { "LP_AGC_CLAMP_CNTL1 ", 0x0504 }, 2129209ff23fSmrg { "LP_BLACK_LEVEL ", 0x051c }, 2130209ff23fSmrg { "LP_BRIGHTNESS ", 0x0508 }, 2131209ff23fSmrg { "LP_CONTRAST ", 0x050c }, 2132209ff23fSmrg { "LP_SLICE_LEVEL ", 0x0520 }, 2133209ff23fSmrg { "LP_SLICE_LIMIT ", 0x0510 }, 2134209ff23fSmrg { "LP_SYNCTIP_LEVEL ", 0x0524 }, 2135209ff23fSmrg { "LP_VERT_LOCKOUT ", 0x0528 }, 2136209ff23fSmrg { "LP_WPA_CNTL0 ", 0x0514 }, 2137209ff23fSmrg { "LP_WPA_CNTL1 ", 0x0518 }, 2138209ff23fSmrg { "MASTER_CNTL ", 0x0040 }, 2139209ff23fSmrg { "MODULATOR_CNTL1 ", 0x0200 }, 2140209ff23fSmrg { "MODULATOR_CNTL2 ", 0x0204 }, 2141209ff23fSmrg { "MV_LEVEL_CNTL1 ", 0x0210 }, 2142209ff23fSmrg { "MV_LEVEL_CNTL2 ", 0x0214 }, 2143209ff23fSmrg { "MV_MODE_CNTL ", 0x0208 }, 2144209ff23fSmrg { "MV_STATUS ", 0x0330 }, 2145209ff23fSmrg { "MV_STRIPE_CNTL ", 0x020c }, 2146209ff23fSmrg { "NOISE_CNTL0 ", 0x0450 }, 2147209ff23fSmrg { "PLL_CNTL0 ", 0x00c8 }, 2148209ff23fSmrg { "PLL_CNTL1 ", 0x00fc }, 2149209ff23fSmrg { "PLL_TEST_CNTL ", 0x00cc }, 2150209ff23fSmrg { "PRE_DAC_MUX_CNTL ", 0x0240 }, 2151209ff23fSmrg { "RGB_CNTL ", 0x0048 }, 2152209ff23fSmrg { "RIPINTF_PORT_CNTL ", 0x003c }, 2153209ff23fSmrg { "SCALER_IN_WINDOW ", 0x0618 }, 2154209ff23fSmrg { "SCALER_OUT_WINDOW ", 0x061c }, 2155209ff23fSmrg { "SG_BLACK_GATE ", 0x04c0 }, 2156209ff23fSmrg { "SG_SYNCTIP_GATE ", 0x04c4 }, 2157209ff23fSmrg { "SG_UVGATE_GATE ", 0x04c8 }, 2158209ff23fSmrg { "SINGLE_STEP_DATA ", 0x05d8 }, 2159209ff23fSmrg { "SPDIF_AC3_PREAMBLE ", 0x0814 }, 2160209ff23fSmrg { "SPDIF_CHANNEL_STAT ", 0x0810 }, 2161209ff23fSmrg { "SPDIF_PORT_CNTL ", 0x080c }, 2162209ff23fSmrg { "SPDIF_TX_CNT_REG ", 0x0820 }, 2163209ff23fSmrg { "STANDARD_SELECT ", 0x0408 }, 2164209ff23fSmrg { "SW_SCRATCH ", 0x0014 }, 2165209ff23fSmrg { "SYNC_CNTL ", 0x0050 }, 2166209ff23fSmrg { "SYNC_LOCK_CNTL ", 0x0104 }, 2167209ff23fSmrg { "SYNC_SIZE ", 0x00b4 }, 2168209ff23fSmrg { "THERMO2BIN_STATUS ", 0x040c }, 2169209ff23fSmrg { "TIMING_CNTL ", 0x01c4 }, 2170209ff23fSmrg { "TVO_DATA_DELAY_A ", 0x0140 }, 2171209ff23fSmrg { "TVO_DATA_DELAY_B ", 0x0144 }, 2172209ff23fSmrg { "TVO_SYNC_PAT_ACCUM ", 0x0108 }, 2173209ff23fSmrg { "TVO_SYNC_PAT_EXPECT ", 0x0110 }, 2174209ff23fSmrg { "TVO_SYNC_THRESHOLD ", 0x010c }, 2175209ff23fSmrg { "TV_DAC_CNTL ", 0x0280 }, 2176209ff23fSmrg { "TV_DTO_INCREMENTS ", 0x0390 }, 2177209ff23fSmrg { "TV_PLL_CNTL ", 0x00c0 }, 2178209ff23fSmrg { "TV_PLL_FINE_CNTL ", 0x00b8 }, 2179209ff23fSmrg { "UPSAMP_AND_GAIN_CNTL ", 0x01e0 }, 2180209ff23fSmrg { "UPSAMP_COEFF0_0 ", 0x0340 }, 2181209ff23fSmrg { "UPSAMP_COEFF0_1 ", 0x0344 }, 2182209ff23fSmrg { "UPSAMP_COEFF0_2 ", 0x0348 }, 2183209ff23fSmrg { "UPSAMP_COEFF1_0 ", 0x034c }, 2184209ff23fSmrg { "UPSAMP_COEFF1_1 ", 0x0350 }, 2185209ff23fSmrg { "UPSAMP_COEFF1_2 ", 0x0354 }, 2186209ff23fSmrg { "UPSAMP_COEFF2_0 ", 0x0358 }, 2187209ff23fSmrg { "UPSAMP_COEFF2_1 ", 0x035c }, 2188209ff23fSmrg { "UPSAMP_COEFF2_2 ", 0x0360 }, 2189209ff23fSmrg { "UPSAMP_COEFF3_0 ", 0x0364 }, 2190209ff23fSmrg { "UPSAMP_COEFF3_1 ", 0x0368 }, 2191209ff23fSmrg { "UPSAMP_COEFF3_2 ", 0x036c }, 2192209ff23fSmrg { "UPSAMP_COEFF4_0 ", 0x0370 }, 2193209ff23fSmrg { "UPSAMP_COEFF4_1 ", 0x0374 }, 2194209ff23fSmrg { "UPSAMP_COEFF4_2 ", 0x0378 }, 2195209ff23fSmrg { "UV_ADR ", 0x0300 }, 2196209ff23fSmrg { "VBI_20BIT_CNTL ", 0x02d0 }, 2197209ff23fSmrg { "VBI_CC_CNTL ", 0x02c8 }, 2198209ff23fSmrg { "VBI_CONTROL ", 0x05d0 }, 2199209ff23fSmrg { "VBI_DTO_CNTL ", 0x02d4 }, 2200209ff23fSmrg { "VBI_EDS_CNTL ", 0x02cc }, 2201209ff23fSmrg { "VBI_LEVEL_CNTL ", 0x02d8 }, 2202209ff23fSmrg { "VBI_SCALER_CONTROL ", 0x060c }, 2203209ff23fSmrg { "VCOUNT ", 0x009c }, 2204209ff23fSmrg { "VDISP ", 0x0098 }, 2205209ff23fSmrg { "VFTOTAL ", 0x00a0 }, 2206209ff23fSmrg { "VIDEO_PORT_SIG ", 0x02c4 }, 2207209ff23fSmrg { "VIN_PLL_CNTL ", 0x00d4 }, 2208209ff23fSmrg { "VIN_PLL_FINE_CNTL ", 0x00d8 }, 2209209ff23fSmrg { "VIP_COMMAND_STATUS ", 0x0008 }, 2210209ff23fSmrg { "VIP_REVISION_ID ", 0x000c }, 2211209ff23fSmrg { "VIP_SUB_VENDOR_DEVICE_ID", 0x0004 }, 2212209ff23fSmrg { "VIP_VENDOR_DEVICE_ID ", 0x0000 }, 2213209ff23fSmrg { "VSCALER_CNTL1 ", 0x01c0 }, 2214209ff23fSmrg { "VSCALER_CNTL2 ", 0x01c8 }, 2215209ff23fSmrg { "VSYNC_DIFF_CNTL ", 0x03a0 }, 2216209ff23fSmrg { "VSYNC_DIFF_LIMITS ", 0x03a4 }, 2217209ff23fSmrg { "VSYNC_DIFF_RD_DATA ", 0x03a8 }, 2218209ff23fSmrg { "VS_BLANKING_CNTL ", 0x0544 }, 2219209ff23fSmrg { "VS_COUNTER_CNTL ", 0x054c }, 2220209ff23fSmrg { "VS_DETECTOR_CNTL ", 0x0540 }, 2221209ff23fSmrg { "VS_FIELD_ID_CNTL ", 0x0548 }, 2222209ff23fSmrg { "VS_FRAME_TOTAL ", 0x0550 }, 2223209ff23fSmrg { "VS_LINE_COUNT ", 0x0554 }, 2224209ff23fSmrg { "VTOTAL ", 0x0094 }, 2225209ff23fSmrg { "V_ACTIVE_WINDOW ", 0x05c4 }, 2226209ff23fSmrg { "V_DEINTERLACE_CONTROL ", 0x0608 }, 2227209ff23fSmrg { "V_SCALER_CONTROL ", 0x0604 }, 2228209ff23fSmrg { "V_VBI_WINDOW ", 0x05cc }, 2229209ff23fSmrg { "Y_FALL_CNTL ", 0x01cc }, 2230209ff23fSmrg { "Y_RISE_CNTL ", 0x01d0 }, 2231209ff23fSmrg { "Y_SAW_TOOTH_CNTL ", 0x01d4 }, 2232209ff23fSmrg {NULL, 0} 2233209ff23fSmrg }; 2234209ff23fSmrg 2235209ff23fSmrg for(i=0; rt_reg_list[i].name!=NULL;i++){ 2236209ff23fSmrg RT_regr(rt_reg_list[i].addr, &data); 223768105dcbSveego xf86DrvMsg(t->VIP->pScrn->scrnIndex, X_INFO, 2238209ff23fSmrg "register (0x%04lx) %s is equal to 0x%08x\n", 2239209ff23fSmrg rt_reg_list[i].addr, rt_reg_list[i].name, (unsigned)data); 2240209ff23fSmrg } 2241209ff23fSmrg 2242209ff23fSmrg} 2243209ff23fSmrg 2244209ff23fSmrg_X_EXPORT void ResetTheatreRegsForNoTVout(TheatrePtr t) 2245209ff23fSmrg{ 2246209ff23fSmrg RT_regw(VIP_CLKOUT_CNTL, 0x0); 2247209ff23fSmrg RT_regw(VIP_HCOUNT, 0x0); 2248209ff23fSmrg RT_regw(VIP_VCOUNT, 0x0); 2249209ff23fSmrg RT_regw(VIP_DFCOUNT, 0x0); 2250209ff23fSmrg #if 0 2251209ff23fSmrg RT_regw(VIP_CLOCK_SEL_CNTL, 0x2b7); /* versus 0x237 <-> 0x2b7 */ 2252209ff23fSmrg RT_regw(VIP_VIN_PLL_CNTL, 0x60a6039); 2253209ff23fSmrg #endif 2254209ff23fSmrg RT_regw(VIP_FRAME_LOCK_CNTL, 0x0); 2255209ff23fSmrg} 2256209ff23fSmrg 2257209ff23fSmrg 2258209ff23fSmrg_X_EXPORT void ResetTheatreRegsForTVout(TheatrePtr t) 2259209ff23fSmrg{ 2260209ff23fSmrg/* RT_regw(VIP_HW_DEBUG, 0x200); */ 2261209ff23fSmrg/* RT_regw(VIP_INT_CNTL, 0x0); 2262209ff23fSmrg RT_regw(VIP_GPIO_INOUT, 0x10090000); 2263209ff23fSmrg RT_regw(VIP_GPIO_INOUT, 0x340b0000); */ 2264209ff23fSmrg/* RT_regw(VIP_MASTER_CNTL, 0x6e8); */ 2265209ff23fSmrg RT_regw(VIP_CLKOUT_CNTL, 0x29); 2266209ff23fSmrg#if 1 2267209ff23fSmrg RT_regw(VIP_HCOUNT, 0x1d1); 2268209ff23fSmrg RT_regw(VIP_VCOUNT, 0x1e3); 2269209ff23fSmrg#else 2270209ff23fSmrg RT_regw(VIP_HCOUNT, 0x322); 2271209ff23fSmrg RT_regw(VIP_VCOUNT, 0x151); 2272209ff23fSmrg#endif 2273209ff23fSmrg RT_regw(VIP_DFCOUNT, 0x01); 2274209ff23fSmrg/* RT_regw(VIP_CLOCK_SEL_CNTL, 0xb7); versus 0x237 <-> 0x2b7 */ 2275209ff23fSmrg RT_regw(VIP_CLOCK_SEL_CNTL, 0x2b7); /* versus 0x237 <-> 0x2b7 */ 2276209ff23fSmrg RT_regw(VIP_VIN_PLL_CNTL, 0x60a6039); 2277209ff23fSmrg/* RT_regw(VIP_PLL_CNTL1, 0xacacac74); */ 2278209ff23fSmrg RT_regw(VIP_FRAME_LOCK_CNTL, 0x0f); 2279209ff23fSmrg/* RT_regw(VIP_ADC_CNTL, 0x02a420a8); 2280209ff23fSmrg RT_regw(VIP_COMB_CNTL_0, 0x0d438083); 2281209ff23fSmrg RT_regw(VIP_COMB_CNTL_2, 0x06080102); 2282209ff23fSmrg RT_regw(VIP_HS_MINMAXWIDTH, 0x462f); 2283209ff23fSmrg ... 2284209ff23fSmrg */ 2285209ff23fSmrg/* 2286209ff23fSmrg RT_regw(VIP_HS_PULSE_WIDTH, 0x359); 2287209ff23fSmrg RT_regw(VIP_HS_PLL_ERROR, 0xab6); 2288209ff23fSmrg RT_regw(VIP_HS_PLL_FS_PATH, 0x7fff08f8); 2289209ff23fSmrg RT_regw(VIP_VS_LINE_COUNT, 0x49b5e005); 2290209ff23fSmrg */ 2291209ff23fSmrg} 2292209ff23fSmrg 2293