V4L/DVB (11379): mxb: fix copy-and-paste bug in mute.
[deliverable/linux.git] / drivers / media / video / mxb.c
CommitLineData
1da177e4
LT
1/*
2 mxb - v4l2 driver for the Multimedia eXtension Board
a8733ca5 3
6acaba8e 4 Copyright (C) 1998-2006 Michael Hunold <michael@mihu.de>
1da177e4
LT
5
6 Visit http://www.mihu.de/linux/saa7146/mxb/
7 for further details about this card.
a8733ca5 8
1da177e4
LT
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22*/
23
24#define DEBUG_VARIABLE debug
25
26#include <media/saa7146_vv.h>
27#include <media/tuner.h>
5e453dc7 28#include <media/v4l2-common.h>
707ecf46 29#include <media/saa7115.h>
1da177e4
LT
30
31#include "mxb.h"
32#include "tea6415c.h"
33#include "tea6420.h"
1da177e4 34
1b8dac15
HV
35#define I2C_SAA5246A 0x11
36#define I2C_SAA7111A 0x24
37#define I2C_TDA9840 0x42
38#define I2C_TEA6415C 0x43
39#define I2C_TEA6420_1 0x4c
40#define I2C_TEA6420_2 0x4d
41#define I2C_TUNER 0x60
1da177e4 42
a8733ca5 43#define MXB_BOARD_CAN_DO_VBI(dev) (dev->revision != 0)
1da177e4
LT
44
45/* global variable */
ff699e6b 46static int mxb_num;
1da177e4 47
a8733ca5 48/* initial frequence the tuner will be tuned to.
1da177e4
LT
49 in verden (lower saxony, germany) 4148 is a
50 channel called "phoenix" */
51static int freq = 4148;
52module_param(freq, int, 0644);
53MODULE_PARM_DESC(freq, "initial frequency the tuner will be tuned to while setup");
54
ff699e6b 55static int debug;
1da177e4
LT
56module_param(debug, int, 0644);
57MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off).");
58
59#define MXB_INPUTS 4
60enum { TUNER, AUX1, AUX3, AUX3_YC };
61
62static struct v4l2_input mxb_inputs[MXB_INPUTS] = {
a8733ca5 63 { TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
1da177e4
LT
64 { AUX1, "AUX1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
65 { AUX3, "AUX3 Composite", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
66 { AUX3_YC, "AUX3 S-Video", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
67};
68
69/* this array holds the information, which port of the saa7146 each
70 input actually uses. the mxb uses port 0 for every input */
71static struct {
72 int hps_source;
73 int hps_sync;
a8733ca5 74} input_port_selection[MXB_INPUTS] = {
1da177e4
LT
75 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
76 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
77 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
78 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
79};
80
81/* this array holds the information of the audio source (mxb_audios),
82 which has to be switched corresponding to the video source (mxb_channels) */
83static int video_audio_connect[MXB_INPUTS] =
84 { 0, 1, 3, 3 };
85
1b8dac15
HV
86/* These are the necessary input-output-pins for bringing one audio source
87 (see above) to the CD-output. Note that gain is set to 0 in this table. */
88static struct v4l2_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
89 { { 1, 1 }, { 1, 1 } }, /* Tuner */
90 { { 5, 1 }, { 6, 1 } }, /* AUX 1 */
91 { { 4, 1 }, { 6, 1 } }, /* AUX 2 */
92 { { 3, 1 }, { 6, 1 } }, /* AUX 3 */
93 { { 1, 1 }, { 3, 1 } }, /* Radio */
94 { { 1, 1 }, { 2, 1 } }, /* CD-Rom */
95 { { 6, 1 }, { 6, 1 } } /* Mute */
96};
97
98/* These are the necessary input-output-pins for bringing one audio source
99 (see above) to the line-output. Note that gain is set to 0 in this table. */
100static struct v4l2_routing TEA6420_line[MXB_AUDIOS + 1][2] = {
101 { { 2, 3 }, { 1, 2 } },
102 { { 5, 3 }, { 6, 2 } },
103 { { 4, 3 }, { 6, 2 } },
104 { { 3, 3 }, { 6, 2 } },
105 { { 2, 3 }, { 3, 2 } },
106 { { 2, 3 }, { 2, 2 } },
107 { { 6, 3 }, { 6, 2 } } /* Mute */
108};
1da177e4
LT
109
110#define MAXCONTROLS 1
111static struct v4l2_queryctrl mxb_controls[] = {
112 { V4L2_CID_AUDIO_MUTE, V4L2_CTRL_TYPE_BOOLEAN, "Mute", 0, 1, 1, 0, 0 },
113};
114
1da177e4
LT
115struct mxb
116{
117 struct video_device *video_dev;
118 struct video_device *vbi_dev;
119
a8733ca5 120 struct i2c_adapter i2c_adapter;
1da177e4 121
1b8dac15
HV
122 struct v4l2_subdev *saa7111a;
123 struct v4l2_subdev *tda9840;
124 struct v4l2_subdev *tea6415c;
125 struct v4l2_subdev *tuner;
126 struct v4l2_subdev *tea6420_1;
127 struct v4l2_subdev *tea6420_2;
1da177e4
LT
128
129 int cur_mode; /* current audio mode (mono, stereo, ...) */
130 int cur_input; /* current input */
1da177e4 131 int cur_mute; /* current mute status */
9d2599d9 132 struct v4l2_frequency cur_freq; /* current frequency the tuner is tuned to */
1da177e4
LT
133};
134
1b8dac15
HV
135#define saa7111a_call(mxb, o, f, args...) \
136 v4l2_subdev_call(mxb->saa7111a, o, f, ##args)
137#define tea6420_1_call(mxb, o, f, args...) \
138 v4l2_subdev_call(mxb->tea6420_1, o, f, ##args)
139#define tea6420_2_call(mxb, o, f, args...) \
140 v4l2_subdev_call(mxb->tea6420_2, o, f, ##args)
141#define tda9840_call(mxb, o, f, args...) \
142 v4l2_subdev_call(mxb->tda9840, o, f, ##args)
143#define tea6415c_call(mxb, o, f, args...) \
144 v4l2_subdev_call(mxb->tea6415c, o, f, ##args)
145#define tuner_call(mxb, o, f, args...) \
146 v4l2_subdev_call(mxb->tuner, o, f, ##args)
147#define call_all(dev, o, f, args...) \
148 v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args)
961f80f9 149
1b8dac15 150static struct saa7146_extension extension;
961f80f9 151
1b8dac15 152static int mxb_probe(struct saa7146_dev *dev)
1da177e4 153{
1b8dac15 154 struct mxb *mxb = NULL;
1da177e4 155
7408187d 156 mxb = kzalloc(sizeof(struct mxb), GFP_KERNEL);
1b8dac15 157 if (mxb == NULL) {
1da177e4
LT
158 DEB_D(("not enough kernel memory.\n"));
159 return -ENOMEM;
160 }
1da177e4 161
9ebeae56
HV
162 snprintf(mxb->i2c_adapter.name, sizeof(mxb->i2c_adapter.name), "mxb%d", mxb_num);
163
1da177e4 164 saa7146_i2c_adapter_prepare(dev, &mxb->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
1b8dac15 165 if (i2c_add_adapter(&mxb->i2c_adapter) < 0) {
1da177e4
LT
166 DEB_S(("cannot register i2c-device. skipping.\n"));
167 kfree(mxb);
168 return -EFAULT;
169 }
170
e6574f2f
HV
171 mxb->saa7111a = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
172 "saa7115", "saa7111", I2C_SAA7111A);
173 mxb->tea6420_1 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
174 "tea6420", "tea6420", I2C_TEA6420_1);
175 mxb->tea6420_2 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
176 "tea6420", "tea6420", I2C_TEA6420_2);
177 mxb->tea6415c = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
178 "tea6415c", "tea6415c", I2C_TEA6415C);
179 mxb->tda9840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
180 "tda9840", "tda9840", I2C_TDA9840);
181 mxb->tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
182 "tuner", "tuner", I2C_TUNER);
183 if (v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
184 "saa5246a", "saa5246a", I2C_SAA5246A)) {
1b8dac15
HV
185 printk(KERN_INFO "mxb: found teletext decoder\n");
186 }
1da177e4
LT
187
188 /* check if all devices are present */
5fa1247a
AV
189 if (!mxb->tea6420_1 || !mxb->tea6420_2 || !mxb->tea6415c ||
190 !mxb->tda9840 || !mxb->saa7111a || !mxb->tuner) {
1da177e4
LT
191 printk("mxb: did not find all i2c devices. aborting\n");
192 i2c_del_adapter(&mxb->i2c_adapter);
193 kfree(mxb);
194 return -ENODEV;
195 }
196
a8733ca5 197 /* all devices are present, probe was successful */
1da177e4
LT
198
199 /* we store the pointer in our private data field */
200 dev->ext_priv = mxb;
201
202 return 0;
203}
204
a8733ca5 205/* some init data for the saa7740, the so-called 'sound arena module'.
1da177e4
LT
206 there are no specs available, so we simply use some init values */
207static struct {
208 int length;
209 char data[9];
210} mxb_saa7740_init[] = {
211 { 3, { 0x80, 0x00, 0x00 } },{ 3, { 0x80, 0x89, 0x00 } },
212 { 3, { 0x80, 0xb0, 0x0a } },{ 3, { 0x00, 0x00, 0x00 } },
213 { 3, { 0x49, 0x00, 0x00 } },{ 3, { 0x4a, 0x00, 0x00 } },
214 { 3, { 0x4b, 0x00, 0x00 } },{ 3, { 0x4c, 0x00, 0x00 } },
215 { 3, { 0x4d, 0x00, 0x00 } },{ 3, { 0x4e, 0x00, 0x00 } },
216 { 3, { 0x4f, 0x00, 0x00 } },{ 3, { 0x50, 0x00, 0x00 } },
217 { 3, { 0x51, 0x00, 0x00 } },{ 3, { 0x52, 0x00, 0x00 } },
218 { 3, { 0x53, 0x00, 0x00 } },{ 3, { 0x54, 0x00, 0x00 } },
219 { 3, { 0x55, 0x00, 0x00 } },{ 3, { 0x56, 0x00, 0x00 } },
220 { 3, { 0x57, 0x00, 0x00 } },{ 3, { 0x58, 0x00, 0x00 } },
221 { 3, { 0x59, 0x00, 0x00 } },{ 3, { 0x5a, 0x00, 0x00 } },
222 { 3, { 0x5b, 0x00, 0x00 } },{ 3, { 0x5c, 0x00, 0x00 } },
223 { 3, { 0x5d, 0x00, 0x00 } },{ 3, { 0x5e, 0x00, 0x00 } },
224 { 3, { 0x5f, 0x00, 0x00 } },{ 3, { 0x60, 0x00, 0x00 } },
225 { 3, { 0x61, 0x00, 0x00 } },{ 3, { 0x62, 0x00, 0x00 } },
226 { 3, { 0x63, 0x00, 0x00 } },{ 3, { 0x64, 0x00, 0x00 } },
227 { 3, { 0x65, 0x00, 0x00 } },{ 3, { 0x66, 0x00, 0x00 } },
228 { 3, { 0x67, 0x00, 0x00 } },{ 3, { 0x68, 0x00, 0x00 } },
229 { 3, { 0x69, 0x00, 0x00 } },{ 3, { 0x6a, 0x00, 0x00 } },
230 { 3, { 0x6b, 0x00, 0x00 } },{ 3, { 0x6c, 0x00, 0x00 } },
231 { 3, { 0x6d, 0x00, 0x00 } },{ 3, { 0x6e, 0x00, 0x00 } },
232 { 3, { 0x6f, 0x00, 0x00 } },{ 3, { 0x70, 0x00, 0x00 } },
233 { 3, { 0x71, 0x00, 0x00 } },{ 3, { 0x72, 0x00, 0x00 } },
234 { 3, { 0x73, 0x00, 0x00 } },{ 3, { 0x74, 0x00, 0x00 } },
235 { 3, { 0x75, 0x00, 0x00 } },{ 3, { 0x76, 0x00, 0x00 } },
236 { 3, { 0x77, 0x00, 0x00 } },{ 3, { 0x41, 0x00, 0x42 } },
237 { 3, { 0x42, 0x10, 0x42 } },{ 3, { 0x43, 0x20, 0x42 } },
238 { 3, { 0x44, 0x30, 0x42 } },{ 3, { 0x45, 0x00, 0x01 } },
239 { 3, { 0x46, 0x00, 0x01 } },{ 3, { 0x47, 0x00, 0x01 } },
240 { 3, { 0x48, 0x00, 0x01 } },
241 { 9, { 0x01, 0x03, 0xc5, 0x5c, 0x7a, 0x85, 0x01, 0x00, 0x54 } },
242 { 9, { 0x21, 0x03, 0xc5, 0x5c, 0x7a, 0x85, 0x01, 0x00, 0x54 } },
243 { 9, { 0x09, 0x0b, 0xb4, 0x6b, 0x74, 0x85, 0x95, 0x00, 0x34 } },
244 { 9, { 0x29, 0x0b, 0xb4, 0x6b, 0x74, 0x85, 0x95, 0x00, 0x34 } },
245 { 9, { 0x11, 0x17, 0x43, 0x62, 0x68, 0x89, 0xd1, 0xff, 0xb0 } },
246 { 9, { 0x31, 0x17, 0x43, 0x62, 0x68, 0x89, 0xd1, 0xff, 0xb0 } },
247 { 9, { 0x19, 0x20, 0x62, 0x51, 0x5a, 0x95, 0x19, 0x01, 0x50 } },
248 { 9, { 0x39, 0x20, 0x62, 0x51, 0x5a, 0x95, 0x19, 0x01, 0x50 } },
249 { 9, { 0x05, 0x3e, 0xd2, 0x69, 0x4e, 0x9a, 0x51, 0x00, 0xf0 } },
250 { 9, { 0x25, 0x3e, 0xd2, 0x69, 0x4e, 0x9a, 0x51, 0x00, 0xf0 } },
251 { 9, { 0x0d, 0x3d, 0xa1, 0x40, 0x7d, 0x9f, 0x29, 0xfe, 0x14 } },
252 { 9, { 0x2d, 0x3d, 0xa1, 0x40, 0x7d, 0x9f, 0x29, 0xfe, 0x14 } },
253 { 9, { 0x15, 0x73, 0xa1, 0x50, 0x5d, 0xa6, 0xf5, 0xfe, 0x38 } },
254 { 9, { 0x35, 0x73, 0xa1, 0x50, 0x5d, 0xa6, 0xf5, 0xfe, 0x38 } },
255 { 9, { 0x1d, 0xed, 0xd0, 0x68, 0x29, 0xb4, 0xe1, 0x00, 0xb8 } },
256 { 9, { 0x3d, 0xed, 0xd0, 0x68, 0x29, 0xb4, 0xe1, 0x00, 0xb8 } },
257 { 3, { 0x80, 0xb3, 0x0a } },
2633812f 258 {-1, { 0 } }
1da177e4
LT
259};
260
1da177e4
LT
261/* bring hardware to a sane state. this has to be done, just in case someone
262 wants to capture from this device before it has been properly initialized.
263 the capture engine would badly fail, because no valid signal arrives on the
264 saa7146, thus leading to timeouts and stuff. */
265static int mxb_init_done(struct saa7146_dev* dev)
266{
267 struct mxb* mxb = (struct mxb*)dev->ext_priv;
1da177e4 268 struct i2c_msg msg;
85369df3 269 struct tuner_setup tun_setup;
6acaba8e 270 v4l2_std_id std = V4L2_STD_PAL_BG;
707ecf46 271 struct v4l2_routing route;
1da177e4
LT
272
273 int i = 0, err = 0;
1da177e4
LT
274
275 /* select video mode in saa7111a */
f41737ec 276 saa7111a_call(mxb, core, s_std, std);
1da177e4
LT
277
278 /* select tuner-output on saa7111a */
279 i = 0;
707ecf46
HV
280 route.input = SAA7115_COMPOSITE0;
281 route.output = SAA7111_FMT_CCIR | SAA7111_VBI_BYPASS;
1b8dac15 282 saa7111a_call(mxb, video, s_routing, &route);
1da177e4
LT
283
284 /* select a tuner type */
85369df3
MCC
285 tun_setup.mode_mask = T_ANALOG_TV;
286 tun_setup.addr = ADDR_UNSET;
9d2599d9 287 tun_setup.type = TUNER_PHILIPS_PAL;
1b8dac15 288 tuner_call(mxb, tuner, s_type_addr, &tun_setup);
9d2599d9
MH
289 /* tune in some frequency on tuner */
290 mxb->cur_freq.tuner = 0;
291 mxb->cur_freq.type = V4L2_TUNER_ANALOG_TV;
292 mxb->cur_freq.frequency = freq;
1b8dac15 293 tuner_call(mxb, tuner, s_frequency, &mxb->cur_freq);
9d2599d9 294
6acaba8e 295 /* set a default video standard */
f41737ec 296 tuner_call(mxb, core, s_std, std);
6acaba8e 297
1da177e4 298 /* mute audio on tea6420s */
1b8dac15
HV
299 tea6420_1_call(mxb, audio, s_routing, &TEA6420_line[6][0]);
300 tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[6][1]);
c0ff2915
HV
301 tea6420_1_call(mxb, audio, s_routing, &TEA6420_cd[6][0]);
302 tea6420_2_call(mxb, audio, s_routing, &TEA6420_cd[6][1]);
1da177e4 303
1b8dac15
HV
304 /* switch to tuner-channel on tea6415c */
305 route.input = 3;
306 route.output = 17;
307 tea6415c_call(mxb, video, s_routing, &route);
1da177e4 308
1b8dac15
HV
309 /* select tuner-output on multicable on tea6415c */
310 route.input = 3;
311 route.output = 13;
312 tea6415c_call(mxb, video, s_routing, &route);
a8733ca5 313
1da177e4
LT
314 /* the rest for mxb */
315 mxb->cur_input = 0;
1da177e4
LT
316 mxb->cur_mute = 1;
317
318 mxb->cur_mode = V4L2_TUNER_MODE_STEREO;
a8733ca5 319
1da177e4 320 /* check if the saa7740 (aka 'sound arena module') is present
a8733ca5 321 on the mxb. if so, we must initialize it. due to lack of
1da177e4
LT
322 informations about the saa7740, the values were reverse
323 engineered. */
324 msg.addr = 0x1b;
325 msg.flags = 0;
326 msg.len = mxb_saa7740_init[0].length;
327 msg.buf = &mxb_saa7740_init[0].data[0];
328
2633812f
HV
329 err = i2c_transfer(&mxb->i2c_adapter, &msg, 1);
330 if (err == 1) {
1da177e4
LT
331 /* the sound arena module is a pos, that's probably the reason
332 philips refuses to hand out a datasheet for the saa7740...
333 it seems to screw up the i2c bus, so we disable fast irq
334 based i2c transactions here and rely on the slow and safe
335 polling method ... */
336 extension.flags &= ~SAA7146_USE_I2C_IRQ;
2633812f
HV
337 for (i = 1; ; i++) {
338 if (-1 == mxb_saa7740_init[i].length)
1da177e4 339 break;
1da177e4 340
a8733ca5 341 msg.len = mxb_saa7740_init[i].length;
1da177e4 342 msg.buf = &mxb_saa7740_init[i].data[0];
2633812f
HV
343 err = i2c_transfer(&mxb->i2c_adapter, &msg, 1);
344 if (err != 1) {
1da177e4
LT
345 DEB_D(("failed to initialize 'sound arena module'.\n"));
346 goto err;
347 }
348 }
349 INFO(("'sound arena module' detected.\n"));
350 }
a8733ca5 351err:
1da177e4
LT
352 /* the rest for saa7146: you should definitely set some basic values
353 for the input-port handling of the saa7146. */
354
355 /* ext->saa has been filled by the core driver */
a8733ca5 356
1da177e4 357 /* some stuff is done via variables */
2633812f
HV
358 saa7146_set_hps_source_and_sync(dev, input_port_selection[mxb->cur_input].hps_source,
359 input_port_selection[mxb->cur_input].hps_sync);
1da177e4
LT
360
361 /* some stuff is done via direct write to the registers */
362
363 /* this is ugly, but because of the fact that this is completely
364 hardware dependend, it should be done directly... */
a8733ca5 365 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
1da177e4
LT
366 saa7146_write(dev, DD1_INIT, 0x02000200);
367 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
368
369 return 0;
370}
371
372/* interrupt-handler. this gets called when irq_mask is != 0.
373 it must clear the interrupt-bits in irq_mask it has handled */
374/*
375void mxb_irq_bh(struct saa7146_dev* dev, u32* irq_mask)
376{
377 struct mxb* mxb = (struct mxb*)dev->ext_priv;
378}
379*/
380
b960074f 381static int vidioc_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl *qc)
1da177e4 382{
b960074f
HV
383 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
384 int i;
a8733ca5 385
b960074f
HV
386 for (i = MAXCONTROLS - 1; i >= 0; i--) {
387 if (mxb_controls[i].id == qc->id) {
388 *qc = mxb_controls[i];
389 DEB_D(("VIDIOC_QUERYCTRL %d.\n", qc->id));
390 return 0;
391 }
392 }
393 return dev->ext_vv_data->core_ops->vidioc_queryctrl(file, fh, qc);
394}
1da177e4 395
b960074f
HV
396static int vidioc_g_ctrl(struct file *file, void *fh, struct v4l2_control *vc)
397{
398 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
399 struct mxb *mxb = (struct mxb *)dev->ext_priv;
400 int i;
1da177e4 401
b960074f
HV
402 for (i = MAXCONTROLS - 1; i >= 0; i--) {
403 if (mxb_controls[i].id == vc->id)
404 break;
1da177e4 405 }
a8733ca5 406
b960074f
HV
407 if (i < 0)
408 return dev->ext_vv_data->core_ops->vidioc_g_ctrl(file, fh, vc);
1da177e4 409
b960074f
HV
410 if (vc->id == V4L2_CID_AUDIO_MUTE) {
411 vc->value = mxb->cur_mute;
412 DEB_D(("VIDIOC_G_CTRL V4L2_CID_AUDIO_MUTE:%d.\n", vc->value));
413 return 0;
414 }
1da177e4 415
b960074f 416 DEB_EE(("VIDIOC_G_CTRL V4L2_CID_AUDIO_MUTE:%d.\n", vc->value));
1da177e4
LT
417 return 0;
418}
419
b960074f 420static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *vc)
1da177e4 421{
b960074f 422 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
2633812f 423 struct mxb *mxb = (struct mxb *)dev->ext_priv;
b960074f 424 int i = 0;
1da177e4 425
b960074f
HV
426 for (i = MAXCONTROLS - 1; i >= 0; i--) {
427 if (mxb_controls[i].id == vc->id)
428 break;
429 }
1da177e4 430
b960074f
HV
431 if (i < 0)
432 return dev->ext_vv_data->core_ops->vidioc_s_ctrl(file, fh, vc);
1da177e4 433
b960074f
HV
434 if (vc->id == V4L2_CID_AUDIO_MUTE) {
435 mxb->cur_mute = vc->value;
436 if (!vc->value) {
437 /* switch the audio-source */
1b8dac15 438 tea6420_1_call(mxb, audio, s_routing,
b960074f 439 &TEA6420_line[video_audio_connect[mxb->cur_input]][0]);
1b8dac15 440 tea6420_2_call(mxb, audio, s_routing,
b960074f
HV
441 &TEA6420_line[video_audio_connect[mxb->cur_input]][1]);
442 } else {
1b8dac15 443 tea6420_1_call(mxb, audio, s_routing,
b960074f 444 &TEA6420_line[6][0]);
1b8dac15 445 tea6420_2_call(mxb, audio, s_routing,
b960074f
HV
446 &TEA6420_line[6][1]);
447 }
448 DEB_EE(("VIDIOC_S_CTRL, V4L2_CID_AUDIO_MUTE: %d.\n", vc->value));
449 }
450 return 0;
451}
1da177e4 452
b960074f
HV
453static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
454{
455 DEB_EE(("VIDIOC_ENUMINPUT %d.\n", i->index));
456 if (i->index < 0 || i->index >= MXB_INPUTS)
457 return -EINVAL;
458 memcpy(i, &mxb_inputs[i->index], sizeof(struct v4l2_input));
1da177e4
LT
459 return 0;
460}
461
b960074f 462static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1da177e4 463{
b960074f 464 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
2633812f 465 struct mxb *mxb = (struct mxb *)dev->ext_priv;
b960074f 466 *i = mxb->cur_input;
a8733ca5 467
b960074f
HV
468 DEB_EE(("VIDIOC_G_INPUT %d.\n", *i));
469 return 0;
470}
a8733ca5 471
b960074f
HV
472static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
473{
474 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
475 struct mxb *mxb = (struct mxb *)dev->ext_priv;
b960074f
HV
476 struct v4l2_routing route;
477 int i = 0;
1da177e4 478
b960074f 479 DEB_EE(("VIDIOC_S_INPUT %d.\n", input));
a8733ca5 480
b960074f
HV
481 if (input < 0 || input >= MXB_INPUTS)
482 return -EINVAL;
a8733ca5 483
b960074f 484 mxb->cur_input = input;
a8733ca5 485
b960074f
HV
486 saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source,
487 input_port_selection[input].hps_sync);
1da177e4 488
b960074f
HV
489 /* prepare switching of tea6415c and saa7111a;
490 have a look at the 'background'-file for further informations */
491 switch (input) {
492 case TUNER:
493 i = SAA7115_COMPOSITE0;
1b8dac15
HV
494 route.input = 3;
495 route.output = 17;
a8733ca5 496
1b8dac15 497 if (tea6415c_call(mxb, video, s_routing, &route)) {
b960074f
HV
498 printk(KERN_ERR "VIDIOC_S_INPUT: could not address tea6415c #1\n");
499 return -EFAULT;
1da177e4 500 }
b960074f 501 /* connect tuner-output always to multicable */
1b8dac15
HV
502 route.input = 3;
503 route.output = 13;
b960074f
HV
504 break;
505 case AUX3_YC:
506 /* nothing to be done here. aux3_yc is
507 directly connected to the saa711a */
508 i = SAA7115_SVIDEO1;
509 break;
510 case AUX3:
511 /* nothing to be done here. aux3 is
512 directly connected to the saa711a */
513 i = SAA7115_COMPOSITE1;
514 break;
515 case AUX1:
516 i = SAA7115_COMPOSITE0;
1b8dac15
HV
517 route.input = 1;
518 route.output = 17;
b960074f
HV
519 break;
520 }
a8733ca5 521
b960074f
HV
522 /* switch video in tea6415c only if necessary */
523 switch (input) {
524 case TUNER:
525 case AUX1:
1b8dac15 526 if (tea6415c_call(mxb, video, s_routing, &route)) {
b960074f
HV
527 printk(KERN_ERR "VIDIOC_S_INPUT: could not address tea6415c #3\n");
528 return -EFAULT;
1da177e4 529 }
b960074f
HV
530 break;
531 default:
532 break;
1da177e4 533 }
1da177e4 534
b960074f
HV
535 /* switch video in saa7111a */
536 route.input = i;
537 route.output = 0;
1b8dac15 538 if (saa7111a_call(mxb, video, s_routing, &route))
b960074f
HV
539 printk(KERN_ERR "VIDIOC_S_INPUT: could not address saa7111a #1.\n");
540
541 /* switch the audio-source only if necessary */
542 if (0 == mxb->cur_mute) {
1b8dac15 543 tea6420_1_call(mxb, audio, s_routing,
b960074f 544 &TEA6420_line[video_audio_connect[input]][0]);
1b8dac15 545 tea6420_2_call(mxb, audio, s_routing,
b960074f 546 &TEA6420_line[video_audio_connect[input]][1]);
a8733ca5 547 }
1da177e4 548
b960074f
HV
549 return 0;
550}
1da177e4 551
b960074f
HV
552static int vidioc_g_tuner(struct file *file, void *fh, struct v4l2_tuner *t)
553{
554 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
555 struct mxb *mxb = (struct mxb *)dev->ext_priv;
a8733ca5 556
b960074f
HV
557 if (t->index) {
558 DEB_D(("VIDIOC_G_TUNER: channel %d does not have a tuner attached.\n", t->index));
559 return -EINVAL;
560 }
a8733ca5 561
b960074f 562 DEB_EE(("VIDIOC_G_TUNER: %d\n", t->index));
a8733ca5 563
b960074f 564 memset(t, 0, sizeof(*t));
b960074f
HV
565 strlcpy(t->name, "TV Tuner", sizeof(t->name));
566 t->type = V4L2_TUNER_ANALOG_TV;
567 t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO |
568 V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
569 t->audmode = mxb->cur_mode;
1b8dac15 570 return call_all(dev, tuner, g_tuner, t);
b960074f 571}
1da177e4 572
b960074f
HV
573static int vidioc_s_tuner(struct file *file, void *fh, struct v4l2_tuner *t)
574{
575 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
576 struct mxb *mxb = (struct mxb *)dev->ext_priv;
a8733ca5 577
b960074f
HV
578 if (t->index) {
579 DEB_D(("VIDIOC_S_TUNER: channel %d does not have a tuner attached.\n", t->index));
580 return -EINVAL;
581 }
1da177e4 582
b960074f 583 mxb->cur_mode = t->audmode;
1b8dac15 584 return call_all(dev, tuner, s_tuner, t);
b960074f 585}
1da177e4 586
b960074f
HV
587static int vidioc_g_frequency(struct file *file, void *fh, struct v4l2_frequency *f)
588{
589 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
590 struct mxb *mxb = (struct mxb *)dev->ext_priv;
591
592 if (mxb->cur_input) {
593 DEB_D(("VIDIOC_G_FREQ: channel %d does not have a tuner!\n",
594 mxb->cur_input));
595 return -EINVAL;
1da177e4 596 }
1da177e4 597
b960074f 598 *f = mxb->cur_freq;
1da177e4 599
b960074f
HV
600 DEB_EE(("VIDIOC_G_FREQ: freq:0x%08x.\n", mxb->cur_freq.frequency));
601 return 0;
602}
1da177e4 603
b960074f
HV
604static int vidioc_s_frequency(struct file *file, void *fh, struct v4l2_frequency *f)
605{
606 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
607 struct mxb *mxb = (struct mxb *)dev->ext_priv;
608 struct saa7146_vv *vv = dev->vv_data;
1da177e4 609
b960074f
HV
610 if (f->tuner)
611 return -EINVAL;
a8733ca5 612
b960074f
HV
613 if (V4L2_TUNER_ANALOG_TV != f->type)
614 return -EINVAL;
a8733ca5 615
b960074f
HV
616 if (mxb->cur_input) {
617 DEB_D(("VIDIOC_S_FREQ: channel %d does not have a tuner!\n", mxb->cur_input));
618 return -EINVAL;
1da177e4 619 }
1da177e4 620
b960074f
HV
621 mxb->cur_freq = *f;
622 DEB_EE(("VIDIOC_S_FREQUENCY: freq:0x%08x.\n", mxb->cur_freq.frequency));
1da177e4 623
b960074f 624 /* tune in desired frequency */
1b8dac15 625 tuner_call(mxb, tuner, s_frequency, &mxb->cur_freq);
1da177e4 626
b960074f
HV
627 /* hack: changing the frequency should invalidate the vbi-counter (=> alevt) */
628 spin_lock(&dev->slock);
629 vv->vbi_fieldcount = 0;
630 spin_unlock(&dev->slock);
631
632 return 0;
633}
634
635static int vidioc_g_audio(struct file *file, void *fh, struct v4l2_audio *a)
636{
637 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
638 struct mxb *mxb = (struct mxb *)dev->ext_priv;
639
640 if (a->index < 0 || a->index > MXB_INPUTS) {
641 DEB_D(("VIDIOC_G_AUDIO %d out of range.\n", a->index));
642 return -EINVAL;
1da177e4 643 }
1da177e4 644
b960074f
HV
645 DEB_EE(("VIDIOC_G_AUDIO %d.\n", a->index));
646 memcpy(a, &mxb_audios[video_audio_connect[mxb->cur_input]], sizeof(struct v4l2_audio));
647 return 0;
648}
1da177e4 649
b960074f
HV
650static int vidioc_s_audio(struct file *file, void *fh, struct v4l2_audio *a)
651{
652 DEB_D(("VIDIOC_S_AUDIO %d.\n", a->index));
653 return 0;
654}
a8733ca5 655
b960074f
HV
656#ifdef CONFIG_VIDEO_ADV_DEBUG
657static int vidioc_g_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
658{
659 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
1da177e4 660
1b8dac15 661 return call_all(dev, core, g_register, reg);
b960074f 662}
1da177e4 663
b960074f
HV
664static int vidioc_s_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
665{
666 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
1da177e4 667
1b8dac15 668 return call_all(dev, core, s_register, reg);
b960074f
HV
669}
670#endif
1da177e4 671
b960074f
HV
672static long vidioc_default(struct file *file, void *fh, int cmd, void *arg)
673{
674 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
675 struct mxb *mxb = (struct mxb *)dev->ext_priv;
676
677 switch (cmd) {
1da177e4
LT
678 case MXB_S_AUDIO_CD:
679 {
b960074f 680 int i = *(int *)arg;
a8733ca5 681
2633812f 682 if (i < 0 || i >= MXB_AUDIOS) {
b960074f 683 DEB_D(("illegal argument to MXB_S_AUDIO_CD: i:%d.\n", i));
1da177e4
LT
684 return -EINVAL;
685 }
a8733ca5 686
b960074f 687 DEB_EE(("MXB_S_AUDIO_CD: i:%d.\n", i));
1da177e4 688
1b8dac15
HV
689 tea6420_1_call(mxb, audio, s_routing, &TEA6420_cd[i][0]);
690 tea6420_2_call(mxb, audio, s_routing, &TEA6420_cd[i][1]);
1da177e4
LT
691
692 return 0;
693 }
694 case MXB_S_AUDIO_LINE:
695 {
b960074f 696 int i = *(int *)arg;
a8733ca5 697
2633812f 698 if (i < 0 || i >= MXB_AUDIOS) {
b960074f 699 DEB_D(("illegal argument to MXB_S_AUDIO_LINE: i:%d.\n", i));
1da177e4
LT
700 return -EINVAL;
701 }
a8733ca5 702
b960074f 703 DEB_EE(("MXB_S_AUDIO_LINE: i:%d.\n", i));
1b8dac15
HV
704 tea6420_1_call(mxb, audio, s_routing, &TEA6420_line[i][0]);
705 tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[i][1]);
1da177e4
LT
706
707 return 0;
708 }
b960074f
HV
709 default:
710/*
711 DEB2(printk("does not handle this ioctl.\n"));
712*/
713 return -ENOIOCTLCMD;
714 }
715 return 0;
716}
1da177e4 717
b960074f
HV
718static struct saa7146_ext_vv vv_data;
719
720/* this function only gets called when the probing was successful */
721static int mxb_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
722{
723 struct mxb *mxb = (struct mxb *)dev->ext_priv;
a8733ca5 724
b960074f 725 DEB_EE(("dev:%p\n", dev));
a8733ca5 726
b960074f
HV
727 /* checking for i2c-devices can be omitted here, because we
728 already did this in "mxb_vl42_probe" */
2633812f 729
b960074f
HV
730 saa7146_vv_init(dev, &vv_data);
731 vv_data.ops.vidioc_queryctrl = vidioc_queryctrl;
732 vv_data.ops.vidioc_g_ctrl = vidioc_g_ctrl;
733 vv_data.ops.vidioc_s_ctrl = vidioc_s_ctrl;
734 vv_data.ops.vidioc_enum_input = vidioc_enum_input;
735 vv_data.ops.vidioc_g_input = vidioc_g_input;
736 vv_data.ops.vidioc_s_input = vidioc_s_input;
737 vv_data.ops.vidioc_g_tuner = vidioc_g_tuner;
738 vv_data.ops.vidioc_s_tuner = vidioc_s_tuner;
739 vv_data.ops.vidioc_g_frequency = vidioc_g_frequency;
740 vv_data.ops.vidioc_s_frequency = vidioc_s_frequency;
741 vv_data.ops.vidioc_g_audio = vidioc_g_audio;
742 vv_data.ops.vidioc_s_audio = vidioc_s_audio;
2633812f 743#ifdef CONFIG_VIDEO_ADV_DEBUG
b960074f
HV
744 vv_data.ops.vidioc_g_register = vidioc_g_register;
745 vv_data.ops.vidioc_s_register = vidioc_s_register;
2633812f 746#endif
b960074f
HV
747 vv_data.ops.vidioc_default = vidioc_default;
748 if (saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) {
749 ERR(("cannot register capture v4l2 device. skipping.\n"));
750 return -1;
751 }
752
753 /* initialization stuff (vbi) (only for revision > 0 and for extensions which want it)*/
754 if (MXB_BOARD_CAN_DO_VBI(dev)) {
755 if (saa7146_register_device(&mxb->vbi_dev, dev, "mxb", VFL_TYPE_VBI)) {
756 ERR(("cannot register vbi v4l2 device. skipping.\n"));
757 }
1da177e4 758 }
b960074f 759
b960074f
HV
760 printk("mxb: found Multimedia eXtension Board #%d.\n", mxb_num);
761
762 mxb_num++;
763 mxb_init_done(dev);
764 return 0;
765}
766
767static int mxb_detach(struct saa7146_dev *dev)
768{
769 struct mxb *mxb = (struct mxb *)dev->ext_priv;
770
771 DEB_EE(("dev:%p\n", dev));
772
b960074f
HV
773 saa7146_unregister_device(&mxb->video_dev,dev);
774 if (MXB_BOARD_CAN_DO_VBI(dev))
775 saa7146_unregister_device(&mxb->vbi_dev, dev);
776 saa7146_vv_release(dev);
777
778 mxb_num--;
779
780 i2c_del_adapter(&mxb->i2c_adapter);
781 kfree(mxb);
782
1da177e4
LT
783 return 0;
784}
785
c6eb8eaf 786static int std_callback(struct saa7146_dev *dev, struct saa7146_standard *standard)
1da177e4 787{
c6eb8eaf 788 struct mxb *mxb = (struct mxb *)dev->ext_priv;
1da177e4 789
c6eb8eaf 790 if (V4L2_STD_PAL_I == standard->id) {
6acaba8e 791 v4l2_std_id std = V4L2_STD_PAL_I;
c6eb8eaf 792
1da177e4
LT
793 DEB_D(("VIDIOC_S_STD: setting mxb for PAL_I.\n"));
794 /* set the 7146 gpio register -- I don't know what this does exactly */
a8733ca5 795 saa7146_write(dev, GPIO_CTRL, 0x00404050);
1da177e4 796 /* unset the 7111 gpio register -- I don't know what this does exactly */
1b8dac15 797 saa7111a_call(mxb, core, s_gpio, 0);
f41737ec 798 tuner_call(mxb, core, s_std, std);
1da177e4 799 } else {
6acaba8e 800 v4l2_std_id std = V4L2_STD_PAL_BG;
c6eb8eaf 801
1da177e4
LT
802 DEB_D(("VIDIOC_S_STD: setting mxb for PAL/NTSC/SECAM.\n"));
803 /* set the 7146 gpio register -- I don't know what this does exactly */
a8733ca5 804 saa7146_write(dev, GPIO_CTRL, 0x00404050);
1da177e4 805 /* set the 7111 gpio register -- I don't know what this does exactly */
1b8dac15 806 saa7111a_call(mxb, core, s_gpio, 1);
f41737ec 807 tuner_call(mxb, core, s_std, std);
1da177e4
LT
808 }
809 return 0;
810}
811
812static struct saa7146_standard standard[] = {
813 {
814 .name = "PAL-BG", .id = V4L2_STD_PAL_BG,
815 .v_offset = 0x17, .v_field = 288,
816 .h_offset = 0x14, .h_pixels = 680,
817 .v_max_out = 576, .h_max_out = 768,
818 }, {
819 .name = "PAL-I", .id = V4L2_STD_PAL_I,
820 .v_offset = 0x17, .v_field = 288,
821 .h_offset = 0x14, .h_pixels = 680,
822 .v_max_out = 576, .h_max_out = 768,
823 }, {
824 .name = "NTSC", .id = V4L2_STD_NTSC,
825 .v_offset = 0x16, .v_field = 240,
826 .h_offset = 0x06, .h_pixels = 708,
827 .v_max_out = 480, .h_max_out = 640,
828 }, {
829 .name = "SECAM", .id = V4L2_STD_SECAM,
830 .v_offset = 0x14, .v_field = 288,
831 .h_offset = 0x14, .h_pixels = 720,
832 .v_max_out = 576, .h_max_out = 768,
833 }
834};
835
836static struct saa7146_pci_extension_data mxb = {
a8733ca5
MCC
837 .ext_priv = "Multimedia eXtension Board",
838 .ext = &extension,
1da177e4
LT
839};
840
841static struct pci_device_id pci_tbl[] = {
842 {
843 .vendor = PCI_VENDOR_ID_PHILIPS,
844 .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
845 .subvendor = 0x0000,
846 .subdevice = 0x0000,
847 .driver_data = (unsigned long)&mxb,
848 }, {
849 .vendor = 0,
850 }
851};
852
853MODULE_DEVICE_TABLE(pci, pci_tbl);
854
855static struct saa7146_ext_vv vv_data = {
856 .inputs = MXB_INPUTS,
857 .capabilities = V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE,
858 .stds = &standard[0],
859 .num_stds = sizeof(standard)/sizeof(struct saa7146_standard),
a8733ca5 860 .std_callback = &std_callback,
1da177e4
LT
861};
862
863static struct saa7146_extension extension = {
864 .name = MXB_IDENTIFIER,
865 .flags = SAA7146_USE_I2C_IRQ,
a8733ca5 866
1da177e4
LT
867 .pci_tbl = &pci_tbl[0],
868 .module = THIS_MODULE,
869
870 .probe = mxb_probe,
871 .attach = mxb_attach,
872 .detach = mxb_detach,
873
874 .irq_mask = 0,
875 .irq_func = NULL,
a8733ca5 876};
1da177e4
LT
877
878static int __init mxb_init_module(void)
879{
2633812f 880 if (saa7146_register_extension(&extension)) {
1da177e4
LT
881 DEB_S(("failed to register extension.\n"));
882 return -ENODEV;
883 }
a8733ca5 884
1da177e4
LT
885 return 0;
886}
887
888static void __exit mxb_cleanup_module(void)
889{
890 saa7146_unregister_extension(&extension);
891}
892
893module_init(mxb_init_module);
894module_exit(mxb_cleanup_module);
895
896MODULE_DESCRIPTION("video4linux-2 driver for the Siemens-Nixdorf 'Multimedia eXtension board'");
897MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
898MODULE_LICENSE("GPL");
This page took 0.54842 seconds and 5 git commands to generate.