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