Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/media/dvb/ttpci/av7110_v4l.c
15111 views
1
/*
2
* av7110_v4l.c: av7110 video4linux interface for DVB and Siemens DVB-C analog module
3
*
4
* Copyright (C) 1999-2002 Ralph Metzler
5
* & Marcus Metzler for convergence integrated media GmbH
6
*
7
* originally based on code by:
8
* Copyright (C) 1998,1999 Christian Theiss <[email protected]>
9
*
10
* This program is free software; you can redistribute it and/or
11
* modify it under the terms of the GNU General Public License
12
* as published by the Free Software Foundation; either version 2
13
* of the License, or (at your option) any later version.
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
19
*
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the Free Software
22
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
24
*
25
* the project's page is at http://www.linuxtv.org/
26
*/
27
28
#include <linux/kernel.h>
29
#include <linux/types.h>
30
#include <linux/delay.h>
31
#include <linux/fs.h>
32
#include <linux/timer.h>
33
#include <linux/poll.h>
34
35
#include "av7110.h"
36
#include "av7110_hw.h"
37
#include "av7110_av.h"
38
39
int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val)
40
{
41
u8 msg[5] = { dev, reg >> 8, reg & 0xff, val >> 8 , val & 0xff };
42
struct i2c_msg msgs = { .flags = 0, .len = 5, .buf = msg };
43
44
switch (av7110->adac_type) {
45
case DVB_ADAC_MSP34x0:
46
msgs.addr = 0x40;
47
break;
48
case DVB_ADAC_MSP34x5:
49
msgs.addr = 0x42;
50
break;
51
default:
52
return 0;
53
}
54
55
if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) {
56
dprintk(1, "dvb-ttpci: failed @ card %d, %u = %u\n",
57
av7110->dvb_adapter.num, reg, val);
58
return -EIO;
59
}
60
return 0;
61
}
62
63
static int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
64
{
65
u8 msg1[3] = { dev, reg >> 8, reg & 0xff };
66
u8 msg2[2];
67
struct i2c_msg msgs[2] = {
68
{ .flags = 0 , .len = 3, .buf = msg1 },
69
{ .flags = I2C_M_RD, .len = 2, .buf = msg2 }
70
};
71
72
switch (av7110->adac_type) {
73
case DVB_ADAC_MSP34x0:
74
msgs[0].addr = 0x40;
75
msgs[1].addr = 0x40;
76
break;
77
case DVB_ADAC_MSP34x5:
78
msgs[0].addr = 0x42;
79
msgs[1].addr = 0x42;
80
break;
81
default:
82
return 0;
83
}
84
85
if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) {
86
dprintk(1, "dvb-ttpci: failed @ card %d, %u\n",
87
av7110->dvb_adapter.num, reg);
88
return -EIO;
89
}
90
*val = (msg2[0] << 8) | msg2[1];
91
return 0;
92
}
93
94
static struct v4l2_input inputs[4] = {
95
{
96
.index = 0,
97
.name = "DVB",
98
.type = V4L2_INPUT_TYPE_CAMERA,
99
.audioset = 1,
100
.tuner = 0, /* ignored */
101
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
102
.status = 0,
103
.capabilities = V4L2_IN_CAP_STD,
104
}, {
105
.index = 1,
106
.name = "Television",
107
.type = V4L2_INPUT_TYPE_TUNER,
108
.audioset = 2,
109
.tuner = 0,
110
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
111
.status = 0,
112
.capabilities = V4L2_IN_CAP_STD,
113
}, {
114
.index = 2,
115
.name = "Video",
116
.type = V4L2_INPUT_TYPE_CAMERA,
117
.audioset = 0,
118
.tuner = 0,
119
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
120
.status = 0,
121
.capabilities = V4L2_IN_CAP_STD,
122
}, {
123
.index = 3,
124
.name = "Y/C",
125
.type = V4L2_INPUT_TYPE_CAMERA,
126
.audioset = 0,
127
.tuner = 0,
128
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
129
.status = 0,
130
.capabilities = V4L2_IN_CAP_STD,
131
}
132
};
133
134
static int ves1820_writereg(struct saa7146_dev *dev, u8 addr, u8 reg, u8 data)
135
{
136
struct av7110 *av7110 = dev->ext_priv;
137
u8 buf[] = { 0x00, reg, data };
138
struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 3 };
139
140
dprintk(4, "dev: %p\n", dev);
141
142
if (1 != i2c_transfer(&av7110->i2c_adap, &msg, 1))
143
return -1;
144
return 0;
145
}
146
147
static int tuner_write(struct saa7146_dev *dev, u8 addr, u8 data [4])
148
{
149
struct av7110 *av7110 = dev->ext_priv;
150
struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = data, .len = 4 };
151
152
dprintk(4, "dev: %p\n", dev);
153
154
if (1 != i2c_transfer(&av7110->i2c_adap, &msg, 1))
155
return -1;
156
return 0;
157
}
158
159
static int ves1820_set_tv_freq(struct saa7146_dev *dev, u32 freq)
160
{
161
u32 div;
162
u8 config;
163
u8 buf[4];
164
165
dprintk(4, "freq: 0x%08x\n", freq);
166
167
/* magic number: 614. tuning with the frequency given by v4l2
168
is always off by 614*62.5 = 38375 kHz...*/
169
div = freq + 614;
170
171
buf[0] = (div >> 8) & 0x7f;
172
buf[1] = div & 0xff;
173
buf[2] = 0x8e;
174
175
if (freq < (u32) (16 * 168.25))
176
config = 0xa0;
177
else if (freq < (u32) (16 * 447.25))
178
config = 0x90;
179
else
180
config = 0x30;
181
config &= ~0x02;
182
183
buf[3] = config;
184
185
return tuner_write(dev, 0x61, buf);
186
}
187
188
static int stv0297_set_tv_freq(struct saa7146_dev *dev, u32 freq)
189
{
190
struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
191
u32 div;
192
u8 data[4];
193
194
div = (freq + 38900000 + 31250) / 62500;
195
196
data[0] = (div >> 8) & 0x7f;
197
data[1] = div & 0xff;
198
data[2] = 0xce;
199
200
if (freq < 45000000)
201
return -EINVAL;
202
else if (freq < 137000000)
203
data[3] = 0x01;
204
else if (freq < 403000000)
205
data[3] = 0x02;
206
else if (freq < 860000000)
207
data[3] = 0x04;
208
else
209
return -EINVAL;
210
211
if (av7110->fe->ops.i2c_gate_ctrl)
212
av7110->fe->ops.i2c_gate_ctrl(av7110->fe, 1);
213
return tuner_write(dev, 0x63, data);
214
}
215
216
217
218
static struct saa7146_standard analog_standard[];
219
static struct saa7146_standard dvb_standard[];
220
static struct saa7146_standard standard[];
221
222
static struct v4l2_audio msp3400_v4l2_audio = {
223
.index = 0,
224
.name = "Television",
225
.capability = V4L2_AUDCAP_STEREO
226
};
227
228
static int av7110_dvb_c_switch(struct saa7146_fh *fh)
229
{
230
struct saa7146_dev *dev = fh->dev;
231
struct saa7146_vv *vv = dev->vv_data;
232
struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
233
u16 adswitch;
234
int source, sync, err;
235
236
dprintk(4, "%p\n", av7110);
237
238
if ((vv->video_status & STATUS_OVERLAY) != 0) {
239
vv->ov_suspend = vv->video_fh;
240
err = saa7146_stop_preview(vv->video_fh); /* side effect: video_status is now 0, video_fh is NULL */
241
if (err != 0) {
242
dprintk(2, "suspending video failed\n");
243
vv->ov_suspend = NULL;
244
}
245
}
246
247
if (0 != av7110->current_input) {
248
dprintk(1, "switching to analog TV:\n");
249
adswitch = 1;
250
source = SAA7146_HPS_SOURCE_PORT_B;
251
sync = SAA7146_HPS_SYNC_PORT_B;
252
memcpy(standard, analog_standard, sizeof(struct saa7146_standard) * 2);
253
254
switch (av7110->current_input) {
255
case 1:
256
dprintk(1, "switching SAA7113 to Analog Tuner Input.\n");
257
msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0000); // loudspeaker source
258
msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0000); // headphone source
259
msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0000); // SCART 1 source
260
msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono
261
msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); // loudspeaker + headphone
262
msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume
263
264
if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820) {
265
if (ves1820_writereg(dev, 0x09, 0x0f, 0x60))
266
dprintk(1, "setting band in demodulator failed.\n");
267
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
268
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD)
269
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF)
270
}
271
if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1)
272
dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
273
break;
274
case 2:
275
dprintk(1, "switching SAA7113 to Video AV CVBS Input.\n");
276
if (i2c_writereg(av7110, 0x48, 0x02, 0xd2) != 1)
277
dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
278
break;
279
case 3:
280
dprintk(1, "switching SAA7113 to Video AV Y/C Input.\n");
281
if (i2c_writereg(av7110, 0x48, 0x02, 0xd9) != 1)
282
dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num);
283
break;
284
default:
285
dprintk(1, "switching SAA7113 to Input: AV7110: SAA7113: invalid input.\n");
286
}
287
} else {
288
adswitch = 0;
289
source = SAA7146_HPS_SOURCE_PORT_A;
290
sync = SAA7146_HPS_SYNC_PORT_A;
291
memcpy(standard, dvb_standard, sizeof(struct saa7146_standard) * 2);
292
dprintk(1, "switching DVB mode\n");
293
msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source
294
msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source
295
msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
296
msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono
297
msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
298
msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
299
300
if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820) {
301
if (ves1820_writereg(dev, 0x09, 0x0f, 0x20))
302
dprintk(1, "setting band in demodulator failed.\n");
303
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
304
saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
305
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
306
}
307
}
308
309
/* hmm, this does not do anything!? */
310
if (av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, adswitch))
311
dprintk(1, "ADSwitch error\n");
312
313
saa7146_set_hps_source_and_sync(dev, source, sync);
314
315
if (vv->ov_suspend != NULL) {
316
saa7146_start_preview(vv->ov_suspend);
317
vv->ov_suspend = NULL;
318
}
319
320
return 0;
321
}
322
323
static int vidioc_g_tuner(struct file *file, void *fh, struct v4l2_tuner *t)
324
{
325
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
326
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
327
u16 stereo_det;
328
s8 stereo;
329
330
dprintk(2, "VIDIOC_G_TUNER: %d\n", t->index);
331
332
if (!av7110->analog_tuner_flags || t->index != 0)
333
return -EINVAL;
334
335
memset(t, 0, sizeof(*t));
336
strcpy((char *)t->name, "Television");
337
338
t->type = V4L2_TUNER_ANALOG_TV;
339
t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO |
340
V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
341
t->rangelow = 772; /* 48.25 MHZ / 62.5 kHz = 772, see fi1216mk2-specs, page 2 */
342
t->rangehigh = 13684; /* 855.25 MHz / 62.5 kHz = 13684 */
343
/* FIXME: add the real signal strength here */
344
t->signal = 0xffff;
345
t->afc = 0;
346
347
/* FIXME: standard / stereo detection is still broken */
348
msp_readreg(av7110, MSP_RD_DEM, 0x007e, &stereo_det);
349
dprintk(1, "VIDIOC_G_TUNER: msp3400 TV standard detection: 0x%04x\n", stereo_det);
350
msp_readreg(av7110, MSP_RD_DSP, 0x0018, &stereo_det);
351
dprintk(1, "VIDIOC_G_TUNER: msp3400 stereo detection: 0x%04x\n", stereo_det);
352
stereo = (s8)(stereo_det >> 8);
353
if (stereo > 0x10) {
354
/* stereo */
355
t->rxsubchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO;
356
t->audmode = V4L2_TUNER_MODE_STEREO;
357
} else if (stereo < -0x10) {
358
/* bilingual */
359
t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
360
t->audmode = V4L2_TUNER_MODE_LANG1;
361
} else /* mono */
362
t->rxsubchans = V4L2_TUNER_SUB_MONO;
363
364
return 0;
365
}
366
367
static int vidioc_s_tuner(struct file *file, void *fh, struct v4l2_tuner *t)
368
{
369
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
370
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
371
u16 fm_matrix, src;
372
dprintk(2, "VIDIOC_S_TUNER: %d\n", t->index);
373
374
if (!av7110->analog_tuner_flags || av7110->current_input != 1)
375
return -EINVAL;
376
377
switch (t->audmode) {
378
case V4L2_TUNER_MODE_STEREO:
379
dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n");
380
fm_matrix = 0x3001; /* stereo */
381
src = 0x0020;
382
break;
383
case V4L2_TUNER_MODE_LANG1_LANG2:
384
dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1_LANG2\n");
385
fm_matrix = 0x3000; /* bilingual */
386
src = 0x0020;
387
break;
388
case V4L2_TUNER_MODE_LANG1:
389
dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n");
390
fm_matrix = 0x3000; /* mono */
391
src = 0x0000;
392
break;
393
case V4L2_TUNER_MODE_LANG2:
394
dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG2\n");
395
fm_matrix = 0x3000; /* mono */
396
src = 0x0010;
397
break;
398
default: /* case V4L2_TUNER_MODE_MONO: */
399
dprintk(2, "VIDIOC_S_TUNER: TDA9840_SET_MONO\n");
400
fm_matrix = 0x3000; /* mono */
401
src = 0x0030;
402
break;
403
}
404
msp_writereg(av7110, MSP_WR_DSP, 0x000e, fm_matrix);
405
msp_writereg(av7110, MSP_WR_DSP, 0x0008, src);
406
msp_writereg(av7110, MSP_WR_DSP, 0x0009, src);
407
msp_writereg(av7110, MSP_WR_DSP, 0x000a, src);
408
return 0;
409
}
410
411
static int vidioc_g_frequency(struct file *file, void *fh, struct v4l2_frequency *f)
412
{
413
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
414
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
415
416
dprintk(2, "VIDIOC_G_FREQ: freq:0x%08x.\n", f->frequency);
417
418
if (!av7110->analog_tuner_flags || av7110->current_input != 1)
419
return -EINVAL;
420
421
memset(f, 0, sizeof(*f));
422
f->type = V4L2_TUNER_ANALOG_TV;
423
f->frequency = av7110->current_freq;
424
return 0;
425
}
426
427
static int vidioc_s_frequency(struct file *file, void *fh, struct v4l2_frequency *f)
428
{
429
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
430
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
431
432
dprintk(2, "VIDIOC_S_FREQUENCY: freq:0x%08x.\n", f->frequency);
433
434
if (!av7110->analog_tuner_flags || av7110->current_input != 1)
435
return -EINVAL;
436
437
if (V4L2_TUNER_ANALOG_TV != f->type)
438
return -EINVAL;
439
440
msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0xffe0); /* fast mute */
441
msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0xffe0);
442
443
/* tune in desired frequency */
444
if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820)
445
ves1820_set_tv_freq(dev, f->frequency);
446
else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297)
447
stv0297_set_tv_freq(dev, f->frequency);
448
av7110->current_freq = f->frequency;
449
450
msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x003f); /* start stereo detection */
451
msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x0000);
452
msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); /* loudspeaker + headphone */
453
msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); /* SCART 1 volume */
454
return 0;
455
}
456
457
static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
458
{
459
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
460
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
461
462
dprintk(2, "VIDIOC_ENUMINPUT: %d\n", i->index);
463
464
if (av7110->analog_tuner_flags) {
465
if (i->index >= 4)
466
return -EINVAL;
467
} else {
468
if (i->index != 0)
469
return -EINVAL;
470
}
471
472
memcpy(i, &inputs[i->index], sizeof(struct v4l2_input));
473
474
return 0;
475
}
476
477
static int vidioc_g_input(struct file *file, void *fh, unsigned int *input)
478
{
479
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
480
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
481
482
*input = av7110->current_input;
483
dprintk(2, "VIDIOC_G_INPUT: %d\n", *input);
484
return 0;
485
}
486
487
static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
488
{
489
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
490
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
491
492
dprintk(2, "VIDIOC_S_INPUT: %d\n", input);
493
494
if (!av7110->analog_tuner_flags)
495
return 0;
496
497
if (input >= 4)
498
return -EINVAL;
499
500
av7110->current_input = input;
501
return av7110_dvb_c_switch(fh);
502
}
503
504
static int vidioc_g_audio(struct file *file, void *fh, struct v4l2_audio *a)
505
{
506
dprintk(2, "VIDIOC_G_AUDIO: %d\n", a->index);
507
if (a->index != 0)
508
return -EINVAL;
509
memcpy(a, &msp3400_v4l2_audio, sizeof(struct v4l2_audio));
510
return 0;
511
}
512
513
static int vidioc_s_audio(struct file *file, void *fh, struct v4l2_audio *a)
514
{
515
dprintk(2, "VIDIOC_S_AUDIO: %d\n", a->index);
516
return 0;
517
}
518
519
static int vidioc_g_sliced_vbi_cap(struct file *file, void *fh,
520
struct v4l2_sliced_vbi_cap *cap)
521
{
522
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
523
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
524
525
dprintk(2, "VIDIOC_G_SLICED_VBI_CAP\n");
526
if (cap->type != V4L2_BUF_TYPE_SLICED_VBI_OUTPUT)
527
return -EINVAL;
528
if (FW_VERSION(av7110->arm_app) >= 0x2623) {
529
cap->service_set = V4L2_SLICED_WSS_625;
530
cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
531
}
532
return 0;
533
}
534
535
static int vidioc_g_fmt_sliced_vbi_out(struct file *file, void *fh,
536
struct v4l2_format *f)
537
{
538
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
539
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
540
541
dprintk(2, "VIDIOC_G_FMT:\n");
542
if (FW_VERSION(av7110->arm_app) < 0x2623)
543
return -EINVAL;
544
memset(&f->fmt.sliced, 0, sizeof f->fmt.sliced);
545
if (av7110->wssMode) {
546
f->fmt.sliced.service_set = V4L2_SLICED_WSS_625;
547
f->fmt.sliced.service_lines[0][23] = V4L2_SLICED_WSS_625;
548
f->fmt.sliced.io_size = sizeof(struct v4l2_sliced_vbi_data);
549
}
550
return 0;
551
}
552
553
static int vidioc_s_fmt_sliced_vbi_out(struct file *file, void *fh,
554
struct v4l2_format *f)
555
{
556
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
557
struct av7110 *av7110 = (struct av7110 *)dev->ext_priv;
558
559
dprintk(2, "VIDIOC_S_FMT\n");
560
if (FW_VERSION(av7110->arm_app) < 0x2623)
561
return -EINVAL;
562
if (f->fmt.sliced.service_set != V4L2_SLICED_WSS_625 &&
563
f->fmt.sliced.service_lines[0][23] != V4L2_SLICED_WSS_625) {
564
memset(&f->fmt.sliced, 0, sizeof(f->fmt.sliced));
565
/* WSS controlled by firmware */
566
av7110->wssMode = 0;
567
av7110->wssData = 0;
568
return av7110_fw_cmd(av7110, COMTYPE_ENCODER,
569
SetWSSConfig, 1, 0);
570
} else {
571
memset(&f->fmt.sliced, 0, sizeof(f->fmt.sliced));
572
f->fmt.sliced.service_set = V4L2_SLICED_WSS_625;
573
f->fmt.sliced.service_lines[0][23] = V4L2_SLICED_WSS_625;
574
f->fmt.sliced.io_size = sizeof(struct v4l2_sliced_vbi_data);
575
/* WSS controlled by userspace */
576
av7110->wssMode = 1;
577
av7110->wssData = 0;
578
}
579
return 0;
580
}
581
582
static int av7110_vbi_reset(struct file *file)
583
{
584
struct saa7146_fh *fh = file->private_data;
585
struct saa7146_dev *dev = fh->dev;
586
struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
587
588
dprintk(2, "%s\n", __func__);
589
av7110->wssMode = 0;
590
av7110->wssData = 0;
591
if (FW_VERSION(av7110->arm_app) < 0x2623)
592
return 0;
593
else
594
return av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 1, 0);
595
}
596
597
static ssize_t av7110_vbi_write(struct file *file, const char __user *data, size_t count, loff_t *ppos)
598
{
599
struct saa7146_fh *fh = file->private_data;
600
struct saa7146_dev *dev = fh->dev;
601
struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
602
struct v4l2_sliced_vbi_data d;
603
int rc;
604
605
dprintk(2, "%s\n", __func__);
606
if (FW_VERSION(av7110->arm_app) < 0x2623 || !av7110->wssMode || count != sizeof d)
607
return -EINVAL;
608
if (copy_from_user(&d, data, count))
609
return -EFAULT;
610
if ((d.id != 0 && d.id != V4L2_SLICED_WSS_625) || d.field != 0 || d.line != 23)
611
return -EINVAL;
612
if (d.id)
613
av7110->wssData = ((d.data[1] << 8) & 0x3f00) | d.data[0];
614
else
615
av7110->wssData = 0x8000;
616
rc = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 1, av7110->wssData);
617
return (rc < 0) ? rc : count;
618
}
619
620
/****************************************************************************
621
* INITIALIZATION
622
****************************************************************************/
623
624
static u8 saa7113_init_regs[] = {
625
0x02, 0xd0,
626
0x03, 0x23,
627
0x04, 0x00,
628
0x05, 0x00,
629
0x06, 0xe9,
630
0x07, 0x0d,
631
0x08, 0x98,
632
0x09, 0x02,
633
0x0a, 0x80,
634
0x0b, 0x40,
635
0x0c, 0x40,
636
0x0d, 0x00,
637
0x0e, 0x01,
638
0x0f, 0x7c,
639
0x10, 0x48,
640
0x11, 0x0c,
641
0x12, 0x8b,
642
0x13, 0x1a,
643
0x14, 0x00,
644
0x15, 0x00,
645
0x16, 0x00,
646
0x17, 0x00,
647
0x18, 0x00,
648
0x19, 0x00,
649
0x1a, 0x00,
650
0x1b, 0x00,
651
0x1c, 0x00,
652
0x1d, 0x00,
653
0x1e, 0x00,
654
655
0x41, 0x77,
656
0x42, 0x77,
657
0x43, 0x77,
658
0x44, 0x77,
659
0x45, 0x77,
660
0x46, 0x77,
661
0x47, 0x77,
662
0x48, 0x77,
663
0x49, 0x77,
664
0x4a, 0x77,
665
0x4b, 0x77,
666
0x4c, 0x77,
667
0x4d, 0x77,
668
0x4e, 0x77,
669
0x4f, 0x77,
670
0x50, 0x77,
671
0x51, 0x77,
672
0x52, 0x77,
673
0x53, 0x77,
674
0x54, 0x77,
675
0x55, 0x77,
676
0x56, 0x77,
677
0x57, 0xff,
678
679
0xff
680
};
681
682
683
static struct saa7146_ext_vv av7110_vv_data_st;
684
static struct saa7146_ext_vv av7110_vv_data_c;
685
686
int av7110_init_analog_module(struct av7110 *av7110)
687
{
688
u16 version1, version2;
689
690
if (i2c_writereg(av7110, 0x80, 0x0, 0x80) == 1 &&
691
i2c_writereg(av7110, 0x80, 0x0, 0) == 1) {
692
printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n",
693
av7110->dvb_adapter.num);
694
av7110->adac_type = DVB_ADAC_MSP34x0;
695
} else if (i2c_writereg(av7110, 0x84, 0x0, 0x80) == 1 &&
696
i2c_writereg(av7110, 0x84, 0x0, 0) == 1) {
697
printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3415\n",
698
av7110->dvb_adapter.num);
699
av7110->adac_type = DVB_ADAC_MSP34x5;
700
} else
701
return -ENODEV;
702
703
msleep(100); // the probing above resets the msp...
704
msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1);
705
msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2);
706
dprintk(1, "dvb-ttpci: @ card %d MSP34xx version 0x%04x 0x%04x\n",
707
av7110->dvb_adapter.num, version1, version2);
708
msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00);
709
msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
710
msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source
711
msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source
712
msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume
713
msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
714
msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
715
msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x1900); // prescale SCART
716
717
if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
718
INFO(("saa7113 not accessible.\n"));
719
} else {
720
u8 *i = saa7113_init_regs;
721
722
if ((av7110->dev->pci->subsystem_vendor == 0x110a) && (av7110->dev->pci->subsystem_device == 0x0000)) {
723
/* Fujitsu/Siemens DVB-Cable */
724
av7110->analog_tuner_flags |= ANALOG_TUNER_VES1820;
725
} else if ((av7110->dev->pci->subsystem_vendor == 0x13c2) && (av7110->dev->pci->subsystem_device == 0x0002)) {
726
/* Hauppauge/TT DVB-C premium */
727
av7110->analog_tuner_flags |= ANALOG_TUNER_VES1820;
728
} else if ((av7110->dev->pci->subsystem_vendor == 0x13c2) && (av7110->dev->pci->subsystem_device == 0x000A)) {
729
/* Hauppauge/TT DVB-C premium */
730
av7110->analog_tuner_flags |= ANALOG_TUNER_STV0297;
731
}
732
733
/* setup for DVB by default */
734
if (av7110->analog_tuner_flags & ANALOG_TUNER_VES1820) {
735
if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20))
736
dprintk(1, "setting band in demodulator failed.\n");
737
} else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) {
738
saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD)
739
saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF)
740
}
741
742
/* init the saa7113 */
743
while (*i != 0xff) {
744
if (i2c_writereg(av7110, 0x48, i[0], i[1]) != 1) {
745
dprintk(1, "saa7113 initialization failed @ card %d", av7110->dvb_adapter.num);
746
break;
747
}
748
i += 2;
749
}
750
/* setup msp for analog sound: B/G Dual-FM */
751
msp_writereg(av7110, MSP_WR_DEM, 0x00bb, 0x02d0); // AD_CV
752
msp_writereg(av7110, MSP_WR_DEM, 0x0001, 3); // FIR1
753
msp_writereg(av7110, MSP_WR_DEM, 0x0001, 18); // FIR1
754
msp_writereg(av7110, MSP_WR_DEM, 0x0001, 27); // FIR1
755
msp_writereg(av7110, MSP_WR_DEM, 0x0001, 48); // FIR1
756
msp_writereg(av7110, MSP_WR_DEM, 0x0001, 66); // FIR1
757
msp_writereg(av7110, MSP_WR_DEM, 0x0001, 72); // FIR1
758
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 4); // FIR2
759
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 64); // FIR2
760
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 0); // FIR2
761
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 3); // FIR2
762
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 18); // FIR2
763
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 27); // FIR2
764
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 48); // FIR2
765
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 66); // FIR2
766
msp_writereg(av7110, MSP_WR_DEM, 0x0005, 72); // FIR2
767
msp_writereg(av7110, MSP_WR_DEM, 0x0083, 0xa000); // MODE_REG
768
msp_writereg(av7110, MSP_WR_DEM, 0x0093, 0x00aa); // DCO1_LO 5.74MHz
769
msp_writereg(av7110, MSP_WR_DEM, 0x009b, 0x04fc); // DCO1_HI
770
msp_writereg(av7110, MSP_WR_DEM, 0x00a3, 0x038e); // DCO2_LO 5.5MHz
771
msp_writereg(av7110, MSP_WR_DEM, 0x00ab, 0x04c6); // DCO2_HI
772
msp_writereg(av7110, MSP_WR_DEM, 0x0056, 0); // LOAD_REG 1/2
773
}
774
775
memcpy(standard, dvb_standard, sizeof(struct saa7146_standard) * 2);
776
/* set dd1 stream a & b */
777
saa7146_write(av7110->dev, DD1_STREAM_B, 0x00000000);
778
saa7146_write(av7110->dev, DD1_INIT, 0x03000700);
779
saa7146_write(av7110->dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
780
781
return 0;
782
}
783
784
int av7110_init_v4l(struct av7110 *av7110)
785
{
786
struct saa7146_dev* dev = av7110->dev;
787
struct saa7146_ext_vv *vv_data;
788
int ret;
789
790
/* special case DVB-C: these cards have an analog tuner
791
plus need some special handling, so we have separate
792
saa7146_ext_vv data for these... */
793
if (av7110->analog_tuner_flags)
794
vv_data = &av7110_vv_data_c;
795
else
796
vv_data = &av7110_vv_data_st;
797
ret = saa7146_vv_init(dev, vv_data);
798
799
if (ret) {
800
ERR(("cannot init capture device. skipping.\n"));
801
return -ENODEV;
802
}
803
vv_data->ops.vidioc_enum_input = vidioc_enum_input;
804
vv_data->ops.vidioc_g_input = vidioc_g_input;
805
vv_data->ops.vidioc_s_input = vidioc_s_input;
806
vv_data->ops.vidioc_g_tuner = vidioc_g_tuner;
807
vv_data->ops.vidioc_s_tuner = vidioc_s_tuner;
808
vv_data->ops.vidioc_g_frequency = vidioc_g_frequency;
809
vv_data->ops.vidioc_s_frequency = vidioc_s_frequency;
810
vv_data->ops.vidioc_g_audio = vidioc_g_audio;
811
vv_data->ops.vidioc_s_audio = vidioc_s_audio;
812
vv_data->ops.vidioc_g_sliced_vbi_cap = vidioc_g_sliced_vbi_cap;
813
vv_data->ops.vidioc_g_fmt_sliced_vbi_out = vidioc_g_fmt_sliced_vbi_out;
814
vv_data->ops.vidioc_s_fmt_sliced_vbi_out = vidioc_s_fmt_sliced_vbi_out;
815
816
if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_GRABBER)) {
817
ERR(("cannot register capture device. skipping.\n"));
818
saa7146_vv_release(dev);
819
return -ENODEV;
820
}
821
if (saa7146_register_device(&av7110->vbi_dev, dev, "av7110", VFL_TYPE_VBI))
822
ERR(("cannot register vbi v4l2 device. skipping.\n"));
823
return 0;
824
}
825
826
int av7110_exit_v4l(struct av7110 *av7110)
827
{
828
struct saa7146_dev* dev = av7110->dev;
829
830
saa7146_unregister_device(&av7110->v4l_dev, av7110->dev);
831
saa7146_unregister_device(&av7110->vbi_dev, av7110->dev);
832
833
saa7146_vv_release(dev);
834
835
return 0;
836
}
837
838
839
840
/* FIXME: these values are experimental values that look better than the
841
values from the latest "official" driver -- at least for me... (MiHu) */
842
static struct saa7146_standard standard[] = {
843
{
844
.name = "PAL", .id = V4L2_STD_PAL_BG,
845
.v_offset = 0x15, .v_field = 288,
846
.h_offset = 0x48, .h_pixels = 708,
847
.v_max_out = 576, .h_max_out = 768,
848
}, {
849
.name = "NTSC", .id = V4L2_STD_NTSC,
850
.v_offset = 0x10, .v_field = 244,
851
.h_offset = 0x40, .h_pixels = 708,
852
.v_max_out = 480, .h_max_out = 640,
853
}
854
};
855
856
static struct saa7146_standard analog_standard[] = {
857
{
858
.name = "PAL", .id = V4L2_STD_PAL_BG,
859
.v_offset = 0x1b, .v_field = 288,
860
.h_offset = 0x08, .h_pixels = 708,
861
.v_max_out = 576, .h_max_out = 768,
862
}, {
863
.name = "NTSC", .id = V4L2_STD_NTSC,
864
.v_offset = 0x10, .v_field = 244,
865
.h_offset = 0x40, .h_pixels = 708,
866
.v_max_out = 480, .h_max_out = 640,
867
}
868
};
869
870
static struct saa7146_standard dvb_standard[] = {
871
{
872
.name = "PAL", .id = V4L2_STD_PAL_BG,
873
.v_offset = 0x14, .v_field = 288,
874
.h_offset = 0x48, .h_pixels = 708,
875
.v_max_out = 576, .h_max_out = 768,
876
}, {
877
.name = "NTSC", .id = V4L2_STD_NTSC,
878
.v_offset = 0x10, .v_field = 244,
879
.h_offset = 0x40, .h_pixels = 708,
880
.v_max_out = 480, .h_max_out = 640,
881
}
882
};
883
884
static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
885
{
886
struct av7110 *av7110 = (struct av7110*) dev->ext_priv;
887
888
if (std->id & V4L2_STD_PAL) {
889
av7110->vidmode = AV7110_VIDEO_MODE_PAL;
890
av7110_set_vidmode(av7110, av7110->vidmode);
891
}
892
else if (std->id & V4L2_STD_NTSC) {
893
av7110->vidmode = AV7110_VIDEO_MODE_NTSC;
894
av7110_set_vidmode(av7110, av7110->vidmode);
895
}
896
else
897
return -1;
898
899
return 0;
900
}
901
902
903
static struct saa7146_ext_vv av7110_vv_data_st = {
904
.inputs = 1,
905
.audios = 1,
906
.capabilities = V4L2_CAP_SLICED_VBI_OUTPUT,
907
.flags = 0,
908
909
.stds = &standard[0],
910
.num_stds = ARRAY_SIZE(standard),
911
.std_callback = &std_callback,
912
913
.vbi_fops.open = av7110_vbi_reset,
914
.vbi_fops.release = av7110_vbi_reset,
915
.vbi_fops.write = av7110_vbi_write,
916
};
917
918
static struct saa7146_ext_vv av7110_vv_data_c = {
919
.inputs = 1,
920
.audios = 1,
921
.capabilities = V4L2_CAP_TUNER | V4L2_CAP_SLICED_VBI_OUTPUT,
922
.flags = SAA7146_USE_PORT_B_FOR_VBI,
923
924
.stds = &standard[0],
925
.num_stds = ARRAY_SIZE(standard),
926
.std_callback = &std_callback,
927
928
.vbi_fops.open = av7110_vbi_reset,
929
.vbi_fops.release = av7110_vbi_reset,
930
.vbi_fops.write = av7110_vbi_write,
931
};
932
933
934