2 mxb - v4l2 driver for the Multimedia eXtension Board
4 Copyright (C) 1998-2006 Michael Hunold <michael@mihu.de>
6 Visit http://www.themm.net/~mihu/linux/saa7146/mxb.html
7 for further details about this card.
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.
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.
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.
24 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
26 #define DEBUG_VARIABLE debug
28 #include <media/drv-intf/saa7146_vv.h>
29 #include <media/tuner.h>
30 #include <media/v4l2-common.h>
31 #include <media/i2c/saa7115.h>
32 #include <linux/module.h>
33 #include <linux/kernel.h>
40 #define I2C_SAA7111A 0x24
41 #define I2C_TDA9840 0x42
42 #define I2C_TEA6415C 0x43
43 #define I2C_TEA6420_1 0x4c
44 #define I2C_TEA6420_2 0x4d
45 #define I2C_TUNER 0x60
47 #define MXB_BOARD_CAN_DO_VBI(dev) (dev->revision != 0)
52 /* initial frequence the tuner will be tuned to.
53 in verden (lower saxony, germany) 4148 is a
54 channel called "phoenix" */
55 static int freq = 4148;
56 module_param(freq, int, 0644);
57 MODULE_PARM_DESC(freq, "initial frequency the tuner will be tuned to while setup");
60 module_param(debug, int, 0644);
61 MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off).");
64 enum { TUNER, AUX1, AUX3, AUX3_YC };
66 static struct v4l2_input mxb_inputs[MXB_INPUTS] = {
67 { TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 0x3f, 0,
68 V4L2_STD_PAL_BG | V4L2_STD_PAL_I, 0, V4L2_IN_CAP_STD },
69 { AUX1, "AUX1", V4L2_INPUT_TYPE_CAMERA, 0x3f, 0,
70 V4L2_STD_ALL, 0, V4L2_IN_CAP_STD },
71 { AUX3, "AUX3 Composite", V4L2_INPUT_TYPE_CAMERA, 0x3f, 0,
72 V4L2_STD_ALL, 0, V4L2_IN_CAP_STD },
73 { AUX3_YC, "AUX3 S-Video", V4L2_INPUT_TYPE_CAMERA, 0x3f, 0,
74 V4L2_STD_ALL, 0, V4L2_IN_CAP_STD },
77 /* this array holds the information, which port of the saa7146 each
78 input actually uses. the mxb uses port 0 for every input */
82 } input_port_selection[MXB_INPUTS] = {
83 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
84 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
85 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
86 { SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
89 /* this array holds the information of the audio source (mxb_audios),
90 which has to be switched corresponding to the video source (mxb_channels) */
91 static int video_audio_connect[MXB_INPUTS] =
99 /* these are the available audio sources, which can switched
100 to the line- and cd-output individually */
101 static struct v4l2_audio mxb_audios[MXB_AUDIOS] = {
105 .capability = V4L2_AUDCAP_STEREO,
109 .capability = V4L2_AUDCAP_STEREO,
113 .capability = V4L2_AUDCAP_STEREO,
117 .capability = V4L2_AUDCAP_STEREO,
120 .name = "Radio (X9)",
121 .capability = V4L2_AUDCAP_STEREO,
124 .name = "CD-ROM (X10)",
125 .capability = V4L2_AUDCAP_STEREO,
129 /* These are the necessary input-output-pins for bringing one audio source
130 (see above) to the CD-output. Note that gain is set to 0 in this table. */
131 static struct mxb_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
132 { { 1, 1 }, { 1, 1 } }, /* Tuner */
133 { { 5, 1 }, { 6, 1 } }, /* AUX 1 */
134 { { 4, 1 }, { 6, 1 } }, /* AUX 2 */
135 { { 3, 1 }, { 6, 1 } }, /* AUX 3 */
136 { { 1, 1 }, { 3, 1 } }, /* Radio */
137 { { 1, 1 }, { 2, 1 } }, /* CD-Rom */
138 { { 6, 1 }, { 6, 1 } } /* Mute */
141 /* These are the necessary input-output-pins for bringing one audio source
142 (see above) to the line-output. Note that gain is set to 0 in this table. */
143 static struct mxb_routing TEA6420_line[MXB_AUDIOS + 1][2] = {
144 { { 2, 3 }, { 1, 2 } },
145 { { 5, 3 }, { 6, 2 } },
146 { { 4, 3 }, { 6, 2 } },
147 { { 3, 3 }, { 6, 2 } },
148 { { 2, 3 }, { 3, 2 } },
149 { { 2, 3 }, { 2, 2 } },
150 { { 6, 3 }, { 6, 2 } } /* Mute */
155 struct video_device video_dev;
156 struct video_device vbi_dev;
158 struct i2c_adapter i2c_adapter;
160 struct v4l2_subdev *saa7111a;
161 struct v4l2_subdev *tda9840;
162 struct v4l2_subdev *tea6415c;
163 struct v4l2_subdev *tuner;
164 struct v4l2_subdev *tea6420_1;
165 struct v4l2_subdev *tea6420_2;
167 int cur_mode; /* current audio mode (mono, stereo, ...) */
168 int cur_input; /* current input */
169 int cur_audinput; /* current audio input */
170 int cur_mute; /* current mute status */
171 struct v4l2_frequency cur_freq; /* current frequency the tuner is tuned to */
174 #define saa7111a_call(mxb, o, f, args...) \
175 v4l2_subdev_call(mxb->saa7111a, o, f, ##args)
176 #define tda9840_call(mxb, o, f, args...) \
177 v4l2_subdev_call(mxb->tda9840, o, f, ##args)
178 #define tea6415c_call(mxb, o, f, args...) \
179 v4l2_subdev_call(mxb->tea6415c, o, f, ##args)
180 #define tuner_call(mxb, o, f, args...) \
181 v4l2_subdev_call(mxb->tuner, o, f, ##args)
182 #define call_all(dev, o, f, args...) \
183 v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args)
185 static void mxb_update_audmode(struct mxb *mxb)
187 struct v4l2_tuner t = {
188 .audmode = mxb->cur_mode,
191 tda9840_call(mxb, tuner, s_tuner, &t);
194 static inline void tea6420_route(struct mxb *mxb, int idx)
196 v4l2_subdev_call(mxb->tea6420_1, audio, s_routing,
197 TEA6420_cd[idx][0].input, TEA6420_cd[idx][0].output, 0);
198 v4l2_subdev_call(mxb->tea6420_2, audio, s_routing,
199 TEA6420_cd[idx][1].input, TEA6420_cd[idx][1].output, 0);
200 v4l2_subdev_call(mxb->tea6420_1, audio, s_routing,
201 TEA6420_line[idx][0].input, TEA6420_line[idx][0].output, 0);
202 v4l2_subdev_call(mxb->tea6420_2, audio, s_routing,
203 TEA6420_line[idx][1].input, TEA6420_line[idx][1].output, 0);
206 static struct saa7146_extension extension;
208 static int mxb_s_ctrl(struct v4l2_ctrl *ctrl)
210 struct saa7146_dev *dev = container_of(ctrl->handler,
211 struct saa7146_dev, ctrl_handler);
212 struct mxb *mxb = dev->ext_priv;
215 case V4L2_CID_AUDIO_MUTE:
216 mxb->cur_mute = ctrl->val;
217 /* switch the audio-source */
218 tea6420_route(mxb, ctrl->val ? 6 :
219 video_audio_connect[mxb->cur_input]);
227 static const struct v4l2_ctrl_ops mxb_ctrl_ops = {
228 .s_ctrl = mxb_s_ctrl,
231 static int mxb_probe(struct saa7146_dev *dev)
233 struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler;
234 struct mxb *mxb = NULL;
236 v4l2_ctrl_new_std(hdl, &mxb_ctrl_ops,
237 V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1);
240 mxb = kzalloc(sizeof(struct mxb), GFP_KERNEL);
242 DEB_D("not enough kernel memory\n");
247 snprintf(mxb->i2c_adapter.name, sizeof(mxb->i2c_adapter.name), "mxb%d", mxb_num);
249 saa7146_i2c_adapter_prepare(dev, &mxb->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
250 if (i2c_add_adapter(&mxb->i2c_adapter) < 0) {
251 DEB_S("cannot register i2c-device. skipping.\n");
256 mxb->saa7111a = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
257 "saa7111", I2C_SAA7111A, NULL);
258 mxb->tea6420_1 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
259 "tea6420", I2C_TEA6420_1, NULL);
260 mxb->tea6420_2 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
261 "tea6420", I2C_TEA6420_2, NULL);
262 mxb->tea6415c = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
263 "tea6415c", I2C_TEA6415C, NULL);
264 mxb->tda9840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
265 "tda9840", I2C_TDA9840, NULL);
266 mxb->tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
267 "tuner", I2C_TUNER, NULL);
269 /* check if all devices are present */
270 if (!mxb->tea6420_1 || !mxb->tea6420_2 || !mxb->tea6415c ||
271 !mxb->tda9840 || !mxb->saa7111a || !mxb->tuner) {
272 pr_err("did not find all i2c devices. aborting\n");
273 i2c_del_adapter(&mxb->i2c_adapter);
278 /* all devices are present, probe was successful */
280 /* we store the pointer in our private data field */
283 v4l2_ctrl_handler_setup(hdl);
288 /* some init data for the saa7740, the so-called 'sound arena module'.
289 there are no specs available, so we simply use some init values */
293 } mxb_saa7740_init[] = {
294 { 3, { 0x80, 0x00, 0x00 } },{ 3, { 0x80, 0x89, 0x00 } },
295 { 3, { 0x80, 0xb0, 0x0a } },{ 3, { 0x00, 0x00, 0x00 } },
296 { 3, { 0x49, 0x00, 0x00 } },{ 3, { 0x4a, 0x00, 0x00 } },
297 { 3, { 0x4b, 0x00, 0x00 } },{ 3, { 0x4c, 0x00, 0x00 } },
298 { 3, { 0x4d, 0x00, 0x00 } },{ 3, { 0x4e, 0x00, 0x00 } },
299 { 3, { 0x4f, 0x00, 0x00 } },{ 3, { 0x50, 0x00, 0x00 } },
300 { 3, { 0x51, 0x00, 0x00 } },{ 3, { 0x52, 0x00, 0x00 } },
301 { 3, { 0x53, 0x00, 0x00 } },{ 3, { 0x54, 0x00, 0x00 } },
302 { 3, { 0x55, 0x00, 0x00 } },{ 3, { 0x56, 0x00, 0x00 } },
303 { 3, { 0x57, 0x00, 0x00 } },{ 3, { 0x58, 0x00, 0x00 } },
304 { 3, { 0x59, 0x00, 0x00 } },{ 3, { 0x5a, 0x00, 0x00 } },
305 { 3, { 0x5b, 0x00, 0x00 } },{ 3, { 0x5c, 0x00, 0x00 } },
306 { 3, { 0x5d, 0x00, 0x00 } },{ 3, { 0x5e, 0x00, 0x00 } },
307 { 3, { 0x5f, 0x00, 0x00 } },{ 3, { 0x60, 0x00, 0x00 } },
308 { 3, { 0x61, 0x00, 0x00 } },{ 3, { 0x62, 0x00, 0x00 } },
309 { 3, { 0x63, 0x00, 0x00 } },{ 3, { 0x64, 0x00, 0x00 } },
310 { 3, { 0x65, 0x00, 0x00 } },{ 3, { 0x66, 0x00, 0x00 } },
311 { 3, { 0x67, 0x00, 0x00 } },{ 3, { 0x68, 0x00, 0x00 } },
312 { 3, { 0x69, 0x00, 0x00 } },{ 3, { 0x6a, 0x00, 0x00 } },
313 { 3, { 0x6b, 0x00, 0x00 } },{ 3, { 0x6c, 0x00, 0x00 } },
314 { 3, { 0x6d, 0x00, 0x00 } },{ 3, { 0x6e, 0x00, 0x00 } },
315 { 3, { 0x6f, 0x00, 0x00 } },{ 3, { 0x70, 0x00, 0x00 } },
316 { 3, { 0x71, 0x00, 0x00 } },{ 3, { 0x72, 0x00, 0x00 } },
317 { 3, { 0x73, 0x00, 0x00 } },{ 3, { 0x74, 0x00, 0x00 } },
318 { 3, { 0x75, 0x00, 0x00 } },{ 3, { 0x76, 0x00, 0x00 } },
319 { 3, { 0x77, 0x00, 0x00 } },{ 3, { 0x41, 0x00, 0x42 } },
320 { 3, { 0x42, 0x10, 0x42 } },{ 3, { 0x43, 0x20, 0x42 } },
321 { 3, { 0x44, 0x30, 0x42 } },{ 3, { 0x45, 0x00, 0x01 } },
322 { 3, { 0x46, 0x00, 0x01 } },{ 3, { 0x47, 0x00, 0x01 } },
323 { 3, { 0x48, 0x00, 0x01 } },
324 { 9, { 0x01, 0x03, 0xc5, 0x5c, 0x7a, 0x85, 0x01, 0x00, 0x54 } },
325 { 9, { 0x21, 0x03, 0xc5, 0x5c, 0x7a, 0x85, 0x01, 0x00, 0x54 } },
326 { 9, { 0x09, 0x0b, 0xb4, 0x6b, 0x74, 0x85, 0x95, 0x00, 0x34 } },
327 { 9, { 0x29, 0x0b, 0xb4, 0x6b, 0x74, 0x85, 0x95, 0x00, 0x34 } },
328 { 9, { 0x11, 0x17, 0x43, 0x62, 0x68, 0x89, 0xd1, 0xff, 0xb0 } },
329 { 9, { 0x31, 0x17, 0x43, 0x62, 0x68, 0x89, 0xd1, 0xff, 0xb0 } },
330 { 9, { 0x19, 0x20, 0x62, 0x51, 0x5a, 0x95, 0x19, 0x01, 0x50 } },
331 { 9, { 0x39, 0x20, 0x62, 0x51, 0x5a, 0x95, 0x19, 0x01, 0x50 } },
332 { 9, { 0x05, 0x3e, 0xd2, 0x69, 0x4e, 0x9a, 0x51, 0x00, 0xf0 } },
333 { 9, { 0x25, 0x3e, 0xd2, 0x69, 0x4e, 0x9a, 0x51, 0x00, 0xf0 } },
334 { 9, { 0x0d, 0x3d, 0xa1, 0x40, 0x7d, 0x9f, 0x29, 0xfe, 0x14 } },
335 { 9, { 0x2d, 0x3d, 0xa1, 0x40, 0x7d, 0x9f, 0x29, 0xfe, 0x14 } },
336 { 9, { 0x15, 0x73, 0xa1, 0x50, 0x5d, 0xa6, 0xf5, 0xfe, 0x38 } },
337 { 9, { 0x35, 0x73, 0xa1, 0x50, 0x5d, 0xa6, 0xf5, 0xfe, 0x38 } },
338 { 9, { 0x1d, 0xed, 0xd0, 0x68, 0x29, 0xb4, 0xe1, 0x00, 0xb8 } },
339 { 9, { 0x3d, 0xed, 0xd0, 0x68, 0x29, 0xb4, 0xe1, 0x00, 0xb8 } },
340 { 3, { 0x80, 0xb3, 0x0a } },
344 /* bring hardware to a sane state. this has to be done, just in case someone
345 wants to capture from this device before it has been properly initialized.
346 the capture engine would badly fail, because no valid signal arrives on the
347 saa7146, thus leading to timeouts and stuff. */
348 static int mxb_init_done(struct saa7146_dev* dev)
350 struct mxb* mxb = (struct mxb*)dev->ext_priv;
352 struct tuner_setup tun_setup;
353 v4l2_std_id std = V4L2_STD_PAL_BG;
357 /* mute audio on tea6420s */
358 tea6420_route(mxb, 6);
360 /* select video mode in saa7111a */
361 saa7111a_call(mxb, video, s_std, std);
363 /* select tuner-output on saa7111a */
365 saa7111a_call(mxb, video, s_routing, SAA7115_COMPOSITE0,
366 SAA7111_FMT_CCIR, 0);
368 /* select a tuner type */
369 tun_setup.mode_mask = T_ANALOG_TV;
370 tun_setup.addr = ADDR_UNSET;
371 tun_setup.type = TUNER_PHILIPS_PAL;
372 tuner_call(mxb, tuner, s_type_addr, &tun_setup);
373 /* tune in some frequency on tuner */
374 mxb->cur_freq.tuner = 0;
375 mxb->cur_freq.type = V4L2_TUNER_ANALOG_TV;
376 mxb->cur_freq.frequency = freq;
377 tuner_call(mxb, tuner, s_frequency, &mxb->cur_freq);
379 /* set a default video standard */
380 /* These two gpio calls set the GPIO pins that control the tda9820 */
381 saa7146_write(dev, GPIO_CTRL, 0x00404050);
382 saa7111a_call(mxb, core, s_gpio, 1);
383 saa7111a_call(mxb, video, s_std, std);
384 tuner_call(mxb, video, s_std, std);
386 /* switch to tuner-channel on tea6415c */
387 tea6415c_call(mxb, video, s_routing, 3, 17, 0);
389 /* select tuner-output on multicable on tea6415c */
390 tea6415c_call(mxb, video, s_routing, 3, 13, 0);
392 /* the rest for mxb */
394 mxb->cur_audinput = video_audio_connect[mxb->cur_input];
397 mxb->cur_mode = V4L2_TUNER_MODE_STEREO;
398 mxb_update_audmode(mxb);
400 /* check if the saa7740 (aka 'sound arena module') is present
401 on the mxb. if so, we must initialize it. due to lack of
402 information about the saa7740, the values were reverse
406 msg.len = mxb_saa7740_init[0].length;
407 msg.buf = &mxb_saa7740_init[0].data[0];
409 err = i2c_transfer(&mxb->i2c_adapter, &msg, 1);
411 /* the sound arena module is a pos, that's probably the reason
412 philips refuses to hand out a datasheet for the saa7740...
413 it seems to screw up the i2c bus, so we disable fast irq
414 based i2c transactions here and rely on the slow and safe
415 polling method ... */
416 extension.flags &= ~SAA7146_USE_I2C_IRQ;
418 if (-1 == mxb_saa7740_init[i].length)
421 msg.len = mxb_saa7740_init[i].length;
422 msg.buf = &mxb_saa7740_init[i].data[0];
423 err = i2c_transfer(&mxb->i2c_adapter, &msg, 1);
425 DEB_D("failed to initialize 'sound arena module'\n");
429 pr_info("'sound arena module' detected\n");
432 /* the rest for saa7146: you should definitely set some basic values
433 for the input-port handling of the saa7146. */
435 /* ext->saa has been filled by the core driver */
437 /* some stuff is done via variables */
438 saa7146_set_hps_source_and_sync(dev, input_port_selection[mxb->cur_input].hps_source,
439 input_port_selection[mxb->cur_input].hps_sync);
441 /* some stuff is done via direct write to the registers */
443 /* this is ugly, but because of the fact that this is completely
444 hardware dependend, it should be done directly... */
445 saa7146_write(dev, DD1_STREAM_B, 0x00000000);
446 saa7146_write(dev, DD1_INIT, 0x02000200);
447 saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
452 /* interrupt-handler. this gets called when irq_mask is != 0.
453 it must clear the interrupt-bits in irq_mask it has handled */
455 void mxb_irq_bh(struct saa7146_dev* dev, u32* irq_mask)
457 struct mxb* mxb = (struct mxb*)dev->ext_priv;
461 static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
463 DEB_EE("VIDIOC_ENUMINPUT %d\n", i->index);
464 if (i->index >= MXB_INPUTS)
466 memcpy(i, &mxb_inputs[i->index], sizeof(struct v4l2_input));
470 static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
472 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
473 struct mxb *mxb = (struct mxb *)dev->ext_priv;
476 DEB_EE("VIDIOC_G_INPUT %d\n", *i);
480 static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
482 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
483 struct mxb *mxb = (struct mxb *)dev->ext_priv;
487 DEB_EE("VIDIOC_S_INPUT %d\n", input);
489 if (input >= MXB_INPUTS)
492 mxb->cur_input = input;
494 saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source,
495 input_port_selection[input].hps_sync);
497 /* prepare switching of tea6415c and saa7111a;
498 have a look at the 'background'-file for further information */
501 i = SAA7115_COMPOSITE0;
503 err = tea6415c_call(mxb, video, s_routing, 3, 17, 0);
505 /* connect tuner-output always to multicable */
507 err = tea6415c_call(mxb, video, s_routing, 3, 13, 0);
510 /* nothing to be done here. aux3_yc is
511 directly connected to the saa711a */
515 /* nothing to be done here. aux3 is
516 directly connected to the saa711a */
517 i = SAA7115_COMPOSITE1;
520 i = SAA7115_COMPOSITE0;
521 err = tea6415c_call(mxb, video, s_routing, 1, 17, 0);
528 /* switch video in saa7111a */
529 if (saa7111a_call(mxb, video, s_routing, i, SAA7111_FMT_CCIR, 0))
530 pr_err("VIDIOC_S_INPUT: could not address saa7111a\n");
532 mxb->cur_audinput = video_audio_connect[input];
533 /* switch the audio-source only if necessary */
534 if (0 == mxb->cur_mute)
535 tea6420_route(mxb, mxb->cur_audinput);
536 if (mxb->cur_audinput == 0)
537 mxb_update_audmode(mxb);
542 static int vidioc_g_tuner(struct file *file, void *fh, struct v4l2_tuner *t)
544 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
545 struct mxb *mxb = (struct mxb *)dev->ext_priv;
548 DEB_D("VIDIOC_G_TUNER: channel %d does not have a tuner attached\n",
553 DEB_EE("VIDIOC_G_TUNER: %d\n", t->index);
555 memset(t, 0, sizeof(*t));
556 strscpy(t->name, "TV Tuner", sizeof(t->name));
557 t->type = V4L2_TUNER_ANALOG_TV;
558 t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO |
559 V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
560 t->audmode = mxb->cur_mode;
561 return call_all(dev, tuner, g_tuner, t);
564 static int vidioc_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *t)
566 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
567 struct mxb *mxb = (struct mxb *)dev->ext_priv;
570 DEB_D("VIDIOC_S_TUNER: channel %d does not have a tuner attached\n",
575 mxb->cur_mode = t->audmode;
576 return call_all(dev, tuner, s_tuner, t);
579 static int vidioc_querystd(struct file *file, void *fh, v4l2_std_id *norm)
581 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
583 return call_all(dev, video, querystd, norm);
586 static int vidioc_g_frequency(struct file *file, void *fh, struct v4l2_frequency *f)
588 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
589 struct mxb *mxb = (struct mxb *)dev->ext_priv;
595 DEB_EE("VIDIOC_G_FREQ: freq:0x%08x\n", mxb->cur_freq.frequency);
599 static int vidioc_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *f)
601 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
602 struct mxb *mxb = (struct mxb *)dev->ext_priv;
603 struct saa7146_vv *vv = dev->vv_data;
608 if (V4L2_TUNER_ANALOG_TV != f->type)
611 DEB_EE("VIDIOC_S_FREQUENCY: freq:0x%08x\n", mxb->cur_freq.frequency);
613 /* tune in desired frequency */
614 tuner_call(mxb, tuner, s_frequency, f);
615 /* let the tuner subdev clamp the frequency to the tuner range */
617 tuner_call(mxb, tuner, g_frequency, &mxb->cur_freq);
618 if (mxb->cur_audinput == 0)
619 mxb_update_audmode(mxb);
624 /* hack: changing the frequency should invalidate the vbi-counter (=> alevt) */
625 spin_lock(&dev->slock);
626 vv->vbi_fieldcount = 0;
627 spin_unlock(&dev->slock);
632 static int vidioc_enumaudio(struct file *file, void *fh, struct v4l2_audio *a)
634 if (a->index >= MXB_AUDIOS)
636 *a = mxb_audios[a->index];
640 static int vidioc_g_audio(struct file *file, void *fh, struct v4l2_audio *a)
642 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
643 struct mxb *mxb = (struct mxb *)dev->ext_priv;
645 DEB_EE("VIDIOC_G_AUDIO\n");
646 *a = mxb_audios[mxb->cur_audinput];
650 static int vidioc_s_audio(struct file *file, void *fh, const struct v4l2_audio *a)
652 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
653 struct mxb *mxb = (struct mxb *)dev->ext_priv;
655 DEB_D("VIDIOC_S_AUDIO %d\n", a->index);
656 if (mxb_inputs[mxb->cur_input].audioset & (1 << a->index)) {
657 if (mxb->cur_audinput != a->index) {
658 mxb->cur_audinput = a->index;
659 tea6420_route(mxb, a->index);
660 if (mxb->cur_audinput == 0)
661 mxb_update_audmode(mxb);
668 #ifdef CONFIG_VIDEO_ADV_DEBUG
669 static int vidioc_g_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
671 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
673 if (reg->reg > pci_resource_len(dev->pci, 0) - 4)
675 reg->val = saa7146_read(dev, reg->reg);
680 static int vidioc_s_register(struct file *file, void *fh, const struct v4l2_dbg_register *reg)
682 struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
684 if (reg->reg > pci_resource_len(dev->pci, 0) - 4)
686 saa7146_write(dev, reg->reg, reg->val);
691 static struct saa7146_ext_vv vv_data;
693 /* this function only gets called when the probing was successful */
694 static int mxb_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
698 DEB_EE("dev:%p\n", dev);
700 saa7146_vv_init(dev, &vv_data);
701 if (mxb_probe(dev)) {
702 saa7146_vv_release(dev);
705 mxb = (struct mxb *)dev->ext_priv;
707 vv_data.vid_ops.vidioc_enum_input = vidioc_enum_input;
708 vv_data.vid_ops.vidioc_g_input = vidioc_g_input;
709 vv_data.vid_ops.vidioc_s_input = vidioc_s_input;
710 vv_data.vid_ops.vidioc_querystd = vidioc_querystd;
711 vv_data.vid_ops.vidioc_g_tuner = vidioc_g_tuner;
712 vv_data.vid_ops.vidioc_s_tuner = vidioc_s_tuner;
713 vv_data.vid_ops.vidioc_g_frequency = vidioc_g_frequency;
714 vv_data.vid_ops.vidioc_s_frequency = vidioc_s_frequency;
715 vv_data.vid_ops.vidioc_enumaudio = vidioc_enumaudio;
716 vv_data.vid_ops.vidioc_g_audio = vidioc_g_audio;
717 vv_data.vid_ops.vidioc_s_audio = vidioc_s_audio;
718 #ifdef CONFIG_VIDEO_ADV_DEBUG
719 vv_data.vid_ops.vidioc_g_register = vidioc_g_register;
720 vv_data.vid_ops.vidioc_s_register = vidioc_s_register;
722 if (saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) {
723 ERR("cannot register capture v4l2 device. skipping.\n");
724 saa7146_vv_release(dev);
728 /* initialization stuff (vbi) (only for revision > 0 and for extensions which want it)*/
729 if (MXB_BOARD_CAN_DO_VBI(dev)) {
730 if (saa7146_register_device(&mxb->vbi_dev, dev, "mxb", VFL_TYPE_VBI)) {
731 ERR("cannot register vbi v4l2 device. skipping.\n");
735 pr_info("found Multimedia eXtension Board #%d\n", mxb_num);
742 static int mxb_detach(struct saa7146_dev *dev)
744 struct mxb *mxb = (struct mxb *)dev->ext_priv;
746 DEB_EE("dev:%p\n", dev);
748 /* mute audio on tea6420s */
749 tea6420_route(mxb, 6);
751 saa7146_unregister_device(&mxb->video_dev,dev);
752 if (MXB_BOARD_CAN_DO_VBI(dev))
753 saa7146_unregister_device(&mxb->vbi_dev, dev);
754 saa7146_vv_release(dev);
758 i2c_del_adapter(&mxb->i2c_adapter);
764 static int std_callback(struct saa7146_dev *dev, struct saa7146_standard *standard)
766 struct mxb *mxb = (struct mxb *)dev->ext_priv;
768 if (V4L2_STD_PAL_I == standard->id) {
769 v4l2_std_id std = V4L2_STD_PAL_I;
771 DEB_D("VIDIOC_S_STD: setting mxb for PAL_I\n");
772 /* These two gpio calls set the GPIO pins that control the tda9820 */
773 saa7146_write(dev, GPIO_CTRL, 0x00404050);
774 saa7111a_call(mxb, core, s_gpio, 0);
775 saa7111a_call(mxb, video, s_std, std);
776 if (mxb->cur_input == 0)
777 tuner_call(mxb, video, s_std, std);
779 v4l2_std_id std = V4L2_STD_PAL_BG;
783 DEB_D("VIDIOC_S_STD: setting mxb for PAL/NTSC/SECAM\n");
784 /* These two gpio calls set the GPIO pins that control the tda9820 */
785 saa7146_write(dev, GPIO_CTRL, 0x00404050);
786 saa7111a_call(mxb, core, s_gpio, 1);
787 saa7111a_call(mxb, video, s_std, std);
788 if (mxb->cur_input == 0)
789 tuner_call(mxb, video, s_std, std);
794 static struct saa7146_standard standard[] = {
796 .name = "PAL-BG", .id = V4L2_STD_PAL_BG,
797 .v_offset = 0x17, .v_field = 288,
798 .h_offset = 0x14, .h_pixels = 680,
799 .v_max_out = 576, .h_max_out = 768,
801 .name = "PAL-I", .id = V4L2_STD_PAL_I,
802 .v_offset = 0x17, .v_field = 288,
803 .h_offset = 0x14, .h_pixels = 680,
804 .v_max_out = 576, .h_max_out = 768,
806 .name = "NTSC", .id = V4L2_STD_NTSC,
807 .v_offset = 0x16, .v_field = 240,
808 .h_offset = 0x06, .h_pixels = 708,
809 .v_max_out = 480, .h_max_out = 640,
811 .name = "SECAM", .id = V4L2_STD_SECAM,
812 .v_offset = 0x14, .v_field = 288,
813 .h_offset = 0x14, .h_pixels = 720,
814 .v_max_out = 576, .h_max_out = 768,
818 static struct saa7146_pci_extension_data mxb = {
819 .ext_priv = "Multimedia eXtension Board",
823 static const struct pci_device_id pci_tbl[] = {
825 .vendor = PCI_VENDOR_ID_PHILIPS,
826 .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
829 .driver_data = (unsigned long)&mxb,
835 MODULE_DEVICE_TABLE(pci, pci_tbl);
837 static struct saa7146_ext_vv vv_data = {
838 .inputs = MXB_INPUTS,
839 .capabilities = V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE | V4L2_CAP_AUDIO,
840 .stds = &standard[0],
841 .num_stds = ARRAY_SIZE(standard),
842 .std_callback = &std_callback,
845 static struct saa7146_extension extension = {
846 .name = "Multimedia eXtension Board",
847 .flags = SAA7146_USE_I2C_IRQ,
849 .pci_tbl = &pci_tbl[0],
850 .module = THIS_MODULE,
852 .attach = mxb_attach,
853 .detach = mxb_detach,
859 static int __init mxb_init_module(void)
861 if (saa7146_register_extension(&extension)) {
862 DEB_S("failed to register extension\n");
869 static void __exit mxb_cleanup_module(void)
871 saa7146_unregister_extension(&extension);
874 module_init(mxb_init_module);
875 module_exit(mxb_cleanup_module);
877 MODULE_DESCRIPTION("video4linux-2 driver for the Siemens-Nixdorf 'Multimedia eXtension board'");
878 MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
879 MODULE_LICENSE("GPL");