1b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen/*
2b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * linux/drivers/video/omap2/dss/venc.c
3b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen *
4b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * Copyright (C) 2009 Nokia Corporation
5b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
6b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen *
7b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * VENC settings from TI's DSS driver
8b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen *
9b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * This program is free software; you can redistribute it and/or modify it
10b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * under the terms of the GNU General Public License version 2 as published by
11b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * the Free Software Foundation.
12b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen *
13b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * This program is distributed in the hope that it will be useful, but WITHOUT
14b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * more details.
17b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen *
18b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * You should have received a copy of the GNU General Public License along with
19b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen * this program.  If not, see <http://www.gnu.org/licenses/>.
20b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen */
21b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
22b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define DSS_SUBSYS_NAME "VENC"
23b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
24b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/kernel.h>
25b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/module.h>
26b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/clk.h>
27b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/err.h>
28b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/io.h>
29b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/mutex.h>
30b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/completion.h>
31b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/delay.h>
32b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/string.h>
33b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/seq_file.h>
34b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/platform_device.h>
35b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include <linux/regulator/consumer.h>
364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen#include <linux/pm_runtime.h>
37a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen#include <linux/of.h>
38b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
39a0b38cc4d35e095f14ab0f486135f8a619ebfc14Tomi Valkeinen#include <video/omapdss.h>
40b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
41b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#include "dss.h"
42525dae613638320c880afcc0d8d6dd27141fc4e4Tomi Valkeinen#include "dss_features.h"
43b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
44b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen/* Venc registers */
45b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_REV_ID				0x00
46b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_STATUS				0x04
47b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_F_CONTROL				0x08
48b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_VIDOUT_CTRL			0x10
49b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_SYNC_CTRL				0x14
50b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_LLEN				0x1C
51b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_FLENS				0x20
52b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_HFLTR_CTRL				0x24
53b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_CC_CARR_WSS_CARR			0x28
54b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_C_PHASE				0x2C
55b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_GAIN_U				0x30
56b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_GAIN_V				0x34
57b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_GAIN_Y				0x38
58b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_BLACK_LEVEL			0x3C
59b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_BLANK_LEVEL			0x40
60b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_X_COLOR				0x44
61b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_M_CONTROL				0x48
62b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_BSTAMP_WSS_DATA			0x4C
63b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_S_CARR				0x50
64b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_LINE21				0x54
65b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_LN_SEL				0x58
66b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_L21__WC_CTL			0x5C
67b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_HTRIGGER_VTRIGGER			0x60
68b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_SAVID__EAVID			0x64
69b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_FLEN__FAL				0x68
70b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_LAL__PHASE_RESET			0x6C
71b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_HS_INT_START_STOP_X		0x70
72b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_HS_EXT_START_STOP_X		0x74
73b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_VS_INT_START_X			0x78
74b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_VS_INT_STOP_X__VS_INT_START_Y	0x7C
75b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_VS_INT_STOP_Y__VS_EXT_START_X	0x80
76b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_VS_EXT_STOP_X__VS_EXT_START_Y	0x84
77b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_VS_EXT_STOP_Y			0x88
78b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_AVID_START_STOP_X			0x90
79b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_AVID_START_STOP_Y			0x94
80b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_FID_INT_START_X__FID_INT_START_Y	0xA0
81b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_FID_INT_OFFSET_Y__FID_EXT_START_X	0xA4
82b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y	0xA8
83b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_TVDETGP_INT_START_STOP_X		0xB0
84b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_TVDETGP_INT_START_STOP_Y		0xB4
85b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_GEN_CTRL				0xB8
86b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_OUTPUT_CONTROL			0xC4
87b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_OUTPUT_TEST			0xC8
88b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define VENC_DAC_B__DAC_C			0xC8
89b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
90b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstruct venc_config {
91b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 f_control;
92b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 vidout_ctrl;
93b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 sync_ctrl;
94b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 llen;
95b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 flens;
96b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 hfltr_ctrl;
97b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 cc_carr_wss_carr;
98b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 c_phase;
99b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 gain_u;
100b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 gain_v;
101b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 gain_y;
102b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 black_level;
103b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 blank_level;
104b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 x_color;
105b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 m_control;
106b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 bstamp_wss_data;
107b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 s_carr;
108b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 line21;
109b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 ln_sel;
110b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 l21__wc_ctl;
111b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 htrigger_vtrigger;
112b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 savid__eavid;
113b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 flen__fal;
114b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 lal__phase_reset;
115b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 hs_int_start_stop_x;
116b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 hs_ext_start_stop_x;
117b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 vs_int_start_x;
118b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 vs_int_stop_x__vs_int_start_y;
119b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 vs_int_stop_y__vs_ext_start_x;
120b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 vs_ext_stop_x__vs_ext_start_y;
121b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 vs_ext_stop_y;
122b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 avid_start_stop_x;
123b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 avid_start_stop_y;
124b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 fid_int_start_x__fid_int_start_y;
125b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 fid_int_offset_y__fid_ext_start_x;
126b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 fid_ext_start_y__fid_ext_offset_y;
127b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 tvdetgp_int_start_stop_x;
128b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 tvdetgp_int_start_stop_y;
129b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 gen_ctrl;
130b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen};
131b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
132b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen/* from TRM */
133b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic const struct venc_config venc_config_pal_trm = {
134b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.f_control				= 0,
135b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vidout_ctrl				= 1,
136b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.sync_ctrl				= 0x40,
137b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.llen					= 0x35F, /* 863 */
138b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.flens					= 0x270, /* 624 */
139b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hfltr_ctrl				= 0,
140b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.cc_carr_wss_carr			= 0x2F7225ED,
141b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.c_phase				= 0,
142b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_u					= 0x111,
143b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_v					= 0x181,
144b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_y					= 0x140,
145b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.black_level				= 0x3B,
146b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.blank_level				= 0x3B,
147b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.x_color				= 0x7,
148b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.m_control				= 0x2,
149b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.bstamp_wss_data			= 0x3F,
150b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.s_carr					= 0x2A098ACB,
151b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.line21					= 0,
152b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.ln_sel					= 0x01290015,
153b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.l21__wc_ctl				= 0x0000F603,
154b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.htrigger_vtrigger			= 0,
155b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
156b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.savid__eavid				= 0x06A70108,
157b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.flen__fal				= 0x00180270,
158b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.lal__phase_reset			= 0x00040135,
159b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hs_int_start_stop_x			= 0x00880358,
160b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hs_ext_start_stop_x			= 0x000F035F,
161b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_start_x				= 0x01A70000,
162b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_stop_x__vs_int_start_y		= 0x000001A7,
163b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_stop_y__vs_ext_start_x		= 0x01AF0000,
164b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_ext_stop_x__vs_ext_start_y		= 0x000101AF,
165b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_ext_stop_y				= 0x00000025,
166b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.avid_start_stop_x			= 0x03530083,
167b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.avid_start_stop_y			= 0x026C002E,
168b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_int_start_x__fid_int_start_y	= 0x0001008A,
169b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_int_offset_y__fid_ext_start_x	= 0x002E0138,
170b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_ext_start_y__fid_ext_offset_y	= 0x01380001,
171b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
172b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.tvdetgp_int_start_stop_x		= 0x00140001,
173b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.tvdetgp_int_start_stop_y		= 0x00010001,
174b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gen_ctrl				= 0x00FF0000,
175b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen};
176b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
177b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen/* from TRM */
178b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic const struct venc_config venc_config_ntsc_trm = {
179b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.f_control				= 0,
180b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vidout_ctrl				= 1,
181b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.sync_ctrl				= 0x8040,
182b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.llen					= 0x359,
183b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.flens					= 0x20C,
184b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hfltr_ctrl				= 0,
185b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.cc_carr_wss_carr			= 0x043F2631,
186b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.c_phase				= 0,
187b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_u					= 0x102,
188b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_v					= 0x16C,
189b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_y					= 0x12F,
190b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.black_level				= 0x43,
191b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.blank_level				= 0x38,
192b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.x_color				= 0x7,
193b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.m_control				= 0x1,
194b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.bstamp_wss_data			= 0x38,
195b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.s_carr					= 0x21F07C1F,
196b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.line21					= 0,
197b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.ln_sel					= 0x01310011,
198b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.l21__wc_ctl				= 0x0000F003,
199b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.htrigger_vtrigger			= 0,
200b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
201b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.savid__eavid				= 0x069300F4,
202b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.flen__fal				= 0x0016020C,
203b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.lal__phase_reset			= 0x00060107,
204b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hs_int_start_stop_x			= 0x008E0350,
205b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hs_ext_start_stop_x			= 0x000F0359,
206b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_start_x				= 0x01A00000,
207b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_stop_x__vs_int_start_y		= 0x020701A0,
208b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_stop_y__vs_ext_start_x		= 0x01AC0024,
209b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_ext_stop_x__vs_ext_start_y		= 0x020D01AC,
210b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_ext_stop_y				= 0x00000006,
211b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.avid_start_stop_x			= 0x03480078,
212b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.avid_start_stop_y			= 0x02060024,
213b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_int_start_x__fid_int_start_y	= 0x0001008A,
214b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_int_offset_y__fid_ext_start_x	= 0x01AC0106,
215b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_ext_start_y__fid_ext_offset_y	= 0x01060006,
216b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
217b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.tvdetgp_int_start_stop_x		= 0x00140001,
218b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.tvdetgp_int_start_stop_y		= 0x00010001,
219b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gen_ctrl				= 0x00F90000,
220b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen};
221b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
222b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic const struct venc_config venc_config_pal_bdghi = {
223b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.f_control				= 0,
224b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vidout_ctrl				= 0,
225b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.sync_ctrl				= 0,
226b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hfltr_ctrl				= 0,
227b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.x_color				= 0,
228b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.line21					= 0,
229b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.ln_sel					= 21,
230b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.htrigger_vtrigger			= 0,
231b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.tvdetgp_int_start_stop_x		= 0x00140001,
232b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.tvdetgp_int_start_stop_y		= 0x00010001,
233b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gen_ctrl				= 0x00FB0000,
234b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
235b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.llen					= 864-1,
236b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.flens					= 625-1,
237b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.cc_carr_wss_carr			= 0x2F7625ED,
238b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.c_phase				= 0xDF,
239b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_u					= 0x111,
240b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_v					= 0x181,
241b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.gain_y					= 0x140,
242b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.black_level				= 0x3e,
243b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.blank_level				= 0x3e,
244b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.m_control				= 0<<2 | 1<<1,
245b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.bstamp_wss_data			= 0x42,
246b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.s_carr					= 0x2a098acb,
247b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.l21__wc_ctl				= 0<<13 | 0x16<<8 | 0<<0,
248b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.savid__eavid				= 0x06A70108,
249b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.flen__fal				= 23<<16 | 624<<0,
250b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.lal__phase_reset			= 2<<17 | 310<<0,
251b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hs_int_start_stop_x			= 0x00920358,
252b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hs_ext_start_stop_x			= 0x000F035F,
253b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_start_x				= 0x1a7<<16,
254b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_stop_x__vs_int_start_y		= 0x000601A7,
255b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_int_stop_y__vs_ext_start_x		= 0x01AF0036,
256b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_ext_stop_x__vs_ext_start_y		= 0x27101af,
257b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vs_ext_stop_y				= 0x05,
258b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.avid_start_stop_x			= 0x03530082,
259b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.avid_start_stop_y			= 0x0270002E,
260b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_int_start_x__fid_int_start_y	= 0x0005008A,
261b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_int_offset_y__fid_ext_start_x	= 0x002E0138,
262b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.fid_ext_start_y__fid_ext_offset_y	= 0x01380005,
263b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen};
264b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
265b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenconst struct omap_video_timings omap_dss_pal_timings = {
266b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.x_res		= 720,
267b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.y_res		= 574,
268d8d789416aa71253c6532c9adc7469cb947031f6Tomi Valkeinen	.pixelclock	= 13500000,
269b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hsw		= 64,
270b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hfp		= 12,
271b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hbp		= 68,
272b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vsw		= 5,
273b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vfp		= 5,
274b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vbp		= 41,
27523c8f88e8a140c8435658c369b26c7b60d8fe3c0Archit Taneja
27623c8f88e8a140c8435658c369b26c7b60d8fe3c0Archit Taneja	.interlace	= true,
277b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen};
278b288627350c456fe4006c3c4419584969a7ae6a1Tomi ValkeinenEXPORT_SYMBOL(omap_dss_pal_timings);
279b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
280b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenconst struct omap_video_timings omap_dss_ntsc_timings = {
281b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.x_res		= 720,
282b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.y_res		= 482,
283d8d789416aa71253c6532c9adc7469cb947031f6Tomi Valkeinen	.pixelclock	= 13500000,
284b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hsw		= 64,
285b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hfp		= 16,
286b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.hbp		= 58,
287b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vsw		= 6,
288b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vfp		= 6,
289b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	.vbp		= 31,
29023c8f88e8a140c8435658c369b26c7b60d8fe3c0Archit Taneja
29123c8f88e8a140c8435658c369b26c7b60d8fe3c0Archit Taneja	.interlace	= true,
292b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen};
293b288627350c456fe4006c3c4419584969a7ae6a1Tomi ValkeinenEXPORT_SYMBOL(omap_dss_ntsc_timings);
294b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
295b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic struct {
29630ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	struct platform_device *pdev;
297b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	void __iomem *base;
298b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	struct mutex venc_lock;
299b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 wss_data;
300b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	struct regulator *vdda_dac_reg;
3014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
3024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	struct clk	*tv_dac_clk;
303a5abf4721b5d27357d6a9623bde02ad44cffd40fArchit Taneja
304a5abf4721b5d27357d6a9623bde02ad44cffd40fArchit Taneja	struct omap_video_timings timings;
305febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja	enum omap_dss_venc_type type;
30689e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja	bool invert_polarity;
30781b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
3081f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen	struct omap_dss_device output;
309b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen} venc;
310b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
311b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic inline void venc_write_reg(int idx, u32 val)
312b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
313b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	__raw_writel(val, venc.base + idx);
314b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
315b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
316b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic inline u32 venc_read_reg(int idx)
317b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
318b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	u32 l = __raw_readl(venc.base + idx);
319b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	return l;
320b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
321b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
322b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic void venc_write_config(const struct venc_config *config)
323b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
324b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DSSDBG("write venc conf\n");
325b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
326b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_LLEN, config->llen);
327b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_FLENS, config->flens);
328b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_CC_CARR_WSS_CARR, config->cc_carr_wss_carr);
329b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_C_PHASE, config->c_phase);
330b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_GAIN_U, config->gain_u);
331b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_GAIN_V, config->gain_v);
332b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_GAIN_Y, config->gain_y);
333b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_BLACK_LEVEL, config->black_level);
334b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_BLANK_LEVEL, config->blank_level);
335b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_M_CONTROL, config->m_control);
336b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
337b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen			venc.wss_data);
338b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_S_CARR, config->s_carr);
339b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_L21__WC_CTL, config->l21__wc_ctl);
340b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_SAVID__EAVID, config->savid__eavid);
341b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_FLEN__FAL, config->flen__fal);
342b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_LAL__PHASE_RESET, config->lal__phase_reset);
343b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_HS_INT_START_STOP_X, config->hs_int_start_stop_x);
344b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_HS_EXT_START_STOP_X, config->hs_ext_start_stop_x);
345b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_VS_INT_START_X, config->vs_int_start_x);
346b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_VS_INT_STOP_X__VS_INT_START_Y,
347b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->vs_int_stop_x__vs_int_start_y);
348b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_VS_INT_STOP_Y__VS_EXT_START_X,
349b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->vs_int_stop_y__vs_ext_start_x);
350b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_VS_EXT_STOP_X__VS_EXT_START_Y,
351b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->vs_ext_stop_x__vs_ext_start_y);
352b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_VS_EXT_STOP_Y, config->vs_ext_stop_y);
353b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_AVID_START_STOP_X, config->avid_start_stop_x);
354b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_AVID_START_STOP_Y, config->avid_start_stop_y);
355b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_FID_INT_START_X__FID_INT_START_Y,
356b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->fid_int_start_x__fid_int_start_y);
357b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_FID_INT_OFFSET_Y__FID_EXT_START_X,
358b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->fid_int_offset_y__fid_ext_start_x);
359b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y,
360b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->fid_ext_start_y__fid_ext_offset_y);
361b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
362b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_DAC_B__DAC_C,  venc_read_reg(VENC_DAC_B__DAC_C));
363b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_VIDOUT_CTRL, config->vidout_ctrl);
364b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_HFLTR_CTRL, config->hfltr_ctrl);
365b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_X_COLOR, config->x_color);
366b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_LINE21, config->line21);
367b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_LN_SEL, config->ln_sel);
368b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_HTRIGGER_VTRIGGER, config->htrigger_vtrigger);
369b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_TVDETGP_INT_START_STOP_X,
370b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->tvdetgp_int_start_stop_x);
371b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_TVDETGP_INT_START_STOP_Y,
372b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		       config->tvdetgp_int_start_stop_y);
373b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_GEN_CTRL, config->gen_ctrl);
374b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_F_CONTROL, config->f_control);
375b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_SYNC_CTRL, config->sync_ctrl);
376b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
377b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
378b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic void venc_reset(void)
379b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
380b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	int t = 1000;
381b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
382b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	venc_write_reg(VENC_F_CONTROL, 1<<8);
383b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	while (venc_read_reg(VENC_F_CONTROL) & (1<<8)) {
384b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		if (--t == 0) {
385b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen			DSSERR("Failed to reset venc\n");
386b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen			return;
387b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		}
388b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	}
389b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
390c6f65e1a4381a2271de1b5dccc94d6c6faad26dcTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_SLEEP_AFTER_VENC_RESET
391b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	/* the magical sleep that makes things work */
392c6f65e1a4381a2271de1b5dccc94d6c6faad26dcTomi Valkeinen	/* XXX more info? What bug this circumvents? */
393b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	msleep(20);
394c6f65e1a4381a2271de1b5dccc94d6c6faad26dcTomi Valkeinen#endif
395b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
396b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
3974fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int venc_runtime_get(void)
398b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
3994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
4004fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	DSSDBG("venc_runtime_get\n");
4024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = pm_runtime_get_sync(&venc.pdev->dev);
4044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	WARN_ON(r < 0);
4054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return r < 0 ? r : 0;
4064fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
4074fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4084fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void venc_runtime_put(void)
4094fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
4104fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
4114fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4124fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	DSSDBG("venc_runtime_put\n");
4134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4140eaf9f52e94f756147dbfe1faf1f77a02378dbf9Tomi Valkeinen	r = pm_runtime_put_sync(&venc.pdev->dev);
4155be3aebd09f384fa2db8dda4fd99b73fc4be64f1Tomi Valkeinen	WARN_ON(r < 0 && r != -ENOSYS);
416b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
417b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
418b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinenstatic const struct venc_config *venc_timings_to_config(
419b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		struct omap_video_timings *timings)
420b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
421b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0)
422b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		return &venc_config_pal_trm;
423b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
424b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0)
425b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen		return &venc_config_ntsc_trm;
426b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
427b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	BUG();
428c6eee968d40d319f0ac7a8a63dcbc633d9e6a2eaTomi Valkeinen	return NULL;
429b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
430b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
43133ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinenstatic int venc_power_on(struct omap_dss_device *dssdev)
43237ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen{
4337ae9a71e09d098deecce1140acf4f5e529211270Tomi Valkeinen	struct omap_overlay_manager *mgr = venc.output.manager;
43437ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	u32 l;
43533ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	int r;
43637ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
437156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	r = venc_runtime_get();
438156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	if (r)
439156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja		goto err0;
440156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja
44137ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	venc_reset();
442a5abf4721b5d27357d6a9623bde02ad44cffd40fArchit Taneja	venc_write_config(venc_timings_to_config(&venc.timings));
44337ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
444febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja	dss_set_venc_output(venc.type);
44537ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	dss_set_dac_pwrdn_bgz(1);
44637ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
44737ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	l = 0;
44837ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
449febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja	if (venc.type == OMAP_DSS_VENC_TYPE_COMPOSITE)
45037ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen		l |= 1 << 1;
45137ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	else /* S-Video */
45237ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen		l |= (1 << 0) | (1 << 2);
45337ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
45489e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja	if (venc.invert_polarity == false)
45537ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen		l |= 1 << 3;
45637ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
45737ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	venc_write_reg(VENC_OUTPUT_CONTROL, l);
45837ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
4598f1f736c4521ac709d4c5805fa31d395804b162aArchit Taneja	dss_mgr_set_timings(mgr, &venc.timings);
46037ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
461ec8741078d0a644d68827c8a347ac6be153622b5Mark Brown	r = regulator_enable(venc.vdda_dac_reg);
462ec8741078d0a644d68827c8a347ac6be153622b5Mark Brown	if (r)
463156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja		goto err1;
46437ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
4658f1f736c4521ac709d4c5805fa31d395804b162aArchit Taneja	r = dss_mgr_enable(mgr);
46633ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	if (r)
467156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja		goto err2;
46833ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen
46933ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	return 0;
47033ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen
471156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Tanejaerr2:
472156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	regulator_disable(venc.vdda_dac_reg);
473156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Tanejaerr1:
47433ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	venc_write_reg(VENC_OUTPUT_CONTROL, 0);
47533ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	dss_set_dac_pwrdn_bgz(0);
47633ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen
477156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	venc_runtime_put();
478156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Tanejaerr0:
47933ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	return r;
48037ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen}
48137ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
48237ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinenstatic void venc_power_off(struct omap_dss_device *dssdev)
48337ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen{
4847ae9a71e09d098deecce1140acf4f5e529211270Tomi Valkeinen	struct omap_overlay_manager *mgr = venc.output.manager;
4858f1f736c4521ac709d4c5805fa31d395804b162aArchit Taneja
48637ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	venc_write_reg(VENC_OUTPUT_CONTROL, 0);
48737ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	dss_set_dac_pwrdn_bgz(0);
48837ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
4898f1f736c4521ac709d4c5805fa31d395804b162aArchit Taneja	dss_mgr_disable(mgr);
49037ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
49137ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	regulator_disable(venc.vdda_dac_reg);
492156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja
493156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	venc_runtime_put();
49437ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen}
49537ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
49609d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic int venc_display_enable(struct omap_dss_device *dssdev)
4970aca3c63e068e47616bdd54b9d19e4771db86e8eGrazvydas Ignotas{
4981f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen	struct omap_dss_device *out = &venc.output;
499156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	int r;
5000aca3c63e068e47616bdd54b9d19e4771db86e8eGrazvydas Ignotas
501156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	DSSDBG("venc_display_enable\n");
5020aca3c63e068e47616bdd54b9d19e4771db86e8eGrazvydas Ignotas
5030aca3c63e068e47616bdd54b9d19e4771db86e8eGrazvydas Ignotas	mutex_lock(&venc.venc_lock);
5040aca3c63e068e47616bdd54b9d19e4771db86e8eGrazvydas Ignotas
5058f1f736c4521ac709d4c5805fa31d395804b162aArchit Taneja	if (out == NULL || out->manager == NULL) {
5068f1f736c4521ac709d4c5805fa31d395804b162aArchit Taneja		DSSERR("Failed to enable display: no output/manager\n");
507156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja		r = -ENODEV;
508156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja		goto err0;
5090aca3c63e068e47616bdd54b9d19e4771db86e8eGrazvydas Ignotas	}
5100aca3c63e068e47616bdd54b9d19e4771db86e8eGrazvydas Ignotas
51133ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	r = venc_power_on(dssdev);
51233ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen	if (r)
513d3923933930273a2c1f724c50fe1dd829e196b31Tomi Valkeinen		goto err0;
51437ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
51537ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	venc.wss_data = 0;
51637ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
51714572c6356dc4361231ee8f4402468c1f36d2c34Tomi Valkeinen	mutex_unlock(&venc.venc_lock);
518156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja
51914572c6356dc4361231ee8f4402468c1f36d2c34Tomi Valkeinen	return 0;
52014572c6356dc4361231ee8f4402468c1f36d2c34Tomi Valkeinenerr0:
52137ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	mutex_unlock(&venc.venc_lock);
52237ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	return r;
523b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
524b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
52509d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic void venc_display_disable(struct omap_dss_device *dssdev)
526b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
527156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	DSSDBG("venc_display_disable\n");
528b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
52937ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	mutex_lock(&venc.venc_lock);
53037ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
53137ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen	venc_power_off(dssdev);
53237ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen
533156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	mutex_unlock(&venc.venc_lock);
534b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
535b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
53609d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic void venc_set_timings(struct omap_dss_device *dssdev,
537156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja		struct omap_video_timings *timings)
53869b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen{
53969b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen	DSSDBG("venc_set_timings\n");
54069b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen
541156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	mutex_lock(&venc.venc_lock);
542156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja
54369b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen	/* Reset WSS data when the TV standard changes. */
544a5abf4721b5d27357d6a9623bde02ad44cffd40fArchit Taneja	if (memcmp(&venc.timings, timings, sizeof(*timings)))
54569b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen		venc.wss_data = 0;
54669b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen
547a5abf4721b5d27357d6a9623bde02ad44cffd40fArchit Taneja	venc.timings = *timings;
548156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja
5495391e87d1259e45fbb153aad97fe21a41403b534Tomi Valkeinen	dispc_set_tv_pclk(13500000);
5505391e87d1259e45fbb153aad97fe21a41403b534Tomi Valkeinen
551156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja	mutex_unlock(&venc.venc_lock);
55269b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen}
55369b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen
55409d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic int venc_check_timings(struct omap_dss_device *dssdev,
555156fd99e92c30b0a894f7f4874c6901bfdc65c44Archit Taneja		struct omap_video_timings *timings)
55669b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen{
55769b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen	DSSDBG("venc_check_timings\n");
55869b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen
55969b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen	if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0)
56069b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen		return 0;
56169b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen
56269b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen	if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0)
56369b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen		return 0;
56469b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen
56569b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen	return -EINVAL;
56669b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen}
56769b2048f44ead2d278e25d12adf0494b469ffb1cTomi Valkeinen
568fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinenstatic void venc_get_timings(struct omap_dss_device *dssdev,
569fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		struct omap_video_timings *timings)
570fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen{
571fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	mutex_lock(&venc.venc_lock);
572fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
573fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	*timings = venc.timings;
574fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
575fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	mutex_unlock(&venc.venc_lock);
576fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen}
577fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
57809d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic u32 venc_get_wss(struct omap_dss_device *dssdev)
5793651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen{
5803651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	/* Invert due to VENC_L21_WC_CTL:INV=1 */
5813651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	return (venc.wss_data >> 8) ^ 0xfffff;
5823651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen}
5833651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
58409d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
5853651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen{
5863651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	const struct venc_config *config;
5874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
5883651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
5893651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	DSSDBG("venc_set_wss\n");
5903651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
5913651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	mutex_lock(&venc.venc_lock);
5923651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
593a5abf4721b5d27357d6a9623bde02ad44cffd40fArchit Taneja	config = venc_timings_to_config(&venc.timings);
5943651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
5953651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	/* Invert due to VENC_L21_WC_CTL:INV=1 */
5963651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	venc.wss_data = (wss ^ 0xfffff) << 8;
5973651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
5984fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = venc_runtime_get();
5994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r)
6004fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err;
6013651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
6023651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
6033651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen			venc.wss_data);
6043651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
6054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	venc_runtime_put();
6063651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
6074fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr:
6083651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen	mutex_unlock(&venc.venc_lock);
6093651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
6104fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return r;
6113651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen}
6123651131268d7eae63efdffe6fa4a361abd44d747Tomi Valkeinen
61309d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic void venc_set_type(struct omap_dss_device *dssdev,
614febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja		enum omap_dss_venc_type type)
615febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja{
616febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja	mutex_lock(&venc.venc_lock);
617febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja
618febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja	venc.type = type;
619febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja
620febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja	mutex_unlock(&venc.venc_lock);
621febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja}
622febe2905d08b238f4ee2eb7e99c402bf85f0f70fArchit Taneja
62309d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinenstatic void venc_invert_vid_out_polarity(struct omap_dss_device *dssdev,
62489e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja		bool invert_polarity)
62589e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja{
62689e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja	mutex_lock(&venc.venc_lock);
62789e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja
62889e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja	venc.invert_polarity = invert_polarity;
62989e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja
63089e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja	mutex_unlock(&venc.venc_lock);
63189e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja}
63289e7195634e563b72288bf13ef4dbdf4709d2d08Archit Taneja
6337e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinenstatic int venc_init_regulator(void)
634b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
6357e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinen	struct regulator *vdda_dac;
636b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
6377e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinen	if (venc.vdda_dac_reg != NULL)
6387e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinen		return 0;
6395f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen
640e6fa68ba82959bd2468271788d89e0fdb2f781e4Tomi Valkeinen	if (venc.pdev->dev.of_node)
641e6fa68ba82959bd2468271788d89e0fdb2f781e4Tomi Valkeinen		vdda_dac = devm_regulator_get(&venc.pdev->dev, "vdda");
642e6fa68ba82959bd2468271788d89e0fdb2f781e4Tomi Valkeinen	else
643e6fa68ba82959bd2468271788d89e0fdb2f781e4Tomi Valkeinen		vdda_dac = devm_regulator_get(&venc.pdev->dev, "vdda_dac");
6445f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen
6457e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinen	if (IS_ERR(vdda_dac)) {
64640359a9b08cc51362a4dddfa2beb3b59e24e2b53Tomi Valkeinen		if (PTR_ERR(vdda_dac) != -EPROBE_DEFER)
64740359a9b08cc51362a4dddfa2beb3b59e24e2b53Tomi Valkeinen			DSSERR("can't get VDDA_DAC regulator\n");
6487e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinen		return PTR_ERR(vdda_dac);
6495f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen	}
6505f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen
6517e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinen	venc.vdda_dac_reg = vdda_dac;
6527e436bb2e3b14706a8bbed21d8d244a89199a907Tomi Valkeinen
653b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	return 0;
654b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
655b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
656e40402cf182e798fd71824f4ad02fb51ce599bb2Tomi Valkeinenstatic void venc_dump_regs(struct seq_file *s)
657b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen{
658b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, venc_read_reg(r))
659b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
6604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (venc_runtime_get())
6614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		return;
662b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
663b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_F_CONTROL);
664b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_VIDOUT_CTRL);
665b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_SYNC_CTRL);
666b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_LLEN);
667b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_FLENS);
668b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_HFLTR_CTRL);
669b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_CC_CARR_WSS_CARR);
670b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_C_PHASE);
671b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_GAIN_U);
672b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_GAIN_V);
673b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_GAIN_Y);
674b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_BLACK_LEVEL);
675b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_BLANK_LEVEL);
676b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_X_COLOR);
677b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_M_CONTROL);
678b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_BSTAMP_WSS_DATA);
679b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_S_CARR);
680b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_LINE21);
681b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_LN_SEL);
682b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_L21__WC_CTL);
683b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_HTRIGGER_VTRIGGER);
684b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_SAVID__EAVID);
685b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_FLEN__FAL);
686b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_LAL__PHASE_RESET);
687b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_HS_INT_START_STOP_X);
688b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_HS_EXT_START_STOP_X);
689b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_VS_INT_START_X);
690b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_VS_INT_STOP_X__VS_INT_START_Y);
691b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_VS_INT_STOP_Y__VS_EXT_START_X);
692b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_VS_EXT_STOP_X__VS_EXT_START_Y);
693b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_VS_EXT_STOP_Y);
694b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_AVID_START_STOP_X);
695b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_AVID_START_STOP_Y);
696b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_FID_INT_START_X__FID_INT_START_Y);
697b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_FID_INT_OFFSET_Y__FID_EXT_START_X);
698b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y);
699b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_TVDETGP_INT_START_STOP_X);
700b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_TVDETGP_INT_START_STOP_Y);
701b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_GEN_CTRL);
702b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_OUTPUT_CONTROL);
703b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen	DUMPREG(VENC_OUTPUT_TEST);
704b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
7054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	venc_runtime_put();
706b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen
707b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen#undef DUMPREG
708b288627350c456fe4006c3c4419584969a7ae6a1Tomi Valkeinen}
70930ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
7104fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int venc_get_clocks(struct platform_device *pdev)
7114fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
7124fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	struct clk *clk;
7134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
7144fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (dss_has_feature(FEAT_VENC_REQUIRES_TV_DAC_CLK)) {
715b2c9c8ee7cec4c7d8fa90375f9de92ecf3045ebbArchit Taneja		clk = devm_clk_get(&pdev->dev, "tv_dac_clk");
7164fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		if (IS_ERR(clk)) {
7174fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen			DSSERR("can't get tv_dac_clk\n");
7184fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen			return PTR_ERR(clk);
7194fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		}
7204fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	} else {
7214fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		clk = NULL;
7224fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	}
7234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
7244fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	venc.tv_dac_clk = clk;
7254fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
7264fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return 0;
7274fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
7284fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
729fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinenstatic int venc_connect(struct omap_dss_device *dssdev,
730fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		struct omap_dss_device *dst)
731fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen{
732fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	struct omap_overlay_manager *mgr;
733fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	int r;
734fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
735fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	r = venc_init_regulator();
736fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	if (r)
737fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		return r;
738fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
739fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	mgr = omap_dss_get_overlay_manager(dssdev->dispc_channel);
740fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	if (!mgr)
741fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		return -ENODEV;
742fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
743fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	r = dss_mgr_connect(mgr, dssdev);
744fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	if (r)
745fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		return r;
746fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
747fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	r = omapdss_output_set_device(dssdev, dst);
748fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	if (r) {
749fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		DSSERR("failed to connect output to new device: %s\n",
750fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen				dst->name);
751fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		dss_mgr_disconnect(mgr, dssdev);
752fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		return r;
753fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	}
754fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
755fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	return 0;
756fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen}
757fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
758fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinenstatic void venc_disconnect(struct omap_dss_device *dssdev,
759fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		struct omap_dss_device *dst)
760fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen{
7619560dc1059222d059d494a64e5da4c54d23838daTomi Valkeinen	WARN_ON(dst != dssdev->dst);
762fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
7639560dc1059222d059d494a64e5da4c54d23838daTomi Valkeinen	if (dst != dssdev->dst)
764fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		return;
765fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
766fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	omapdss_output_unset_device(dssdev);
767fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
768fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	if (dssdev->manager)
769fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen		dss_mgr_disconnect(dssdev->manager, dssdev);
770fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen}
771fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
772fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinenstatic const struct omapdss_atv_ops venc_ops = {
773fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	.connect = venc_connect,
774fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	.disconnect = venc_disconnect,
775fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
77609d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.enable = venc_display_enable,
77709d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.disable = venc_display_disable,
778fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
77909d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.check_timings = venc_check_timings,
78009d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.set_timings = venc_set_timings,
781fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	.get_timings = venc_get_timings,
782fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
78309d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.set_type = venc_set_type,
78409d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.invert_vid_out_polarity = venc_invert_vid_out_polarity,
785fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
78609d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.set_wss = venc_set_wss,
78709d2e7cdebd53b7572380a215008b334ff6321a5Tomi Valkeinen	.get_wss = venc_get_wss,
788fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen};
789fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen
790b5a99c2626a4ace340a535775342e2a75fbe60e7Tomi Valkeinenstatic void venc_init_output(struct platform_device *pdev)
79181b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja{
7921f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen	struct omap_dss_device *out = &venc.output;
79381b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
7941f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen	out->dev = &pdev->dev;
79581b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja	out->id = OMAP_DSS_OUTPUT_VENC;
7961f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen	out->output_type = OMAP_DISPLAY_TYPE_VENC;
7977286a08fb5607dbcf1a47639609d53d76b60e957Tomi Valkeinen	out->name = "venc.0";
7982eea5ae6c102a5088e39733115ff7762a4674887Tomi Valkeinen	out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
799fb8efa49660ea450ad632c9d8b70f12e4a43a495Tomi Valkeinen	out->ops.atv = &venc_ops;
800b7328e14591fb532688db36ef894ac8c34948b4eTomi Valkeinen	out->owner = THIS_MODULE;
80181b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
8025d47dbc85228de3ce82dea11af3c169e66cbf520Tomi Valkeinen	omapdss_register_output(out);
80381b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja}
80481b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
80581b87f515f6abbbe4eef42835065db9d0831ef35Archit Tanejastatic void __exit venc_uninit_output(struct platform_device *pdev)
80681b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja{
8071f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen	struct omap_dss_device *out = &venc.output;
80881b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
8095d47dbc85228de3ce82dea11af3c169e66cbf520Tomi Valkeinen	omapdss_unregister_output(out);
81081b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja}
81181b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
812a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinenstatic int venc_probe_of(struct platform_device *pdev)
813a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen{
814a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	struct device_node *node = pdev->dev.of_node;
815a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	struct device_node *ep;
816a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	u32 channels;
817a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	int r;
818a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
819a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	ep = omapdss_of_get_first_endpoint(node);
820a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	if (!ep)
821a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		return 0;
822a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
823a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	venc.invert_polarity = of_property_read_bool(ep, "ti,invert-polarity");
824a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
825a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	r = of_property_read_u32(ep, "ti,channels", &channels);
826a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	if (r) {
827a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		dev_err(&pdev->dev,
828a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen			"failed to read property 'ti,channels': %d\n", r);
829a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		goto err;
830a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	}
831a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
832a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	switch (channels) {
833a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	case 1:
834a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		venc.type = OMAP_DSS_VENC_TYPE_COMPOSITE;
835a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		break;
836a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	case 2:
837a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		venc.type = OMAP_DSS_VENC_TYPE_SVIDEO;
838a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		break;
839a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	default:
840a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		dev_err(&pdev->dev, "bad channel propert '%d'\n", channels);
841a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		r = -EINVAL;
842a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		goto err;
843a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	}
844a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
845a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	of_node_put(ep);
846a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
847a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	return 0;
848a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinenerr:
849a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	of_node_put(ep);
850a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
851a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	return 0;
852a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen}
853a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
85430ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy/* VENC HW IP initialisation */
855b5a99c2626a4ace340a535775342e2a75fbe60e7Tomi Valkeinenstatic int omap_venchw_probe(struct platform_device *pdev)
85630ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy{
85730ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	u8 rev_id;
858ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	struct resource *venc_mem;
85938f3daf678d909e8ee5638f21a34f35c01343420Tomi Valkeinen	int r;
860ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy
86130ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	venc.pdev = pdev;
86230ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
86330ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	mutex_init(&venc.venc_lock);
86430ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
86530ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	venc.wss_data = 0;
86630ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
867ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	venc_mem = platform_get_resource(venc.pdev, IORESOURCE_MEM, 0);
868ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	if (!venc_mem) {
869ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy		DSSERR("can't get IORESOURCE_MEM VENC\n");
870cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen		return -EINVAL;
871ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	}
872cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen
8736e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall	venc.base = devm_ioremap(&pdev->dev, venc_mem->start,
8746e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall				 resource_size(venc_mem));
87530ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	if (!venc.base) {
87630ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy		DSSERR("can't ioremap VENC\n");
877cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen		return -ENOMEM;
87830ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	}
87930ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
8804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = venc_get_clocks(pdev);
8814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r)
882cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen		return r;
8834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
8844fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_enable(&pdev->dev);
8854fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
8864fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = venc_runtime_get();
8874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r)
888cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen		goto err_runtime_get;
88930ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
89030ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff);
891a06b62f8004bd95c132fa312e8593c9a10f466ecSumit Semwal	dev_dbg(&pdev->dev, "OMAP VENC rev %d\n", rev_id);
89230ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
8934fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	venc_runtime_put();
89430ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
895a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	if (pdev->dev.of_node) {
896a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		r = venc_probe_of(pdev);
897a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		if (r) {
898a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen			DSSERR("Invalid DT data\n");
899a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen			goto err_probe_of;
900a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		}
901a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	}
902a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
903e40402cf182e798fd71824f4ad02fb51ce599bb2Tomi Valkeinen	dss_debugfs_create_file("venc", venc_dump_regs);
904e40402cf182e798fd71824f4ad02fb51ce599bb2Tomi Valkeinen
90581b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja	venc_init_output(pdev);
90681b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
907cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen	return 0;
9084fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
909a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinenerr_probe_of:
910cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinenerr_runtime_get:
9114fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_disable(&pdev->dev);
9124fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return r;
91330ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy}
91430ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
9156e7e8f06b2c77dbb5d28062a174e4d67aec4b924Tomi Valkeinenstatic int __exit omap_venchw_remove(struct platform_device *pdev)
91630ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy{
91781b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja	venc_uninit_output(pdev);
91881b87f515f6abbbe4eef42835065db9d0831ef35Archit Taneja
9194fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_disable(&pdev->dev);
9204fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
92130ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	return 0;
92230ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy}
92330ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
9244fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int venc_runtime_suspend(struct device *dev)
9254fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
9264fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (venc.tv_dac_clk)
927f11766d1c210aca50e772f55457fea113d8f511aRajendra Nayak		clk_disable_unprepare(venc.tv_dac_clk);
9284fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
9294fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_runtime_put();
9304fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
9314fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return 0;
9324fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
9334fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
9344fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int venc_runtime_resume(struct device *dev)
9354fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
9364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
9374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
9384fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = dispc_runtime_get();
9394fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r < 0)
940852f083843af618eaa8997f7803c9aed8293fdf9Tomi Valkeinen		return r;
9414fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
9424fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (venc.tv_dac_clk)
943f11766d1c210aca50e772f55457fea113d8f511aRajendra Nayak		clk_prepare_enable(venc.tv_dac_clk);
9444fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
9454fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return 0;
9464fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
9474fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
9484fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic const struct dev_pm_ops venc_pm_ops = {
9494fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	.runtime_suspend = venc_runtime_suspend,
9504fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	.runtime_resume = venc_runtime_resume,
9514fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen};
9524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
953a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
954a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinenstatic const struct of_device_id venc_of_match[] = {
955a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	{ .compatible = "ti,omap2-venc", },
956a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	{ .compatible = "ti,omap3-venc", },
957a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	{ .compatible = "ti,omap4-venc", },
958a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen	{},
959a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen};
960a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen
96130ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamystatic struct platform_driver omap_venchw_driver = {
962b5a99c2626a4ace340a535775342e2a75fbe60e7Tomi Valkeinen	.probe		= omap_venchw_probe,
9636e7e8f06b2c77dbb5d28062a174e4d67aec4b924Tomi Valkeinen	.remove         = __exit_p(omap_venchw_remove),
96430ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	.driver         = {
96530ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy		.name   = "omapdss_venc",
96630ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy		.owner  = THIS_MODULE,
9674fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		.pm	= &venc_pm_ops,
968a2207021f22d74cc0485042e296b016a2199e443Tomi Valkeinen		.of_match_table = venc_of_match,
969422ccbd57170d18cfd9d4c0cdbdd4603929fc51bTomi Valkeinen		.suppress_bind_attrs = true,
97030ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy	},
97130ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy};
97230ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
9736e7e8f06b2c77dbb5d28062a174e4d67aec4b924Tomi Valkeinenint __init venc_init_platform_driver(void)
97430ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy{
975b5a99c2626a4ace340a535775342e2a75fbe60e7Tomi Valkeinen	return platform_driver_register(&omap_venchw_driver);
97630ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy}
97730ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy
9786e7e8f06b2c77dbb5d28062a174e4d67aec4b924Tomi Valkeinenvoid __exit venc_uninit_platform_driver(void)
97930ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy{
98004c742c3dccac296fdc52b464bd0491ffe88de23Tomi Valkeinen	platform_driver_unregister(&omap_venchw_driver);
98130ea50c9f5166a375b4dc0109d18a5d21bab5711Senthilvadivu Guruswamy}
982