Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Side by Side Diff: drivers/media/video/samsung/tv20/sdout_s5pv210.c

Issue 2036011: V4L/DVB : Add S5PV210 TV out driver support (Closed) Base URL: swsolcc@12.23.106.100:kernel-samsung.git
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /* linux/drivers/media/video/samsung/tv20/sdout_s5pv210.c
2 *
3 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com/
5 *
6 * S5PV210 - tv encoder raw ftn file for Samsung TVOut driver
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/platform_device.h>
16 #include <linux/clk.h>
17 #include <linux/delay.h>
18
19 #include <plat/clock.h>
20 #include <linux/io.h>
21 #include <linux/uaccess.h>
22 #include <asm/sizes.h>
23 #include <linux/memory.h>
24
25 #include "tv_out_s5pv210.h"
26
27 #include <mach/regs-sdaout.h>
28
29 #ifdef CONFIG_TVOUT_RAW_DBG
30 #define S5P_SDAOUT_DEBUG 1
31 #endif
32
33 #ifdef S5P_SDAOUT_DEBUG
34 #define SDPRINTK(fmt, args...) \
35 printk(KERN_INFO "\t\t[SDOUT] %s: " fmt, __func__ , ## args)
36 #else
37 #define SDPRINTK(fmt, args...)
38 #endif
39
40 static struct resource *sdout_mem;
41 void __iomem *sdout_base;
42
43 /*
44 * initialization - iniization functions are only called under stopping SDOUT
45 */
46 enum s5p_tv_sd_err tv_sdout_init_video_scale_cfg(
47 enum s5p_sd_level component_level,
48 enum s5p_sd_vsync_ratio component_ratio,
49 enum s5p_sd_level composite_level,
50 enum s5p_sd_vsync_ratio composite_ratio)
51 {
52 u32 temp_reg = 0;
53
54 SDPRINTK("%d,%d,%d,%d\n\r", component_level, component_ratio,
55 composite_level, composite_ratio);
56
57 switch (component_level) {
58
59 case S5P_TV_SD_LEVEL_0IRE:
60 temp_reg = SDO_COMPONENT_LEVEL_SEL_0IRE;
61 break;
62
63 case S5P_TV_SD_LEVEL_75IRE:
64 temp_reg = SDO_COMPONENT_LEVEL_SEL_75IRE;
65 break;
66
67 default:
68 SDPRINTK("invalid component_level parameter(%d)\n\r",
69 component_level);
70 return S5P_TV_SD_ERR_INVALID_PARAM;
71 }
72
73 switch (composite_level) {
74
75 case SDOUT_VTOS_RATIO_10_4:
76 temp_reg |= SDO_COMPONENT_VTOS_RATIO_10_4;
77 break;
78
79 case SDOUT_VTOS_RATIO_7_3:
80 temp_reg |= SDO_COMPONENT_VTOS_RATIO_7_3;
81 break;
82
83 default:
84 SDPRINTK(" invalid composite_level parameter(%d)\n\r",
85 composite_level);
86 return S5P_TV_SD_ERR_INVALID_PARAM;
87 }
88
89 switch (composite_level) {
90
91 case S5P_TV_SD_LEVEL_0IRE:
92 temp_reg |= SDO_COMPOSITE_LEVEL_SEL_0IRE;
93 break;
94
95 case S5P_TV_SD_LEVEL_75IRE:
96 temp_reg |= SDO_COMPOSITE_LEVEL_SEL_75IRE;
97 break;
98
99 default:
100 SDPRINTK("invalid composite_ratio parameter(%d)\n\r",
101 composite_ratio);
102 return S5P_TV_SD_ERR_INVALID_PARAM;
103 }
104
105 switch (composite_ratio) {
106
107 case SDOUT_VTOS_RATIO_10_4:
108 temp_reg |= SDO_COMPOSITE_VTOS_RATIO_10_4;
109 break;
110
111 case SDOUT_VTOS_RATIO_7_3:
112 temp_reg |= SDO_COMPOSITE_VTOS_RATIO_7_3;
113 break;
114
115 default:
116 SDPRINTK("invalid component_ratio parameter(%d)\n\r",
117 component_ratio);
118 return S5P_TV_SD_ERR_INVALID_PARAM;
119 }
120
121 writel(temp_reg, sdout_base + S5P_SDO_SCALE);
122
123 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_SCALE));
124
125 return SDOUT_NO_ERROR;
126 }
127
128 enum s5p_tv_sd_err tv_sdout_init_sync_signal_pin(enum s5p_sd_sync_sig_pin pin)
129 {
130 SDPRINTK("%d\n\r", pin);
131
132 switch (pin) {
133
134 case SDOUT_SYNC_SIG_NO:
135 writel(SDO_COMPONENT_SYNC_ABSENT, sdout_base + S5P_SDO_SYNC);
136 break;
137
138 case SDOUT_SYNC_SIG_YG:
139 writel(SDO_COMPONENT_SYNC_YG, sdout_base + S5P_SDO_SYNC);
140 break;
141
142 case SDOUT_SYNC_SIG_ALL:
143 writel(SDO_COMPONENT_SYNC_ALL, sdout_base + S5P_SDO_SYNC);
144 break;
145
146 default:
147 SDPRINTK("invalid pin parameter(%d)\n\r", pin);
148 return S5P_TV_SD_ERR_INVALID_PARAM;
149 }
150
151 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SYNC));
152
153 return SDOUT_NO_ERROR;
154 }
155
156 enum s5p_tv_sd_err tv_sdout_init_vbi(bool wss_cvbs,
157 enum s5p_sd_closed_caption_type caption_cvbs,
158 bool wss_y_sideo,
159 enum s5p_sd_closed_caption_type caption_y_sideo,
160 bool cgmsa_rgb,
161 bool wss_rgb,
162 enum s5p_sd_closed_caption_type caption_rgb,
163 bool cgmsa_y_ppr,
164 bool wss_y_ppr,
165 enum s5p_sd_closed_caption_type caption_y_ppr)
166 {
167 u32 temp_reg = 0;
168
169 SDPRINTK(" %d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n\r",
170 wss_cvbs, caption_cvbs, wss_y_sideo,
171 caption_y_sideo, cgmsa_rgb, wss_rgb,
172 caption_rgb, cgmsa_y_ppr, wss_y_ppr, caption_y_ppr);
173
174 if (wss_cvbs)
175 temp_reg = SDO_CVBS_WSS_INS;
176 else
177 temp_reg = SDO_CVBS_NO_WSS;
178
179 switch (caption_cvbs) {
180
181 case SDOUT_NO_INS:
182 temp_reg |= SDO_CVBS_NO_CLOSED_CAPTION;
183 break;
184
185 case SDOUT_INS_1:
186 temp_reg |= SDO_CVBS_21H_CLOSED_CAPTION;
187 break;
188
189 case SDOUT_INS_2:
190 temp_reg |= SDO_CVBS_21H_284H_CLOSED_CAPTION;
191 break;
192
193 case SDOUT_INS_OTHERS:
194 temp_reg |= SDO_CVBS_USE_OTHERS;
195 break;
196
197 default:
198 SDPRINTK(" invalid caption_cvbs parameter(%d)\n\r",
199 caption_cvbs);
200 return S5P_TV_SD_ERR_INVALID_PARAM;
201 }
202
203 if (wss_y_sideo)
204 temp_reg |= SDO_SVIDEO_WSS_INS;
205 else
206 temp_reg |= SDO_SVIDEO_NO_WSS;
207
208 switch (caption_y_sideo) {
209
210 case SDOUT_NO_INS:
211 temp_reg |= SDO_SVIDEO_NO_CLOSED_CAPTION;
212 break;
213
214 case SDOUT_INS_1:
215 temp_reg |= SDO_SVIDEO_21H_CLOSED_CAPTION;
216 break;
217
218 case SDOUT_INS_2:
219 temp_reg |= SDO_SVIDEO_21H_284H_CLOSED_CAPTION;
220 break;
221
222 case SDOUT_INS_OTHERS:
223 temp_reg |= SDO_SVIDEO_USE_OTHERS;
224 break;
225
226 default:
227 SDPRINTK("invalid caption_y_sideo parameter(%d)\n\r",
228 caption_y_sideo);
229 return S5P_TV_SD_ERR_INVALID_PARAM;
230 }
231
232 if (cgmsa_rgb)
233 temp_reg |= SDO_RGB_CGMSA_INS;
234 else
235 temp_reg |= SDO_RGB_NO_CGMSA;
236
237 if (wss_rgb)
238 temp_reg |= SDO_RGB_WSS_INS;
239 else
240 temp_reg |= SDO_RGB_NO_WSS;
241
242 switch (caption_rgb) {
243
244 case SDOUT_NO_INS:
245 temp_reg |= SDO_RGB_NO_CLOSED_CAPTION;
246 break;
247
248 case SDOUT_INS_1:
249 temp_reg |= SDO_RGB_21H_CLOSED_CAPTION;
250 break;
251
252 case SDOUT_INS_2:
253 temp_reg |= SDO_RGB_21H_284H_CLOSED_CAPTION;
254 break;
255
256 case SDOUT_INS_OTHERS:
257 temp_reg |= SDO_RGB_USE_OTHERS;
258 break;
259
260 default:
261 SDPRINTK(" invalid caption_rgb parameter(%d)\n\r",
262 caption_rgb);
263 return S5P_TV_SD_ERR_INVALID_PARAM;
264 }
265
266 if (cgmsa_y_ppr)
267 temp_reg |= SDO_YPBPR_CGMSA_INS;
268 else
269 temp_reg |= SDO_YPBPR_NO_CGMSA;
270
271 if (wss_y_ppr)
272 temp_reg |= SDO_YPBPR_WSS_INS;
273 else
274 temp_reg |= SDO_YPBPR_NO_WSS;
275
276 switch (caption_y_ppr) {
277
278 case SDOUT_NO_INS:
279 temp_reg |= SDO_YPBPR_NO_CLOSED_CAPTION;
280 break;
281
282 case SDOUT_INS_1:
283 temp_reg |= SDO_YPBPR_21H_CLOSED_CAPTION;
284 break;
285
286 case SDOUT_INS_2:
287 temp_reg |= SDO_YPBPR_21H_284H_CLOSED_CAPTION;
288 break;
289
290 case SDOUT_INS_OTHERS:
291 temp_reg |= SDO_YPBPR_USE_OTHERS;
292 break;
293
294 default:
295 SDPRINTK("invalid caption_y_ppr parameter(%d)\n\r",
296 caption_y_ppr);
297 return S5P_TV_SD_ERR_INVALID_PARAM;
298 }
299
300 writel(temp_reg, sdout_base + S5P_SDO_VBI);
301
302 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_VBI));
303
304 return SDOUT_NO_ERROR;
305 }
306
307 enum s5p_tv_sd_err tv_sdout_init_offset_gain(enum s5p_sd_channel_sel channel,
308 u32 offset,
309 u32 gain)
310 {
311 SDPRINTK("%d,%d,%d\n\r", channel, offset, gain);
312
313 switch (channel) {
314
315 case SDOUT_CHANNEL_0:
316 writel(SDO_SCALE_CONV_OFFSET(offset) |
317 SDO_SCALE_CONV_GAIN(gain),
318 sdout_base + S5P_SDO_SCALE_CH0);
319 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH0));
320 break;
321
322 case SDOUT_CHANNEL_1:
323 writel(SDO_SCALE_CONV_OFFSET(offset) |
324 SDO_SCALE_CONV_GAIN(gain),
325 sdout_base + S5P_SDO_SCALE_CH1);
326 SDPRINTK(" 0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH1));
327 break;
328
329 case SDOUT_CHANNEL_2:
330 writel(SDO_SCALE_CONV_OFFSET(offset) |
331 SDO_SCALE_CONV_GAIN(gain),
332 sdout_base + S5P_SDO_SCALE_CH2);
333 SDPRINTK(" 0x%08x\n\r", readl(sdout_base + S5P_SDO_SCALE_CH2));
334 break;
335
336 default:
337 SDPRINTK(" invalid channel parameter(%d)\n\r", channel);
338 return S5P_TV_SD_ERR_INVALID_PARAM;
339 }
340
341 return SDOUT_NO_ERROR;
342 }
343
344 void tv_sdout_init_delay(u32 delay_y,
345 u32 offset_video_start,
346 u32 offset_video_end)
347 {
348 SDPRINTK("%d,%d,%d\n\r", delay_y, offset_video_start, offset_video_end);
349
350 writel(SDO_DELAY_YTOC(
351 delay_y) | SDO_ACTIVE_START_OFFSET(offset_video_start) |
352 SDO_ACTIVE_END_OFFSET(offset_video_end),
353 sdout_base + S5P_SDO_YCDELAY);
354
355 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_YCDELAY));
356 }
357
358 void tv_sdout_init_schlock(bool color_sucarrier_pha_adj)
359 {
360 SDPRINTK("%d\n\r", color_sucarrier_pha_adj);
361
362 if (color_sucarrier_pha_adj)
363 writel(SDO_COLOR_SC_PHASE_ADJ, sdout_base + S5P_SDO_SCHLOCK);
364 else
365 writel(SDO_COLOR_SC_PHASE_NOADJ, sdout_base + S5P_SDO_SCHLOCK);
366
367 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_SCHLOCK));
368 }
369
370 enum s5p_tv_sd_err tv_sdout_init_dac_power_onoff(
371 enum s5p_sd_channel_sel channel, bool dac_on)
372 {
373 u32 temp_on_off;
374
375 SDPRINTK("%d,%d)\n\r", channel, dac_on);
376
377 switch (channel) {
378
379 case SDOUT_CHANNEL_0:
380 temp_on_off = SDO_POWER_ON_DAC0;
381 break;
382
383 case SDOUT_CHANNEL_1:
384 temp_on_off = SDO_POWER_ON_DAC1;
385 break;
386
387 case SDOUT_CHANNEL_2:
388 temp_on_off = SDO_POWER_ON_DAC2;
389 break;
390
391 default:
392 SDPRINTK("invalid channel parameter(%d)\n\r", channel);
393 return S5P_TV_SD_ERR_INVALID_PARAM;
394 }
395
396 if (dac_on) {
397 writel(readl(sdout_base + S5P_SDO_DAC) | temp_on_off,
398 sdout_base + S5P_SDO_DAC);
399 } else {
400 writel(readl(sdout_base + S5P_SDO_DAC) & ~temp_on_off,
401 sdout_base + S5P_SDO_DAC);
402 }
403
404 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_DAC));
405
406 return SDOUT_NO_ERROR;
407 }
408
409 void tv_sdout_init_color_compensaton_onoff(bool bright_hue_saturation_adj,
410 bool y_ppr_color_compensation,
411 bool rgcolor_compensation,
412 bool y_c_color_compensation,
413 bool y_cvbs_color_compensation)
414 {
415 u32 temp_reg = 0;
416
417 SDPRINTK("%d,%d,%d,%d,%d)\n\r", bright_hue_saturation_adj,
418 y_ppr_color_compensation, rgcolor_compensation,
419 y_c_color_compensation, y_cvbs_color_compensation);
420
421 if (bright_hue_saturation_adj)
422 temp_reg &= ~SDO_COMPONENT_BHS_ADJ_OFF;
423 else
424 temp_reg |= SDO_COMPONENT_BHS_ADJ_OFF;
425
426 if (y_ppr_color_compensation)
427 temp_reg &= ~SDO_COMPONENT_YPBPR_COMP_OFF;
428 else
429 temp_reg |= SDO_COMPONENT_YPBPR_COMP_OFF;
430
431 if (rgcolor_compensation)
432 temp_reg &= ~SDO_COMPONENT_RGB_COMP_OFF;
433 else
434 temp_reg |= SDO_COMPONENT_RGB_COMP_OFF;
435
436 if (y_c_color_compensation)
437 temp_reg &= ~SDO_COMPONENT_YC_COMP_OFF;
438 else
439 temp_reg |= SDO_COMPONENT_YC_COMP_OFF;
440
441 if (y_cvbs_color_compensation)
442 temp_reg &= ~SDO_COMPONENT_CVBS_COMP_OFF;
443 else
444 temp_reg |= SDO_COMPONENT_CVBS_COMP_OFF;
445
446 writel(temp_reg, sdout_base + S5P_SDO_CCCON);
447
448 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CCCON));
449 }
450
451 void tv_sdout_init_brightness_hue_saturation(u32 gain_brightness,
452 u32 offset_brightness,
453 u32 gain0_cb_hue_saturation,
454 u32 gain1_cb_hue_saturation,
455 u32 gain0_cr_hue_saturation,
456 u32 gain1_cr_hue_saturation,
457 u32 offset_cb_hue_saturation,
458 u32 offset_cr_hue_saturation)
459 {
460 SDPRINTK(" %d,%d,%d,%d,%d,%d,%d,%d)\n\r", gain_brightness,
461 offset_brightness, gain0_cb_hue_saturation,
462 gain1_cb_hue_saturation, gain0_cr_hue_saturation,
463 gain1_cr_hue_saturation, offset_cb_hue_saturation,
464 offset_cr_hue_saturation);
465
466 writel(SDO_BRIGHTNESS_GAIN(gain_brightness) |
467 SDO_BRIGHTNESS_OFFSET(offset_brightness),
468 sdout_base + S5P_SDO_YSCALE);
469
470 writel(SDO_HS_CB_GAIN0(gain0_cb_hue_saturation) |
471 SDO_HS_CB_GAIN1(gain1_cb_hue_saturation),
472 sdout_base + S5P_SDO_CBSCALE);
473
474 writel(SDO_HS_CR_GAIN0(gain0_cr_hue_saturation) |
475 SDO_HS_CR_GAIN1(gain1_cr_hue_saturation),
476 sdout_base + S5P_SDO_CRSCALE);
477
478 writel(SDO_HS_CR_OFFSET(offset_cr_hue_saturation) |
479 SDO_HS_CB_OFFSET(offset_cb_hue_saturation),
480 sdout_base + S5P_SDO_CB_CR_OFFSET);
481
482 SDPRINTK("0x%08x,0x%08x,0x%08x,0x%08x)\n\r",
483 readl(sdout_base + S5P_SDO_YSCALE),
484 readl(sdout_base + S5P_SDO_CBSCALE),
485 readl(sdout_base + S5P_SDO_CRSCALE),
486 readl(sdout_base + S5P_SDO_CB_CR_OFFSET));
487 }
488
489 void tv_sdout_init_rgb_color_compensation(u32 max_rgbcube,
490 u32 min_rgbcube)
491 {
492 SDPRINTK("0x%08x,0x%08x\n\r", max_rgbcube, min_rgbcube);
493
494 writel(SDO_MAX_RGB_CUBE(max_rgbcube) | SDO_MIN_RGB_CUBE(min_rgbcube),
495 sdout_base + S5P_SDO_RGB_CC);
496
497 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_RGB_CC));
498 }
499
500 void tv_sdout_init_cvbs_color_compensation(u32 y_lower_mid,
501 u32 y_bottom,
502 u32 y_top,
503 u32 y_upper_mid,
504 u32 radius)
505 {
506 SDPRINTK("%d,%d,%d,%d,%d\n\r", y_lower_mid, y_bottom,
507 y_top, y_upper_mid, radius);
508
509 writel(SDO_Y_LOWER_MID_CVBS_CORN(y_lower_mid) |
510 SDO_Y_BOTTOM_CVBS_CORN(y_bottom),
511 sdout_base + S5P_SDO_CVBS_CC_Y1);
512 writel(SDO_Y_TOP_CVBS_CORN(y_top) |
513 SDO_Y_UPPER_MID_CVBS_CORN(y_upper_mid),
514 sdout_base + S5P_SDO_CVBS_CC_Y2);
515 writel(SDO_RADIUS_CVBS_CORN(radius), sdout_base + S5P_SDO_CVBS_CC_C);
516
517 SDPRINTK("0x%08x,0x%08x,0x%08x)\n\r",
518 readl(sdout_base + S5P_SDO_CVBS_CC_Y1),
519 readl(sdout_base + S5P_SDO_CVBS_CC_Y2),
520 readl(sdout_base + S5P_SDO_CVBS_CC_C));
521 }
522
523 void tv_sdout_init_svideo_color_compensation(u32 y_top,
524 u32 y_bottom,
525 u32 y_c_cylinder)
526 {
527 SDPRINTK(" %d,%d,%d)\n\r", y_top, y_bottom, y_c_cylinder);
528
529 writel(SDO_Y_TOP_YC_CYLINDER(y_top) |
530 SDO_Y_BOTOM_YC_CYLINDER(y_bottom),
531 sdout_base + S5P_SDO_YC_CC_Y);
532 writel(SDO_RADIUS_YC_CYLINDER(y_c_cylinder),
533 sdout_base + S5P_SDO_YC_CC_C);
534
535 SDPRINTK("0x%08x,0x%08x)\n\r", readl(sdout_base + S5P_SDO_YC_CC_Y),
536 readl(sdout_base + S5P_SDO_YC_CC_C));
537 }
538
539 void tv_sdout_init_component_porch(u32 back_525,
540 u32 front_525,
541 u32 back_625,
542 u32 front_625)
543 {
544 SDPRINTK(" %d,%d,%d,%d)\n\r", back_525, front_525, back_625, front_625);
545
546 writel(SDO_COMPONENT_525_BP(back_525) |
547 SDO_COMPONENT_525_FP(front_525),
548 sdout_base + S5P_SDO_CSC_525_PORCH);
549 writel(SDO_COMPONENT_625_BP(back_625) |
550 SDO_COMPONENT_625_FP(front_625),
551 sdout_base + S5P_SDO_CSC_625_PORCH);
552
553 SDPRINTK(" 0x%08x,0x%08x)\n\r",
554 readl(sdout_base + S5P_SDO_CSC_525_PORCH),
555 readl(sdout_base + S5P_SDO_CSC_625_PORCH));
556 }
557
558 enum s5p_tv_sd_err tv_sdout_init_vesa_rgb_sync(
559 enum s5p_sd_vesa_rgb_sync_type sync_type,
560 enum s5p_tv_active_polarity v_sync_active,
561 enum s5p_tv_active_polarity h_sync_active)
562 {
563 u32 temp_reg = 0;
564
565 SDPRINTK("%d,%d,%d\n\r", sync_type, v_sync_active, h_sync_active);
566
567 switch (sync_type) {
568
569 case SDOUT_VESA_RGB_SYNC_COMPOSITE:
570 temp_reg |= SDO_RGB_SYNC_COMPOSITE;
571 break;
572
573 case SDOUT_VESA_RGB_SYNC_SEPARATE:
574 temp_reg |= SDO_RGB_SYNC_SEPERATE;
575 break;
576
577 default:
578 SDPRINTK(" invalid sync_type parameter(%d)\n\r",
579 sync_type);
580 return S5P_TV_SD_ERR_INVALID_PARAM;
581 }
582
583 switch (v_sync_active) {
584
585 case TVOUT_POL_ACTIVE_LOW:
586 temp_reg |= SDO_RGB_VSYNC_LOW_ACT;
587 break;
588
589 case TVOUT_POL_ACTIVE_HIGH:
590 temp_reg |= SDO_RGB_VSYNC_HIGH_ACT;
591 break;
592
593 default:
594 SDPRINTK(" invalid v_sync_active parameter(%d)\n\r",
595 v_sync_active);
596 return S5P_TV_SD_ERR_INVALID_PARAM;
597 }
598
599 switch (h_sync_active) {
600
601 case TVOUT_POL_ACTIVE_LOW:
602 temp_reg |= SDO_RGB_HSYNC_LOW_ACT;
603 break;
604
605 case TVOUT_POL_ACTIVE_HIGH:
606 temp_reg |= SDO_RGB_HSYNC_HIGH_ACT;
607 break;
608
609 default:
610 SDPRINTK(" invalid h_sync_active parameter(%d)\n\r",
611 h_sync_active);
612 return S5P_TV_SD_ERR_INVALID_PARAM;
613 }
614
615 writel(temp_reg, sdout_base + S5P_SDO_RGBSYNC);
616
617 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_RGBSYNC));
618
619 return SDOUT_NO_ERROR;
620 }
621
622 void tv_sdout_init_oversampling_filter_coeff(u32 size,
623 u32 *coeff,
624 u32 *coeff1,
625 u32 *coeff2)
626 {
627 u32 *temp_reg = 0;
628
629 SDPRINTK(" %d,0x%x,0x%x,0x%x\n\r", (u32)size, (u32)coeff, (u32)coeff1,
630 (u32)coeff2);
631
632 if (coeff != NULL) {
633 temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_0);
634 memcpy((void *)temp_reg, (const void *)coeff, size*4);
635 }
636
637 if (coeff1 != NULL) {
638 temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_1);
639 memcpy((void *)temp_reg, (const void *)coeff1, size*4);
640 }
641
642 if (coeff2 != NULL) {
643 temp_reg = (u32 *)readl(sdout_base + S5P_SDO_OSFC00_2);
644 memcpy((void *)temp_reg, (const void *)coeff2, size*4);
645 }
646
647 SDPRINTK(" ()\n\r");
648 }
649
650 enum s5p_tv_sd_err tv_sdout_init_ch_xtalk_cancel_coef(
651 enum s5p_sd_channel_sel channel,
652 u32 coeff2,
653 u32 coeff1)
654 {
655 SDPRINTK(" %d,%d,%d\n\r", channel, coeff2, coeff1);
656
657 switch (channel) {
658
659 case SDOUT_CHANNEL_0:
660 writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1),
661 sdout_base + S5P_SDO_XTALK0);
662 SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK0));
663 break;
664
665 case SDOUT_CHANNEL_1:
666 writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1),
667 sdout_base + S5P_SDO_XTALK1);
668 SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK1));
669 break;
670
671 case SDOUT_CHANNEL_2:
672 writel(SDO_XTALK_COEF02(coeff2) | SDO_XTALK_COEF01(coeff1),
673 sdout_base + S5P_SDO_XTALK2);
674 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_XTALK2));
675 break;
676
677 default:
678 SDPRINTK(" invalid channel parameter(%d)\n\r", channel);
679 return S5P_TV_SD_ERR_INVALID_PARAM;
680 }
681
682 return SDOUT_NO_ERROR;
683 }
684
685 void tv_sdout_init_closed_caption(u32 display_cc, u32 non_display_cc)
686 {
687 SDPRINTK("%d,%d\n\r", display_cc, non_display_cc);
688
689 writel(SDO_DISPLAY_CC_CAPTION(display_cc) |
690 SDO_NON_DISPLAY_CC_CAPTION(non_display_cc),
691 sdout_base + S5P_SDO_ARMCC);
692
693 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_ARMCC));
694 }
695
696 /* static functions */
697 static u32 tv_sdout_init_wss_cgms_crc(u32 value)
698 {
699 u8 i;
700 u8 CGMS[14], CRC[6], OLD_CRC;
701 u32 temp_in;
702
703 temp_in = value;
704
705 for (i = 0; i < 14; i++)
706 CGMS[i] = (u8)(temp_in >> i) & 0x1 ;
707
708 /* initialize state */
709 for (i = 0; i < 6; i++)
710 CRC[i] = 0x1;
711
712 /* round 20 */
713 for (i = 0; i < 14; i++) {
714 OLD_CRC = CRC[0];
715 CRC[0] = CRC[1];
716 CRC[1] = CRC[2];
717 CRC[2] = CRC[3];
718 CRC[3] = CRC[4];
719 CRC[4] = OLD_CRC ^ CGMS[i] ^ CRC[5];
720 CRC[5] = OLD_CRC ^ CGMS[i];
721 }
722
723 /* recompose to return crc */
724 temp_in &= 0x3fff;
725
726 for (i = 0; i < 6; i++)
727 temp_in |= ((u32)(CRC[i] & 0x1) << i);
728
729 return temp_in;
730 }
731
732
733 enum s5p_tv_sd_err tv_sdout_init_wss525_data(
734 enum s5p_sd_525_copy_permit copy_permit,
735 enum s5p_sd_525_mv_psp mv_psp,
736 enum s5p_sd_525_copy_info copy_info,
737 bool analog_on,
738 enum s5p_sd_525_aspect_ratio display_ratio)
739 {
740 u32 temp_reg = 0;
741
742 SDPRINTK("%d,%d,%d,%d\n\r", copy_permit, mv_psp, copy_info,
743 display_ratio);
744
745 switch (copy_permit) {
746
747 case SDO_525_COPY_PERMIT:
748 temp_reg = SDO_WORD2_WSS525_COPY_PERMIT;
749 break;
750
751 case SDO_525_ONECOPY_PERMIT:
752 temp_reg = SDO_WORD2_WSS525_ONECOPY_PERMIT;
753 break;
754
755 case SDO_525_NOCOPY_PERMIT:
756 temp_reg = SDO_WORD2_WSS525_NOCOPY_PERMIT;
757 break;
758
759 default:
760 SDPRINTK(" invalid copy_permit parameter(%d)\n\r",
761 copy_permit);
762 return S5P_TV_SD_ERR_INVALID_PARAM;
763 }
764
765 switch (mv_psp) {
766
767 case SDO_525_MV_PSP_OFF:
768 temp_reg |= SDO_WORD2_WSS525_MV_PSP_OFF;
769 break;
770
771 case SDO_525_MV_PSP_ON_2LINE_BURST:
772 temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_2LINE_BURST;
773 break;
774
775 case SDO_525_MV_PSP_ON_BURST_OFF:
776 temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_BURST_OFF;
777 break;
778
779 case SDO_525_MV_PSP_ON_4LINE_BURST:
780 temp_reg |= SDO_WORD2_WSS525_MV_PSP_ON_4LINE_BURST;
781 break;
782
783 default:
784 SDPRINTK(" invalid mv_psp parameter(%d)\n\r", mv_psp);
785 return S5P_TV_SD_ERR_INVALID_PARAM;
786 }
787
788 switch (copy_info) {
789
790 case SDO_525_COPY_INFO:
791 temp_reg |= SDO_WORD1_WSS525_COPY_INFO;
792 break;
793
794 case SDO_525_DEFAULT:
795 temp_reg |= SDO_WORD1_WSS525_DEFAULT;
796 break;
797
798 default:
799 SDPRINTK(" invalid copy_info parameter(%d)\n\r", copy_info);
800 return S5P_TV_SD_ERR_INVALID_PARAM;
801 }
802
803 if (analog_on)
804 temp_reg |= SDO_WORD2_WSS525_ANALOG_ON;
805 else
806 temp_reg |= SDO_WORD2_WSS525_ANALOG_OFF;
807
808 switch (display_ratio) {
809
810 case SDO_525_COPY_PERMIT:
811 temp_reg |= SDO_WORD0_WSS525_4_3_NORMAL;
812 break;
813
814 case SDO_525_ONECOPY_PERMIT:
815 temp_reg |= SDO_WORD0_WSS525_16_9_ANAMORPIC;
816 break;
817
818 case SDO_525_NOCOPY_PERMIT:
819 temp_reg |= SDO_WORD0_WSS525_4_3_LETTERBOX;
820 break;
821
822 default:
823 SDPRINTK(" invalid display_ratio parameter(%d)\n\r",
824 display_ratio);
825 return S5P_TV_SD_ERR_INVALID_PARAM;
826 }
827
828 writel(temp_reg |
829 SDO_CRC_WSS525(tv_sdout_init_wss_cgms_crc(temp_reg)),
830 sdout_base + S5P_SDO_WSS525);
831
832 SDPRINTK("0x%08x)\n\r", readl(sdout_base + S5P_SDO_WSS525));
833
834 return SDOUT_NO_ERROR;
835 }
836
837 enum s5p_tv_sd_err tv_sdout_init_wss625_data(bool surround_sound,
838 bool copyright,
839 bool copy_protection,
840 bool text_subtitles,
841 enum s5p_sd_625_subtitles open_subtitles,
842 enum s5p_sd_625_camera_film camera_film,
843 enum s5p_sd_625_color_encoding color_encoding,
844 bool helper_signal,
845 enum s5p_sd_625_aspect_ratio display_ratio)
846 {
847 u32 temp_reg = 0;
848
849 SDPRINTK("%d,%d,%d,%d,%d,%d,%d,%d,%d\n\r",
850 surround_sound, copyright, copy_protection,
851 text_subtitles, open_subtitles, camera_film,
852 color_encoding, helper_signal, display_ratio);
853
854 if (surround_sound)
855 temp_reg = SDO_WSS625_SURROUND_SOUND_ENABLE;
856 else
857 temp_reg = SDO_WSS625_SURROUND_SOUND_DISABLE;
858
859 if (copyright)
860 temp_reg |= SDO_WSS625_COPYRIGHT;
861 else
862 temp_reg |= SDO_WSS625_NO_COPYRIGHT;
863
864 if (copy_protection)
865 temp_reg |= SDO_WSS625_COPY_RESTRICTED;
866 else
867 temp_reg |= SDO_WSS625_COPY_NOT_RESTRICTED;
868
869 if (text_subtitles)
870 temp_reg |= SDO_WSS625_TELETEXT_SUBTITLES;
871 else
872 temp_reg |= SDO_WSS625_TELETEXT_NO_SUBTITLES;
873
874 switch (open_subtitles) {
875
876 case SDO_625_NO_OPEN_SUBTITLES:
877 temp_reg |= SDO_WSS625_NO_OPEN_SUBTITLES;
878 break;
879
880 case SDO_625_INACT_OPEN_SUBTITLES:
881 temp_reg |= SDO_WSS625_INACT_OPEN_SUBTITLES;
882 break;
883
884 case SDO_625_OUTACT_OPEN_SUBTITLES:
885 temp_reg |= SDO_WSS625_OUTACT_OPEN_SUBTITLES;
886 break;
887
888 default:
889 SDPRINTK(" invalid open_subtitles parameter(%d)\n\r",
890 open_subtitles);
891 return S5P_TV_SD_ERR_INVALID_PARAM;
892 }
893
894 switch (camera_film) {
895
896 case SDO_625_CAMERA:
897 temp_reg |= SDO_WSS625_CAMERA;
898 break;
899
900 case SDO_625_FILM:
901 temp_reg |= SDO_WSS625_FILM;
902 break;
903
904 default:
905 SDPRINTK("invalid camera_film parameter(%d)\n\r",
906 camera_film);
907 return S5P_TV_SD_ERR_INVALID_PARAM;
908 }
909
910 switch (color_encoding) {
911
912 case SDO_625_NORMAL_PAL:
913 temp_reg |= SDO_WSS625_NORMAL_PAL;
914 break;
915
916 case SDO_625_MOTION_ADAPTIVE_COLORPLUS:
917 temp_reg |= SDO_WSS625_MOTION_ADAPTIVE_COLORPLUS;
918 break;
919
920 default:
921 SDPRINTK("invalid color_encoding parameter(%d)\n\r",
922 color_encoding);
923 return S5P_TV_SD_ERR_INVALID_PARAM;
924 }
925
926 if (helper_signal)
927 temp_reg |= SDO_WSS625_HELPER_SIG;
928 else
929 temp_reg |= SDO_WSS625_HELPER_NO_SIG;
930
931 switch (display_ratio) {
932
933 case SDO_625_4_3_FULL_576:
934 temp_reg |= SDO_WSS625_4_3_FULL_576;
935 break;
936
937 case SDO_625_14_9_LETTERBOX_CENTER_504:
938 temp_reg |= SDO_WSS625_14_9_LETTERBOX_CENTER_504;
939 break;
940
941 case SDO_625_14_9_LETTERBOX_TOP_504:
942 temp_reg |= SDO_WSS625_14_9_LETTERBOX_TOP_504;
943 break;
944
945 case SDO_625_16_9_LETTERBOX_CENTER_430:
946 temp_reg |= SDO_WSS625_16_9_LETTERBOX_CENTER_430;
947 break;
948
949 case SDO_625_16_9_LETTERBOX_TOP_430:
950 temp_reg |= SDO_WSS625_16_9_LETTERBOX_TOP_430;
951 break;
952
953 case SDO_625_16_9_LETTERBOX_CENTER:
954 temp_reg |= SDO_WSS625_16_9_LETTERBOX_CENTER;
955 break;
956
957 case SDO_625_14_9_FULL_CENTER_576:
958 temp_reg |= SDO_WSS625_14_9_FULL_CENTER_576;
959 break;
960
961 case SDO_625_16_9_ANAMORPIC_576:
962 temp_reg |= SDO_WSS625_16_9_ANAMORPIC_576;
963 break;
964
965 default:
966 SDPRINTK("invalid display_ratio parameter(%d)\n\r",
967 display_ratio);
968 return S5P_TV_SD_ERR_INVALID_PARAM;
969 }
970
971 writel(temp_reg, sdout_base + S5P_SDO_WSS625);
972
973 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_WSS625));
974
975 return SDOUT_NO_ERROR;
976 }
977
978 enum s5p_tv_sd_err tv_sdout_init_cgmsa525_data(
979 enum s5p_sd_525_copy_permit copy_permit,
980 enum s5p_sd_525_mv_psp mv_psp,
981 enum s5p_sd_525_copy_info copy_info,
982 bool analog_on,
983 enum s5p_sd_525_aspect_ratio display_ratio)
984 {
985 u32 temp_reg = 0;
986
987 SDPRINTK("%d,%d,%d,%d)\n\r", copy_permit, mv_psp,
988 copy_info, display_ratio);
989
990 switch (copy_permit) {
991
992 case SDO_525_COPY_PERMIT:
993 temp_reg = SDO_WORD2_CGMS525_COPY_PERMIT;
994 break;
995
996 case SDO_525_ONECOPY_PERMIT:
997 temp_reg = SDO_WORD2_CGMS525_ONECOPY_PERMIT;
998 break;
999
1000 case SDO_525_NOCOPY_PERMIT:
1001 temp_reg = SDO_WORD2_CGMS525_NOCOPY_PERMIT;
1002 break;
1003
1004 default:
1005 SDPRINTK("invalid copy_permit parameter(%d)\n\r", copy_permit);
1006 return S5P_TV_SD_ERR_INVALID_PARAM;
1007 }
1008
1009 switch (mv_psp) {
1010
1011 case SDO_525_MV_PSP_OFF:
1012 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_OFF;
1013 break;
1014
1015 case SDO_525_MV_PSP_ON_2LINE_BURST:
1016 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_2LINE_BURST;
1017 break;
1018
1019 case SDO_525_MV_PSP_ON_BURST_OFF:
1020 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_BURST_OFF;
1021 break;
1022
1023 case SDO_525_MV_PSP_ON_4LINE_BURST:
1024 temp_reg |= SDO_WORD2_CGMS525_MV_PSP_ON_4LINE_BURST;
1025 break;
1026
1027 default:
1028 SDPRINTK(" invalid mv_psp parameter(%d)\n\r", mv_psp);
1029 return S5P_TV_SD_ERR_INVALID_PARAM;
1030 }
1031
1032 switch (copy_info) {
1033
1034 case SDO_525_COPY_INFO:
1035 temp_reg |= SDO_WORD1_CGMS525_COPY_INFO;
1036 break;
1037
1038 case SDO_525_DEFAULT:
1039 temp_reg |= SDO_WORD1_CGMS525_DEFAULT;
1040 break;
1041
1042 default:
1043 SDPRINTK("invalid copy_info parameter(%d)\n\r", copy_info);
1044 return S5P_TV_SD_ERR_INVALID_PARAM;
1045 }
1046
1047 if (analog_on)
1048 temp_reg |= SDO_WORD2_CGMS525_ANALOG_ON;
1049 else
1050 temp_reg |= SDO_WORD2_CGMS525_ANALOG_OFF;
1051
1052 switch (display_ratio) {
1053
1054 case SDO_525_COPY_PERMIT:
1055 temp_reg |= SDO_WORD0_CGMS525_4_3_NORMAL;
1056 break;
1057
1058 case SDO_525_ONECOPY_PERMIT:
1059 temp_reg |= SDO_WORD0_CGMS525_16_9_ANAMORPIC;
1060 break;
1061
1062 case SDO_525_NOCOPY_PERMIT:
1063 temp_reg |= SDO_WORD0_CGMS525_4_3_LETTERBOX;
1064 break;
1065
1066 default:
1067 SDPRINTK(" invalid display_ratio parameter(%d)\n\r",
1068 display_ratio);
1069 return S5P_TV_SD_ERR_INVALID_PARAM;
1070 }
1071
1072 writel(temp_reg |
1073 SDO_CRC_CGMS525(tv_sdout_init_wss_cgms_crc(temp_reg)),
1074 sdout_base + S5P_SDO_CGMS525);
1075
1076 SDPRINTK(" 0x%08x)\n\r", readl(sdout_base + S5P_SDO_CGMS525));
1077
1078 return SDOUT_NO_ERROR;
1079 }
1080
1081 enum s5p_tv_sd_err tv_sdout_init_cgmsa625_data(bool surround_sound,
1082 bool copyright,
1083 bool copy_protection,
1084 bool text_subtitles,
1085 enum s5p_sd_625_subtitles open_subtitles,
1086 enum s5p_sd_625_camera_film camera_film,
1087 enum s5p_sd_625_color_encoding color_encoding,
1088 bool helper_signal,
1089 enum s5p_sd_625_aspect_ratio display_ratio)
1090 {
1091 u32 temp_reg = 0;
1092
1093 SDPRINTK("%d,%d,%d,%d,%d,%d,%d,%d,%d)\n\r", surround_sound,
1094 copyright, copy_protection,
1095 text_subtitles, open_subtitles, camera_film,
1096 color_encoding, helper_signal, display_ratio);
1097
1098 if (surround_sound)
1099 temp_reg = SDO_CGMS625_SURROUND_SOUND_ENABLE;
1100 else
1101 temp_reg = SDO_CGMS625_SURROUND_SOUND_DISABLE;
1102
1103 if (copyright)
1104 temp_reg |= SDO_CGMS625_COPYRIGHT;
1105 else
1106 temp_reg |= SDO_CGMS625_NO_COPYRIGHT;
1107
1108 if (copy_protection)
1109 temp_reg |= SDO_CGMS625_COPY_RESTRICTED;
1110 else
1111 temp_reg |= SDO_CGMS625_COPY_NOT_RESTRICTED;
1112
1113 if (text_subtitles)
1114 temp_reg |= SDO_CGMS625_TELETEXT_SUBTITLES;
1115 else
1116 temp_reg |= SDO_CGMS625_TELETEXT_NO_SUBTITLES;
1117
1118 switch (open_subtitles) {
1119
1120 case SDO_625_NO_OPEN_SUBTITLES:
1121 temp_reg |= SDO_CGMS625_NO_OPEN_SUBTITLES;
1122 break;
1123
1124 case SDO_625_INACT_OPEN_SUBTITLES:
1125 temp_reg |= SDO_CGMS625_INACT_OPEN_SUBTITLES;
1126 break;
1127
1128 case SDO_625_OUTACT_OPEN_SUBTITLES:
1129 temp_reg |= SDO_CGMS625_OUTACT_OPEN_SUBTITLES;
1130 break;
1131
1132 default:
1133 SDPRINTK("invalid open_subtitles parameter(%d)\n\r",
1134 open_subtitles);
1135 return S5P_TV_SD_ERR_INVALID_PARAM;
1136 }
1137
1138 switch (camera_film) {
1139
1140 case SDO_625_CAMERA:
1141 temp_reg |= SDO_CGMS625_CAMERA;
1142 break;
1143
1144 case SDO_625_FILM:
1145 temp_reg |= SDO_CGMS625_FILM;
1146 break;
1147
1148 default:
1149 SDPRINTK(" invalid camera_film parameter(%d)\n\r",
1150 camera_film);
1151 return S5P_TV_SD_ERR_INVALID_PARAM;
1152 }
1153
1154 switch (color_encoding) {
1155
1156 case SDO_625_NORMAL_PAL:
1157 temp_reg |= SDO_CGMS625_NORMAL_PAL;
1158 break;
1159
1160 case SDO_625_MOTION_ADAPTIVE_COLORPLUS:
1161 temp_reg |= SDO_CGMS625_MOTION_ADAPTIVE_COLORPLUS;
1162 break;
1163
1164 default:
1165 SDPRINTK(" invalid color_encoding parameter(%d)\n\r",
1166 color_encoding);
1167 return S5P_TV_SD_ERR_INVALID_PARAM;
1168 }
1169
1170 if (helper_signal)
1171 temp_reg |= SDO_CGMS625_HELPER_SIG;
1172 else
1173 temp_reg |= SDO_CGMS625_HELPER_NO_SIG;
1174
1175
1176 switch (display_ratio) {
1177
1178 case SDO_625_4_3_FULL_576:
1179 temp_reg |= SDO_CGMS625_4_3_FULL_576;
1180 break;
1181
1182 case SDO_625_14_9_LETTERBOX_CENTER_504:
1183 temp_reg |= SDO_CGMS625_14_9_LETTERBOX_CENTER_504;
1184 break;
1185
1186 case SDO_625_14_9_LETTERBOX_TOP_504:
1187 temp_reg |= SDO_CGMS625_14_9_LETTERBOX_TOP_504;
1188 break;
1189
1190 case SDO_625_16_9_LETTERBOX_CENTER_430:
1191 temp_reg |= SDO_CGMS625_16_9_LETTERBOX_CENTER_430;
1192 break;
1193
1194 case SDO_625_16_9_LETTERBOX_TOP_430:
1195 temp_reg |= SDO_CGMS625_16_9_LETTERBOX_TOP_430;
1196 break;
1197
1198 case SDO_625_16_9_LETTERBOX_CENTER:
1199 temp_reg |= SDO_CGMS625_16_9_LETTERBOX_CENTER;
1200 break;
1201
1202 case SDO_625_14_9_FULL_CENTER_576:
1203 temp_reg |= SDO_CGMS625_14_9_FULL_CENTER_576;
1204 break;
1205
1206 case SDO_625_16_9_ANAMORPIC_576:
1207 temp_reg |= SDO_CGMS625_16_9_ANAMORPIC_576;
1208 break;
1209
1210 default:
1211 SDPRINTK("invalid display_ratio parameter(%d)\n\r",
1212 display_ratio);
1213 return S5P_TV_SD_ERR_INVALID_PARAM;
1214 }
1215
1216 writel(temp_reg, sdout_base + S5P_SDO_CGMS625);
1217
1218 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CGMS625));
1219
1220 return SDOUT_NO_ERROR;
1221 }
1222
1223
1224 static enum s5p_tv_sd_err tv_sdout_init_antialias_filter_coeff_default(
1225 enum s5p_sd_level composite_level,
1226 enum s5p_sd_vsync_ratio composite_ratio,
1227 enum s5p_tv_o_mode out_mode)
1228 {
1229 SDPRINTK("%d,%d,%d\n\r", composite_level, composite_ratio, out_mode);
1230
1231 switch (composite_level) {
1232
1233 case S5P_TV_SD_LEVEL_0IRE:
1234
1235 switch (composite_ratio) {
1236
1237 case SDOUT_VTOS_RATIO_10_4:
1238
1239 switch (out_mode) {
1240
1241 case TVOUT_OUTPUT_COMPOSITE:
1242 case TVOUT_OUTPUT_SVIDEO:
1243 writel(0x00000000 , sdout_base + S5P_SDO_Y3);
1244 writel(0x00000000 , sdout_base + S5P_SDO_Y4);
1245 writel(0x00000000 , sdout_base + S5P_SDO_Y5);
1246 writel(0x00000000 , sdout_base + S5P_SDO_Y6);
1247 writel(0x00000000 , sdout_base + S5P_SDO_Y7);
1248 writel(0x00000000 , sdout_base + S5P_SDO_Y8);
1249 writel(0x00000000 , sdout_base + S5P_SDO_Y9);
1250 writel(0x00000000 , sdout_base + S5P_SDO_Y10);
1251 writel(0x0000029a , sdout_base + S5P_SDO_Y11);
1252 writel(0x00000000 , sdout_base + S5P_SDO_CB0);
1253 writel(0x00000000 , sdout_base + S5P_SDO_CB1);
1254 writel(0x00000000 , sdout_base + S5P_SDO_CB2);
1255 writel(0x00000000 , sdout_base + S5P_SDO_CB3);
1256 writel(0x00000000 , sdout_base + S5P_SDO_CB4);
1257 writel(0x00000001 , sdout_base + S5P_SDO_CB5);
1258 writel(0x00000007 , sdout_base + S5P_SDO_CB6);
1259 writel(0x00000015 , sdout_base + S5P_SDO_CB7);
1260 writel(0x0000002b , sdout_base + S5P_SDO_CB8);
1261 writel(0x00000045 , sdout_base + S5P_SDO_CB9);
1262 writel(0x00000059 , sdout_base + S5P_SDO_CB10);
1263 writel(0x00000061 , sdout_base + S5P_SDO_CB11);
1264 writel(0x00000000 , sdout_base + S5P_SDO_CR1);
1265 writel(0x00000000 , sdout_base + S5P_SDO_CR2);
1266 writel(0x00000000 , sdout_base + S5P_SDO_CR3);
1267 writel(0x00000000 , sdout_base + S5P_SDO_CR4);
1268 writel(0x00000002 , sdout_base + S5P_SDO_CR5);
1269 writel(0x0000000a , sdout_base + S5P_SDO_CR6);
1270 writel(0x0000001e , sdout_base + S5P_SDO_CR7);
1271 writel(0x0000003d , sdout_base + S5P_SDO_CR8);
1272 writel(0x00000061 , sdout_base + S5P_SDO_CR9);
1273 writel(0x0000007a , sdout_base + S5P_SDO_CR10);
1274 writel(0x0000008f , sdout_base + S5P_SDO_CR11);
1275 break;
1276
1277 case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED:
1278 case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE:
1279 case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE:
1280 writel(0x00000000, sdout_base + S5P_SDO_Y0);
1281 writel(0x00000000, sdout_base + S5P_SDO_Y1);
1282 writel(0x00000000, sdout_base + S5P_SDO_Y2);
1283 writel(0x00000000, sdout_base + S5P_SDO_Y3);
1284 writel(0x00000000, sdout_base + S5P_SDO_Y4);
1285 writel(0x00000000, sdout_base + S5P_SDO_Y5);
1286 writel(0x00000000, sdout_base + S5P_SDO_Y6);
1287 writel(0x00000000, sdout_base + S5P_SDO_Y7);
1288 writel(0x00000000, sdout_base + S5P_SDO_Y8);
1289 writel(0x00000000, sdout_base + S5P_SDO_Y9);
1290 writel(0x00000000, sdout_base + S5P_SDO_Y10);
1291 writel(0x0000029a, sdout_base + S5P_SDO_Y11);
1292 writel(0x00000000, sdout_base + S5P_SDO_CB0);
1293 writel(0x00000000, sdout_base + S5P_SDO_CB1);
1294 writel(0x00000000, sdout_base + S5P_SDO_CB2);
1295 writel(0x00000000, sdout_base + S5P_SDO_CB3);
1296 writel(0x00000000, sdout_base + S5P_SDO_CB4);
1297 writel(0x00000001, sdout_base + S5P_SDO_CB5);
1298 writel(0x00000007, sdout_base + S5P_SDO_CB6);
1299 writel(0x00000015, sdout_base + S5P_SDO_CB7);
1300 writel(0x0000002b, sdout_base + S5P_SDO_CB8);
1301 writel(0x00000045, sdout_base + S5P_SDO_CB9);
1302 writel(0x00000059, sdout_base + S5P_SDO_CB10);
1303 writel(0x00000061, sdout_base + S5P_SDO_CB11);
1304 writel(0x00000000, sdout_base + S5P_SDO_CR1);
1305 writel(0x00000000, sdout_base + S5P_SDO_CR2);
1306 writel(0x00000000, sdout_base + S5P_SDO_CR3);
1307 writel(0x00000000, sdout_base + S5P_SDO_CR4);
1308 writel(0x00000002, sdout_base + S5P_SDO_CR5);
1309 writel(0x0000000a, sdout_base + S5P_SDO_CR6);
1310 writel(0x0000001e, sdout_base + S5P_SDO_CR7);
1311 writel(0x0000003d, sdout_base + S5P_SDO_CR8);
1312 writel(0x00000061, sdout_base + S5P_SDO_CR9);
1313 writel(0x0000007a, sdout_base + S5P_SDO_CR10);
1314 writel(0x0000008f, sdout_base + S5P_SDO_CR11);
1315 break;
1316
1317 default:
1318 SDPRINTK("invalid out_mode parameter(%d)\n\r",
1319 out_mode);
1320 return S5P_TV_SD_ERR_INVALID_PARAM;
1321 }
1322
1323 break;
1324
1325 case SDOUT_VTOS_RATIO_7_3:
1326 writel(0x00000000, sdout_base + S5P_SDO_Y0);
1327 writel(0x00000000, sdout_base + S5P_SDO_Y1);
1328 writel(0x00000000, sdout_base + S5P_SDO_Y2);
1329 writel(0x00000000, sdout_base + S5P_SDO_Y3);
1330 writel(0x00000000, sdout_base + S5P_SDO_Y4);
1331 writel(0x00000000, sdout_base + S5P_SDO_Y5);
1332 writel(0x00000000, sdout_base + S5P_SDO_Y6);
1333 writel(0x00000000, sdout_base + S5P_SDO_Y7);
1334 writel(0x00000000, sdout_base + S5P_SDO_Y8);
1335 writel(0x00000000, sdout_base + S5P_SDO_Y9);
1336 writel(0x00000000, sdout_base + S5P_SDO_Y10);
1337 writel(0x00000281, sdout_base + S5P_SDO_Y11);
1338 writel(0x00000000, sdout_base + S5P_SDO_CB0);
1339 writel(0x00000000, sdout_base + S5P_SDO_CB1);
1340 writel(0x00000000, sdout_base + S5P_SDO_CB2);
1341 writel(0x00000000, sdout_base + S5P_SDO_CB3);
1342 writel(0x00000000, sdout_base + S5P_SDO_CB4);
1343 writel(0x00000001, sdout_base + S5P_SDO_CB5);
1344 writel(0x00000007, sdout_base + S5P_SDO_CB6);
1345 writel(0x00000015, sdout_base + S5P_SDO_CB7);
1346 writel(0x0000002a, sdout_base + S5P_SDO_CB8);
1347 writel(0x00000044, sdout_base + S5P_SDO_CB9);
1348 writel(0x00000057, sdout_base + S5P_SDO_CB10);
1349 writel(0x0000005f, sdout_base + S5P_SDO_CB11);
1350 writel(0x00000000, sdout_base + S5P_SDO_CR1);
1351 writel(0x00000000, sdout_base + S5P_SDO_CR2);
1352 writel(0x00000000, sdout_base + S5P_SDO_CR3);
1353 writel(0x00000000, sdout_base + S5P_SDO_CR4);
1354 writel(0x00000002, sdout_base + S5P_SDO_CR5);
1355 writel(0x0000000a, sdout_base + S5P_SDO_CR6);
1356 writel(0x0000001d, sdout_base + S5P_SDO_CR7);
1357 writel(0x0000003c, sdout_base + S5P_SDO_CR8);
1358 writel(0x0000005f, sdout_base + S5P_SDO_CR9);
1359 writel(0x0000007b, sdout_base + S5P_SDO_CR10);
1360 writel(0x00000086, sdout_base + S5P_SDO_CR11);
1361 break;
1362
1363 default:
1364 SDPRINTK("invalid composite_ratio parameter(%d)\n\r",
1365 composite_ratio);
1366 return S5P_TV_SD_ERR_INVALID_PARAM;
1367 }
1368
1369 break;
1370
1371 case S5P_TV_SD_LEVEL_75IRE:
1372
1373 switch (composite_ratio) {
1374
1375 case SDOUT_VTOS_RATIO_10_4:
1376 writel(0x00000000, sdout_base + S5P_SDO_Y0);
1377 writel(0x00000000, sdout_base + S5P_SDO_Y1);
1378 writel(0x00000000, sdout_base + S5P_SDO_Y2);
1379 writel(0x00000000, sdout_base + S5P_SDO_Y3);
1380 writel(0x00000000, sdout_base + S5P_SDO_Y4);
1381 writel(0x00000000, sdout_base + S5P_SDO_Y5);
1382 writel(0x00000000, sdout_base + S5P_SDO_Y6);
1383 writel(0x00000000, sdout_base + S5P_SDO_Y7);
1384 writel(0x00000000, sdout_base + S5P_SDO_Y8);
1385 writel(0x00000000, sdout_base + S5P_SDO_Y9);
1386 writel(0x00000000, sdout_base + S5P_SDO_Y10);
1387 writel(0x0000025d, sdout_base + S5P_SDO_Y11);
1388 writel(0x00000000, sdout_base + S5P_SDO_CB0);
1389 writel(0x00000000, sdout_base + S5P_SDO_CB1);
1390 writel(0x00000000, sdout_base + S5P_SDO_CB2);
1391 writel(0x00000000, sdout_base + S5P_SDO_CB3);
1392 writel(0x00000000, sdout_base + S5P_SDO_CB4);
1393 writel(0x00000001, sdout_base + S5P_SDO_CB5);
1394 writel(0x00000007, sdout_base + S5P_SDO_CB6);
1395 writel(0x00000014, sdout_base + S5P_SDO_CB7);
1396 writel(0x00000028, sdout_base + S5P_SDO_CB8);
1397 writel(0x0000003f, sdout_base + S5P_SDO_CB9);
1398 writel(0x00000052, sdout_base + S5P_SDO_CB10);
1399 writel(0x0000005a, sdout_base + S5P_SDO_CB11);
1400 writel(0x00000000, sdout_base + S5P_SDO_CR1);
1401 writel(0x00000000, sdout_base + S5P_SDO_CR2);
1402 writel(0x00000000, sdout_base + S5P_SDO_CR3);
1403 writel(0x00000000, sdout_base + S5P_SDO_CR4);
1404 writel(0x00000001, sdout_base + S5P_SDO_CR5);
1405 writel(0x00000009, sdout_base + S5P_SDO_CR6);
1406 writel(0x0000001c, sdout_base + S5P_SDO_CR7);
1407 writel(0x00000039, sdout_base + S5P_SDO_CR8);
1408 writel(0x0000005a, sdout_base + S5P_SDO_CR9);
1409 writel(0x00000074, sdout_base + S5P_SDO_CR10);
1410 writel(0x0000007e, sdout_base + S5P_SDO_CR11);
1411 break;
1412
1413 case SDOUT_VTOS_RATIO_7_3:
1414 writel(0x00000000, sdout_base + S5P_SDO_Y0);
1415 writel(0x00000000, sdout_base + S5P_SDO_Y1);
1416 writel(0x00000000, sdout_base + S5P_SDO_Y2);
1417 writel(0x00000000, sdout_base + S5P_SDO_Y3);
1418 writel(0x00000000, sdout_base + S5P_SDO_Y4);
1419 writel(0x00000000, sdout_base + S5P_SDO_Y5);
1420 writel(0x00000000, sdout_base + S5P_SDO_Y6);
1421 writel(0x00000000, sdout_base + S5P_SDO_Y7);
1422 writel(0x00000000, sdout_base + S5P_SDO_Y8);
1423 writel(0x00000000, sdout_base + S5P_SDO_Y9);
1424 writel(0x00000000, sdout_base + S5P_SDO_Y10);
1425 writel(0x00000251, sdout_base + S5P_SDO_Y11);
1426 writel(0x00000000, sdout_base + S5P_SDO_CB0);
1427 writel(0x00000000, sdout_base + S5P_SDO_CB1);
1428 writel(0x00000000, sdout_base + S5P_SDO_CB2);
1429 writel(0x00000000, sdout_base + S5P_SDO_CB3);
1430 writel(0x00000000, sdout_base + S5P_SDO_CB4);
1431 writel(0x00000001, sdout_base + S5P_SDO_CB5);
1432 writel(0x00000006, sdout_base + S5P_SDO_CB6);
1433 writel(0x00000013, sdout_base + S5P_SDO_CB7);
1434 writel(0x00000028, sdout_base + S5P_SDO_CB8);
1435 writel(0x0000003f, sdout_base + S5P_SDO_CB9);
1436 writel(0x00000051, sdout_base + S5P_SDO_CB10);
1437 writel(0x00000056, sdout_base + S5P_SDO_CB11);
1438 writel(0x00000000, sdout_base + S5P_SDO_CR1);
1439 writel(0x00000000, sdout_base + S5P_SDO_CR2);
1440 writel(0x00000000, sdout_base + S5P_SDO_CR3);
1441 writel(0x00000000, sdout_base + S5P_SDO_CR4);
1442 writel(0x00000002, sdout_base + S5P_SDO_CR5);
1443 writel(0x00000005, sdout_base + S5P_SDO_CR6);
1444 writel(0x00000018, sdout_base + S5P_SDO_CR7);
1445 writel(0x00000037, sdout_base + S5P_SDO_CR8);
1446 writel(0x0000005A, sdout_base + S5P_SDO_CR9);
1447 writel(0x00000076, sdout_base + S5P_SDO_CR10);
1448 writel(0x0000007e, sdout_base + S5P_SDO_CR11);
1449 break;
1450
1451 default:
1452 SDPRINTK("invalid composite_ratio parameter(%d)\n\r",
1453 composite_ratio);
1454 return S5P_TV_SD_ERR_INVALID_PARAM;
1455 }
1456
1457 break;
1458
1459 default:
1460 SDPRINTK(" invalid composite_level parameter(%d)\n\r",
1461 composite_level);
1462 return S5P_TV_SD_ERR_INVALID_PARAM;
1463 }
1464
1465 SDPRINTK("()\n\r");
1466
1467 return SDOUT_NO_ERROR;
1468
1469 }
1470
1471
1472 static enum s5p_tv_sd_err tv_sdout_init_oversampling_filter_coeff_default(
1473 enum s5p_tv_o_mode out_mode)
1474 {
1475 SDPRINTK("%d\n\r", out_mode);
1476
1477 switch (out_mode) {
1478
1479 case TVOUT_OUTPUT_COMPOSITE:
1480 case TVOUT_OUTPUT_SVIDEO:
1481 case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED:
1482 break;
1483
1484 default:
1485 SDPRINTK("invalid out_mode parameter(%d)\n\r", out_mode);
1486 return S5P_TV_SD_ERR_INVALID_PARAM;
1487 }
1488
1489 return SDOUT_NO_ERROR;
1490 }
1491
1492 /*
1493 * initialization
1494 * - iniization functions are only called under stopping sdout
1495 */
1496 enum s5p_tv_sd_err tv_sdout_init_display_mode(enum s5p_tv_disp_mode disp_mode,
1497 enum s5p_tv_o_mode out_mode,
1498 enum s5p_sd_order order)
1499 {
1500 u32 temp_reg = 0;
1501
1502 SDPRINTK(" %d,%d,%d\n\r", disp_mode, out_mode, order);
1503
1504 switch (disp_mode) {
1505
1506 case TVOUT_NTSC_M:
1507 temp_reg |= SDO_NTSC_M;
1508 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE,
1509 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_75IRE,
1510 SDOUT_VTOS_RATIO_10_4);
1511
1512 tv_sdout_init_antialias_filter_coeff_default(
1513 S5P_TV_SD_LEVEL_75IRE,
1514 SDOUT_VTOS_RATIO_10_4,
1515 out_mode);
1516 break;
1517
1518 case TVOUT_PAL_BDGHI:
1519 temp_reg |= SDO_PAL_BGHID;
1520 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE,
1521 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE,
1522 SDOUT_VTOS_RATIO_7_3);
1523
1524 tv_sdout_init_antialias_filter_coeff_default(
1525 S5P_TV_SD_LEVEL_0IRE,
1526 SDOUT_VTOS_RATIO_7_3,
1527 out_mode);
1528 break;
1529
1530 case TVOUT_PAL_M:
1531 temp_reg |= SDO_PAL_M;
1532 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE,
1533 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE,
1534 SDOUT_VTOS_RATIO_7_3);
1535
1536 tv_sdout_init_antialias_filter_coeff_default(
1537 S5P_TV_SD_LEVEL_0IRE,
1538 SDOUT_VTOS_RATIO_7_3,
1539 out_mode);
1540 break;
1541
1542 case TVOUT_PAL_N:
1543 temp_reg |= SDO_PAL_N;
1544 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE,
1545 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE,
1546 SDOUT_VTOS_RATIO_7_3);
1547
1548 tv_sdout_init_antialias_filter_coeff_default(
1549 S5P_TV_SD_LEVEL_75IRE,
1550 SDOUT_VTOS_RATIO_10_4,
1551 out_mode);
1552 break;
1553
1554 case TVOUT_PAL_NC:
1555 temp_reg |= SDO_PAL_NC;
1556 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE,
1557 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE,
1558 SDOUT_VTOS_RATIO_7_3);
1559
1560 tv_sdout_init_antialias_filter_coeff_default(
1561 S5P_TV_SD_LEVEL_0IRE,
1562 SDOUT_VTOS_RATIO_7_3,
1563 out_mode);
1564 break;
1565
1566 case TVOUT_PAL_60:
1567 temp_reg |= SDO_PAL_60;
1568 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE,
1569 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_0IRE,
1570 SDOUT_VTOS_RATIO_7_3);
1571 tv_sdout_init_antialias_filter_coeff_default(
1572 S5P_TV_SD_LEVEL_0IRE,
1573 SDOUT_VTOS_RATIO_7_3,
1574 out_mode);
1575 break;
1576
1577 case TVOUT_NTSC_443:
1578 temp_reg |= SDO_NTSC_443;
1579 tv_sdout_init_video_scale_cfg(S5P_TV_SD_LEVEL_0IRE,
1580 SDOUT_VTOS_RATIO_7_3, S5P_TV_SD_LEVEL_75IRE,
1581 SDOUT_VTOS_RATIO_10_4);
1582 tv_sdout_init_antialias_filter_coeff_default(
1583 S5P_TV_SD_LEVEL_75IRE,
1584 SDOUT_VTOS_RATIO_10_4,
1585 out_mode);
1586 break;
1587
1588 default:
1589 SDPRINTK("invalid disp_mode parameter(%d)\n\r", disp_mode);
1590 return S5P_TV_SD_ERR_INVALID_PARAM;
1591 }
1592
1593 switch (out_mode) {
1594
1595 case TVOUT_OUTPUT_COMPOSITE:
1596 case TVOUT_OUTPUT_SVIDEO:
1597 temp_reg |= SDO_COMPOSITE | SDO_INTERLACED;
1598
1599 switch (order) {
1600
1601 case S5P_TV_SD_O_ORDER_COMPOSITE_CVBS_Y_C:
1602 temp_reg |= SDO_DAC2_CVBS | SDO_DAC1_Y | SDO_DAC0_C;
1603 break;
1604
1605 case S5P_TV_SD_O_ORDER_COMPOSITE_CVBS_C_Y:
1606 temp_reg |= SDO_DAC2_CVBS | SDO_DAC1_C | SDO_DAC0_Y;
1607 break;
1608
1609 case S5P_TV_SD_O_ORDER_COMPOSITE_Y_C_CVBS:
1610 temp_reg |= SDO_DAC2_Y | SDO_DAC1_C | SDO_DAC0_CVBS;
1611 break;
1612
1613 case S5P_TV_SD_O_ORDER_COMPOSITE_Y_CVBS_C:
1614 temp_reg |= SDO_DAC2_Y | SDO_DAC1_CVBS | SDO_DAC0_C;
1615 break;
1616
1617 case S5P_TV_SD_O_ORDER_COMPOSITE_C_CVBS_Y:
1618 temp_reg |= SDO_DAC2_C | SDO_DAC1_CVBS | SDO_DAC0_Y;
1619 break;
1620
1621 case S5P_TV_SD_O_ORDER_COMPOSITE_C_Y_CVBS:
1622 temp_reg |= SDO_DAC2_C | SDO_DAC1_Y | SDO_DAC0_CVBS;
1623 break;
1624
1625 default:
1626 SDPRINTK(" invalid order parameter(%d)\n\r", order);
1627 return S5P_TV_SD_ERR_INVALID_PARAM;
1628 break;
1629 }
1630
1631 break;
1632
1633 case TVOUT_OUTPUT_COMPONENT_YPBPR_INERLACED:
1634 temp_reg |= SDO_COMPONENT | SDO_YPBPR | SDO_INTERLACED;
1635
1636 switch (order) {
1637
1638 case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB:
1639 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G |
1640 SDO_DAC0_PB_B;
1641 break;
1642
1643 case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY:
1644 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B |
1645 SDO_DAC0_Y_G;
1646 break;
1647
1648 case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR:
1649 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G |
1650 SDO_DAC0_PR_R;
1651 break;
1652
1653 case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY:
1654 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R |
1655 SDO_DAC0_Y_G;
1656 break;
1657
1658 case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB:
1659 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R |
1660 SDO_DAC0_PB_B;
1661 break;
1662
1663 case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR:
1664 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B |
1665 SDO_DAC0_PR_R;
1666 break;
1667
1668 default:
1669 SDPRINTK(" invalid order parameter(%d)\n\r", order);
1670 return S5P_TV_SD_ERR_INVALID_PARAM;
1671 break;
1672 }
1673
1674 break;
1675
1676 case TVOUT_OUTPUT_COMPONENT_YPBPR_PROGRESSIVE:
1677 temp_reg |= SDO_COMPONENT | SDO_YPBPR | SDO_PROGRESSIVE;
1678
1679 switch (order) {
1680
1681 case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB:
1682 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G |
1683 SDO_DAC0_PB_B;
1684 break;
1685
1686 case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY:
1687 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B |
1688 SDO_DAC0_Y_G;
1689 break;
1690
1691 case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR:
1692 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G |
1693 SDO_DAC0_PR_R;
1694 break;
1695
1696 case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY:
1697 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R |
1698 SDO_DAC0_Y_G;
1699 break;
1700
1701 case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB:
1702 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R |
1703 SDO_DAC0_PB_B;
1704 break;
1705
1706 case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR:
1707 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B |
1708 SDO_DAC0_PR_R;
1709 break;
1710
1711 default:
1712 SDPRINTK(" invalid order parameter(%d)\n\r", order);
1713 return S5P_TV_SD_ERR_INVALID_PARAM;
1714 }
1715
1716 break;
1717
1718 case TVOUT_OUTPUT_COMPONENT_RGB_PROGRESSIVE:
1719 temp_reg |= SDO_COMPONENT | SDO_RGB | SDO_PROGRESSIVE;
1720
1721 switch (order) {
1722
1723 case S5P_TV_SD_O_ORDER_COMPONENT_RGB_PRYPB:
1724 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_Y_G |
1725 SDO_DAC0_PB_B;
1726 break;
1727
1728 case S5P_TV_SD_O_ORDER_COMPONENT_RBG_PRPBY:
1729 temp_reg |= SDO_DAC2_PR_R | SDO_DAC1_PB_B |
1730 SDO_DAC0_Y_G;
1731 break;
1732
1733 case S5P_TV_SD_O_ORDER_COMPONENT_BGR_PBYPR:
1734 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_Y_G |
1735 SDO_DAC0_PR_R;
1736 break;
1737
1738 case S5P_TV_SD_O_ORDER_COMPONENT_BRG_PBPRY:
1739 temp_reg |= SDO_DAC2_PB_B | SDO_DAC1_PR_R |
1740 SDO_DAC0_Y_G;
1741 break;
1742
1743 case S5P_TV_SD_O_ORDER_COMPONENT_GRB_YPRPB:
1744 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PR_R |
1745 SDO_DAC0_PB_B;
1746 break;
1747
1748 case S5P_TV_SD_O_ORDER_COMPONENT_GBR_YPBPR:
1749 temp_reg |= SDO_DAC2_Y_G | SDO_DAC1_PB_B |
1750 SDO_DAC0_PR_R;
1751 break;
1752
1753 default:
1754 SDPRINTK("invalid order parameter(%d)\n\r", order);
1755 return S5P_TV_SD_ERR_INVALID_PARAM;
1756 }
1757
1758 break;
1759
1760 default:
1761 SDPRINTK(" invalid out_mode parameter(%d)\n\r", out_mode);
1762 return S5P_TV_SD_ERR_INVALID_PARAM;
1763 }
1764
1765 tv_sdout_init_oversampling_filter_coeff_default(out_mode);
1766
1767 writel(temp_reg, sdout_base + S5P_SDO_CONFIG);
1768
1769 SDPRINTK("0x%08x\n\r", readl(sdout_base + S5P_SDO_CONFIG));
1770
1771 return SDOUT_NO_ERROR;
1772 }
1773
1774 /*
1775 * start - start functions are only called under stopping SDOUT
1776 */
1777 void tv_sdout_start(void)
1778 {
1779 SDPRINTK("()\n\r");
1780
1781 writel(SDO_TVOUT_CLOCK_ON, sdout_base + S5P_SDO_CLKCON);
1782
1783 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_CLKCON));
1784 }
1785
1786 /*
1787 / stop - stop functions are only called under running SDOUT
1788 */
1789 void tv_sdout_stop(void)
1790 {
1791 SDPRINTK("()\n\r");
1792
1793 mdelay(100);
1794
1795 writel(SDO_TVOUT_CLOCK_OFF, sdout_base + S5P_SDO_CLKCON);
1796
1797 SDPRINTK(" 0x%x)\n\r", readl(sdout_base + S5P_SDO_CLKCON));
1798 }
1799
1800 /*
1801 * reset
1802 * - reset function
1803 */
1804 void tv_sdout_sw_reset(bool active)
1805 {
1806 SDPRINTK("%d\n\r", active);
1807
1808 if (active)
1809 writel(readl(sdout_base + S5P_SDO_CLKCON) |
1810 SDO_TVOUT_SW_RESET,
1811 sdout_base + S5P_SDO_CLKCON);
1812 else
1813 writel(readl(sdout_base + S5P_SDO_CLKCON) &
1814 ~SDO_TVOUT_SW_RESET,
1815 sdout_base + S5P_SDO_CLKCON);
1816
1817 SDPRINTK(" 0x%x\n\r", readl(sdout_base + S5P_SDO_CLKCON));
1818 }
1819
1820
1821 void tv_sdout_set_interrupt_enable(bool vsync_intr_en)
1822 {
1823 SDPRINTK("%d)\n\r", vsync_intr_en);
1824
1825 if (vsync_intr_en)
1826 writel(readl(sdout_base + S5P_SDO_IRQMASK) &
1827 ~SDO_VSYNC_IRQ_DISABLE,
1828 sdout_base + S5P_SDO_IRQMASK);
1829 else
1830 writel(readl(sdout_base + S5P_SDO_IRQMASK) |
1831 SDO_VSYNC_IRQ_DISABLE,
1832 sdout_base + S5P_SDO_IRQMASK);
1833
1834 SDPRINTK("0x%x)\n\r", readl(sdout_base + S5P_SDO_IRQMASK));
1835 }
1836
1837 void tv_sdout_clear_interrupt_pending(void)
1838 {
1839 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ));
1840
1841 writel(readl(sdout_base + S5P_SDO_IRQ) | SDO_VSYNC_IRQ_PEND,
1842 sdout_base + S5P_SDO_IRQ);
1843
1844 SDPRINTK("0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ));
1845 }
1846
1847 bool tv_sdout_get_interrupt_pending(void)
1848 {
1849 SDPRINTK(" 0x%x\n\r", readl(sdout_base + S5P_SDO_IRQ));
1850
1851 return (readl(sdout_base + S5P_SDO_IRQ) | SDO_VSYNC_IRQ_PEND) ?
1852 1 : 0;
1853 }
1854
1855 int __init tv_sdout_probe(struct platform_device *pdev, u32 res_num)
1856 {
1857 struct resource *res;
1858 size_t size;
1859
1860 res = platform_get_resource(pdev, IORESOURCE_MEM, res_num);
1861
1862 if (res == NULL) {
1863 dev_err(&pdev->dev,
1864 "failed to get memory region resource\n");
1865 goto error;
1866 }
1867
1868 size = (res->end - res->start) + 1;
1869
1870 sdout_mem = request_mem_region(res->start, size, pdev->name);
1871
1872 if (sdout_mem == NULL) {
1873 dev_err(&pdev->dev,
1874 "failed to get memory region\n");
1875 goto error;
1876 }
1877
1878 sdout_base = ioremap(res->start, size);
1879
1880 if (sdout_base == NULL) {
1881 dev_err(&pdev->dev,
1882 "failed to ioremap address region\n");
1883 goto error;
1884
1885 }
1886
1887 return 0;
1888 error:
1889 return -ENOENT;
1890
1891 }
1892
1893 int __init tv_sdout_release(struct platform_device *pdev)
1894 {
1895 iounmap(sdout_base);
1896
1897 /* remove memory region */
1898 if (sdout_mem != NULL) {
1899 if (release_resource(sdout_mem))
1900 dev_err(&pdev->dev,
1901 "Can't remove tvout drv !!\n");
1902
1903 kfree(sdout_mem);
1904
1905 sdout_mem = NULL;
1906 }
1907
1908 return 0;
1909 }
OLDNEW
« no previous file with comments | « drivers/media/video/samsung/tv20/s5p_tv_v4l2.c ('k') | drivers/media/video/samsung/tv20/tv_clock_s5pv210.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698