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