aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx25840/cx25840-vbi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/cx25840/cx25840-vbi.c')
-rw-r--r--drivers/media/video/cx25840/cx25840-vbi.c152
1 files changed, 4 insertions, 148 deletions
diff --git a/drivers/media/video/cx25840/cx25840-vbi.c b/drivers/media/video/cx25840/cx25840-vbi.c
index c754b9d13369..69f2bbdbb929 100644
--- a/drivers/media/video/cx25840/cx25840-vbi.c
+++ b/drivers/media/video/cx25840/cx25840-vbi.c
@@ -82,150 +82,6 @@ static int decode_vps(u8 * dst, u8 * p)
82 return err & 0xf0; 82 return err & 0xf0;
83} 83}
84 84
85void cx25840_vbi_setup(struct i2c_client *client)
86{
87 struct cx25840_state *state = i2c_get_clientdata(client);
88 v4l2_std_id std = state->std;
89 int hblank,hactive,burst,vblank,vactive,sc,vblank656,src_decimation;
90 int luma_lpf,uv_lpf, comb;
91 u32 pll_int,pll_frac,pll_post;
92
93 /* datasheet startup, step 8d */
94 if (std & ~V4L2_STD_NTSC) {
95 cx25840_write(client, 0x49f, 0x11);
96 } else {
97 cx25840_write(client, 0x49f, 0x14);
98 }
99
100 if (std & V4L2_STD_625_50) {
101 hblank=0x084;
102 hactive=0x2d0;
103 burst=0x5d;
104 vblank=0x024;
105 vactive=0x244;
106 vblank656=0x28;
107 src_decimation=0x21f;
108
109 luma_lpf=2;
110 if (std & V4L2_STD_SECAM) {
111 uv_lpf=0;
112 comb=0;
113 sc=0x0a425f;
114 } else if (std == V4L2_STD_PAL_Nc) {
115 uv_lpf=1;
116 comb=0x20;
117 sc=556453;
118 } else {
119 uv_lpf=1;
120 comb=0x20;
121 sc=0x0a8263;
122 }
123 } else {
124 hactive=720;
125 hblank=122;
126 vactive=487;
127 luma_lpf=1;
128 uv_lpf=1;
129
130 src_decimation=0x21f;
131 if (std == V4L2_STD_PAL_60) {
132 vblank=26;
133 vblank656=26;
134 burst=0x5b;
135 luma_lpf=2;
136 comb=0x20;
137 sc=0x0a8263;
138 } else if (std == V4L2_STD_PAL_M) {
139 vblank=20;
140 vblank656=24;
141 burst=0x61;
142 comb=0x20;
143
144 sc=555452;
145 } else {
146 vblank=26;
147 vblank656=26;
148 burst=0x5b;
149 comb=0x66;
150 sc=556063;
151 }
152 }
153
154 /* DEBUG: Displays configured PLL frequency */
155 pll_int=cx25840_read(client, 0x108);
156 pll_frac=cx25840_read4(client, 0x10c)&0x1ffffff;
157 pll_post=cx25840_read(client, 0x109);
158 v4l_dbg(1, cx25840_debug, client,
159 "PLL regs = int: %u, frac: %u, post: %u\n",
160 pll_int,pll_frac,pll_post);
161
162 if (pll_post) {
163 int fin, fsc;
164 int pll= (28636363L*((((u64)pll_int)<<25L)+pll_frac)) >>25L;
165
166 pll/=pll_post;
167 v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n",
168 pll/1000000, pll%1000000);
169 v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n",
170 pll/8000000, (pll/8)%1000000);
171
172 fin=((u64)src_decimation*pll)>>12;
173 v4l_dbg(1, cx25840_debug, client, "ADC Sampling freq = "
174 "%d.%06d MHz\n",
175 fin/1000000,fin%1000000);
176
177 fsc= (((u64)sc)*pll) >> 24L;
178 v4l_dbg(1, cx25840_debug, client, "Chroma sub-carrier freq = "
179 "%d.%06d MHz\n",
180 fsc/1000000,fsc%1000000);
181
182 v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, "
183 "vblank %i, vactive %i, vblank656 %i, src_dec %i, "
184 "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x,"
185 " sc 0x%06x\n",
186 hblank, hactive, vblank, vactive, vblank656,
187 src_decimation, burst, luma_lpf, uv_lpf, comb, sc);
188 }
189
190 /* Sets horizontal blanking delay and active lines */
191 cx25840_write(client, 0x470, hblank);
192 cx25840_write(client, 0x471, 0xff&(((hblank>>8)&0x3)|(hactive <<4)));
193 cx25840_write(client, 0x472, hactive>>4);
194
195 /* Sets burst gate delay */
196 cx25840_write(client, 0x473, burst);
197
198 /* Sets vertical blanking delay and active duration */
199 cx25840_write(client, 0x474, vblank);
200 cx25840_write(client, 0x475, 0xff&(((vblank>>8)&0x3)|(vactive <<4)));
201 cx25840_write(client, 0x476, vactive>>4);
202 cx25840_write(client, 0x477, vblank656);
203
204 /* Sets src decimation rate */
205 cx25840_write(client, 0x478, 0xff&src_decimation);
206 cx25840_write(client, 0x479, 0xff&(src_decimation>>8));
207
208 /* Sets Luma and UV Low pass filters */
209 cx25840_write(client, 0x47a, luma_lpf<<6|((uv_lpf<<4)&0x30));
210
211 /* Enables comb filters */
212 cx25840_write(client, 0x47b, comb);
213
214 /* Sets SC Step*/
215 cx25840_write(client, 0x47c, sc);
216 cx25840_write(client, 0x47d, 0xff&sc>>8);
217 cx25840_write(client, 0x47e, 0xff&sc>>16);
218
219 /* Sets VBI parameters */
220 if (std & V4L2_STD_625_50) {
221 cx25840_write(client, 0x47f, 0x01);
222 state->vbi_line_offset = 5;
223 } else {
224 cx25840_write(client, 0x47f, 0x00);
225 state->vbi_line_offset = 8;
226 }
227}
228
229int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) 85int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
230{ 86{
231 struct cx25840_state *state = i2c_get_clientdata(client); 87 struct cx25840_state *state = i2c_get_clientdata(client);
@@ -292,8 +148,8 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
292 /* raw VBI */ 148 /* raw VBI */
293 memset(svbi, 0, sizeof(*svbi)); 149 memset(svbi, 0, sizeof(*svbi));
294 150
295 /* Setup VBI */ 151 /* Setup standard */
296 cx25840_vbi_setup(client); 152 cx25840_std_setup(client);
297 153
298 /* VBI Offset */ 154 /* VBI Offset */
299 cx25840_write(client, 0x47f, vbi_offset); 155 cx25840_write(client, 0x47f, vbi_offset);
@@ -304,8 +160,8 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
304 for (x = 0; x <= 23; x++) 160 for (x = 0; x <= 23; x++)
305 lcr[x] = 0x00; 161 lcr[x] = 0x00;
306 162
307 /* Setup VBI */ 163 /* Setup standard */
308 cx25840_vbi_setup(client); 164 cx25840_std_setup(client);
309 165
310 /* Sliced VBI */ 166 /* Sliced VBI */
311 cx25840_write(client, 0x404, 0x32); /* Ancillary data */ 167 cx25840_write(client, 0x404, 0x32); /* Ancillary data */