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