|
@@ -83,9 +83,14 @@ static struct {
|
|
static int video_audio_connect[MXB_INPUTS] =
|
|
static int video_audio_connect[MXB_INPUTS] =
|
|
{ 0, 1, 3, 3 };
|
|
{ 0, 1, 3, 3 };
|
|
|
|
|
|
|
|
+struct mxb_routing {
|
|
|
|
+ u32 input;
|
|
|
|
+ u32 output;
|
|
|
|
+};
|
|
|
|
+
|
|
/* These are the necessary input-output-pins for bringing one audio source
|
|
/* These are the necessary input-output-pins for bringing one audio source
|
|
(see above) to the CD-output. Note that gain is set to 0 in this table. */
|
|
(see above) to the CD-output. Note that gain is set to 0 in this table. */
|
|
-static struct v4l2_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
|
|
|
|
|
|
+static struct mxb_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
|
|
{ { 1, 1 }, { 1, 1 } }, /* Tuner */
|
|
{ { 1, 1 }, { 1, 1 } }, /* Tuner */
|
|
{ { 5, 1 }, { 6, 1 } }, /* AUX 1 */
|
|
{ { 5, 1 }, { 6, 1 } }, /* AUX 1 */
|
|
{ { 4, 1 }, { 6, 1 } }, /* AUX 2 */
|
|
{ { 4, 1 }, { 6, 1 } }, /* AUX 2 */
|
|
@@ -97,7 +102,7 @@ static struct v4l2_routing TEA6420_cd[MXB_AUDIOS + 1][2] = {
|
|
|
|
|
|
/* These are the necessary input-output-pins for bringing one audio source
|
|
/* These are the necessary input-output-pins for bringing one audio source
|
|
(see above) to the line-output. Note that gain is set to 0 in this table. */
|
|
(see above) to the line-output. Note that gain is set to 0 in this table. */
|
|
-static struct v4l2_routing TEA6420_line[MXB_AUDIOS + 1][2] = {
|
|
|
|
|
|
+static struct mxb_routing TEA6420_line[MXB_AUDIOS + 1][2] = {
|
|
{ { 2, 3 }, { 1, 2 } },
|
|
{ { 2, 3 }, { 1, 2 } },
|
|
{ { 5, 3 }, { 6, 2 } },
|
|
{ { 5, 3 }, { 6, 2 } },
|
|
{ { 4, 3 }, { 6, 2 } },
|
|
{ { 4, 3 }, { 6, 2 } },
|
|
@@ -134,10 +139,6 @@ struct mxb
|
|
|
|
|
|
#define saa7111a_call(mxb, o, f, args...) \
|
|
#define saa7111a_call(mxb, o, f, args...) \
|
|
v4l2_subdev_call(mxb->saa7111a, o, f, ##args)
|
|
v4l2_subdev_call(mxb->saa7111a, o, f, ##args)
|
|
-#define tea6420_1_call(mxb, o, f, args...) \
|
|
|
|
- v4l2_subdev_call(mxb->tea6420_1, o, f, ##args)
|
|
|
|
-#define tea6420_2_call(mxb, o, f, args...) \
|
|
|
|
- v4l2_subdev_call(mxb->tea6420_2, o, f, ##args)
|
|
|
|
#define tda9840_call(mxb, o, f, args...) \
|
|
#define tda9840_call(mxb, o, f, args...) \
|
|
v4l2_subdev_call(mxb->tda9840, o, f, ##args)
|
|
v4l2_subdev_call(mxb->tda9840, o, f, ##args)
|
|
#define tea6415c_call(mxb, o, f, args...) \
|
|
#define tea6415c_call(mxb, o, f, args...) \
|
|
@@ -147,6 +148,22 @@ struct mxb
|
|
#define call_all(dev, o, f, args...) \
|
|
#define call_all(dev, o, f, args...) \
|
|
v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args)
|
|
v4l2_device_call_until_err(&dev->v4l2_dev, 0, o, f, ##args)
|
|
|
|
|
|
|
|
+static inline void tea6420_route_cd(struct mxb *mxb, int idx)
|
|
|
|
+{
|
|
|
|
+ v4l2_subdev_call(mxb->tea6420_1, audio, s_routing,
|
|
|
|
+ TEA6420_cd[idx][0].input, TEA6420_cd[idx][0].output, 0);
|
|
|
|
+ v4l2_subdev_call(mxb->tea6420_2, audio, s_routing,
|
|
|
|
+ TEA6420_cd[idx][1].input, TEA6420_cd[idx][1].output, 0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void tea6420_route_line(struct mxb *mxb, int idx)
|
|
|
|
+{
|
|
|
|
+ v4l2_subdev_call(mxb->tea6420_1, audio, s_routing,
|
|
|
|
+ TEA6420_line[idx][0].input, TEA6420_line[idx][0].output, 0);
|
|
|
|
+ v4l2_subdev_call(mxb->tea6420_2, audio, s_routing,
|
|
|
|
+ TEA6420_line[idx][1].input, TEA6420_line[idx][1].output, 0);
|
|
|
|
+}
|
|
|
|
+
|
|
static struct saa7146_extension extension;
|
|
static struct saa7146_extension extension;
|
|
|
|
|
|
static int mxb_probe(struct saa7146_dev *dev)
|
|
static int mxb_probe(struct saa7146_dev *dev)
|
|
@@ -268,7 +285,6 @@ static int mxb_init_done(struct saa7146_dev* dev)
|
|
struct i2c_msg msg;
|
|
struct i2c_msg msg;
|
|
struct tuner_setup tun_setup;
|
|
struct tuner_setup tun_setup;
|
|
v4l2_std_id std = V4L2_STD_PAL_BG;
|
|
v4l2_std_id std = V4L2_STD_PAL_BG;
|
|
- struct v4l2_routing route;
|
|
|
|
|
|
|
|
int i = 0, err = 0;
|
|
int i = 0, err = 0;
|
|
|
|
|
|
@@ -277,9 +293,8 @@ static int mxb_init_done(struct saa7146_dev* dev)
|
|
|
|
|
|
/* select tuner-output on saa7111a */
|
|
/* select tuner-output on saa7111a */
|
|
i = 0;
|
|
i = 0;
|
|
- route.input = SAA7115_COMPOSITE0;
|
|
|
|
- route.output = SAA7111_FMT_CCIR | SAA7111_VBI_BYPASS;
|
|
|
|
- saa7111a_call(mxb, video, s_routing, &route);
|
|
|
|
|
|
+ saa7111a_call(mxb, video, s_routing, SAA7115_COMPOSITE0,
|
|
|
|
+ SAA7111_FMT_CCIR | SAA7111_VBI_BYPASS, 0);
|
|
|
|
|
|
/* select a tuner type */
|
|
/* select a tuner type */
|
|
tun_setup.mode_mask = T_ANALOG_TV;
|
|
tun_setup.mode_mask = T_ANALOG_TV;
|
|
@@ -296,20 +311,14 @@ static int mxb_init_done(struct saa7146_dev* dev)
|
|
tuner_call(mxb, core, s_std, std);
|
|
tuner_call(mxb, core, s_std, std);
|
|
|
|
|
|
/* mute audio on tea6420s */
|
|
/* mute audio on tea6420s */
|
|
- tea6420_1_call(mxb, audio, s_routing, &TEA6420_line[6][0]);
|
|
|
|
- tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[6][1]);
|
|
|
|
- tea6420_1_call(mxb, audio, s_routing, &TEA6420_cd[6][0]);
|
|
|
|
- tea6420_2_call(mxb, audio, s_routing, &TEA6420_cd[6][1]);
|
|
|
|
|
|
+ tea6420_route_line(mxb, 6);
|
|
|
|
+ tea6420_route_cd(mxb, 6);
|
|
|
|
|
|
/* switch to tuner-channel on tea6415c */
|
|
/* switch to tuner-channel on tea6415c */
|
|
- route.input = 3;
|
|
|
|
- route.output = 17;
|
|
|
|
- tea6415c_call(mxb, video, s_routing, &route);
|
|
|
|
|
|
+ tea6415c_call(mxb, video, s_routing, 3, 17, 0);
|
|
|
|
|
|
/* select tuner-output on multicable on tea6415c */
|
|
/* select tuner-output on multicable on tea6415c */
|
|
- route.input = 3;
|
|
|
|
- route.output = 13;
|
|
|
|
- tea6415c_call(mxb, video, s_routing, &route);
|
|
|
|
|
|
+ tea6415c_call(mxb, video, s_routing, 3, 13, 0);
|
|
|
|
|
|
/* the rest for mxb */
|
|
/* the rest for mxb */
|
|
mxb->cur_input = 0;
|
|
mxb->cur_input = 0;
|
|
@@ -433,18 +442,9 @@ static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *vc)
|
|
|
|
|
|
if (vc->id == V4L2_CID_AUDIO_MUTE) {
|
|
if (vc->id == V4L2_CID_AUDIO_MUTE) {
|
|
mxb->cur_mute = vc->value;
|
|
mxb->cur_mute = vc->value;
|
|
- if (!vc->value) {
|
|
|
|
- /* switch the audio-source */
|
|
|
|
- tea6420_1_call(mxb, audio, s_routing,
|
|
|
|
- &TEA6420_line[video_audio_connect[mxb->cur_input]][0]);
|
|
|
|
- tea6420_2_call(mxb, audio, s_routing,
|
|
|
|
- &TEA6420_line[video_audio_connect[mxb->cur_input]][1]);
|
|
|
|
- } else {
|
|
|
|
- tea6420_1_call(mxb, audio, s_routing,
|
|
|
|
- &TEA6420_line[6][0]);
|
|
|
|
- tea6420_2_call(mxb, audio, s_routing,
|
|
|
|
- &TEA6420_line[6][1]);
|
|
|
|
- }
|
|
|
|
|
|
+ /* switch the audio-source */
|
|
|
|
+ tea6420_route_line(mxb, vc->value ? 6 :
|
|
|
|
+ video_audio_connect[mxb->cur_input]);
|
|
DEB_EE(("VIDIOC_S_CTRL, V4L2_CID_AUDIO_MUTE: %d.\n", vc->value));
|
|
DEB_EE(("VIDIOC_S_CTRL, V4L2_CID_AUDIO_MUTE: %d.\n", vc->value));
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
@@ -473,7 +473,7 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
|
|
{
|
|
{
|
|
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
|
|
struct saa7146_dev *dev = ((struct saa7146_fh *)fh)->dev;
|
|
struct mxb *mxb = (struct mxb *)dev->ext_priv;
|
|
struct mxb *mxb = (struct mxb *)dev->ext_priv;
|
|
- struct v4l2_routing route;
|
|
|
|
|
|
+ int err = 0;
|
|
int i = 0;
|
|
int i = 0;
|
|
|
|
|
|
DEB_EE(("VIDIOC_S_INPUT %d.\n", input));
|
|
DEB_EE(("VIDIOC_S_INPUT %d.\n", input));
|
|
@@ -491,16 +491,12 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
|
|
switch (input) {
|
|
switch (input) {
|
|
case TUNER:
|
|
case TUNER:
|
|
i = SAA7115_COMPOSITE0;
|
|
i = SAA7115_COMPOSITE0;
|
|
- route.input = 3;
|
|
|
|
- route.output = 17;
|
|
|
|
|
|
|
|
- if (tea6415c_call(mxb, video, s_routing, &route)) {
|
|
|
|
- printk(KERN_ERR "VIDIOC_S_INPUT: could not address tea6415c #1\n");
|
|
|
|
- return -EFAULT;
|
|
|
|
- }
|
|
|
|
|
|
+ err = tea6415c_call(mxb, video, s_routing, 3, 17, 0);
|
|
|
|
+
|
|
/* connect tuner-output always to multicable */
|
|
/* connect tuner-output always to multicable */
|
|
- route.input = 3;
|
|
|
|
- route.output = 13;
|
|
|
|
|
|
+ if (!err)
|
|
|
|
+ err = tea6415c_call(mxb, video, s_routing, 3, 13, 0);
|
|
break;
|
|
break;
|
|
case AUX3_YC:
|
|
case AUX3_YC:
|
|
/* nothing to be done here. aux3_yc is
|
|
/* nothing to be done here. aux3_yc is
|
|
@@ -514,37 +510,20 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
|
|
break;
|
|
break;
|
|
case AUX1:
|
|
case AUX1:
|
|
i = SAA7115_COMPOSITE0;
|
|
i = SAA7115_COMPOSITE0;
|
|
- route.input = 1;
|
|
|
|
- route.output = 17;
|
|
|
|
|
|
+ err = tea6415c_call(mxb, video, s_routing, 1, 17, 0);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- /* switch video in tea6415c only if necessary */
|
|
|
|
- switch (input) {
|
|
|
|
- case TUNER:
|
|
|
|
- case AUX1:
|
|
|
|
- if (tea6415c_call(mxb, video, s_routing, &route)) {
|
|
|
|
- printk(KERN_ERR "VIDIOC_S_INPUT: could not address tea6415c #3\n");
|
|
|
|
- return -EFAULT;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ if (err)
|
|
|
|
+ return err;
|
|
|
|
|
|
/* switch video in saa7111a */
|
|
/* switch video in saa7111a */
|
|
- route.input = i;
|
|
|
|
- route.output = 0;
|
|
|
|
- if (saa7111a_call(mxb, video, s_routing, &route))
|
|
|
|
|
|
+ if (saa7111a_call(mxb, video, s_routing, i, 0, 0))
|
|
printk(KERN_ERR "VIDIOC_S_INPUT: could not address saa7111a #1.\n");
|
|
printk(KERN_ERR "VIDIOC_S_INPUT: could not address saa7111a #1.\n");
|
|
|
|
|
|
/* switch the audio-source only if necessary */
|
|
/* switch the audio-source only if necessary */
|
|
- if (0 == mxb->cur_mute) {
|
|
|
|
- tea6420_1_call(mxb, audio, s_routing,
|
|
|
|
- &TEA6420_line[video_audio_connect[input]][0]);
|
|
|
|
- tea6420_2_call(mxb, audio, s_routing,
|
|
|
|
- &TEA6420_line[video_audio_connect[input]][1]);
|
|
|
|
- }
|
|
|
|
|
|
+ if (0 == mxb->cur_mute)
|
|
|
|
+ tea6420_route_line(mxb, video_audio_connect[input]);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -686,9 +665,7 @@ static long vidioc_default(struct file *file, void *fh, int cmd, void *arg)
|
|
|
|
|
|
DEB_EE(("MXB_S_AUDIO_CD: i:%d.\n", i));
|
|
DEB_EE(("MXB_S_AUDIO_CD: i:%d.\n", i));
|
|
|
|
|
|
- tea6420_1_call(mxb, audio, s_routing, &TEA6420_cd[i][0]);
|
|
|
|
- tea6420_2_call(mxb, audio, s_routing, &TEA6420_cd[i][1]);
|
|
|
|
-
|
|
|
|
|
|
+ tea6420_route_cd(mxb, i);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
case MXB_S_AUDIO_LINE:
|
|
case MXB_S_AUDIO_LINE:
|
|
@@ -701,9 +678,7 @@ static long vidioc_default(struct file *file, void *fh, int cmd, void *arg)
|
|
}
|
|
}
|
|
|
|
|
|
DEB_EE(("MXB_S_AUDIO_LINE: i:%d.\n", i));
|
|
DEB_EE(("MXB_S_AUDIO_LINE: i:%d.\n", i));
|
|
- tea6420_1_call(mxb, audio, s_routing, &TEA6420_line[i][0]);
|
|
|
|
- tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[i][1]);
|
|
|
|
-
|
|
|
|
|
|
+ tea6420_route_line(mxb, i);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
default:
|
|
default:
|