xref: /linux/drivers/gpu/drm/radeon/radeon_legacy_tv.c (revision 8a922b7728a93d837954315c98b84f6b78de0c4f)
1 // SPDX-License-Identifier: MIT
2 
3 #include <drm/drm_device.h>
4 
5 #include "radeon.h"
6 
7 /*
8  * Integrated TV out support based on the GATOS code by
9  * Federico Ulivi <fulivi@lycos.com>
10  */
11 
12 
13 /*
14  * Limits of h/v positions (hPos & vPos)
15  */
16 #define MAX_H_POSITION 5 /* Range: [-5..5], negative is on the left, 0 is default, positive is on the right */
17 #define MAX_V_POSITION 5 /* Range: [-5..5], negative is up, 0 is default, positive is down */
18 
19 /*
20  * Unit for hPos (in TV clock periods)
21  */
22 #define H_POS_UNIT 10
23 
24 /*
25  * Indexes in h. code timing table for horizontal line position adjustment
26  */
27 #define H_TABLE_POS1 6
28 #define H_TABLE_POS2 8
29 
30 /*
31  * Limits of hor. size (hSize)
32  */
33 #define MAX_H_SIZE 5 /* Range: [-5..5], negative is smaller, positive is larger */
34 
35 /* tv standard constants */
36 #define NTSC_TV_CLOCK_T 233
37 #define NTSC_TV_VFTOTAL 1
38 #define NTSC_TV_LINES_PER_FRAME 525
39 #define NTSC_TV_ZERO_H_SIZE 479166
40 #define NTSC_TV_H_SIZE_UNIT 9478
41 
42 #define PAL_TV_CLOCK_T 188
43 #define PAL_TV_VFTOTAL 3
44 #define PAL_TV_LINES_PER_FRAME 625
45 #define PAL_TV_ZERO_H_SIZE 473200
46 #define PAL_TV_H_SIZE_UNIT 9360
47 
48 /* tv pll setting for 27 mhz ref clk */
49 #define NTSC_TV_PLL_M_27 22
50 #define NTSC_TV_PLL_N_27 175
51 #define NTSC_TV_PLL_P_27 5
52 
53 #define PAL_TV_PLL_M_27 113
54 #define PAL_TV_PLL_N_27 668
55 #define PAL_TV_PLL_P_27 3
56 
57 /* tv pll setting for 14 mhz ref clk */
58 #define NTSC_TV_PLL_M_14 33
59 #define NTSC_TV_PLL_N_14 693
60 #define NTSC_TV_PLL_P_14 7
61 
62 #define PAL_TV_PLL_M_14 19
63 #define PAL_TV_PLL_N_14 353
64 #define PAL_TV_PLL_P_14 5
65 
66 #define VERT_LEAD_IN_LINES 2
67 #define FRAC_BITS 0xe
68 #define FRAC_MASK 0x3fff
69 
70 struct radeon_tv_mode_constants {
71 	uint16_t hor_resolution;
72 	uint16_t ver_resolution;
73 	enum radeon_tv_std standard;
74 	uint16_t hor_total;
75 	uint16_t ver_total;
76 	uint16_t hor_start;
77 	uint16_t hor_syncstart;
78 	uint16_t ver_syncstart;
79 	unsigned def_restart;
80 	uint16_t crtcPLL_N;
81 	uint8_t  crtcPLL_M;
82 	uint8_t  crtcPLL_post_div;
83 	unsigned pix_to_tv;
84 };
85 
86 static const uint16_t hor_timing_NTSC[MAX_H_CODE_TIMING_LEN] = {
87 	0x0007,
88 	0x003f,
89 	0x0263,
90 	0x0a24,
91 	0x2a6b,
92 	0x0a36,
93 	0x126d, /* H_TABLE_POS1 */
94 	0x1bfe,
95 	0x1a8f, /* H_TABLE_POS2 */
96 	0x1ec7,
97 	0x3863,
98 	0x1bfe,
99 	0x1bfe,
100 	0x1a2a,
101 	0x1e95,
102 	0x0e31,
103 	0x201b,
104 	0
105 };
106 
107 static const uint16_t vert_timing_NTSC[MAX_V_CODE_TIMING_LEN] = {
108 	0x2001,
109 	0x200d,
110 	0x1006,
111 	0x0c06,
112 	0x1006,
113 	0x1818,
114 	0x21e3,
115 	0x1006,
116 	0x0c06,
117 	0x1006,
118 	0x1817,
119 	0x21d4,
120 	0x0002,
121 	0
122 };
123 
124 static const uint16_t hor_timing_PAL[MAX_H_CODE_TIMING_LEN] = {
125 	0x0007,
126 	0x0058,
127 	0x027c,
128 	0x0a31,
129 	0x2a77,
130 	0x0a95,
131 	0x124f, /* H_TABLE_POS1 */
132 	0x1bfe,
133 	0x1b22, /* H_TABLE_POS2 */
134 	0x1ef9,
135 	0x387c,
136 	0x1bfe,
137 	0x1bfe,
138 	0x1b31,
139 	0x1eb5,
140 	0x0e43,
141 	0x201b,
142 	0
143 };
144 
145 static const uint16_t vert_timing_PAL[MAX_V_CODE_TIMING_LEN] = {
146 	0x2001,
147 	0x200c,
148 	0x1005,
149 	0x0c05,
150 	0x1005,
151 	0x1401,
152 	0x1821,
153 	0x2240,
154 	0x1005,
155 	0x0c05,
156 	0x1005,
157 	0x1401,
158 	0x1822,
159 	0x2230,
160 	0x0002,
161 	0
162 };
163 
164 /**********************************************************************
165  *
166  * availableModes
167  *
168  * Table of all allowed modes for tv output
169  *
170  **********************************************************************/
171 static const struct radeon_tv_mode_constants available_tv_modes[] = {
172 	{   /* NTSC timing for 27 Mhz ref clk */
173 		800,                /* horResolution */
174 		600,                /* verResolution */
175 		TV_STD_NTSC,        /* standard */
176 		990,                /* horTotal */
177 		740,                /* verTotal */
178 		813,                /* horStart */
179 		824,                /* horSyncStart */
180 		632,                /* verSyncStart */
181 		625592,             /* defRestart */
182 		592,                /* crtcPLL_N */
183 		91,                 /* crtcPLL_M */
184 		4,                  /* crtcPLL_postDiv */
185 		1022,               /* pixToTV */
186 	},
187 	{   /* PAL timing for 27 Mhz ref clk */
188 		800,               /* horResolution */
189 		600,               /* verResolution */
190 		TV_STD_PAL,        /* standard */
191 		1144,              /* horTotal */
192 		706,               /* verTotal */
193 		812,               /* horStart */
194 		824,               /* horSyncStart */
195 		669,               /* verSyncStart */
196 		696700,            /* defRestart */
197 		1382,              /* crtcPLL_N */
198 		231,               /* crtcPLL_M */
199 		4,                 /* crtcPLL_postDiv */
200 		759,               /* pixToTV */
201 	},
202 	{   /* NTSC timing for 14 Mhz ref clk */
203 		800,                /* horResolution */
204 		600,                /* verResolution */
205 		TV_STD_NTSC,        /* standard */
206 		1018,               /* horTotal */
207 		727,                /* verTotal */
208 		813,                /* horStart */
209 		840,                /* horSyncStart */
210 		633,                /* verSyncStart */
211 		630627,             /* defRestart */
212 		347,                /* crtcPLL_N */
213 		14,                 /* crtcPLL_M */
214 		8,                  /* crtcPLL_postDiv */
215 		1022,               /* pixToTV */
216 	},
217 	{ /* PAL timing for 14 Mhz ref clk */
218 		800,                /* horResolution */
219 		600,                /* verResolution */
220 		TV_STD_PAL,         /* standard */
221 		1131,               /* horTotal */
222 		742,                /* verTotal */
223 		813,                /* horStart */
224 		840,                /* horSyncStart */
225 		633,                /* verSyncStart */
226 		708369,             /* defRestart */
227 		211,                /* crtcPLL_N */
228 		9,                  /* crtcPLL_M */
229 		8,                  /* crtcPLL_postDiv */
230 		759,                /* pixToTV */
231 	},
232 };
233 
234 #define N_AVAILABLE_MODES ARRAY_SIZE(available_tv_modes)
235 
236 static const struct radeon_tv_mode_constants *radeon_legacy_tv_get_std_mode(struct radeon_encoder *radeon_encoder,
237 									    uint16_t *pll_ref_freq)
238 {
239 	struct drm_device *dev = radeon_encoder->base.dev;
240 	struct radeon_device *rdev = dev->dev_private;
241 	struct radeon_crtc *radeon_crtc;
242 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
243 	const struct radeon_tv_mode_constants *const_ptr;
244 	struct radeon_pll *pll;
245 
246 	radeon_crtc = to_radeon_crtc(radeon_encoder->base.crtc);
247 	if (radeon_crtc->crtc_id == 1)
248 		pll = &rdev->clock.p2pll;
249 	else
250 		pll = &rdev->clock.p1pll;
251 
252 	if (pll_ref_freq)
253 		*pll_ref_freq = pll->reference_freq;
254 
255 	if (tv_dac->tv_std == TV_STD_NTSC ||
256 	    tv_dac->tv_std == TV_STD_NTSC_J ||
257 	    tv_dac->tv_std == TV_STD_PAL_M) {
258 		if (pll->reference_freq == 2700)
259 			const_ptr = &available_tv_modes[0];
260 		else
261 			const_ptr = &available_tv_modes[2];
262 	} else {
263 		if (pll->reference_freq == 2700)
264 			const_ptr = &available_tv_modes[1];
265 		else
266 			const_ptr = &available_tv_modes[3];
267 	}
268 	return const_ptr;
269 }
270 
271 static long YCOEF_value[5] = { 2, 2, 0, 4, 0 };
272 static long YCOEF_EN_value[5] = { 1, 1, 0, 1, 0 };
273 static long SLOPE_value[5] = { 1, 2, 2, 4, 8 };
274 static long SLOPE_limit[5] = { 6, 5, 4, 3, 2 };
275 
276 static void radeon_wait_pll_lock(struct drm_encoder *encoder, unsigned n_tests,
277 				 unsigned n_wait_loops, unsigned cnt_threshold)
278 {
279 	struct drm_device *dev = encoder->dev;
280 	struct radeon_device *rdev = dev->dev_private;
281 	uint32_t save_pll_test;
282 	unsigned int i, j;
283 
284 	WREG32(RADEON_TEST_DEBUG_MUX, (RREG32(RADEON_TEST_DEBUG_MUX) & 0xffff60ff) | 0x100);
285 	save_pll_test = RREG32_PLL(RADEON_PLL_TEST_CNTL);
286 	WREG32_PLL(RADEON_PLL_TEST_CNTL, save_pll_test & ~RADEON_PLL_MASK_READ_B);
287 
288 	WREG8(RADEON_CLOCK_CNTL_INDEX, RADEON_PLL_TEST_CNTL);
289 	for (i = 0; i < n_tests; i++) {
290 		WREG8(RADEON_CLOCK_CNTL_DATA + 3, 0);
291 		for (j = 0; j < n_wait_loops; j++)
292 			if (RREG8(RADEON_CLOCK_CNTL_DATA + 3) >= cnt_threshold)
293 				break;
294 	}
295 	WREG32_PLL(RADEON_PLL_TEST_CNTL, save_pll_test);
296 	WREG32(RADEON_TEST_DEBUG_MUX, RREG32(RADEON_TEST_DEBUG_MUX) & 0xffffe0ff);
297 }
298 
299 
300 static void radeon_legacy_tv_write_fifo(struct radeon_encoder *radeon_encoder,
301 					uint16_t addr, uint32_t value)
302 {
303 	struct drm_device *dev = radeon_encoder->base.dev;
304 	struct radeon_device *rdev = dev->dev_private;
305 	uint32_t tmp;
306 	int i = 0;
307 
308 	WREG32(RADEON_TV_HOST_WRITE_DATA, value);
309 
310 	WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
311 	WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_WT);
312 
313 	do {
314 		tmp = RREG32(RADEON_TV_HOST_RD_WT_CNTL);
315 		if ((tmp & RADEON_HOST_FIFO_WT_ACK) == 0)
316 			break;
317 		i++;
318 	} while (i < 10000);
319 	WREG32(RADEON_TV_HOST_RD_WT_CNTL, 0);
320 }
321 
322 #if 0 /* included for completeness */
323 static uint32_t radeon_legacy_tv_read_fifo(struct radeon_encoder *radeon_encoder, uint16_t addr)
324 {
325 	struct drm_device *dev = radeon_encoder->base.dev;
326 	struct radeon_device *rdev = dev->dev_private;
327 	uint32_t tmp;
328 	int i = 0;
329 
330 	WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
331 	WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_RD);
332 
333 	do {
334 		tmp = RREG32(RADEON_TV_HOST_RD_WT_CNTL);
335 		if ((tmp & RADEON_HOST_FIFO_RD_ACK) == 0)
336 			break;
337 		i++;
338 	} while (i < 10000);
339 	WREG32(RADEON_TV_HOST_RD_WT_CNTL, 0);
340 	return RREG32(RADEON_TV_HOST_READ_DATA);
341 }
342 #endif
343 
344 static uint16_t radeon_get_htiming_tables_addr(uint32_t tv_uv_adr)
345 {
346 	uint16_t h_table;
347 
348 	switch ((tv_uv_adr & RADEON_HCODE_TABLE_SEL_MASK) >> RADEON_HCODE_TABLE_SEL_SHIFT) {
349 	case 0:
350 		h_table = RADEON_TV_MAX_FIFO_ADDR_INTERNAL;
351 		break;
352 	case 1:
353 		h_table = ((tv_uv_adr & RADEON_TABLE1_BOT_ADR_MASK) >> RADEON_TABLE1_BOT_ADR_SHIFT) * 2;
354 		break;
355 	case 2:
356 		h_table = ((tv_uv_adr & RADEON_TABLE3_TOP_ADR_MASK) >> RADEON_TABLE3_TOP_ADR_SHIFT) * 2;
357 		break;
358 	default:
359 		h_table = 0;
360 		break;
361 	}
362 	return h_table;
363 }
364 
365 static uint16_t radeon_get_vtiming_tables_addr(uint32_t tv_uv_adr)
366 {
367 	uint16_t v_table;
368 
369 	switch ((tv_uv_adr & RADEON_VCODE_TABLE_SEL_MASK) >> RADEON_VCODE_TABLE_SEL_SHIFT) {
370 	case 0:
371 		v_table = ((tv_uv_adr & RADEON_MAX_UV_ADR_MASK) >> RADEON_MAX_UV_ADR_SHIFT) * 2 + 1;
372 		break;
373 	case 1:
374 		v_table = ((tv_uv_adr & RADEON_TABLE1_BOT_ADR_MASK) >> RADEON_TABLE1_BOT_ADR_SHIFT) * 2 + 1;
375 		break;
376 	case 2:
377 		v_table = ((tv_uv_adr & RADEON_TABLE3_TOP_ADR_MASK) >> RADEON_TABLE3_TOP_ADR_SHIFT) * 2 + 1;
378 		break;
379 	default:
380 		v_table = 0;
381 		break;
382 	}
383 	return v_table;
384 }
385 
386 static void radeon_restore_tv_timing_tables(struct radeon_encoder *radeon_encoder)
387 {
388 	struct drm_device *dev = radeon_encoder->base.dev;
389 	struct radeon_device *rdev = dev->dev_private;
390 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
391 	uint16_t h_table, v_table;
392 	uint32_t tmp;
393 	int i;
394 
395 	WREG32(RADEON_TV_UV_ADR, tv_dac->tv.tv_uv_adr);
396 	h_table = radeon_get_htiming_tables_addr(tv_dac->tv.tv_uv_adr);
397 	v_table = radeon_get_vtiming_tables_addr(tv_dac->tv.tv_uv_adr);
398 
399 	for (i = 0; i < MAX_H_CODE_TIMING_LEN; i += 2, h_table--) {
400 		tmp = ((uint32_t)tv_dac->tv.h_code_timing[i] << 14) | ((uint32_t)tv_dac->tv.h_code_timing[i+1]);
401 		radeon_legacy_tv_write_fifo(radeon_encoder, h_table, tmp);
402 		if (tv_dac->tv.h_code_timing[i] == 0 || tv_dac->tv.h_code_timing[i + 1] == 0)
403 			break;
404 	}
405 	for (i = 0; i < MAX_V_CODE_TIMING_LEN; i += 2, v_table++) {
406 		tmp = ((uint32_t)tv_dac->tv.v_code_timing[i+1] << 14) | ((uint32_t)tv_dac->tv.v_code_timing[i]);
407 		radeon_legacy_tv_write_fifo(radeon_encoder, v_table, tmp);
408 		if (tv_dac->tv.v_code_timing[i] == 0 || tv_dac->tv.v_code_timing[i + 1] == 0)
409 			break;
410 	}
411 }
412 
413 static void radeon_legacy_write_tv_restarts(struct radeon_encoder *radeon_encoder)
414 {
415 	struct drm_device *dev = radeon_encoder->base.dev;
416 	struct radeon_device *rdev = dev->dev_private;
417 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
418 	WREG32(RADEON_TV_FRESTART, tv_dac->tv.frestart);
419 	WREG32(RADEON_TV_HRESTART, tv_dac->tv.hrestart);
420 	WREG32(RADEON_TV_VRESTART, tv_dac->tv.vrestart);
421 }
422 
423 static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)
424 {
425 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
426 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
427 	int restart;
428 	unsigned int h_total, v_total, f_total;
429 	int v_offset, h_offset;
430 	u16 p1, p2, h_inc;
431 	bool h_changed;
432 	const struct radeon_tv_mode_constants *const_ptr;
433 
434 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
435 	if (!const_ptr)
436 		return false;
437 
438 	h_total = const_ptr->hor_total;
439 	v_total = const_ptr->ver_total;
440 
441 	if (tv_dac->tv_std == TV_STD_NTSC ||
442 	    tv_dac->tv_std == TV_STD_NTSC_J ||
443 	    tv_dac->tv_std == TV_STD_PAL_M ||
444 	    tv_dac->tv_std == TV_STD_PAL_60)
445 		f_total = NTSC_TV_VFTOTAL + 1;
446 	else
447 		f_total = PAL_TV_VFTOTAL + 1;
448 
449 	/* adjust positions 1&2 in hor. cod timing table */
450 	h_offset = tv_dac->h_pos * H_POS_UNIT;
451 
452 	if (tv_dac->tv_std == TV_STD_NTSC ||
453 	    tv_dac->tv_std == TV_STD_NTSC_J ||
454 	    tv_dac->tv_std == TV_STD_PAL_M) {
455 		h_offset -= 50;
456 		p1 = hor_timing_NTSC[H_TABLE_POS1];
457 		p2 = hor_timing_NTSC[H_TABLE_POS2];
458 	} else {
459 		p1 = hor_timing_PAL[H_TABLE_POS1];
460 		p2 = hor_timing_PAL[H_TABLE_POS2];
461 	}
462 
463 	p1 = (u16)((int)p1 + h_offset);
464 	p2 = (u16)((int)p2 - h_offset);
465 
466 	h_changed = (p1 != tv_dac->tv.h_code_timing[H_TABLE_POS1] ||
467 		     p2 != tv_dac->tv.h_code_timing[H_TABLE_POS2]);
468 
469 	tv_dac->tv.h_code_timing[H_TABLE_POS1] = p1;
470 	tv_dac->tv.h_code_timing[H_TABLE_POS2] = p2;
471 
472 	/* Convert hOffset from n. of TV clock periods to n. of CRTC clock periods (CRTC pixels) */
473 	h_offset = (h_offset * (int)(const_ptr->pix_to_tv)) / 1000;
474 
475 	/* adjust restart */
476 	restart = const_ptr->def_restart;
477 
478 	/*
479 	 * convert v_pos TV lines to n. of CRTC pixels
480 	 */
481 	if (tv_dac->tv_std == TV_STD_NTSC ||
482 	    tv_dac->tv_std == TV_STD_NTSC_J ||
483 	    tv_dac->tv_std == TV_STD_PAL_M ||
484 	    tv_dac->tv_std == TV_STD_PAL_60)
485 		v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(NTSC_TV_LINES_PER_FRAME);
486 	else
487 		v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(PAL_TV_LINES_PER_FRAME);
488 
489 	restart -= v_offset + h_offset;
490 
491 	DRM_DEBUG_KMS("compute_restarts: def = %u h = %d v = %d, p1 = %04x, p2 = %04x, restart = %d\n",
492 		  const_ptr->def_restart, tv_dac->h_pos, tv_dac->v_pos, p1, p2, restart);
493 
494 	tv_dac->tv.hrestart = restart % h_total;
495 	restart /= h_total;
496 	tv_dac->tv.vrestart = restart % v_total;
497 	restart /= v_total;
498 	tv_dac->tv.frestart = restart % f_total;
499 
500 	DRM_DEBUG_KMS("compute_restart: F/H/V=%u,%u,%u\n",
501 		  (unsigned)tv_dac->tv.frestart,
502 		  (unsigned)tv_dac->tv.vrestart,
503 		  (unsigned)tv_dac->tv.hrestart);
504 
505 	/* compute h_inc from hsize */
506 	if (tv_dac->tv_std == TV_STD_NTSC ||
507 	    tv_dac->tv_std == TV_STD_NTSC_J ||
508 	    tv_dac->tv_std == TV_STD_PAL_M)
509 		h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * NTSC_TV_CLOCK_T) /
510 			      (tv_dac->h_size * (int)(NTSC_TV_H_SIZE_UNIT) + (int)(NTSC_TV_ZERO_H_SIZE)));
511 	else
512 		h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * PAL_TV_CLOCK_T) /
513 			      (tv_dac->h_size * (int)(PAL_TV_H_SIZE_UNIT) + (int)(PAL_TV_ZERO_H_SIZE)));
514 
515 	tv_dac->tv.timing_cntl = (tv_dac->tv.timing_cntl & ~RADEON_H_INC_MASK) |
516 		((u32)h_inc << RADEON_H_INC_SHIFT);
517 
518 	DRM_DEBUG_KMS("compute_restart: h_size = %d h_inc = %d\n", tv_dac->h_size, h_inc);
519 
520 	return h_changed;
521 }
522 
523 void radeon_legacy_tv_mode_set(struct drm_encoder *encoder,
524 			       struct drm_display_mode *mode,
525 			       struct drm_display_mode *adjusted_mode)
526 {
527 	struct drm_device *dev = encoder->dev;
528 	struct radeon_device *rdev = dev->dev_private;
529 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
530 	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
531 	const struct radeon_tv_mode_constants *const_ptr;
532 	struct radeon_crtc *radeon_crtc;
533 	int i;
534 	uint16_t pll_ref_freq;
535 	uint32_t vert_space, flicker_removal, tmp;
536 	uint32_t tv_master_cntl, tv_rgb_cntl, tv_dac_cntl;
537 	uint32_t tv_modulator_cntl1, tv_modulator_cntl2;
538 	uint32_t tv_vscaler_cntl1, tv_vscaler_cntl2;
539 	uint32_t tv_pll_cntl, tv_ftotal;
540 	uint32_t tv_y_fall_cntl, tv_y_rise_cntl, tv_y_saw_tooth_cntl;
541 	uint32_t m, n, p;
542 	const uint16_t *hor_timing;
543 	const uint16_t *vert_timing;
544 
545 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, &pll_ref_freq);
546 	if (!const_ptr)
547 		return;
548 
549 	radeon_crtc = to_radeon_crtc(encoder->crtc);
550 
551 	tv_master_cntl = (RADEON_VIN_ASYNC_RST |
552 			  RADEON_CRT_FIFO_CE_EN |
553 			  RADEON_TV_FIFO_CE_EN |
554 			  RADEON_TV_ON);
555 
556 	if (!ASIC_IS_R300(rdev))
557 		tv_master_cntl |= RADEON_TVCLK_ALWAYS_ONb;
558 
559 	if (tv_dac->tv_std == TV_STD_NTSC ||
560 	    tv_dac->tv_std == TV_STD_NTSC_J)
561 		tv_master_cntl |= RADEON_RESTART_PHASE_FIX;
562 
563 	tv_modulator_cntl1 = (RADEON_SLEW_RATE_LIMIT |
564 			      RADEON_SYNC_TIP_LEVEL |
565 			      RADEON_YFLT_EN |
566 			      RADEON_UVFLT_EN |
567 			      (6 << RADEON_CY_FILT_BLEND_SHIFT));
568 
569 	if (tv_dac->tv_std == TV_STD_NTSC ||
570 	    tv_dac->tv_std == TV_STD_NTSC_J) {
571 		tv_modulator_cntl1 |= (0x46 << RADEON_SET_UP_LEVEL_SHIFT) |
572 			(0x3b << RADEON_BLANK_LEVEL_SHIFT);
573 		tv_modulator_cntl2 = (-111 & RADEON_TV_U_BURST_LEVEL_MASK) |
574 			((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
575 	} else if (tv_dac->tv_std == TV_STD_SCART_PAL) {
576 		tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN;
577 		tv_modulator_cntl2 = (0 & RADEON_TV_U_BURST_LEVEL_MASK) |
578 			((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
579 	} else {
580 		tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN |
581 			(0x3b << RADEON_SET_UP_LEVEL_SHIFT) |
582 			(0x3b << RADEON_BLANK_LEVEL_SHIFT);
583 		tv_modulator_cntl2 = (-78 & RADEON_TV_U_BURST_LEVEL_MASK) |
584 			((62 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
585 	}
586 
587 
588 	tv_rgb_cntl = (RADEON_RGB_DITHER_EN
589 		       | RADEON_TVOUT_SCALE_EN
590 		       | (0x0b << RADEON_UVRAM_READ_MARGIN_SHIFT)
591 		       | (0x07 << RADEON_FIFORAM_FFMACRO_READ_MARGIN_SHIFT)
592 		       | RADEON_RGB_ATTEN_SEL(0x3)
593 		       | RADEON_RGB_ATTEN_VAL(0xc));
594 
595 	if (radeon_crtc->crtc_id == 1)
596 		tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC2;
597 	else {
598 		if (radeon_crtc->rmx_type != RMX_OFF)
599 			tv_rgb_cntl |= RADEON_RGB_SRC_SEL_RMX;
600 		else
601 			tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC1;
602 	}
603 
604 	if (tv_dac->tv_std == TV_STD_NTSC ||
605 	    tv_dac->tv_std == TV_STD_NTSC_J ||
606 	    tv_dac->tv_std == TV_STD_PAL_M ||
607 	    tv_dac->tv_std == TV_STD_PAL_60)
608 		vert_space = const_ptr->ver_total * 2 * 10000 / NTSC_TV_LINES_PER_FRAME;
609 	else
610 		vert_space = const_ptr->ver_total * 2 * 10000 / PAL_TV_LINES_PER_FRAME;
611 
612 	tmp = RREG32(RADEON_TV_VSCALER_CNTL1);
613 	tmp &= 0xe3ff0000;
614 	tmp |= (vert_space * (1 << FRAC_BITS) / 10000);
615 	tv_vscaler_cntl1 = tmp;
616 
617 	if (pll_ref_freq == 2700)
618 		tv_vscaler_cntl1 |= RADEON_RESTART_FIELD;
619 
620 	if (const_ptr->hor_resolution == 1024)
621 		tv_vscaler_cntl1 |= (4 << RADEON_Y_DEL_W_SIG_SHIFT);
622 	else
623 		tv_vscaler_cntl1 |= (2 << RADEON_Y_DEL_W_SIG_SHIFT);
624 
625 	/* scale up for int divide */
626 	tmp = const_ptr->ver_total * 2 * 1000;
627 	if (tv_dac->tv_std == TV_STD_NTSC ||
628 	    tv_dac->tv_std == TV_STD_NTSC_J ||
629 	    tv_dac->tv_std == TV_STD_PAL_M ||
630 	    tv_dac->tv_std == TV_STD_PAL_60) {
631 		tmp /= NTSC_TV_LINES_PER_FRAME;
632 	} else {
633 		tmp /= PAL_TV_LINES_PER_FRAME;
634 	}
635 	flicker_removal = (tmp + 500) / 1000;
636 
637 	if (flicker_removal < 3)
638 		flicker_removal = 3;
639 	for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) {
640 		if (flicker_removal == SLOPE_limit[i])
641 			break;
642 	}
643 
644 	tv_y_saw_tooth_cntl = (vert_space * SLOPE_value[i] * (1 << (FRAC_BITS - 1)) +
645 				5001) / 10000 / 8 | ((SLOPE_value[i] *
646 				(1 << (FRAC_BITS - 1)) / 8) << 16);
647 	tv_y_fall_cntl =
648 		(YCOEF_EN_value[i] << 17) | ((YCOEF_value[i] * (1 << 8) / 8) << 24) |
649 		RADEON_Y_FALL_PING_PONG | (272 * SLOPE_value[i] / 8) * (1 << (FRAC_BITS - 1)) /
650 		1024;
651 	tv_y_rise_cntl = RADEON_Y_RISE_PING_PONG|
652 		(flicker_removal * 1024 - 272) * SLOPE_value[i] / 8 * (1 << (FRAC_BITS - 1)) / 1024;
653 
654 	tv_vscaler_cntl2 = RREG32(RADEON_TV_VSCALER_CNTL2) & 0x00fffff0;
655 	tv_vscaler_cntl2 |= (0x10 << 24) |
656 		RADEON_DITHER_MODE |
657 		RADEON_Y_OUTPUT_DITHER_EN |
658 		RADEON_UV_OUTPUT_DITHER_EN |
659 		RADEON_UV_TO_BUF_DITHER_EN;
660 
661 	tmp = (tv_vscaler_cntl1 >> RADEON_UV_INC_SHIFT) & RADEON_UV_INC_MASK;
662 	tmp = ((16384 * 256 * 10) / tmp + 5) / 10;
663 	tmp = (tmp << RADEON_UV_OUTPUT_POST_SCALE_SHIFT) | 0x000b0000;
664 	tv_dac->tv.timing_cntl = tmp;
665 
666 	if (tv_dac->tv_std == TV_STD_NTSC ||
667 	    tv_dac->tv_std == TV_STD_NTSC_J ||
668 	    tv_dac->tv_std == TV_STD_PAL_M ||
669 	    tv_dac->tv_std == TV_STD_PAL_60)
670 		tv_dac_cntl = tv_dac->ntsc_tvdac_adj;
671 	else
672 		tv_dac_cntl = tv_dac->pal_tvdac_adj;
673 
674 	tv_dac_cntl |= RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD;
675 
676 	if (tv_dac->tv_std == TV_STD_NTSC ||
677 	    tv_dac->tv_std == TV_STD_NTSC_J)
678 		tv_dac_cntl |= RADEON_TV_DAC_STD_NTSC;
679 	else
680 		tv_dac_cntl |= RADEON_TV_DAC_STD_PAL;
681 
682 	if (tv_dac->tv_std == TV_STD_NTSC ||
683 	    tv_dac->tv_std == TV_STD_NTSC_J) {
684 		if (pll_ref_freq == 2700) {
685 			m = NTSC_TV_PLL_M_27;
686 			n = NTSC_TV_PLL_N_27;
687 			p = NTSC_TV_PLL_P_27;
688 		} else {
689 			m = NTSC_TV_PLL_M_14;
690 			n = NTSC_TV_PLL_N_14;
691 			p = NTSC_TV_PLL_P_14;
692 		}
693 	} else {
694 		if (pll_ref_freq == 2700) {
695 			m = PAL_TV_PLL_M_27;
696 			n = PAL_TV_PLL_N_27;
697 			p = PAL_TV_PLL_P_27;
698 		} else {
699 			m = PAL_TV_PLL_M_14;
700 			n = PAL_TV_PLL_N_14;
701 			p = PAL_TV_PLL_P_14;
702 		}
703 	}
704 
705 	tv_pll_cntl = (m & RADEON_TV_M0LO_MASK) |
706 		(((m >> 8) & RADEON_TV_M0HI_MASK) << RADEON_TV_M0HI_SHIFT) |
707 		((n & RADEON_TV_N0LO_MASK) << RADEON_TV_N0LO_SHIFT) |
708 		(((n >> 9) & RADEON_TV_N0HI_MASK) << RADEON_TV_N0HI_SHIFT) |
709 		((p & RADEON_TV_P_MASK) << RADEON_TV_P_SHIFT);
710 
711 	tv_dac->tv.tv_uv_adr = 0xc8;
712 
713 	if (tv_dac->tv_std == TV_STD_NTSC ||
714 	    tv_dac->tv_std == TV_STD_NTSC_J ||
715 	    tv_dac->tv_std == TV_STD_PAL_M ||
716 	    tv_dac->tv_std == TV_STD_PAL_60) {
717 		tv_ftotal = NTSC_TV_VFTOTAL;
718 		hor_timing = hor_timing_NTSC;
719 		vert_timing = vert_timing_NTSC;
720 	} else {
721 		hor_timing = hor_timing_PAL;
722 		vert_timing = vert_timing_PAL;
723 		tv_ftotal = PAL_TV_VFTOTAL;
724 	}
725 
726 	for (i = 0; i < MAX_H_CODE_TIMING_LEN; i++) {
727 		if ((tv_dac->tv.h_code_timing[i] = hor_timing[i]) == 0)
728 			break;
729 	}
730 
731 	for (i = 0; i < MAX_V_CODE_TIMING_LEN; i++) {
732 		if ((tv_dac->tv.v_code_timing[i] = vert_timing[i]) == 0)
733 			break;
734 	}
735 
736 	radeon_legacy_tv_init_restarts(encoder);
737 
738 	/* play with DAC_CNTL */
739 	/* play with GPIOPAD_A */
740 	/* DISP_OUTPUT_CNTL */
741 	/* use reference freq */
742 
743 	/* program the TV registers */
744 	WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
745 				       RADEON_CRT_ASYNC_RST | RADEON_TV_FIFO_ASYNC_RST));
746 
747 	tmp = RREG32(RADEON_TV_DAC_CNTL);
748 	tmp &= ~RADEON_TV_DAC_NBLANK;
749 	tmp |= RADEON_TV_DAC_BGSLEEP |
750 		RADEON_TV_DAC_RDACPD |
751 		RADEON_TV_DAC_GDACPD |
752 		RADEON_TV_DAC_BDACPD;
753 	WREG32(RADEON_TV_DAC_CNTL, tmp);
754 
755 	/* TV PLL */
756 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVCLK_SRC_SEL_TVPLL);
757 	WREG32_PLL(RADEON_TV_PLL_CNTL, tv_pll_cntl);
758 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVPLL_RESET, ~RADEON_TVPLL_RESET);
759 
760 	radeon_wait_pll_lock(encoder, 200, 800, 135);
761 
762 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_RESET);
763 
764 	radeon_wait_pll_lock(encoder, 300, 160, 27);
765 	radeon_wait_pll_lock(encoder, 200, 800, 135);
766 
767 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~0xf);
768 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVCLK_SRC_SEL_TVPLL, ~RADEON_TVCLK_SRC_SEL_TVPLL);
769 
770 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, (1 << RADEON_TVPDC_SHIFT), ~RADEON_TVPDC_MASK);
771 	WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_SLEEP);
772 
773 	/* TV HV */
774 	WREG32(RADEON_TV_RGB_CNTL, tv_rgb_cntl);
775 	WREG32(RADEON_TV_HTOTAL, const_ptr->hor_total - 1);
776 	WREG32(RADEON_TV_HDISP, const_ptr->hor_resolution - 1);
777 	WREG32(RADEON_TV_HSTART, const_ptr->hor_start);
778 
779 	WREG32(RADEON_TV_VTOTAL, const_ptr->ver_total - 1);
780 	WREG32(RADEON_TV_VDISP, const_ptr->ver_resolution - 1);
781 	WREG32(RADEON_TV_FTOTAL, tv_ftotal);
782 	WREG32(RADEON_TV_VSCALER_CNTL1, tv_vscaler_cntl1);
783 	WREG32(RADEON_TV_VSCALER_CNTL2, tv_vscaler_cntl2);
784 
785 	WREG32(RADEON_TV_Y_FALL_CNTL, tv_y_fall_cntl);
786 	WREG32(RADEON_TV_Y_RISE_CNTL, tv_y_rise_cntl);
787 	WREG32(RADEON_TV_Y_SAW_TOOTH_CNTL, tv_y_saw_tooth_cntl);
788 
789 	WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
790 				       RADEON_CRT_ASYNC_RST));
791 
792 	/* TV restarts */
793 	radeon_legacy_write_tv_restarts(radeon_encoder);
794 
795 	/* tv timings */
796 	radeon_restore_tv_timing_tables(radeon_encoder);
797 
798 	WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST));
799 
800 	/* tv std */
801 	WREG32(RADEON_TV_SYNC_CNTL, (RADEON_SYNC_PUB | RADEON_TV_SYNC_IO_DRIVE));
802 	WREG32(RADEON_TV_TIMING_CNTL, tv_dac->tv.timing_cntl);
803 	WREG32(RADEON_TV_MODULATOR_CNTL1, tv_modulator_cntl1);
804 	WREG32(RADEON_TV_MODULATOR_CNTL2, tv_modulator_cntl2);
805 	WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, (RADEON_Y_RED_EN |
806 					    RADEON_C_GRN_EN |
807 					    RADEON_CMP_BLU_EN |
808 					    RADEON_DAC_DITHER_EN));
809 
810 	WREG32(RADEON_TV_CRC_CNTL, 0);
811 
812 	WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
813 
814 	WREG32(RADEON_TV_GAIN_LIMIT_SETTINGS, ((0x17f << RADEON_UV_GAIN_LIMIT_SHIFT) |
815 					       (0x5ff << RADEON_Y_GAIN_LIMIT_SHIFT)));
816 	WREG32(RADEON_TV_LINEAR_GAIN_SETTINGS, ((0x100 << RADEON_UV_GAIN_SHIFT) |
817 						(0x100 << RADEON_Y_GAIN_SHIFT)));
818 
819 	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
820 
821 }
822 
823 void radeon_legacy_tv_adjust_crtc_reg(struct drm_encoder *encoder,
824 				      uint32_t *h_total_disp, uint32_t *h_sync_strt_wid,
825 				      uint32_t *v_total_disp, uint32_t *v_sync_strt_wid)
826 {
827 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
828 	const struct radeon_tv_mode_constants *const_ptr;
829 	uint32_t tmp;
830 
831 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
832 	if (!const_ptr)
833 		return;
834 
835 	*h_total_disp = (((const_ptr->hor_resolution / 8) - 1) << RADEON_CRTC_H_DISP_SHIFT) |
836 		(((const_ptr->hor_total / 8) - 1) << RADEON_CRTC_H_TOTAL_SHIFT);
837 
838 	tmp = *h_sync_strt_wid;
839 	tmp &= ~(RADEON_CRTC_H_SYNC_STRT_PIX | RADEON_CRTC_H_SYNC_STRT_CHAR);
840 	tmp |= (((const_ptr->hor_syncstart / 8) - 1) << RADEON_CRTC_H_SYNC_STRT_CHAR_SHIFT) |
841 		(const_ptr->hor_syncstart & 7);
842 	*h_sync_strt_wid = tmp;
843 
844 	*v_total_disp = ((const_ptr->ver_resolution - 1) << RADEON_CRTC_V_DISP_SHIFT) |
845 		((const_ptr->ver_total - 1) << RADEON_CRTC_V_TOTAL_SHIFT);
846 
847 	tmp = *v_sync_strt_wid;
848 	tmp &= ~RADEON_CRTC_V_SYNC_STRT;
849 	tmp |= ((const_ptr->ver_syncstart - 1) << RADEON_CRTC_V_SYNC_STRT_SHIFT);
850 	*v_sync_strt_wid = tmp;
851 }
852 
853 static int get_post_div(int value)
854 {
855 	int post_div;
856 	switch (value) {
857 	case 1: post_div = 0; break;
858 	case 2: post_div = 1; break;
859 	case 3: post_div = 4; break;
860 	case 4: post_div = 2; break;
861 	case 6: post_div = 6; break;
862 	case 8: post_div = 3; break;
863 	case 12: post_div = 7; break;
864 	case 16:
865 	default: post_div = 5; break;
866 	}
867 	return post_div;
868 }
869 
870 void radeon_legacy_tv_adjust_pll1(struct drm_encoder *encoder,
871 				  uint32_t *htotal_cntl, uint32_t *ppll_ref_div,
872 				  uint32_t *ppll_div_3, uint32_t *pixclks_cntl)
873 {
874 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
875 	const struct radeon_tv_mode_constants *const_ptr;
876 
877 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
878 	if (!const_ptr)
879 		return;
880 
881 	*htotal_cntl = (const_ptr->hor_total & 0x7) | RADEON_HTOT_CNTL_VGA_EN;
882 
883 	*ppll_ref_div = const_ptr->crtcPLL_M;
884 
885 	*ppll_div_3 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
886 	*pixclks_cntl &= ~(RADEON_PIX2CLK_SRC_SEL_MASK | RADEON_PIXCLK_TV_SRC_SEL);
887 	*pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK;
888 }
889 
890 void radeon_legacy_tv_adjust_pll2(struct drm_encoder *encoder,
891 				  uint32_t *htotal2_cntl, uint32_t *p2pll_ref_div,
892 				  uint32_t *p2pll_div_0, uint32_t *pixclks_cntl)
893 {
894 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
895 	const struct radeon_tv_mode_constants *const_ptr;
896 
897 	const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
898 	if (!const_ptr)
899 		return;
900 
901 	*htotal2_cntl = (const_ptr->hor_total & 0x7);
902 
903 	*p2pll_ref_div = const_ptr->crtcPLL_M;
904 
905 	*p2pll_div_0 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
906 	*pixclks_cntl &= ~RADEON_PIX2CLK_SRC_SEL_MASK;
907 	*pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK | RADEON_PIXCLK_TV_SRC_SEL;
908 }
909 
910