aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx25840
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2008-07-17 10:08:40 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-07-20 06:28:00 -0400
commitcb5aa1c62df81ba2cdbae7f7ce469b231d43aba6 (patch)
treec207c7de9968a112b7bc0387e41a4a7727540702 /drivers/media/video/cx25840
parent5de39b2b1f68253d79f3548ef2d103fd5edae563 (diff)
V4L/DVB (8376): cx25840: move cx25840_vbi_setup to core.c and rename to cx25840_std_setup
cx25840_vbi_setup has nothing to do with setting up VBI, but everything with setting up the standard. Move to cx25840-core.c and rename. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/cx25840')
-rw-r--r--drivers/media/video/cx25840/cx25840-core.c153
-rw-r--r--drivers/media/video/cx25840/cx25840-core.h2
-rw-r--r--drivers/media/video/cx25840/cx25840-vbi.c152
3 files changed, 155 insertions, 152 deletions
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
index 8d5f25caf01b..120c498cb60c 100644
--- a/drivers/media/video/cx25840/cx25840-core.c
+++ b/drivers/media/video/cx25840/cx25840-core.c
@@ -237,7 +237,7 @@ static void cx25840_initialize(struct i2c_client *client)
237 cx25840_write(client, 0x8d3, 0x1f); 237 cx25840_write(client, 0x8d3, 0x1f);
238 cx25840_write(client, 0x8e3, 0x03); 238 cx25840_write(client, 0x8e3, 0x03);
239 239
240 cx25840_vbi_setup(client); 240 cx25840_std_setup(client);
241 241
242 /* trial and error says these are needed to get audio */ 242 /* trial and error says these are needed to get audio */
243 cx25840_write(client, 0x914, 0xa0); 243 cx25840_write(client, 0x914, 0xa0);
@@ -337,7 +337,7 @@ static void cx23885_initialize(struct i2c_client *client)
337 finish_wait(&state->fw_wait, &wait); 337 finish_wait(&state->fw_wait, &wait);
338 destroy_workqueue(q); 338 destroy_workqueue(q);
339 339
340 cx25840_vbi_setup(client); 340 cx25840_std_setup(client);
341 341
342 /* (re)set input */ 342 /* (re)set input */
343 set_input(client, state->vid_input, state->aud_input); 343 set_input(client, state->vid_input, state->aud_input);
@@ -348,6 +348,153 @@ static void cx23885_initialize(struct i2c_client *client)
348 348
349/* ----------------------------------------------------------------------- */ 349/* ----------------------------------------------------------------------- */
350 350
351void cx25840_std_setup(struct i2c_client *client)
352{
353 struct cx25840_state *state = i2c_get_clientdata(client);
354 v4l2_std_id std = state->std;
355 int hblank, hactive, burst, vblank, vactive, sc;
356 int vblank656, src_decimation;
357 int luma_lpf, uv_lpf, comb;
358 u32 pll_int, pll_frac, pll_post;
359
360 /* datasheet startup, step 8d */
361 if (std & ~V4L2_STD_NTSC)
362 cx25840_write(client, 0x49f, 0x11);
363 else
364 cx25840_write(client, 0x49f, 0x14);
365
366 if (std & V4L2_STD_625_50) {
367 hblank = 132;
368 hactive = 720;
369 burst = 93;
370 vblank = 36;
371 vactive = 580;
372 vblank656 = 40;
373 src_decimation = 0x21f;
374 luma_lpf = 2;
375
376 if (std & V4L2_STD_SECAM) {
377 uv_lpf = 0;
378 comb = 0;
379 sc = 0x0a425f;
380 } else if (std == V4L2_STD_PAL_Nc) {
381 uv_lpf = 1;
382 comb = 0x20;
383 sc = 556453;
384 } else {
385 uv_lpf = 1;
386 comb = 0x20;
387 sc = 688739;
388 }
389 } else {
390 hactive = 720;
391 hblank = 122;
392 vactive = 487;
393 luma_lpf = 1;
394 uv_lpf = 1;
395
396 src_decimation = 0x21f;
397 if (std == V4L2_STD_PAL_60) {
398 vblank = 26;
399 vblank656 = 26;
400 burst = 0x5b;
401 luma_lpf = 2;
402 comb = 0x20;
403 sc = 688739;
404 } else if (std == V4L2_STD_PAL_M) {
405 vblank = 20;
406 vblank656 = 24;
407 burst = 0x61;
408 comb = 0x20;
409 sc = 555452;
410 } else {
411 vblank = 26;
412 vblank656 = 26;
413 burst = 0x5b;
414 comb = 0x66;
415 sc = 556063;
416 }
417 }
418
419 /* DEBUG: Displays configured PLL frequency */
420 pll_int = cx25840_read(client, 0x108);
421 pll_frac = cx25840_read4(client, 0x10c) & 0x1ffffff;
422 pll_post = cx25840_read(client, 0x109);
423 v4l_dbg(1, cx25840_debug, client,
424 "PLL regs = int: %u, frac: %u, post: %u\n",
425 pll_int, pll_frac, pll_post);
426
427 if (pll_post) {
428 int fin, fsc;
429 int pll = (28636363L * ((((u64)pll_int) << 25L) + pll_frac)) >> 25L;
430
431 pll /= pll_post;
432 v4l_dbg(1, cx25840_debug, client, "PLL = %d.%06d MHz\n",
433 pll / 1000000, pll % 1000000);
434 v4l_dbg(1, cx25840_debug, client, "PLL/8 = %d.%06d MHz\n",
435 pll / 8000000, (pll / 8) % 1000000);
436
437 fin = ((u64)src_decimation * pll) >> 12;
438 v4l_dbg(1, cx25840_debug, client,
439 "ADC Sampling freq = %d.%06d MHz\n",
440 fin / 1000000, fin % 1000000);
441
442 fsc = (((u64)sc) * pll) >> 24L;
443 v4l_dbg(1, cx25840_debug, client,
444 "Chroma sub-carrier freq = %d.%06d MHz\n",
445 fsc / 1000000, fsc % 1000000);
446
447 v4l_dbg(1, cx25840_debug, client, "hblank %i, hactive %i, "
448 "vblank %i, vactive %i, vblank656 %i, src_dec %i, "
449 "burst 0x%02x, luma_lpf %i, uv_lpf %i, comb 0x%02x, "
450 "sc 0x%06x\n",
451 hblank, hactive, vblank, vactive, vblank656,
452 src_decimation, burst, luma_lpf, uv_lpf, comb, sc);
453 }
454
455 /* Sets horizontal blanking delay and active lines */
456 cx25840_write(client, 0x470, hblank);
457 cx25840_write(client, 0x471,
458 0xff & (((hblank >> 8) & 0x3) | (hactive << 4)));
459 cx25840_write(client, 0x472, hactive >> 4);
460
461 /* Sets burst gate delay */
462 cx25840_write(client, 0x473, burst);
463
464 /* Sets vertical blanking delay and active duration */
465 cx25840_write(client, 0x474, vblank);
466 cx25840_write(client, 0x475,
467 0xff & (((vblank >> 8) & 0x3) | (vactive << 4)));
468 cx25840_write(client, 0x476, vactive >> 4);
469 cx25840_write(client, 0x477, vblank656);
470
471 /* Sets src decimation rate */
472 cx25840_write(client, 0x478, 0xff & src_decimation);
473 cx25840_write(client, 0x479, 0xff & (src_decimation >> 8));
474
475 /* Sets Luma and UV Low pass filters */
476 cx25840_write(client, 0x47a, luma_lpf << 6 | ((uv_lpf << 4) & 0x30));
477
478 /* Enables comb filters */
479 cx25840_write(client, 0x47b, comb);
480
481 /* Sets SC Step*/
482 cx25840_write(client, 0x47c, sc);
483 cx25840_write(client, 0x47d, 0xff & sc >> 8);
484 cx25840_write(client, 0x47e, 0xff & sc >> 16);
485
486 /* Sets VBI parameters */
487 if (std & V4L2_STD_625_50) {
488 cx25840_write(client, 0x47f, 0x01);
489 state->vbi_line_offset = 5;
490 } else {
491 cx25840_write(client, 0x47f, 0x00);
492 state->vbi_line_offset = 8;
493 }
494}
495
496/* ----------------------------------------------------------------------- */
497
351static void input_change(struct i2c_client *client) 498static void input_change(struct i2c_client *client)
352{ 499{
353 struct cx25840_state *state = i2c_get_clientdata(client); 500 struct cx25840_state *state = i2c_get_clientdata(client);
@@ -565,7 +712,7 @@ static int set_v4lstd(struct i2c_client *client)
565 } 712 }
566 cx25840_and_or(client, 0x400, ~0xf, fmt); 713 cx25840_and_or(client, 0x400, ~0xf, fmt);
567 cx25840_and_or(client, 0x403, ~0x3, pal_m); 714 cx25840_and_or(client, 0x403, ~0x3, pal_m);
568 cx25840_vbi_setup(client); 715 cx25840_std_setup(client);
569 if (!state->is_cx25836) 716 if (!state->is_cx25836)
570 input_change(client); 717 input_change(client);
571 return 0; 718 return 0;
diff --git a/drivers/media/video/cx25840/cx25840-core.h b/drivers/media/video/cx25840/cx25840-core.h
index 8bf797f48b09..27d8e52cd67e 100644
--- a/drivers/media/video/cx25840/cx25840-core.h
+++ b/drivers/media/video/cx25840/cx25840-core.h
@@ -61,6 +61,7 @@ int cx25840_write4(struct i2c_client *client, u16 addr, u32 value);
61u8 cx25840_read(struct i2c_client *client, u16 addr); 61u8 cx25840_read(struct i2c_client *client, u16 addr);
62u32 cx25840_read4(struct i2c_client *client, u16 addr); 62u32 cx25840_read4(struct i2c_client *client, u16 addr);
63int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned mask, u8 value); 63int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned mask, u8 value);
64void cx25840_std_setup(struct i2c_client *client);
64 65
65/* ----------------------------------------------------------------------- */ 66/* ----------------------------------------------------------------------- */
66/* cx25850-firmware.c */ 67/* cx25850-firmware.c */
@@ -73,7 +74,6 @@ void cx25840_audio_set_path(struct i2c_client *client);
73 74
74/* ----------------------------------------------------------------------- */ 75/* ----------------------------------------------------------------------- */
75/* cx25850-vbi.c */ 76/* cx25850-vbi.c */
76void cx25840_vbi_setup(struct i2c_client *client);
77int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg); 77int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg);
78 78
79#endif 79#endif
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 */