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