xref: /rk3399_rockchip-uboot/drivers/video/sunxi/tve_common.c (revision d2e1ee686ab16c022d1a3049a35b4ce89a25d34e)
1*af4c874fSJernej Skrabec /*
2*af4c874fSJernej Skrabec  * TV encoder driver for Allwinner SoCs.
3*af4c874fSJernej Skrabec  *
4*af4c874fSJernej Skrabec  * (C) Copyright 2013-2014 Luc Verhaegen <libv@skynet.be>
5*af4c874fSJernej Skrabec  * (C) Copyright 2014-2015 Hans de Goede <hdegoede@redhat.com>
6*af4c874fSJernej Skrabec  * (C) Copyright 2017 Jernej Skrabec <jernej.skrabec@siol.net>
7*af4c874fSJernej Skrabec  *
8*af4c874fSJernej Skrabec  * SPDX-License-Identifier:	GPL-2.0+
9*af4c874fSJernej Skrabec  */
10*af4c874fSJernej Skrabec 
11*af4c874fSJernej Skrabec #include <common.h>
12*af4c874fSJernej Skrabec 
13*af4c874fSJernej Skrabec #include <asm/arch/tve.h>
14*af4c874fSJernej Skrabec #include <asm/io.h>
15*af4c874fSJernej Skrabec 
tvencoder_mode_set(struct sunxi_tve_reg * const tve,enum tve_mode mode)16*af4c874fSJernej Skrabec void tvencoder_mode_set(struct sunxi_tve_reg * const tve, enum tve_mode mode)
17*af4c874fSJernej Skrabec {
18*af4c874fSJernej Skrabec 	switch (mode) {
19*af4c874fSJernej Skrabec 	case tve_mode_vga:
20*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_GCTRL_DAC_INPUT(0, 1) |
21*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(1, 2) |
22*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(2, 3), &tve->gctrl);
23*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CFG0_VGA, &tve->cfg0);
24*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_DAC_CFG0_VGA, &tve->dac_cfg0);
25*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_UNKNOWN1_VGA, &tve->unknown1);
26*af4c874fSJernej Skrabec 		break;
27*af4c874fSJernej Skrabec 	case tve_mode_composite_pal_nc:
28*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CHROMA_FREQ_PAL_NC, &tve->chroma_freq);
29*af4c874fSJernej Skrabec 		/* Fall through */
30*af4c874fSJernej Skrabec 	case tve_mode_composite_pal:
31*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_GCTRL_DAC_INPUT(0, 1) |
32*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(1, 2) |
33*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(2, 3) |
34*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(3, 4), &tve->gctrl);
35*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CFG0_PAL, &tve->cfg0);
36*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_DAC_CFG0_COMPOSITE, &tve->dac_cfg0);
37*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_FILTER_COMPOSITE, &tve->filter);
38*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_PORCH_NUM_PAL, &tve->porch_num);
39*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_LINE_NUM_PAL, &tve->line_num);
40*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_BLANK_BLACK_LEVEL_PAL,
41*af4c874fSJernej Skrabec 		       &tve->blank_black_level);
42*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_UNKNOWN1_COMPOSITE, &tve->unknown1);
43*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CBR_LEVEL_PAL, &tve->cbr_level);
44*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_BURST_WIDTH_COMPOSITE, &tve->burst_width);
45*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_UNKNOWN2_PAL, &tve->unknown2);
46*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_ACTIVE_NUM_COMPOSITE, &tve->active_num);
47*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CHROMA_BW_GAIN_COMP, &tve->chroma_bw_gain);
48*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_NOTCH_WIDTH_COMPOSITE, &tve->notch_width);
49*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_RESYNC_NUM_PAL, &tve->resync_num);
50*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_SLAVE_PARA_COMPOSITE, &tve->slave_para);
51*af4c874fSJernej Skrabec 		break;
52*af4c874fSJernej Skrabec 	case tve_mode_composite_pal_m:
53*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CHROMA_FREQ_PAL_M, &tve->chroma_freq);
54*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_COLOR_BURST_PAL_M, &tve->color_burst);
55*af4c874fSJernej Skrabec 		/* Fall through */
56*af4c874fSJernej Skrabec 	case tve_mode_composite_ntsc:
57*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_GCTRL_DAC_INPUT(0, 1) |
58*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(1, 2) |
59*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(2, 3) |
60*af4c874fSJernej Skrabec 		       SUNXI_TVE_GCTRL_DAC_INPUT(3, 4), &tve->gctrl);
61*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CFG0_NTSC, &tve->cfg0);
62*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_DAC_CFG0_COMPOSITE, &tve->dac_cfg0);
63*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_FILTER_COMPOSITE, &tve->filter);
64*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_PORCH_NUM_NTSC, &tve->porch_num);
65*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_LINE_NUM_NTSC, &tve->line_num);
66*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_BLANK_BLACK_LEVEL_NTSC,
67*af4c874fSJernej Skrabec 		       &tve->blank_black_level);
68*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_UNKNOWN1_COMPOSITE, &tve->unknown1);
69*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CBR_LEVEL_NTSC, &tve->cbr_level);
70*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_BURST_PHASE_NTSC, &tve->burst_phase);
71*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_BURST_WIDTH_COMPOSITE, &tve->burst_width);
72*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_UNKNOWN2_NTSC, &tve->unknown2);
73*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_SYNC_VBI_LEVEL_NTSC, &tve->sync_vbi_level);
74*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_ACTIVE_NUM_COMPOSITE, &tve->active_num);
75*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_CHROMA_BW_GAIN_COMP, &tve->chroma_bw_gain);
76*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_NOTCH_WIDTH_COMPOSITE, &tve->notch_width);
77*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_RESYNC_NUM_NTSC, &tve->resync_num);
78*af4c874fSJernej Skrabec 		writel(SUNXI_TVE_SLAVE_PARA_COMPOSITE, &tve->slave_para);
79*af4c874fSJernej Skrabec 		break;
80*af4c874fSJernej Skrabec 	}
81*af4c874fSJernej Skrabec }
82*af4c874fSJernej Skrabec 
tvencoder_enable(struct sunxi_tve_reg * const tve)83*af4c874fSJernej Skrabec void tvencoder_enable(struct sunxi_tve_reg * const tve)
84*af4c874fSJernej Skrabec {
85*af4c874fSJernej Skrabec 	setbits_le32(&tve->gctrl, SUNXI_TVE_GCTRL_ENABLE);
86*af4c874fSJernej Skrabec }
87