mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
V4L/DVB (11380): v4l2-subdev: change s_routing prototype
It is no longer needed to use a struct pointer as argument, since v4l2_subdev doesn't require that ioctl-like approach anymore. Instead just pass the input, output and config (new!) arguments directly. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
c0ff29150d
commit
5325b4272a
@ -652,7 +652,7 @@ static int au8522_reset(struct v4l2_subdev *sd, u32 val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int au8522_s_video_routing(struct v4l2_subdev *sd,
|
static int au8522_s_video_routing(struct v4l2_subdev *sd,
|
||||||
const struct v4l2_routing *route)
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct au8522_state *state = to_state(sd);
|
struct au8522_state *state = to_state(sd);
|
||||||
|
|
||||||
@ -663,11 +663,11 @@ static int au8522_s_video_routing(struct v4l2_subdev *sd,
|
|||||||
closed), and then came back to analog mode */
|
closed), and then came back to analog mode */
|
||||||
au8522_writereg(state, 0x106, 1);
|
au8522_writereg(state, 0x106, 1);
|
||||||
|
|
||||||
if (route->input == AU8522_COMPOSITE_CH1) {
|
if (input == AU8522_COMPOSITE_CH1) {
|
||||||
au8522_setup_cvbs_mode(state);
|
au8522_setup_cvbs_mode(state);
|
||||||
} else if (route->input == AU8522_SVIDEO_CH13) {
|
} else if (input == AU8522_SVIDEO_CH13) {
|
||||||
au8522_setup_svideo_mode(state);
|
au8522_setup_svideo_mode(state);
|
||||||
} else if (route->input == AU8522_COMPOSITE_CH4_SIF) {
|
} else if (input == AU8522_COMPOSITE_CH4_SIF) {
|
||||||
au8522_setup_cvbs_tuner_mode(state);
|
au8522_setup_cvbs_tuner_mode(state);
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_ERR "au8522 mode not currently supported\n");
|
printk(KERN_ERR "au8522 mode not currently supported\n");
|
||||||
@ -677,10 +677,10 @@ static int au8522_s_video_routing(struct v4l2_subdev *sd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int au8522_s_audio_routing(struct v4l2_subdev *sd,
|
static int au8522_s_audio_routing(struct v4l2_subdev *sd,
|
||||||
const struct v4l2_routing *route)
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct au8522_state *state = to_state(sd);
|
struct au8522_state *state = to_state(sd);
|
||||||
set_audio_input(state, route->input);
|
set_audio_input(state, input);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,18 +219,19 @@ static int adv7170_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int adv7170_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int adv7170_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct adv7170 *encoder = to_adv7170(sd);
|
struct adv7170 *encoder = to_adv7170(sd);
|
||||||
|
|
||||||
/* RJ: route->input = 0: input is from decoder
|
/* RJ: input = 0: input is from decoder
|
||||||
route->input = 1: input is from ZR36060
|
input = 1: input is from ZR36060
|
||||||
route->input = 2: color bar */
|
input = 2: color bar */
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "set input from %s\n",
|
v4l2_dbg(1, debug, sd, "set input from %s\n",
|
||||||
route->input == 0 ? "decoder" : "ZR36060");
|
input == 0 ? "decoder" : "ZR36060");
|
||||||
|
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case 0:
|
case 0:
|
||||||
adv7170_write(sd, 0x01, 0x20);
|
adv7170_write(sd, 0x01, 0x20);
|
||||||
adv7170_write(sd, 0x08, TR1CAPT); /* TR1 */
|
adv7170_write(sd, 0x08, TR1CAPT); /* TR1 */
|
||||||
@ -250,11 +251,11 @@ static int adv7170_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
v4l2_dbg(1, debug, sd, "illegal input: %d\n", route->input);
|
v4l2_dbg(1, debug, sd, "illegal input: %d\n", input);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[route->input]);
|
v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[input]);
|
||||||
encoder->input = route->input;
|
encoder->input = input;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,15 +237,16 @@ static int adv7175_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int adv7175_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int adv7175_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct adv7175 *encoder = to_adv7175(sd);
|
struct adv7175 *encoder = to_adv7175(sd);
|
||||||
|
|
||||||
/* RJ: route->input = 0: input is from decoder
|
/* RJ: input = 0: input is from decoder
|
||||||
route->input = 1: input is from ZR36060
|
input = 1: input is from ZR36060
|
||||||
route->input = 2: color bar */
|
input = 2: color bar */
|
||||||
|
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case 0:
|
case 0:
|
||||||
adv7175_write(sd, 0x01, 0x00);
|
adv7175_write(sd, 0x01, 0x00);
|
||||||
|
|
||||||
@ -288,11 +289,11 @@ static int adv7175_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
v4l2_dbg(1, debug, sd, "illegal input: %d\n", route->input);
|
v4l2_dbg(1, debug, sd, "illegal input: %d\n", input);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[route->input]);
|
v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[input]);
|
||||||
encoder->input = route->input;
|
encoder->input = input;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1154,7 +1154,6 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
|
|||||||
struct au0828_fh *fh = priv;
|
struct au0828_fh *fh = priv;
|
||||||
struct au0828_dev *dev = fh->dev;
|
struct au0828_dev *dev = fh->dev;
|
||||||
int i;
|
int i;
|
||||||
struct v4l2_routing route;
|
|
||||||
|
|
||||||
dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
|
dprintk(1, "VIDIOC_S_INPUT in function %s, input=%d\n", __func__,
|
||||||
index);
|
index);
|
||||||
@ -1180,9 +1179,8 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
route.input = AUVI_INPUT(index).vmux;
|
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
|
||||||
route.output = 0;
|
AUVI_INPUT(index).vmux, 0, 0);
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing, &route);
|
|
||||||
|
|
||||||
for (i = 0; i < AU0828_MAX_INPUT; i++) {
|
for (i = 0; i < AU0828_MAX_INPUT; i++) {
|
||||||
int enable = 0;
|
int enable = 0;
|
||||||
@ -1205,8 +1203,8 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int index)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
route.input = AUVI_INPUT(index).amux;
|
v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing, &route);
|
AUVI_INPUT(index).amux, 0, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,21 +292,22 @@ static int bt819_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bt819_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int bt819_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct bt819 *decoder = to_bt819(sd);
|
struct bt819 *decoder = to_bt819(sd);
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "set input %x\n", route->input);
|
v4l2_dbg(1, debug, sd, "set input %x\n", input);
|
||||||
|
|
||||||
if (route->input < 0 || route->input > 7)
|
if (input < 0 || input > 7)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (sd->v4l2_dev == NULL || sd->v4l2_dev->notify == NULL)
|
if (sd->v4l2_dev == NULL || sd->v4l2_dev->notify == NULL)
|
||||||
v4l2_err(sd, "no notify found!\n");
|
v4l2_err(sd, "no notify found!\n");
|
||||||
|
|
||||||
if (decoder->input != route->input) {
|
if (decoder->input != input) {
|
||||||
v4l2_subdev_notify(sd, BT819_FIFO_RESET_LOW, 0);
|
v4l2_subdev_notify(sd, BT819_FIFO_RESET_LOW, 0);
|
||||||
decoder->input = route->input;
|
decoder->input = input;
|
||||||
/* select mode */
|
/* select mode */
|
||||||
if (decoder->input == 0) {
|
if (decoder->input == 0) {
|
||||||
bt819_setbit(decoder, 0x0b, 6, 0);
|
bt819_setbit(decoder, 0x0b, 6, 0);
|
||||||
|
@ -142,16 +142,17 @@ static int bt856_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bt856_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int bt856_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct bt856 *encoder = to_bt856(sd);
|
struct bt856 *encoder = to_bt856(sd);
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "set input %d\n", route->input);
|
v4l2_dbg(1, debug, sd, "set input %d\n", input);
|
||||||
|
|
||||||
/* We only have video bus.
|
/* We only have video bus.
|
||||||
* route->input= 0: input is from bt819
|
* input= 0: input is from bt819
|
||||||
* route->input= 1: input is from ZR36060 */
|
* input= 1: input is from ZR36060 */
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case 0:
|
case 0:
|
||||||
bt856_setbit(encoder, 0xde, 4, 0);
|
bt856_setbit(encoder, 0xde, 4, 0);
|
||||||
bt856_setbit(encoder, 0xde, 3, 1);
|
bt856_setbit(encoder, 0xde, 3, 1);
|
||||||
|
@ -99,7 +99,8 @@ static int bt866_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bt866_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int bt866_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
static const __u8 init[] = {
|
static const __u8 init[] = {
|
||||||
0xc8, 0xcc, /* CRSCALE */
|
0xc8, 0xcc, /* CRSCALE */
|
||||||
@ -137,7 +138,7 @@ static int bt866_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *ro
|
|||||||
|
|
||||||
val = encoder->reg[0xdc];
|
val = encoder->reg[0xdc];
|
||||||
|
|
||||||
if (route->input == 0)
|
if (input == 0)
|
||||||
val |= 0x40; /* CBSWAP */
|
val |= 0x40; /* CBSWAP */
|
||||||
else
|
else
|
||||||
val &= ~0x40; /* !CBSWAP */
|
val &= ~0x40; /* !CBSWAP */
|
||||||
@ -145,15 +146,15 @@ static int bt866_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *ro
|
|||||||
bt866_write(encoder, 0xdc, val);
|
bt866_write(encoder, 0xdc, val);
|
||||||
|
|
||||||
val = encoder->reg[0xcc];
|
val = encoder->reg[0xcc];
|
||||||
if (route->input == 2)
|
if (input == 2)
|
||||||
val |= 0x01; /* OSDBAR */
|
val |= 0x01; /* OSDBAR */
|
||||||
else
|
else
|
||||||
val &= ~0x01; /* !OSDBAR */
|
val &= ~0x01; /* !OSDBAR */
|
||||||
bt866_write(encoder, 0xcc, val);
|
bt866_write(encoder, 0xcc, val);
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "set input %d\n", route->input);
|
v4l2_dbg(1, debug, sd, "set input %d\n", input);
|
||||||
|
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -1198,7 +1198,7 @@ audio_mux(struct bttv *btv, int input, int mute)
|
|||||||
ctrl.value = btv->mute;
|
ctrl.value = btv->mute;
|
||||||
bttv_call_all(btv, core, s_ctrl, &ctrl);
|
bttv_call_all(btv, core, s_ctrl, &ctrl);
|
||||||
if (btv->sd_msp34xx) {
|
if (btv->sd_msp34xx) {
|
||||||
struct v4l2_routing route;
|
u32 in;
|
||||||
|
|
||||||
/* Note: the inputs tuner/radio/extern/intern are translated
|
/* Note: the inputs tuner/radio/extern/intern are translated
|
||||||
to msp routings. This assumes common behavior for all msp3400
|
to msp routings. This assumes common behavior for all msp3400
|
||||||
@ -1207,11 +1207,11 @@ audio_mux(struct bttv *btv, int input, int mute)
|
|||||||
For now this is sufficient. */
|
For now this is sufficient. */
|
||||||
switch (input) {
|
switch (input) {
|
||||||
case TVAUDIO_INPUT_RADIO:
|
case TVAUDIO_INPUT_RADIO:
|
||||||
route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
|
in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
|
||||||
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
||||||
break;
|
break;
|
||||||
case TVAUDIO_INPUT_EXTERN:
|
case TVAUDIO_INPUT_EXTERN:
|
||||||
route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
|
in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
|
||||||
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
||||||
break;
|
break;
|
||||||
case TVAUDIO_INPUT_INTERN:
|
case TVAUDIO_INPUT_INTERN:
|
||||||
@ -1220,7 +1220,7 @@ audio_mux(struct bttv *btv, int input, int mute)
|
|||||||
input is the BTTV_BOARD_AVERMEDIA98. I wonder how
|
input is the BTTV_BOARD_AVERMEDIA98. I wonder how
|
||||||
that was tested. My guess is that the whole INTERN
|
that was tested. My guess is that the whole INTERN
|
||||||
input does not work. */
|
input does not work. */
|
||||||
route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
|
in = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
|
||||||
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
||||||
break;
|
break;
|
||||||
case TVAUDIO_INPUT_TUNER:
|
case TVAUDIO_INPUT_TUNER:
|
||||||
@ -1229,21 +1229,18 @@ audio_mux(struct bttv *btv, int input, int mute)
|
|||||||
is the only difference between the VOODOOTV_FM
|
is the only difference between the VOODOOTV_FM
|
||||||
and VOODOOTV_200 */
|
and VOODOOTV_200 */
|
||||||
if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
|
if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
|
||||||
route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
|
in = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
|
||||||
MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
|
MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
|
||||||
else
|
else
|
||||||
route.input = MSP_INPUT_DEFAULT;
|
in = MSP_INPUT_DEFAULT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
route.output = MSP_OUTPUT_DEFAULT;
|
v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing,
|
||||||
v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing, &route);
|
in, MSP_OUTPUT_DEFAULT, 0);
|
||||||
}
|
}
|
||||||
if (btv->sd_tvaudio) {
|
if (btv->sd_tvaudio) {
|
||||||
struct v4l2_routing route;
|
v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing,
|
||||||
|
input, 0, 0);
|
||||||
route.input = input;
|
|
||||||
route.output = 0;
|
|
||||||
v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing, &route);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -53,14 +53,15 @@ static inline int cs5345_read(struct v4l2_subdev *sd, u8 reg)
|
|||||||
return i2c_smbus_read_byte_data(client, reg);
|
return i2c_smbus_read_byte_data(client, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cs5345_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int cs5345_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
if ((route->input & 0xf) > 6) {
|
if ((input & 0xf) > 6) {
|
||||||
v4l2_err(sd, "Invalid input %d.\n", route->input);
|
v4l2_err(sd, "Invalid input %d.\n", input);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
cs5345_write(sd, 0x09, route->input & 0xf);
|
cs5345_write(sd, 0x09, input & 0xf);
|
||||||
cs5345_write(sd, 0x05, route->input & 0xf0);
|
cs5345_write(sd, 0x05, input & 0xf0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,17 +58,18 @@ static int cs53l32a_read(struct v4l2_subdev *sd, u8 reg)
|
|||||||
return i2c_smbus_read_byte_data(client, reg);
|
return i2c_smbus_read_byte_data(client, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cs53l32a_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int cs53l32a_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
/* There are 2 physical inputs, but the second input can be
|
/* There are 2 physical inputs, but the second input can be
|
||||||
placed in two modes, the first mode bypasses the PGA (gain),
|
placed in two modes, the first mode bypasses the PGA (gain),
|
||||||
the second goes through the PGA. Hence there are three
|
the second goes through the PGA. Hence there are three
|
||||||
possible inputs to choose from. */
|
possible inputs to choose from. */
|
||||||
if (route->input > 2) {
|
if (input > 2) {
|
||||||
v4l2_err(sd, "Invalid input %d.\n", route->input);
|
v4l2_err(sd, "Invalid input %d.\n", input);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
cs53l32a_write(sd, 0x01, 0x01 + (route->input << 4));
|
cs53l32a_write(sd, 0x01, 0x01 + (input << 4));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
int cx18_audio_set_io(struct cx18 *cx)
|
int cx18_audio_set_io(struct cx18 *cx)
|
||||||
{
|
{
|
||||||
const struct cx18_card_audio_input *in;
|
const struct cx18_card_audio_input *in;
|
||||||
struct v4l2_routing route;
|
|
||||||
u32 val;
|
u32 val;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -44,13 +43,11 @@ int cx18_audio_set_io(struct cx18 *cx)
|
|||||||
in = &cx->card->audio_inputs[cx->audio_input];
|
in = &cx->card->audio_inputs[cx->audio_input];
|
||||||
|
|
||||||
/* handle muxer chips */
|
/* handle muxer chips */
|
||||||
route.input = in->muxer_input;
|
v4l2_subdev_call(cx->sd_extmux, audio, s_routing,
|
||||||
route.output = 0;
|
in->audio_input, 0, 0);
|
||||||
v4l2_subdev_call(cx->sd_extmux, audio, s_routing, &route);
|
|
||||||
|
|
||||||
route.input = in->audio_input;
|
|
||||||
err = cx18_call_hw_err(cx, cx->card->hw_audio_ctrl,
|
err = cx18_call_hw_err(cx, cx->card->hw_audio_ctrl,
|
||||||
audio, s_routing, &route);
|
audio, s_routing, in->audio_input, 0, 0);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -547,19 +547,19 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int cx18_av_s_video_routing(struct v4l2_subdev *sd,
|
static int cx18_av_s_video_routing(struct v4l2_subdev *sd,
|
||||||
const struct v4l2_routing *route)
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct cx18_av_state *state = to_cx18_av_state(sd);
|
struct cx18_av_state *state = to_cx18_av_state(sd);
|
||||||
struct cx18 *cx = v4l2_get_subdevdata(sd);
|
struct cx18 *cx = v4l2_get_subdevdata(sd);
|
||||||
return set_input(cx, route->input, state->aud_input);
|
return set_input(cx, input, state->aud_input);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cx18_av_s_audio_routing(struct v4l2_subdev *sd,
|
static int cx18_av_s_audio_routing(struct v4l2_subdev *sd,
|
||||||
const struct v4l2_routing *route)
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct cx18_av_state *state = to_cx18_av_state(sd);
|
struct cx18_av_state *state = to_cx18_av_state(sd);
|
||||||
struct cx18 *cx = v4l2_get_subdevdata(sd);
|
struct cx18 *cx = v4l2_get_subdevdata(sd);
|
||||||
return set_input(cx, state->vid_input, route->input);
|
return set_input(cx, state->vid_input, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cx18_av_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
|
static int cx18_av_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
|
||||||
|
@ -156,12 +156,12 @@ static int gpiomux_s_std(struct v4l2_subdev *sd, v4l2_std_id norm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int gpiomux_s_audio_routing(struct v4l2_subdev *sd,
|
static int gpiomux_s_audio_routing(struct v4l2_subdev *sd,
|
||||||
const struct v4l2_routing *route)
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct cx18 *cx = v4l2_get_subdevdata(sd);
|
struct cx18 *cx = v4l2_get_subdevdata(sd);
|
||||||
u32 data;
|
u32 data;
|
||||||
|
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case 0:
|
case 0:
|
||||||
data = cx->card->gpio_audio_input.tuner;
|
data = cx->card->gpio_audio_input.tuner;
|
||||||
break;
|
break;
|
||||||
|
@ -932,7 +932,7 @@ static long cx18_default(struct file *file, void *fh, int cmd, void *arg)
|
|||||||
CX18_DEBUG_IOCTL("VIDIOC_INT_S_AUDIO_ROUTING(%d, %d)\n",
|
CX18_DEBUG_IOCTL("VIDIOC_INT_S_AUDIO_ROUTING(%d, %d)\n",
|
||||||
route->input, route->output);
|
route->input, route->output);
|
||||||
cx18_call_hw(cx, cx->card->hw_audio_ctrl, audio, s_routing,
|
cx18_call_hw(cx, cx->card->hw_audio_ctrl, audio, s_routing,
|
||||||
route);
|
route->input, route->output, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,20 +25,8 @@
|
|||||||
|
|
||||||
void cx18_video_set_io(struct cx18 *cx)
|
void cx18_video_set_io(struct cx18 *cx)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route;
|
|
||||||
int inp = cx->active_input;
|
int inp = cx->active_input;
|
||||||
u32 type;
|
|
||||||
|
|
||||||
route.input = cx->card->video_inputs[inp].video_input;
|
v4l2_subdev_call(cx->sd_av, video, s_routing,
|
||||||
route.output = 0;
|
cx->card->video_inputs[inp].video_input, 0, 0);
|
||||||
v4l2_subdev_call(cx->sd_av, video, s_routing, &route);
|
|
||||||
|
|
||||||
type = cx->card->video_inputs[inp].video_type;
|
|
||||||
|
|
||||||
if (type == CX18_CARD_INPUT_VID_TUNER)
|
|
||||||
route.input = 0; /* Tuner */
|
|
||||||
else if (type < CX18_CARD_INPUT_COMPOSITE1)
|
|
||||||
route.input = 2; /* S-Video */
|
|
||||||
else
|
|
||||||
route.input = 1; /* Composite */
|
|
||||||
}
|
}
|
||||||
|
@ -357,10 +357,7 @@ int cx231xx_config(struct cx231xx *dev)
|
|||||||
*/
|
*/
|
||||||
void cx231xx_config_i2c(struct cx231xx *dev)
|
void cx231xx_config_i2c(struct cx231xx *dev)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route;
|
/* u32 input = INPUT(dev->video_input)->vmux; */
|
||||||
|
|
||||||
route.input = INPUT(dev->video_input)->vmux;
|
|
||||||
route.output = 0;
|
|
||||||
|
|
||||||
call_all(dev, video, s_stream, 1);
|
call_all(dev, video, s_stream, 1);
|
||||||
}
|
}
|
||||||
|
@ -820,17 +820,12 @@ static struct videobuf_queue_ops cx231xx_video_qops = {
|
|||||||
|
|
||||||
void video_mux(struct cx231xx *dev, int index)
|
void video_mux(struct cx231xx *dev, int index)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct v4l2_routing route;
|
|
||||||
|
|
||||||
route.input = INPUT(index)->vmux;
|
|
||||||
route.output = 0;
|
|
||||||
dev->video_input = index;
|
dev->video_input = index;
|
||||||
dev->ctl_ainput = INPUT(index)->amux;
|
dev->ctl_ainput = INPUT(index)->amux;
|
||||||
|
|
||||||
cx231xx_set_video_input_mux(dev, index);
|
cx231xx_set_video_input_mux(dev, index);
|
||||||
|
|
||||||
cx25840_call(dev, video, s_routing, &route);
|
cx25840_call(dev, video, s_routing, INPUT(index)->vmux, 0, 0);
|
||||||
|
|
||||||
cx231xx_set_audio_input(dev, dev->ctl_ainput);
|
cx231xx_set_audio_input(dev, dev->ctl_ainput);
|
||||||
|
|
||||||
|
@ -393,9 +393,6 @@ static void res_free(struct cx23885_dev *dev, struct cx23885_fh *fh,
|
|||||||
|
|
||||||
static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
|
static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route;
|
|
||||||
memset(&route, 0, sizeof(route));
|
|
||||||
|
|
||||||
dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n",
|
dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n",
|
||||||
__func__,
|
__func__,
|
||||||
input, INPUT(input)->vmux,
|
input, INPUT(input)->vmux,
|
||||||
@ -403,10 +400,9 @@ static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
|
|||||||
INPUT(input)->gpio2, INPUT(input)->gpio3);
|
INPUT(input)->gpio2, INPUT(input)->gpio3);
|
||||||
dev->input = input;
|
dev->input = input;
|
||||||
|
|
||||||
route.input = INPUT(input)->vmux;
|
|
||||||
|
|
||||||
/* Tell the internal A/V decoder */
|
/* Tell the internal A/V decoder */
|
||||||
v4l2_subdev_call(dev->sd_cx25840, video, s_routing, &route);
|
v4l2_subdev_call(dev->sd_cx25840, video, s_routing,
|
||||||
|
INPUT(input)->vmux, 0, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1322,22 +1322,24 @@ static int cx25840_s_radio(struct v4l2_subdev *sd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cx25840_s_video_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int cx25840_s_video_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct cx25840_state *state = to_state(sd);
|
struct cx25840_state *state = to_state(sd);
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
|
|
||||||
return set_input(client, route->input, state->aud_input);
|
return set_input(client, input, state->aud_input);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cx25840_s_audio_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int cx25840_s_audio_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct cx25840_state *state = to_state(sd);
|
struct cx25840_state *state = to_state(sd);
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
|
|
||||||
if (state->is_cx25836)
|
if (state->is_cx25836)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return set_input(client, state->vid_input, route->input);
|
return set_input(client, state->vid_input, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *freq)
|
static int cx25840_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *freq)
|
||||||
|
@ -428,10 +428,8 @@ int cx88_video_mux(struct cx88_core *core, unsigned int input)
|
|||||||
routes for different inputs. HVR-1300 surely does */
|
routes for different inputs. HVR-1300 surely does */
|
||||||
if (core->board.audio_chip &&
|
if (core->board.audio_chip &&
|
||||||
core->board.audio_chip == V4L2_IDENT_WM8775) {
|
core->board.audio_chip == V4L2_IDENT_WM8775) {
|
||||||
struct v4l2_routing route;
|
call_all(core, audio, s_routing,
|
||||||
|
INPUT(input).audioroute, 0, 0);
|
||||||
route.input = INPUT(input).audioroute;
|
|
||||||
call_all(core, audio, s_routing, &route);
|
|
||||||
}
|
}
|
||||||
/* cx2388's C-ADC is connected to the tuner only.
|
/* cx2388's C-ADC is connected to the tuner only.
|
||||||
When used with S-Video, that ADC is busy dealing with
|
When used with S-Video, that ADC is busy dealing with
|
||||||
@ -823,10 +821,8 @@ static int video_open(struct file *file)
|
|||||||
if (core->board.radio.audioroute) {
|
if (core->board.radio.audioroute) {
|
||||||
if(core->board.audio_chip &&
|
if(core->board.audio_chip &&
|
||||||
core->board.audio_chip == V4L2_IDENT_WM8775) {
|
core->board.audio_chip == V4L2_IDENT_WM8775) {
|
||||||
struct v4l2_routing route;
|
call_all(core, audio, s_routing,
|
||||||
|
core->board.radio.audioroute, 0, 0);
|
||||||
route.input = core->board.radio.audioroute;
|
|
||||||
call_all(core, audio, s_routing, &route);
|
|
||||||
}
|
}
|
||||||
/* "I2S ADC mode" */
|
/* "I2S ADC mode" */
|
||||||
core->tvaudio = WW_I2SADC;
|
core->tvaudio = WW_I2SADC;
|
||||||
|
@ -1018,14 +1018,9 @@ EXPORT_SYMBOL_GPL(em28xx_init_isoc);
|
|||||||
*/
|
*/
|
||||||
void em28xx_wake_i2c(struct em28xx *dev)
|
void em28xx_wake_i2c(struct em28xx *dev)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route;
|
v4l2_device_call_all(&dev->v4l2_dev, 0, core, reset, 0);
|
||||||
int zero = 0;
|
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
|
||||||
|
INPUT(dev->ctl_input)->vmux, 0, 0);
|
||||||
route.input = INPUT(dev->ctl_input)->vmux;
|
|
||||||
route.output = 0;
|
|
||||||
|
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, core, reset, zero);
|
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing, &route);
|
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
|
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -515,10 +515,6 @@ static struct videobuf_queue_ops em28xx_video_qops = {
|
|||||||
|
|
||||||
static void video_mux(struct em28xx *dev, int index)
|
static void video_mux(struct em28xx *dev, int index)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route;
|
|
||||||
|
|
||||||
route.input = INPUT(index)->vmux;
|
|
||||||
route.output = 0;
|
|
||||||
dev->ctl_input = index;
|
dev->ctl_input = index;
|
||||||
dev->ctl_ainput = INPUT(index)->amux;
|
dev->ctl_ainput = INPUT(index)->amux;
|
||||||
dev->ctl_aoutput = INPUT(index)->aout;
|
dev->ctl_aoutput = INPUT(index)->aout;
|
||||||
@ -526,25 +522,22 @@ static void video_mux(struct em28xx *dev, int index)
|
|||||||
if (!dev->ctl_aoutput)
|
if (!dev->ctl_aoutput)
|
||||||
dev->ctl_aoutput = EM28XX_AOUT_MASTER;
|
dev->ctl_aoutput = EM28XX_AOUT_MASTER;
|
||||||
|
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing, &route);
|
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
|
||||||
|
INPUT(index)->vmux, 0, 0);
|
||||||
|
|
||||||
if (dev->board.has_msp34xx) {
|
if (dev->board.has_msp34xx) {
|
||||||
if (dev->i2s_speed) {
|
if (dev->i2s_speed) {
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, audio,
|
v4l2_device_call_all(&dev->v4l2_dev, 0, audio,
|
||||||
s_i2s_clock_freq, dev->i2s_speed);
|
s_i2s_clock_freq, dev->i2s_speed);
|
||||||
}
|
}
|
||||||
route.input = dev->ctl_ainput;
|
|
||||||
route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
|
|
||||||
|
|
||||||
/* Note: this is msp3400 specific */
|
/* Note: this is msp3400 specific */
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing, &route);
|
v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
|
||||||
|
dev->ctl_ainput, MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->board.adecoder != EM28XX_NOADECODER) {
|
if (dev->board.adecoder != EM28XX_NOADECODER) {
|
||||||
route.input = dev->ctl_ainput;
|
v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing,
|
||||||
route.output = dev->ctl_aoutput;
|
dev->ctl_ainput, dev->ctl_aoutput, 0);
|
||||||
|
|
||||||
v4l2_device_call_all(&dev->v4l2_dev, 0, audio, s_routing, &route);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
em28xx_audio_analog_set(dev);
|
em28xx_audio_analog_set(dev);
|
||||||
|
@ -248,15 +248,16 @@ static int subdev_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int subdev_s_audio_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int subdev_s_audio_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct ivtv *itv = sd_to_ivtv(sd);
|
struct ivtv *itv = sd_to_ivtv(sd);
|
||||||
u16 mask, data;
|
u16 mask, data;
|
||||||
|
|
||||||
if (route->input > 2)
|
if (input > 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
mask = itv->card->gpio_audio_input.mask;
|
mask = itv->card->gpio_audio_input.mask;
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case 0:
|
case 0:
|
||||||
data = itv->card->gpio_audio_input.tuner;
|
data = itv->card->gpio_audio_input.tuner;
|
||||||
break;
|
break;
|
||||||
@ -318,17 +319,18 @@ static int subdev_log_status(struct v4l2_subdev *sd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int subdev_s_video_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int subdev_s_video_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct ivtv *itv = sd_to_ivtv(sd);
|
struct ivtv *itv = sd_to_ivtv(sd);
|
||||||
u16 mask, data;
|
u16 mask, data;
|
||||||
|
|
||||||
if (route->input > 2) /* 0:Tuner 1:Composite 2:S-Video */
|
if (input > 2) /* 0:Tuner 1:Composite 2:S-Video */
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
mask = itv->card->gpio_video_input.mask;
|
mask = itv->card->gpio_video_input.mask;
|
||||||
if (route->input == 0)
|
if (input == 0)
|
||||||
data = itv->card->gpio_video_input.tuner;
|
data = itv->card->gpio_video_input.tuner;
|
||||||
else if (route->input == 1)
|
else if (input == 1)
|
||||||
data = itv->card->gpio_video_input.composite;
|
data = itv->card->gpio_video_input.composite;
|
||||||
else
|
else
|
||||||
data = itv->card->gpio_video_input.svideo;
|
data = itv->card->gpio_video_input.svideo;
|
||||||
|
@ -1033,7 +1033,6 @@ static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
|
|||||||
static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
|
static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
|
||||||
{
|
{
|
||||||
struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
|
struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
|
||||||
struct v4l2_routing route;
|
|
||||||
|
|
||||||
if (outp >= itv->card->nof_outputs)
|
if (outp >= itv->card->nof_outputs)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -1046,9 +1045,9 @@ static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
|
|||||||
itv->active_output, outp);
|
itv->active_output, outp);
|
||||||
|
|
||||||
itv->active_output = outp;
|
itv->active_output = outp;
|
||||||
route.input = SAA7127_INPUT_TYPE_NORMAL;
|
ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing,
|
||||||
route.output = itv->card->video_outputs[outp].video_output;
|
SAA7127_INPUT_TYPE_NORMAL,
|
||||||
ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing, &route);
|
itv->card->video_outputs[outp].video_output, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1738,7 +1737,8 @@ static long ivtv_default(struct file *file, void *fh, int cmd, void *arg)
|
|||||||
case VIDIOC_INT_S_AUDIO_ROUTING: {
|
case VIDIOC_INT_S_AUDIO_ROUTING: {
|
||||||
struct v4l2_routing *route = arg;
|
struct v4l2_routing *route = arg;
|
||||||
|
|
||||||
ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing, route);
|
ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing,
|
||||||
|
route->input, route->output, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
void ivtv_audio_set_io(struct ivtv *itv)
|
void ivtv_audio_set_io(struct ivtv *itv)
|
||||||
{
|
{
|
||||||
const struct ivtv_card_audio_input *in;
|
const struct ivtv_card_audio_input *in;
|
||||||
struct v4l2_routing route;
|
u32 input, output = 0;
|
||||||
|
|
||||||
/* Determine which input to use */
|
/* Determine which input to use */
|
||||||
if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags))
|
if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags))
|
||||||
@ -43,73 +43,77 @@ void ivtv_audio_set_io(struct ivtv *itv)
|
|||||||
in = &itv->card->audio_inputs[itv->audio_input];
|
in = &itv->card->audio_inputs[itv->audio_input];
|
||||||
|
|
||||||
/* handle muxer chips */
|
/* handle muxer chips */
|
||||||
route.input = in->muxer_input;
|
input = in->muxer_input;
|
||||||
route.output = 0;
|
|
||||||
if (itv->card->hw_muxer & IVTV_HW_M52790)
|
if (itv->card->hw_muxer & IVTV_HW_M52790)
|
||||||
route.output = M52790_OUT_STEREO;
|
output = M52790_OUT_STEREO;
|
||||||
v4l2_subdev_call(itv->sd_muxer, audio, s_routing, &route);
|
v4l2_subdev_call(itv->sd_muxer, audio, s_routing,
|
||||||
|
input, output, 0);
|
||||||
|
|
||||||
route.input = in->audio_input;
|
input = in->audio_input;
|
||||||
route.output = 0;
|
output = 0;
|
||||||
if (itv->card->hw_audio & IVTV_HW_MSP34XX)
|
if (itv->card->hw_audio & IVTV_HW_MSP34XX)
|
||||||
route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
|
output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
|
||||||
ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing, &route);
|
ivtv_call_hw(itv, itv->card->hw_audio, audio, s_routing,
|
||||||
|
input, output, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Selects the video input and output according to the current
|
/* Selects the video input and output according to the current
|
||||||
settings. */
|
settings. */
|
||||||
void ivtv_video_set_io(struct ivtv *itv)
|
void ivtv_video_set_io(struct ivtv *itv)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route;
|
|
||||||
int inp = itv->active_input;
|
int inp = itv->active_input;
|
||||||
|
u32 input;
|
||||||
u32 type;
|
u32 type;
|
||||||
|
|
||||||
route.input = itv->card->video_inputs[inp].video_input;
|
v4l2_subdev_call(itv->sd_video, video, s_routing,
|
||||||
route.output = 0;
|
itv->card->video_inputs[inp].video_input, 0, 0);
|
||||||
v4l2_subdev_call(itv->sd_video, video, s_routing, &route);
|
|
||||||
|
|
||||||
type = itv->card->video_inputs[inp].video_type;
|
type = itv->card->video_inputs[inp].video_type;
|
||||||
|
|
||||||
if (type == IVTV_CARD_INPUT_VID_TUNER) {
|
if (type == IVTV_CARD_INPUT_VID_TUNER) {
|
||||||
route.input = 0; /* Tuner */
|
input = 0; /* Tuner */
|
||||||
} else if (type < IVTV_CARD_INPUT_COMPOSITE1) {
|
} else if (type < IVTV_CARD_INPUT_COMPOSITE1) {
|
||||||
route.input = 2; /* S-Video */
|
input = 2; /* S-Video */
|
||||||
} else {
|
} else {
|
||||||
route.input = 1; /* Composite */
|
input = 1; /* Composite */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itv->card->hw_video & IVTV_HW_GPIO)
|
if (itv->card->hw_video & IVTV_HW_GPIO)
|
||||||
ivtv_call_hw(itv, IVTV_HW_GPIO, video, s_routing, &route);
|
ivtv_call_hw(itv, IVTV_HW_GPIO, video, s_routing,
|
||||||
|
input, 0, 0);
|
||||||
|
|
||||||
if (itv->card->hw_video & IVTV_HW_UPD64031A) {
|
if (itv->card->hw_video & IVTV_HW_UPD64031A) {
|
||||||
if (type == IVTV_CARD_INPUT_VID_TUNER ||
|
if (type == IVTV_CARD_INPUT_VID_TUNER ||
|
||||||
type >= IVTV_CARD_INPUT_COMPOSITE1) {
|
type >= IVTV_CARD_INPUT_COMPOSITE1) {
|
||||||
/* Composite: GR on, connect to 3DYCS */
|
/* Composite: GR on, connect to 3DYCS */
|
||||||
route.input = UPD64031A_GR_ON | UPD64031A_3DYCS_COMPOSITE;
|
input = UPD64031A_GR_ON | UPD64031A_3DYCS_COMPOSITE;
|
||||||
} else {
|
} else {
|
||||||
/* S-Video: GR bypassed, turn it off */
|
/* S-Video: GR bypassed, turn it off */
|
||||||
route.input = UPD64031A_GR_OFF | UPD64031A_3DYCS_DISABLE;
|
input = UPD64031A_GR_OFF | UPD64031A_3DYCS_DISABLE;
|
||||||
}
|
}
|
||||||
route.input |= itv->card->gr_config;
|
input |= itv->card->gr_config;
|
||||||
|
|
||||||
ivtv_call_hw(itv, IVTV_HW_UPD64031A, video, s_routing, &route);
|
ivtv_call_hw(itv, IVTV_HW_UPD64031A, video, s_routing,
|
||||||
|
input, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itv->card->hw_video & IVTV_HW_UPD6408X) {
|
if (itv->card->hw_video & IVTV_HW_UPD6408X) {
|
||||||
route.input = UPD64083_YCS_MODE;
|
input = UPD64083_YCS_MODE;
|
||||||
if (type > IVTV_CARD_INPUT_VID_TUNER &&
|
if (type > IVTV_CARD_INPUT_VID_TUNER &&
|
||||||
type < IVTV_CARD_INPUT_COMPOSITE1) {
|
type < IVTV_CARD_INPUT_COMPOSITE1) {
|
||||||
/* S-Video uses YCNR mode and internal Y-ADC, the upd64031a
|
/* S-Video uses YCNR mode and internal Y-ADC, the
|
||||||
is not used. */
|
upd64031a is not used. */
|
||||||
route.input |= UPD64083_YCNR_MODE;
|
input |= UPD64083_YCNR_MODE;
|
||||||
}
|
}
|
||||||
else if (itv->card->hw_video & IVTV_HW_UPD64031A) {
|
else if (itv->card->hw_video & IVTV_HW_UPD64031A) {
|
||||||
/* Use upd64031a output for tuner and composite(CX23416GYC only) inputs */
|
/* Use upd64031a output for tuner and
|
||||||
if ((type == IVTV_CARD_INPUT_VID_TUNER)||
|
composite(CX23416GYC only) inputs */
|
||||||
(itv->card->type == IVTV_CARD_CX23416GYC)) {
|
if (type == IVTV_CARD_INPUT_VID_TUNER ||
|
||||||
route.input |= UPD64083_EXT_Y_ADC;
|
itv->card->type == IVTV_CARD_CX23416GYC) {
|
||||||
}
|
input |= UPD64083_EXT_Y_ADC;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ivtv_call_hw(itv, IVTV_HW_UPD6408X, video, s_routing, &route);
|
ivtv_call_hw(itv, IVTV_HW_UPD6408X, video, s_routing,
|
||||||
|
input, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -409,11 +409,12 @@ static void ks0127_init(struct v4l2_subdev *sd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int ks0127_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct ks0127 *ks = to_ks0127(sd);
|
struct ks0127 *ks = to_ks0127(sd);
|
||||||
|
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case KS_INPUT_COMPOSITE_1:
|
case KS_INPUT_COMPOSITE_1:
|
||||||
case KS_INPUT_COMPOSITE_2:
|
case KS_INPUT_COMPOSITE_2:
|
||||||
case KS_INPUT_COMPOSITE_3:
|
case KS_INPUT_COMPOSITE_3:
|
||||||
@ -421,13 +422,13 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
|
|||||||
case KS_INPUT_COMPOSITE_5:
|
case KS_INPUT_COMPOSITE_5:
|
||||||
case KS_INPUT_COMPOSITE_6:
|
case KS_INPUT_COMPOSITE_6:
|
||||||
v4l2_dbg(1, debug, sd,
|
v4l2_dbg(1, debug, sd,
|
||||||
"s_routing %d: Composite\n", route->input);
|
"s_routing %d: Composite\n", input);
|
||||||
/* autodetect 50/60 Hz */
|
/* autodetect 50/60 Hz */
|
||||||
ks0127_and_or(sd, KS_CMDA, 0xfc, 0x00);
|
ks0127_and_or(sd, KS_CMDA, 0xfc, 0x00);
|
||||||
/* VSE=0 */
|
/* VSE=0 */
|
||||||
ks0127_and_or(sd, KS_CMDA, ~0x40, 0x00);
|
ks0127_and_or(sd, KS_CMDA, ~0x40, 0x00);
|
||||||
/* set input line */
|
/* set input line */
|
||||||
ks0127_and_or(sd, KS_CMDB, 0xb0, route->input);
|
ks0127_and_or(sd, KS_CMDB, 0xb0, input);
|
||||||
/* non-freerunning mode */
|
/* non-freerunning mode */
|
||||||
ks0127_and_or(sd, KS_CMDC, 0x70, 0x0a);
|
ks0127_and_or(sd, KS_CMDC, 0x70, 0x0a);
|
||||||
/* analog input */
|
/* analog input */
|
||||||
@ -455,13 +456,13 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
|
|||||||
case KS_INPUT_SVIDEO_2:
|
case KS_INPUT_SVIDEO_2:
|
||||||
case KS_INPUT_SVIDEO_3:
|
case KS_INPUT_SVIDEO_3:
|
||||||
v4l2_dbg(1, debug, sd,
|
v4l2_dbg(1, debug, sd,
|
||||||
"s_routing %d: S-Video\n", route->input);
|
"s_routing %d: S-Video\n", input);
|
||||||
/* autodetect 50/60 Hz */
|
/* autodetect 50/60 Hz */
|
||||||
ks0127_and_or(sd, KS_CMDA, 0xfc, 0x00);
|
ks0127_and_or(sd, KS_CMDA, 0xfc, 0x00);
|
||||||
/* VSE=0 */
|
/* VSE=0 */
|
||||||
ks0127_and_or(sd, KS_CMDA, ~0x40, 0x00);
|
ks0127_and_or(sd, KS_CMDA, ~0x40, 0x00);
|
||||||
/* set input line */
|
/* set input line */
|
||||||
ks0127_and_or(sd, KS_CMDB, 0xb0, route->input);
|
ks0127_and_or(sd, KS_CMDB, 0xb0, input);
|
||||||
/* non-freerunning mode */
|
/* non-freerunning mode */
|
||||||
ks0127_and_or(sd, KS_CMDC, 0x70, 0x0a);
|
ks0127_and_or(sd, KS_CMDC, 0x70, 0x0a);
|
||||||
/* analog input */
|
/* analog input */
|
||||||
@ -496,7 +497,7 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
|
|||||||
|
|
||||||
ks0127_and_or(sd, KS_CMDA, 0xff, 0x40); /* VSE=1 */
|
ks0127_and_or(sd, KS_CMDA, 0xff, 0x40); /* VSE=1 */
|
||||||
/* set input line and VALIGN */
|
/* set input line and VALIGN */
|
||||||
ks0127_and_or(sd, KS_CMDB, 0xb0, (route->input | 0x40));
|
ks0127_and_or(sd, KS_CMDB, 0xb0, (input | 0x40));
|
||||||
/* freerunning mode, */
|
/* freerunning mode, */
|
||||||
/* TSTGEN = 1 TSTGFR=11 TSTGPH=0 TSTGPK=0 VMEM=1*/
|
/* TSTGEN = 1 TSTGFR=11 TSTGPH=0 TSTGPK=0 VMEM=1*/
|
||||||
ks0127_and_or(sd, KS_CMDC, 0x70, 0x87);
|
ks0127_and_or(sd, KS_CMDC, 0x70, 0x87);
|
||||||
@ -531,7 +532,7 @@ static int ks0127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
v4l2_dbg(1, debug, sd,
|
v4l2_dbg(1, debug, sd,
|
||||||
"s_routing: Unknown input %d\n", route->input);
|
"s_routing: Unknown input %d\n", input);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,12 +69,13 @@ static int m52790_write(struct v4l2_subdev *sd)
|
|||||||
part of the audio output routing. The normal case is that another
|
part of the audio output routing. The normal case is that another
|
||||||
chip takes care of the actual muting so making it part of the
|
chip takes care of the actual muting so making it part of the
|
||||||
output routing seems to be the right thing to do for now. */
|
output routing seems to be the right thing to do for now. */
|
||||||
static int m52790_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int m52790_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct m52790_state *state = to_state(sd);
|
struct m52790_state *state = to_state(sd);
|
||||||
|
|
||||||
state->input = route->input;
|
state->input = input;
|
||||||
state->output = route->output;
|
state->output = output;
|
||||||
m52790_write(sd);
|
m52790_write(sd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -505,25 +505,26 @@ static int msp_s_std(struct v4l2_subdev *sd, v4l2_std_id id)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int msp_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *rt)
|
static int msp_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct msp_state *state = to_state(sd);
|
struct msp_state *state = to_state(sd);
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
int tuner = (rt->input >> 3) & 1;
|
int tuner = (input >> 3) & 1;
|
||||||
int sc_in = rt->input & 0x7;
|
int sc_in = input & 0x7;
|
||||||
int sc1_out = rt->output & 0xf;
|
int sc1_out = output & 0xf;
|
||||||
int sc2_out = (rt->output >> 4) & 0xf;
|
int sc2_out = (output >> 4) & 0xf;
|
||||||
u16 val, reg;
|
u16 val, reg;
|
||||||
int i;
|
int i;
|
||||||
int extern_input = 1;
|
int extern_input = 1;
|
||||||
|
|
||||||
if (state->routing.input == rt->input &&
|
if (state->route_in == input && state->route_out == output)
|
||||||
state->routing.output == rt->output)
|
|
||||||
return 0;
|
return 0;
|
||||||
state->routing = *rt;
|
state->route_in = input;
|
||||||
|
state->route_out = output;
|
||||||
/* check if the tuner input is used */
|
/* check if the tuner input is used */
|
||||||
for (i = 0; i < 5; i++) {
|
for (i = 0; i < 5; i++) {
|
||||||
if (((rt->input >> (4 + i * 4)) & 0xf) == 0)
|
if (((input >> (4 + i * 4)) & 0xf) == 0)
|
||||||
extern_input = 0;
|
extern_input = 0;
|
||||||
}
|
}
|
||||||
state->mode = extern_input ? MSP_MODE_EXTERN : MSP_MODE_AM_DETECT;
|
state->mode = extern_input ? MSP_MODE_EXTERN : MSP_MODE_AM_DETECT;
|
||||||
@ -673,7 +674,7 @@ static int msp_log_status(struct v4l2_subdev *sd)
|
|||||||
}
|
}
|
||||||
v4l_info(client, "Audmode: 0x%04x\n", state->audmode);
|
v4l_info(client, "Audmode: 0x%04x\n", state->audmode);
|
||||||
v4l_info(client, "Routing: 0x%08x (input) 0x%08x (output)\n",
|
v4l_info(client, "Routing: 0x%08x (input) 0x%08x (output)\n",
|
||||||
state->routing.input, state->routing.output);
|
state->route_in, state->route_out);
|
||||||
v4l_info(client, "ACB: 0x%04x\n", state->acb);
|
v4l_info(client, "ACB: 0x%04x\n", state->acb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -761,8 +762,8 @@ static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||||||
state->i2s_mode = 0;
|
state->i2s_mode = 0;
|
||||||
init_waitqueue_head(&state->wq);
|
init_waitqueue_head(&state->wq);
|
||||||
/* These are the reset input/output positions */
|
/* These are the reset input/output positions */
|
||||||
state->routing.input = MSP_INPUT_DEFAULT;
|
state->route_in = MSP_INPUT_DEFAULT;
|
||||||
state->routing.output = MSP_OUTPUT_DEFAULT;
|
state->route_out = MSP_OUTPUT_DEFAULT;
|
||||||
|
|
||||||
state->rev1 = msp_read_dsp(client, 0x1e);
|
state->rev1 = msp_read_dsp(client, 0x1e);
|
||||||
if (state->rev1 != -1)
|
if (state->rev1 != -1)
|
||||||
|
@ -80,7 +80,8 @@ struct msp_state {
|
|||||||
int i2s_mode;
|
int i2s_mode;
|
||||||
int main, second; /* sound carrier */
|
int main, second; /* sound carrier */
|
||||||
int input;
|
int input;
|
||||||
struct v4l2_routing routing;
|
u32 route_in;
|
||||||
|
u32 route_out;
|
||||||
|
|
||||||
/* v4l2 */
|
/* v4l2 */
|
||||||
int audmode;
|
int audmode;
|
||||||
|
@ -188,7 +188,7 @@ void msp3400c_set_mode(struct i2c_client *client, int mode)
|
|||||||
{
|
{
|
||||||
struct msp_state *state = to_state(i2c_get_clientdata(client));
|
struct msp_state *state = to_state(i2c_get_clientdata(client));
|
||||||
struct msp3400c_init_data_dem *data = &msp3400c_init_data[mode];
|
struct msp3400c_init_data_dem *data = &msp3400c_init_data[mode];
|
||||||
int tuner = (state->routing.input >> 3) & 1;
|
int tuner = (state->route_in >> 3) & 1;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
v4l_dbg(1, msp_debug, client, "set_mode: %d\n", mode);
|
v4l_dbg(1, msp_debug, client, "set_mode: %d\n", mode);
|
||||||
@ -896,7 +896,7 @@ static void msp34xxg_set_source(struct i2c_client *client, u16 reg, int in)
|
|||||||
static void msp34xxg_set_sources(struct i2c_client *client)
|
static void msp34xxg_set_sources(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
struct msp_state *state = to_state(i2c_get_clientdata(client));
|
struct msp_state *state = to_state(i2c_get_clientdata(client));
|
||||||
u32 in = state->routing.input;
|
u32 in = state->route_in;
|
||||||
|
|
||||||
msp34xxg_set_source(client, 0x0008, (in >> 4) & 0xf);
|
msp34xxg_set_source(client, 0x0008, (in >> 4) & 0xf);
|
||||||
/* quasi-peak detector is set to same input as the loudspeaker (MAIN) */
|
/* quasi-peak detector is set to same input as the loudspeaker (MAIN) */
|
||||||
@ -912,7 +912,7 @@ static void msp34xxg_set_sources(struct i2c_client *client)
|
|||||||
static void msp34xxg_reset(struct i2c_client *client)
|
static void msp34xxg_reset(struct i2c_client *client)
|
||||||
{
|
{
|
||||||
struct msp_state *state = to_state(i2c_get_clientdata(client));
|
struct msp_state *state = to_state(i2c_get_clientdata(client));
|
||||||
int tuner = (state->routing.input >> 3) & 1;
|
int tuner = (state->route_in >> 3) & 1;
|
||||||
int modus;
|
int modus;
|
||||||
|
|
||||||
/* initialize std to 1 (autodetect) to signal that no standard is
|
/* initialize std to 1 (autodetect) to signal that no standard is
|
||||||
|
@ -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;
|
saa7111a_call(mxb, video, s_routing, SAA7115_COMPOSITE0,
|
||||||
route.output = SAA7111_FMT_CCIR | SAA7111_VBI_BYPASS;
|
SAA7111_FMT_CCIR | SAA7111_VBI_BYPASS, 0);
|
||||||
saa7111a_call(mxb, video, s_routing, &route);
|
|
||||||
|
|
||||||
/* 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_route_line(mxb, 6);
|
||||||
tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[6][1]);
|
tea6420_route_cd(mxb, 6);
|
||||||
tea6420_1_call(mxb, audio, s_routing, &TEA6420_cd[6][0]);
|
|
||||||
tea6420_2_call(mxb, audio, s_routing, &TEA6420_cd[6][1]);
|
|
||||||
|
|
||||||
/* switch to tuner-channel on tea6415c */
|
/* switch to tuner-channel on tea6415c */
|
||||||
route.input = 3;
|
tea6415c_call(mxb, video, s_routing, 3, 17, 0);
|
||||||
route.output = 17;
|
|
||||||
tea6415c_call(mxb, video, s_routing, &route);
|
|
||||||
|
|
||||||
/* select tuner-output on multicable on tea6415c */
|
/* select tuner-output on multicable on tea6415c */
|
||||||
route.input = 3;
|
tea6415c_call(mxb, video, s_routing, 3, 13, 0);
|
||||||
route.output = 13;
|
|
||||||
tea6415c_call(mxb, video, s_routing, &route);
|
|
||||||
|
|
||||||
/* 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 */
|
||||||
/* switch the audio-source */
|
tea6420_route_line(mxb, vc->value ? 6 :
|
||||||
tea6420_1_call(mxb, audio, s_routing,
|
video_audio_connect[mxb->cur_input]);
|
||||||
&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]);
|
|
||||||
}
|
|
||||||
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)) {
|
err = tea6415c_call(mxb, video, s_routing, 3, 17, 0);
|
||||||
printk(KERN_ERR "VIDIOC_S_INPUT: could not address tea6415c #1\n");
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
/* connect tuner-output always to multicable */
|
/* connect tuner-output always to multicable */
|
||||||
route.input = 3;
|
if (!err)
|
||||||
route.output = 13;
|
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;
|
err = tea6415c_call(mxb, video, s_routing, 1, 17, 0);
|
||||||
route.output = 17;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* switch video in tea6415c only if necessary */
|
if (err)
|
||||||
switch (input) {
|
return err;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* switch video in saa7111a */
|
/* switch video in saa7111a */
|
||||||
route.input = i;
|
if (saa7111a_call(mxb, video, s_routing, i, 0, 0))
|
||||||
route.output = 0;
|
|
||||||
if (saa7111a_call(mxb, video, s_routing, &route))
|
|
||||||
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) {
|
if (0 == mxb->cur_mute)
|
||||||
tea6420_1_call(mxb, audio, s_routing,
|
tea6420_route_line(mxb, video_audio_connect[input]);
|
||||||
&TEA6420_line[video_audio_connect[input]][0]);
|
|
||||||
tea6420_2_call(mxb, audio, s_routing,
|
|
||||||
&TEA6420_line[video_audio_connect[input]][1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
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_route_cd(mxb, i);
|
||||||
tea6420_2_call(mxb, audio, s_routing, &TEA6420_cd[i][1]);
|
|
||||||
|
|
||||||
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_route_line(mxb, i);
|
||||||
tea6420_2_call(mxb, audio, s_routing, &TEA6420_line[i][1]);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -58,9 +58,9 @@ static const struct routing_scheme routing_schemes[] = {
|
|||||||
void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
||||||
{
|
{
|
||||||
if (hdw->input_dirty || hdw->force_dirty) {
|
if (hdw->input_dirty || hdw->force_dirty) {
|
||||||
struct v4l2_routing route;
|
|
||||||
const struct routing_scheme *sp;
|
const struct routing_scheme *sp;
|
||||||
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
||||||
|
u32 input;
|
||||||
|
|
||||||
pvr2_trace(PVR2_TRACE_CHIPS, "subdev msp3400 v4l2 set_stereo");
|
pvr2_trace(PVR2_TRACE_CHIPS, "subdev msp3400 v4l2 set_stereo");
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
|||||||
((sp = routing_schemes + sid) != NULL) &&
|
((sp = routing_schemes + sid) != NULL) &&
|
||||||
(hdw->input_val >= 0) &&
|
(hdw->input_val >= 0) &&
|
||||||
(hdw->input_val < sp->cnt)) {
|
(hdw->input_val < sp->cnt)) {
|
||||||
route.input = sp->def[hdw->input_val];
|
input = sp->def[hdw->input_val];
|
||||||
} else {
|
} else {
|
||||||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||||
"*** WARNING *** subdev msp3400 set_input:"
|
"*** WARNING *** subdev msp3400 set_input:"
|
||||||
@ -77,8 +77,8 @@ void pvr2_msp3400_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
|||||||
sid, hdw->input_val);
|
sid, hdw->input_val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
|
sd->ops->audio->s_routing(sd, input,
|
||||||
sd->ops->audio->s_routing(sd, &route);
|
MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,16 +60,16 @@ static const struct routing_scheme routing_schemes[] = {
|
|||||||
void pvr2_cs53l32a_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
void pvr2_cs53l32a_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
||||||
{
|
{
|
||||||
if (hdw->input_dirty || hdw->force_dirty) {
|
if (hdw->input_dirty || hdw->force_dirty) {
|
||||||
struct v4l2_routing route;
|
|
||||||
const struct routing_scheme *sp;
|
const struct routing_scheme *sp;
|
||||||
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
||||||
|
u32 input;
|
||||||
pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_input(%d)",
|
pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_input(%d)",
|
||||||
hdw->input_val);
|
hdw->input_val);
|
||||||
if ((sid < ARRAY_SIZE(routing_schemes)) &&
|
if ((sid < ARRAY_SIZE(routing_schemes)) &&
|
||||||
((sp = routing_schemes + sid) != NULL) &&
|
((sp = routing_schemes + sid) != NULL) &&
|
||||||
(hdw->input_val >= 0) &&
|
(hdw->input_val >= 0) &&
|
||||||
(hdw->input_val < sp->cnt)) {
|
(hdw->input_val < sp->cnt)) {
|
||||||
route.input = sp->def[hdw->input_val];
|
input = sp->def[hdw->input_val];
|
||||||
} else {
|
} else {
|
||||||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||||
"*** WARNING *** subdev v4l2 set_input:"
|
"*** WARNING *** subdev v4l2 set_input:"
|
||||||
@ -78,8 +78,7 @@ void pvr2_cs53l32a_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
|||||||
sid, hdw->input_val);
|
sid, hdw->input_val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
route.output = 0;
|
sd->ops->audio->s_routing(sd, input, 0, 0);
|
||||||
sd->ops->audio->s_routing(sd, &route);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,14 +105,11 @@ void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
|||||||
{
|
{
|
||||||
pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update...");
|
pvr2_trace(PVR2_TRACE_CHIPS, "subdev cx2584x update...");
|
||||||
if (hdw->input_dirty || hdw->force_dirty) {
|
if (hdw->input_dirty || hdw->force_dirty) {
|
||||||
struct v4l2_routing route;
|
|
||||||
enum cx25840_video_input vid_input;
|
enum cx25840_video_input vid_input;
|
||||||
enum cx25840_audio_input aud_input;
|
enum cx25840_audio_input aud_input;
|
||||||
const struct routing_scheme *sp;
|
const struct routing_scheme *sp;
|
||||||
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
||||||
|
|
||||||
memset(&route, 0, sizeof(route));
|
|
||||||
|
|
||||||
if ((sid < ARRAY_SIZE(routing_schemes)) &&
|
if ((sid < ARRAY_SIZE(routing_schemes)) &&
|
||||||
((sp = routing_schemes + sid) != NULL) &&
|
((sp = routing_schemes + sid) != NULL) &&
|
||||||
(hdw->input_val >= 0) &&
|
(hdw->input_val >= 0) &&
|
||||||
@ -131,10 +128,8 @@ void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
|||||||
pvr2_trace(PVR2_TRACE_CHIPS,
|
pvr2_trace(PVR2_TRACE_CHIPS,
|
||||||
"subdev cx2584x set_input vid=0x%x aud=0x%x",
|
"subdev cx2584x set_input vid=0x%x aud=0x%x",
|
||||||
vid_input, aud_input);
|
vid_input, aud_input);
|
||||||
route.input = (u32)vid_input;
|
sd->ops->video->s_routing(sd, (u32)vid_input, 0, 0);
|
||||||
sd->ops->video->s_routing(sd, &route);
|
sd->ops->audio->s_routing(sd, (u32)aud_input, 0, 0);
|
||||||
route.input = (u32)aud_input;
|
|
||||||
sd->ops->audio->s_routing(sd, &route);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,16 +75,17 @@ static const struct routing_scheme routing_schemes[] = {
|
|||||||
void pvr2_saa7115_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
void pvr2_saa7115_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
||||||
{
|
{
|
||||||
if (hdw->input_dirty || hdw->force_dirty) {
|
if (hdw->input_dirty || hdw->force_dirty) {
|
||||||
struct v4l2_routing route;
|
|
||||||
const struct routing_scheme *sp;
|
const struct routing_scheme *sp;
|
||||||
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
unsigned int sid = hdw->hdw_desc->signal_routing_scheme;
|
||||||
|
u32 input;
|
||||||
|
|
||||||
pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_input(%d)",
|
pvr2_trace(PVR2_TRACE_CHIPS, "subdev v4l2 set_input(%d)",
|
||||||
hdw->input_val);
|
hdw->input_val);
|
||||||
if ((sid < ARRAY_SIZE(routing_schemes)) &&
|
if ((sid < ARRAY_SIZE(routing_schemes)) &&
|
||||||
((sp = routing_schemes + sid) != NULL) &&
|
((sp = routing_schemes + sid) != NULL) &&
|
||||||
(hdw->input_val >= 0) &&
|
(hdw->input_val >= 0) &&
|
||||||
(hdw->input_val < sp->cnt)) {
|
(hdw->input_val < sp->cnt)) {
|
||||||
route.input = sp->def[hdw->input_val];
|
input = sp->def[hdw->input_val];
|
||||||
} else {
|
} else {
|
||||||
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
||||||
"*** WARNING *** subdev v4l2 set_input:"
|
"*** WARNING *** subdev v4l2 set_input:"
|
||||||
@ -93,8 +94,7 @@ void pvr2_saa7115_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
|||||||
sid, hdw->input_val);
|
sid, hdw->input_val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
route.output = 0;
|
sd->ops->video->s_routing(sd, input, 0, 0);
|
||||||
sd->ops->video->s_routing(sd, &route);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,24 +39,22 @@
|
|||||||
void pvr2_wm8775_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
void pvr2_wm8775_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
|
||||||
{
|
{
|
||||||
if (hdw->input_dirty || hdw->force_dirty) {
|
if (hdw->input_dirty || hdw->force_dirty) {
|
||||||
struct v4l2_routing route;
|
u32 input;
|
||||||
|
|
||||||
memset(&route, 0, sizeof(route));
|
|
||||||
|
|
||||||
switch (hdw->input_val) {
|
switch (hdw->input_val) {
|
||||||
case PVR2_CVAL_INPUT_RADIO:
|
case PVR2_CVAL_INPUT_RADIO:
|
||||||
route.input = 1;
|
input = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* All other cases just use the second input */
|
/* All other cases just use the second input */
|
||||||
route.input = 2;
|
input = 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pvr2_trace(PVR2_TRACE_CHIPS, "subdev wm8775"
|
pvr2_trace(PVR2_TRACE_CHIPS, "subdev wm8775"
|
||||||
" set_input(val=%d route=0x%x)",
|
" set_input(val=%d route=0x%x)",
|
||||||
hdw->input_val, route.input);
|
hdw->input_val, input);
|
||||||
|
|
||||||
sd->ops->audio->s_routing(sd, &route);
|
sd->ops->audio->s_routing(sd, input, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,17 +299,18 @@ static int saa7110_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saa7110_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int saa7110_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct saa7110 *decoder = to_saa7110(sd);
|
struct saa7110 *decoder = to_saa7110(sd);
|
||||||
|
|
||||||
if (route->input < 0 || route->input >= SAA7110_MAX_INPUT) {
|
if (input < 0 || input >= SAA7110_MAX_INPUT) {
|
||||||
v4l2_dbg(1, debug, sd, "input=%d not available\n", route->input);
|
v4l2_dbg(1, debug, sd, "input=%d not available\n", input);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (decoder->input != route->input) {
|
if (decoder->input != input) {
|
||||||
saa7110_selmux(sd, route->input);
|
saa7110_selmux(sd, input);
|
||||||
v4l2_dbg(1, debug, sd, "switched to input=%d\n", route->input);
|
v4l2_dbg(1, debug, sd, "switched to input=%d\n", input);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1228,30 +1228,32 @@ static int saa711x_s_radio(struct v4l2_subdev *sd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saa711x_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int saa711x_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct saa711x_state *state = to_state(sd);
|
struct saa711x_state *state = to_state(sd);
|
||||||
u32 input = route->input;
|
|
||||||
u8 mask = (state->ident == V4L2_IDENT_SAA7111) ? 0xf8 : 0xf0;
|
u8 mask = (state->ident == V4L2_IDENT_SAA7111) ? 0xf8 : 0xf0;
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n", route->input, route->output);
|
v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n",
|
||||||
|
input, output);
|
||||||
|
|
||||||
/* saa7111/3 does not have these inputs */
|
/* saa7111/3 does not have these inputs */
|
||||||
if ((state->ident == V4L2_IDENT_SAA7113 ||
|
if ((state->ident == V4L2_IDENT_SAA7113 ||
|
||||||
state->ident == V4L2_IDENT_SAA7111) &&
|
state->ident == V4L2_IDENT_SAA7111) &&
|
||||||
(route->input == SAA7115_COMPOSITE4 ||
|
(input == SAA7115_COMPOSITE4 ||
|
||||||
route->input == SAA7115_COMPOSITE5)) {
|
input == SAA7115_COMPOSITE5)) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (route->input > SAA7115_SVIDEO3)
|
if (input > SAA7115_SVIDEO3)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (route->output > SAA7115_IPORT_ON)
|
if (output > SAA7115_IPORT_ON)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (state->input == route->input && state->output == route->output)
|
if (state->input == input && state->output == output)
|
||||||
return 0;
|
return 0;
|
||||||
v4l2_dbg(1, debug, sd, "now setting %s input %s output\n",
|
v4l2_dbg(1, debug, sd, "now setting %s input %s output\n",
|
||||||
(route->input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite",
|
(input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite",
|
||||||
(route->output == SAA7115_IPORT_ON) ? "iport on" : "iport off");
|
(output == SAA7115_IPORT_ON) ? "iport on" : "iport off");
|
||||||
state->input = route->input;
|
state->input = input;
|
||||||
|
|
||||||
/* saa7111 has slightly different input numbering */
|
/* saa7111 has slightly different input numbering */
|
||||||
if (state->ident == V4L2_IDENT_SAA7111) {
|
if (state->ident == V4L2_IDENT_SAA7111) {
|
||||||
@ -1260,10 +1262,10 @@ static int saa711x_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
|
|||||||
/* saa7111 specific */
|
/* saa7111 specific */
|
||||||
saa711x_write(sd, R_10_CHROMA_CNTL_2,
|
saa711x_write(sd, R_10_CHROMA_CNTL_2,
|
||||||
(saa711x_read(sd, R_10_CHROMA_CNTL_2) & 0x3f) |
|
(saa711x_read(sd, R_10_CHROMA_CNTL_2) & 0x3f) |
|
||||||
((route->output & 0xc0) ^ 0x40));
|
((output & 0xc0) ^ 0x40));
|
||||||
saa711x_write(sd, R_13_RT_X_PORT_OUT_CNTL,
|
saa711x_write(sd, R_13_RT_X_PORT_OUT_CNTL,
|
||||||
(saa711x_read(sd, R_13_RT_X_PORT_OUT_CNTL) & 0xf0) |
|
(saa711x_read(sd, R_13_RT_X_PORT_OUT_CNTL) & 0xf0) |
|
||||||
((route->output & 2) ? 0x0a : 0));
|
((output & 2) ? 0x0a : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* select mode */
|
/* select mode */
|
||||||
@ -1276,7 +1278,7 @@ static int saa711x_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
|
|||||||
(saa711x_read(sd, R_09_LUMA_CNTL) & 0x7f) |
|
(saa711x_read(sd, R_09_LUMA_CNTL) & 0x7f) |
|
||||||
(state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
|
(state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
|
||||||
|
|
||||||
state->output = route->output;
|
state->output = output;
|
||||||
if (state->ident == V4L2_IDENT_SAA7114 ||
|
if (state->ident == V4L2_IDENT_SAA7114 ||
|
||||||
state->ident == V4L2_IDENT_SAA7115) {
|
state->ident == V4L2_IDENT_SAA7115) {
|
||||||
saa711x_write(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK,
|
saa711x_write(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK,
|
||||||
|
@ -570,15 +570,16 @@ static int saa7127_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return saa7127_set_std(sd, std);
|
return saa7127_set_std(sd, std);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saa7127_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int saa7127_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct saa7127_state *state = to_state(sd);
|
struct saa7127_state *state = to_state(sd);
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (state->input_type != route->input)
|
if (state->input_type != input)
|
||||||
rc = saa7127_set_input_type(sd, route->input);
|
rc = saa7127_set_input_type(sd, input);
|
||||||
if (rc == 0 && state->output_type != route->output)
|
if (rc == 0 && state->output_type != output)
|
||||||
rc = saa7127_set_output_type(sd, route->output);
|
rc = saa7127_set_output_type(sd, output);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1104,22 +1104,22 @@ static struct v4l2_queryctrl saa717x_qctrl[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int saa717x_s_video_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int saa717x_s_video_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct saa717x_state *decoder = to_state(sd);
|
struct saa717x_state *decoder = to_state(sd);
|
||||||
int inp = route->input;
|
int is_tuner = input & 0x80; /* tuner input flag */
|
||||||
int is_tuner = inp & 0x80; /* tuner input flag */
|
|
||||||
|
|
||||||
inp &= 0x7f;
|
input &= 0x7f;
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "decoder set input (%d)\n", inp);
|
v4l2_dbg(1, debug, sd, "decoder set input (%d)\n", input);
|
||||||
/* inputs from 0-9 are available*/
|
/* inputs from 0-9 are available*/
|
||||||
/* saa717x have mode0-mode9 but mode5 is reserved. */
|
/* saa717x have mode0-mode9 but mode5 is reserved. */
|
||||||
if (inp < 0 || inp > 9 || inp == 5)
|
if (input < 0 || input > 9 || input == 5)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (decoder->input != inp) {
|
if (decoder->input != input) {
|
||||||
int input_line = inp;
|
int input_line = input;
|
||||||
|
|
||||||
decoder->input = input_line;
|
decoder->input = input_line;
|
||||||
v4l2_dbg(1, debug, sd, "now setting %s input %d\n",
|
v4l2_dbg(1, debug, sd, "now setting %s input %d\n",
|
||||||
@ -1276,12 +1276,13 @@ static int saa717x_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saa717x_s_audio_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int saa717x_s_audio_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct saa717x_state *decoder = to_state(sd);
|
struct saa717x_state *decoder = to_state(sd);
|
||||||
|
|
||||||
if (route->input < 3) { /* FIXME! --tadachi */
|
if (input < 3) { /* FIXME! --tadachi */
|
||||||
decoder->audio_input = route->input;
|
decoder->audio_input = input;
|
||||||
v4l2_dbg(1, debug, sd,
|
v4l2_dbg(1, debug, sd,
|
||||||
"set decoder audio input to %d\n",
|
"set decoder audio input to %d\n",
|
||||||
decoder->audio_input);
|
decoder->audio_input);
|
||||||
|
@ -245,14 +245,15 @@ static int saa7185_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int saa7185_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int saa7185_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct saa7185 *encoder = to_saa7185(sd);
|
struct saa7185 *encoder = to_saa7185(sd);
|
||||||
|
|
||||||
/* RJ: route->input = 0: input is from SA7111
|
/* RJ: input = 0: input is from SA7111
|
||||||
route->input = 1: input is from ZR36060 */
|
input = 1: input is from ZR36060 */
|
||||||
|
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case 0:
|
case 0:
|
||||||
/* turn off colorbar */
|
/* turn off colorbar */
|
||||||
saa7185_write(sd, 0x3a, 0x0f);
|
saa7185_write(sd, 0x3a, 0x0f);
|
||||||
|
@ -160,14 +160,14 @@ static int saa7191_write_block(struct v4l2_subdev *sd,
|
|||||||
/* Helper functions */
|
/* Helper functions */
|
||||||
|
|
||||||
static int saa7191_s_routing(struct v4l2_subdev *sd,
|
static int saa7191_s_routing(struct v4l2_subdev *sd,
|
||||||
const struct v4l2_routing *route)
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct saa7191 *decoder = to_saa7191(sd);
|
struct saa7191 *decoder = to_saa7191(sd);
|
||||||
u8 luma = saa7191_read_reg(sd, SAA7191_REG_LUMA);
|
u8 luma = saa7191_read_reg(sd, SAA7191_REG_LUMA);
|
||||||
u8 iock = saa7191_read_reg(sd, SAA7191_REG_IOCK);
|
u8 iock = saa7191_read_reg(sd, SAA7191_REG_IOCK);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
switch (route->input) {
|
switch (input) {
|
||||||
case SAA7191_INPUT_COMPOSITE: /* Set Composite input */
|
case SAA7191_INPUT_COMPOSITE: /* Set Composite input */
|
||||||
iock &= ~(SAA7191_IOCK_CHRS | SAA7191_IOCK_GPSW1
|
iock &= ~(SAA7191_IOCK_CHRS | SAA7191_IOCK_GPSW1
|
||||||
| SAA7191_IOCK_GPSW2);
|
| SAA7191_IOCK_GPSW2);
|
||||||
@ -190,7 +190,7 @@ static int saa7191_s_routing(struct v4l2_subdev *sd,
|
|||||||
if (err)
|
if (err)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
decoder->input = route->input;
|
decoder->input = input;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -47,12 +47,11 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
|||||||
|
|
||||||
|
|
||||||
/* makes a connection between the input-pin 'i' and the output-pin 'o' */
|
/* makes a connection between the input-pin 'i' and the output-pin 'o' */
|
||||||
static int tea6415c_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int tea6415c_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 i, u32 o, u32 config)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
u8 byte = 0;
|
u8 byte = 0;
|
||||||
u32 i = route->input;
|
|
||||||
u32 o = route->output;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "i=%d, o=%d\n", i, o);
|
v4l2_dbg(1, debug, sd, "i=%d, o=%d\n", i, o);
|
||||||
|
@ -48,15 +48,15 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
|||||||
|
|
||||||
/* make a connection between the input 'i' and the output 'o'
|
/* make a connection between the input 'i' and the output 'o'
|
||||||
with gain 'g' (note: i = 6 means 'mute') */
|
with gain 'g' (note: i = 6 means 'mute') */
|
||||||
static int tea6420_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int tea6420_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 i, u32 o, u32 config)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||||
int i = route->input;
|
int g = (o >> 4) & 0xf;
|
||||||
int o = route->output & 0xf;
|
|
||||||
int g = (route->output >> 4) & 0xf;
|
|
||||||
u8 byte;
|
u8 byte;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
o &= 0xf;
|
||||||
v4l2_dbg(1, debug, sd, "i=%d, o=%d, g=%d\n", i, o, g);
|
v4l2_dbg(1, debug, sd, "i=%d, o=%d, g=%d\n", i, o, g);
|
||||||
|
|
||||||
/* check if the parameters are valid */
|
/* check if the parameters are valid */
|
||||||
@ -133,13 +133,8 @@ static int tea6420_probe(struct i2c_client *client,
|
|||||||
|
|
||||||
/* set initial values: set "mute"-input to all outputs at gain 0 */
|
/* set initial values: set "mute"-input to all outputs at gain 0 */
|
||||||
err = 0;
|
err = 0;
|
||||||
for (i = 1; i < 5; i++) {
|
for (i = 1; i < 5; i++)
|
||||||
struct v4l2_routing route;
|
err += tea6420_s_routing(sd, 6, i, 0);
|
||||||
|
|
||||||
route.input = 6;
|
|
||||||
route.output = i;
|
|
||||||
err += tea6420_s_routing(sd, &route);
|
|
||||||
}
|
|
||||||
if (err) {
|
if (err) {
|
||||||
v4l_dbg(1, debug, client, "could not initialize tea6420\n");
|
v4l_dbg(1, debug, client, "could not initialize tea6420\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -1781,17 +1781,18 @@ static int tvaudio_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tvaudio_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *rt)
|
static int tvaudio_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct CHIPSTATE *chip = to_state(sd);
|
struct CHIPSTATE *chip = to_state(sd);
|
||||||
struct CHIPDESC *desc = chip->desc;
|
struct CHIPDESC *desc = chip->desc;
|
||||||
|
|
||||||
if (!(desc->flags & CHIP_HAS_INPUTSEL))
|
if (!(desc->flags & CHIP_HAS_INPUTSEL))
|
||||||
return 0;
|
return 0;
|
||||||
if (rt->input >= 4)
|
if (input >= 4)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
/* There are four inputs: tuner, radio, extern and intern. */
|
/* There are four inputs: tuner, radio, extern and intern. */
|
||||||
chip->input = rt->input;
|
chip->input = input;
|
||||||
if (chip->muted)
|
if (chip->muted)
|
||||||
return 0;
|
return 0;
|
||||||
chip_write_masked(chip, desc->inputreg,
|
chip_write_masked(chip, desc->inputreg,
|
||||||
|
@ -69,7 +69,8 @@ struct tvp5150 {
|
|||||||
struct v4l2_subdev sd;
|
struct v4l2_subdev sd;
|
||||||
|
|
||||||
v4l2_std_id norm; /* Current set standard */
|
v4l2_std_id norm; /* Current set standard */
|
||||||
struct v4l2_routing route;
|
u32 input;
|
||||||
|
u32 output;
|
||||||
int enable;
|
int enable;
|
||||||
int bright;
|
int bright;
|
||||||
int contrast;
|
int contrast;
|
||||||
@ -280,10 +281,10 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
|
|||||||
int input = 0;
|
int input = 0;
|
||||||
unsigned char val;
|
unsigned char val;
|
||||||
|
|
||||||
if ((decoder->route.output & TVP5150_BLACK_SCREEN) || !decoder->enable)
|
if ((decoder->output & TVP5150_BLACK_SCREEN) || !decoder->enable)
|
||||||
input = 8;
|
input = 8;
|
||||||
|
|
||||||
switch (decoder->route.input) {
|
switch (decoder->input) {
|
||||||
case TVP5150_COMPOSITE1:
|
case TVP5150_COMPOSITE1:
|
||||||
input |= 2;
|
input |= 2;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
@ -299,8 +300,8 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
|
|||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "Selecting video route: route input=%i, output=%i "
|
v4l2_dbg(1, debug, sd, "Selecting video route: route input=%i, output=%i "
|
||||||
"=> tvp5150 input=%i, opmode=%i\n",
|
"=> tvp5150 input=%i, opmode=%i\n",
|
||||||
decoder->route.input,decoder->route.output,
|
decoder->input, decoder->output,
|
||||||
input, opmode );
|
input, opmode);
|
||||||
|
|
||||||
tvp5150_write(sd, TVP5150_OP_MODE_CTL, opmode);
|
tvp5150_write(sd, TVP5150_OP_MODE_CTL, opmode);
|
||||||
tvp5150_write(sd, TVP5150_VD_IN_SRC_SEL_1, input);
|
tvp5150_write(sd, TVP5150_VD_IN_SRC_SEL_1, input);
|
||||||
@ -309,7 +310,7 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
|
|||||||
* For Composite and TV, it should be the reverse
|
* For Composite and TV, it should be the reverse
|
||||||
*/
|
*/
|
||||||
val = tvp5150_read(sd, TVP5150_MISC_CTL);
|
val = tvp5150_read(sd, TVP5150_MISC_CTL);
|
||||||
if (decoder->route.input == TVP5150_SVIDEO)
|
if (decoder->input == TVP5150_SVIDEO)
|
||||||
val = (val & ~0x40) | 0x10;
|
val = (val & ~0x40) | 0x10;
|
||||||
else
|
else
|
||||||
val = (val & ~0x10) | 0x40;
|
val = (val & ~0x10) | 0x40;
|
||||||
@ -878,11 +879,13 @@ static int tvp5150_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
|
|||||||
I2C Command
|
I2C Command
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int tvp5150_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int tvp5150_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct tvp5150 *decoder = to_tvp5150(sd);
|
struct tvp5150 *decoder = to_tvp5150(sd);
|
||||||
|
|
||||||
decoder->route = *route;
|
decoder->input = input;
|
||||||
|
decoder->output = output;
|
||||||
tvp5150_selmux(sd);
|
tvp5150_selmux(sd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1077,7 +1080,7 @@ static int tvp5150_probe(struct i2c_client *c,
|
|||||||
c->addr << 1, c->adapter->name);
|
c->addr << 1, c->adapter->name);
|
||||||
|
|
||||||
core->norm = V4L2_STD_ALL; /* Default is autodetect */
|
core->norm = V4L2_STD_ALL; /* Default is autodetect */
|
||||||
core->route.input = TVP5150_COMPOSITE1;
|
core->input = TVP5150_COMPOSITE1;
|
||||||
core->enable = 1;
|
core->enable = 1;
|
||||||
core->bright = 128;
|
core->bright = 128;
|
||||||
core->contrast = 128;
|
core->contrast = 128;
|
||||||
|
@ -124,17 +124,18 @@ static int upd64031a_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int upd64031a_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int upd64031a_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct upd64031a_state *state = to_state(sd);
|
struct upd64031a_state *state = to_state(sd);
|
||||||
u8 r00, r05, r08;
|
u8 r00, r05, r08;
|
||||||
|
|
||||||
state->gr_mode = (route->input & 3) << 6;
|
state->gr_mode = (input & 3) << 6;
|
||||||
state->direct_3dycs_connect = (route->input & 0xc) << 4;
|
state->direct_3dycs_connect = (input & 0xc) << 4;
|
||||||
state->ext_comp_sync =
|
state->ext_comp_sync =
|
||||||
(route->input & UPD64031A_COMPOSITE_EXTERNAL) << 1;
|
(input & UPD64031A_COMPOSITE_EXTERNAL) << 1;
|
||||||
state->ext_vert_sync =
|
state->ext_vert_sync =
|
||||||
(route->input & UPD64031A_VERTICAL_EXTERNAL) << 2;
|
(input & UPD64031A_VERTICAL_EXTERNAL) << 2;
|
||||||
r00 = (state->regs[R00] & ~GR_MODE_MASK) | state->gr_mode;
|
r00 = (state->regs[R00] & ~GR_MODE_MASK) | state->gr_mode;
|
||||||
r05 = (state->regs[R00] & ~SYNC_CIRCUIT_MASK) |
|
r05 = (state->regs[R00] & ~SYNC_CIRCUIT_MASK) |
|
||||||
state->ext_comp_sync | state->ext_vert_sync;
|
state->ext_comp_sync | state->ext_vert_sync;
|
||||||
|
@ -102,15 +102,16 @@ static u8 upd64083_read(struct v4l2_subdev *sd, u8 reg)
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static int upd64083_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int upd64083_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct upd64083_state *state = to_state(sd);
|
struct upd64083_state *state = to_state(sd);
|
||||||
u8 r00, r02;
|
u8 r00, r02;
|
||||||
|
|
||||||
if (route->input > 7 || (route->input & 6) == 6)
|
if (input > 7 || (input & 6) == 6)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
state->mode = (route->input & 3) << 6;
|
state->mode = (input & 3) << 6;
|
||||||
state->ext_y_adc = (route->input & UPD64083_EXT_Y_ADC) << 3;
|
state->ext_y_adc = (input & UPD64083_EXT_Y_ADC) << 3;
|
||||||
r00 = (state->regs[R00] & ~(3 << 6)) | state->mode;
|
r00 = (state->regs[R00] & ~(3 << 6)) | state->mode;
|
||||||
r02 = (state->regs[R02] & ~(1 << 5)) | state->ext_y_adc;
|
r02 = (state->regs[R02] & ~(1 << 5)) | state->ext_y_adc;
|
||||||
upd64083_write(sd, R00, r00);
|
upd64083_write(sd, R00, r00);
|
||||||
|
@ -2597,7 +2597,6 @@ int usbvision_muxsel(struct usb_usbvision *usbvision, int channel)
|
|||||||
/* inputs #1 and #2 are variable for SAA7111 and SAA7113 */
|
/* inputs #1 and #2 are variable for SAA7111 and SAA7113 */
|
||||||
int mode[4]= {SAA7115_COMPOSITE0, 0, 0, SAA7115_COMPOSITE3};
|
int mode[4]= {SAA7115_COMPOSITE0, 0, 0, SAA7115_COMPOSITE3};
|
||||||
int audio[]= {1, 0, 0, 0};
|
int audio[]= {1, 0, 0, 0};
|
||||||
struct v4l2_routing route;
|
|
||||||
//channel 0 is TV with audiochannel 1 (tuner mono)
|
//channel 0 is TV with audiochannel 1 (tuner mono)
|
||||||
//channel 1 is Composite with audio channel 0 (line in)
|
//channel 1 is Composite with audio channel 0 (line in)
|
||||||
//channel 2 is S-Video with audio channel 0 (line in)
|
//channel 2 is S-Video with audio channel 0 (line in)
|
||||||
@ -2630,9 +2629,7 @@ int usbvision_muxsel(struct usb_usbvision *usbvision, int channel)
|
|||||||
mode[2] = SAA7115_SVIDEO1;
|
mode[2] = SAA7115_SVIDEO1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
route.input = mode[channel];
|
call_all(usbvision, video, s_routing, mode[channel], 0, 0);
|
||||||
route.output = 0;
|
|
||||||
call_all(usbvision, video, s_routing, &route);
|
|
||||||
usbvision_set_audio(usbvision, audio[channel]);
|
usbvision_set_audio(usbvision, audio[channel]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2565,12 +2565,11 @@ static int vino_acquire_input(struct vino_channel_settings *vcs)
|
|||||||
int input;
|
int input;
|
||||||
int data_norm;
|
int data_norm;
|
||||||
v4l2_std_id norm;
|
v4l2_std_id norm;
|
||||||
struct v4l2_routing route = { 0, 0 };
|
|
||||||
|
|
||||||
input = VINO_INPUT_COMPOSITE;
|
input = VINO_INPUT_COMPOSITE;
|
||||||
|
|
||||||
route.input = vino_get_saa7191_input(input);
|
ret = decoder_call(video, s_routing,
|
||||||
ret = decoder_call(video, s_routing, &route);
|
vino_get_saa7191_input(input), 0, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
@ -2656,10 +2655,9 @@ static int vino_set_input(struct vino_channel_settings *vcs, int input)
|
|||||||
if (vino_drvdata->decoder_owner == vcs->channel) {
|
if (vino_drvdata->decoder_owner == vcs->channel) {
|
||||||
int data_norm;
|
int data_norm;
|
||||||
v4l2_std_id norm;
|
v4l2_std_id norm;
|
||||||
struct v4l2_routing route = { 0, 0 };
|
|
||||||
|
|
||||||
route.input = vino_get_saa7191_input(input);
|
ret = decoder_call(video, s_routing,
|
||||||
ret = decoder_call(video, s_routing, &route);
|
vino_get_saa7191_input(input), 0, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
vino_drvdata->decoder_owner = VINO_NO_CHANNEL;
|
vino_drvdata->decoder_owner = VINO_NO_CHANNEL;
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
@ -376,33 +376,34 @@ static int vpx3220_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vpx3220_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int vpx3220_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
int data;
|
int data;
|
||||||
|
|
||||||
/* RJ: route->input = 0: ST8 (PCTV) input
|
/* RJ: input = 0: ST8 (PCTV) input
|
||||||
route->input = 1: COMPOSITE input
|
input = 1: COMPOSITE input
|
||||||
route->input = 2: SVHS input */
|
input = 2: SVHS input */
|
||||||
|
|
||||||
const int input[3][2] = {
|
const int input_vals[3][2] = {
|
||||||
{0x0c, 0},
|
{0x0c, 0},
|
||||||
{0x0d, 0},
|
{0x0d, 0},
|
||||||
{0x0e, 1}
|
{0x0e, 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (route->input < 0 || route->input > 2)
|
if (input < 0 || input > 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
v4l2_dbg(1, debug, sd, "input switched to %s\n", inputs[route->input]);
|
v4l2_dbg(1, debug, sd, "input switched to %s\n", inputs[input]);
|
||||||
|
|
||||||
vpx3220_write(sd, 0x33, input[route->input][0]);
|
vpx3220_write(sd, 0x33, input_vals[input][0]);
|
||||||
|
|
||||||
data = vpx3220_fp_read(sd, 0xf2) & ~(0x0020);
|
data = vpx3220_fp_read(sd, 0xf2) & ~(0x0020);
|
||||||
if (data < 0)
|
if (data < 0)
|
||||||
return data;
|
return data;
|
||||||
/* 0x0010 is required to latch the setting */
|
/* 0x0010 is required to latch the setting */
|
||||||
vpx3220_fp_write(sd, 0xf2,
|
vpx3220_fp_write(sd, 0xf2,
|
||||||
data | (input[route->input][1] << 5) | 0x0010);
|
data | (input_vals[input][1] << 5) | 0x0010);
|
||||||
|
|
||||||
udelay(10);
|
udelay(10);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -79,7 +79,8 @@ static int wm8775_write(struct v4l2_subdev *sd, int reg, u16 val)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wm8775_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *route)
|
static int wm8775_s_routing(struct v4l2_subdev *sd,
|
||||||
|
u32 input, u32 output, u32 config)
|
||||||
{
|
{
|
||||||
struct wm8775_state *state = to_state(sd);
|
struct wm8775_state *state = to_state(sd);
|
||||||
|
|
||||||
@ -88,11 +89,11 @@ static int wm8775_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *r
|
|||||||
16 combinations.
|
16 combinations.
|
||||||
If only one input is active (the normal case) then the
|
If only one input is active (the normal case) then the
|
||||||
input values 1, 2, 4 or 8 should be used. */
|
input values 1, 2, 4 or 8 should be used. */
|
||||||
if (route->input > 15) {
|
if (input > 15) {
|
||||||
v4l2_err(sd, "Invalid input %d.\n", route->input);
|
v4l2_err(sd, "Invalid input %d.\n", input);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
state->input = route->input;
|
state->input = input;
|
||||||
if (state->muted)
|
if (state->muted)
|
||||||
return 0;
|
return 0;
|
||||||
wm8775_write(sd, R21, 0x0c0);
|
wm8775_write(sd, R21, 0x0c0);
|
||||||
|
@ -1087,10 +1087,8 @@ zr36057_init (struct zoran *zr)
|
|||||||
detect_guest_activity(zr);
|
detect_guest_activity(zr);
|
||||||
test_interrupts(zr);
|
test_interrupts(zr);
|
||||||
if (!pass_through) {
|
if (!pass_through) {
|
||||||
struct v4l2_routing route = { 2, 0 };
|
|
||||||
|
|
||||||
decoder_call(zr, video, s_stream, 0);
|
decoder_call(zr, video, s_stream, 0);
|
||||||
encoder_call(zr, video, s_routing, &route);
|
encoder_call(zr, video, s_routing, 2, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
zr->zoran_proc = NULL;
|
zr->zoran_proc = NULL;
|
||||||
|
@ -971,7 +971,6 @@ zr36057_enable_jpg (struct zoran *zr,
|
|||||||
struct vfe_settings cap;
|
struct vfe_settings cap;
|
||||||
int field_size =
|
int field_size =
|
||||||
zr->jpg_buffers.buffer_size / zr->jpg_settings.field_per_buff;
|
zr->jpg_buffers.buffer_size / zr->jpg_settings.field_per_buff;
|
||||||
struct v4l2_routing route = { 0, 0 };
|
|
||||||
|
|
||||||
zr->codec_mode = mode;
|
zr->codec_mode = mode;
|
||||||
|
|
||||||
@ -994,8 +993,7 @@ zr36057_enable_jpg (struct zoran *zr,
|
|||||||
*/
|
*/
|
||||||
set_videobus_dir(zr, 0);
|
set_videobus_dir(zr, 0);
|
||||||
decoder_call(zr, video, s_stream, 1);
|
decoder_call(zr, video, s_stream, 1);
|
||||||
route.input = 0;
|
encoder_call(zr, video, s_routing, 0, 0, 0);
|
||||||
encoder_call(zr, video, s_routing, &route);
|
|
||||||
|
|
||||||
/* Take the JPEG codec and the VFE out of sleep */
|
/* Take the JPEG codec and the VFE out of sleep */
|
||||||
jpeg_codec_sleep(zr, 0);
|
jpeg_codec_sleep(zr, 0);
|
||||||
@ -1043,8 +1041,7 @@ zr36057_enable_jpg (struct zoran *zr,
|
|||||||
*/
|
*/
|
||||||
decoder_call(zr, video, s_stream, 0);
|
decoder_call(zr, video, s_stream, 0);
|
||||||
set_videobus_dir(zr, 1);
|
set_videobus_dir(zr, 1);
|
||||||
route.input = 1;
|
encoder_call(zr, video, s_routing, 1, 0, 0);
|
||||||
encoder_call(zr, video, s_routing, &route);
|
|
||||||
|
|
||||||
/* Take the JPEG codec and the VFE out of sleep */
|
/* Take the JPEG codec and the VFE out of sleep */
|
||||||
jpeg_codec_sleep(zr, 0);
|
jpeg_codec_sleep(zr, 0);
|
||||||
@ -1089,8 +1086,7 @@ zr36057_enable_jpg (struct zoran *zr,
|
|||||||
zr36057_adjust_vfe(zr, mode);
|
zr36057_adjust_vfe(zr, mode);
|
||||||
|
|
||||||
decoder_call(zr, video, s_stream, 1);
|
decoder_call(zr, video, s_stream, 1);
|
||||||
route.input = 0;
|
encoder_call(zr, video, s_routing, 0, 0, 0);
|
||||||
encoder_call(zr, video, s_routing, &route);
|
|
||||||
|
|
||||||
dprintk(2, KERN_INFO "%s: enable_jpg(IDLE)\n", ZR_DEVNAME(zr));
|
dprintk(2, KERN_INFO "%s: enable_jpg(IDLE)\n", ZR_DEVNAME(zr));
|
||||||
break;
|
break;
|
||||||
@ -1571,8 +1567,6 @@ zoran_set_pci_master (struct zoran *zr,
|
|||||||
void
|
void
|
||||||
zoran_init_hardware (struct zoran *zr)
|
zoran_init_hardware (struct zoran *zr)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route = { 0, 0 };
|
|
||||||
|
|
||||||
/* Enable bus-mastering */
|
/* Enable bus-mastering */
|
||||||
zoran_set_pci_master(zr, 1);
|
zoran_set_pci_master(zr, 1);
|
||||||
|
|
||||||
@ -1581,16 +1575,14 @@ zoran_init_hardware (struct zoran *zr)
|
|||||||
zr->card.init(zr);
|
zr->card.init(zr);
|
||||||
}
|
}
|
||||||
|
|
||||||
route.input = zr->card.input[zr->input].muxsel;
|
|
||||||
|
|
||||||
decoder_call(zr, core, init, 0);
|
decoder_call(zr, core, init, 0);
|
||||||
decoder_call(zr, core, s_std, zr->norm);
|
decoder_call(zr, core, s_std, zr->norm);
|
||||||
decoder_call(zr, video, s_routing, &route);
|
decoder_call(zr, video, s_routing,
|
||||||
|
zr->card.input[zr->input].muxsel, 0, 0);
|
||||||
|
|
||||||
encoder_call(zr, core, init, 0);
|
encoder_call(zr, core, init, 0);
|
||||||
encoder_call(zr, video, s_std_output, zr->norm);
|
encoder_call(zr, video, s_std_output, zr->norm);
|
||||||
route.input = 0;
|
encoder_call(zr, video, s_routing, 0, 0, 0);
|
||||||
encoder_call(zr, video, s_routing, &route);
|
|
||||||
|
|
||||||
/* toggle JPEG codec sleep to sync PLL */
|
/* toggle JPEG codec sleep to sync PLL */
|
||||||
jpeg_codec_sleep(zr, 1);
|
jpeg_codec_sleep(zr, 1);
|
||||||
|
@ -1018,10 +1018,8 @@ zoran_close(struct file *file)
|
|||||||
zoran_set_pci_master(zr, 0);
|
zoran_set_pci_master(zr, 0);
|
||||||
|
|
||||||
if (!pass_through) { /* Switch to color bar */
|
if (!pass_through) { /* Switch to color bar */
|
||||||
struct v4l2_routing route = { 2, 0 };
|
|
||||||
|
|
||||||
decoder_call(zr, video, s_stream, 0);
|
decoder_call(zr, video, s_stream, 0);
|
||||||
encoder_call(zr, video, s_routing, &route);
|
encoder_call(zr, video, s_routing, 2, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1496,8 +1494,6 @@ static int
|
|||||||
zoran_set_input (struct zoran *zr,
|
zoran_set_input (struct zoran *zr,
|
||||||
int input)
|
int input)
|
||||||
{
|
{
|
||||||
struct v4l2_routing route = { 0, 0 };
|
|
||||||
|
|
||||||
if (input == zr->input) {
|
if (input == zr->input) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1519,10 +1515,10 @@ zoran_set_input (struct zoran *zr,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
route.input = zr->card.input[input].muxsel;
|
|
||||||
zr->input = input;
|
zr->input = input;
|
||||||
|
|
||||||
decoder_call(zr, video, s_routing, &route);
|
decoder_call(zr, video, s_routing,
|
||||||
|
zr->card.input[input].muxsel, 0, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1748,7 +1744,6 @@ jpgreqbuf_unlock_and_return:
|
|||||||
case BUZIOC_G_STATUS:
|
case BUZIOC_G_STATUS:
|
||||||
{
|
{
|
||||||
struct zoran_status *bstat = arg;
|
struct zoran_status *bstat = arg;
|
||||||
struct v4l2_routing route = { 0, 0 };
|
|
||||||
int status = 0, res = 0;
|
int status = 0, res = 0;
|
||||||
v4l2_std_id norm;
|
v4l2_std_id norm;
|
||||||
|
|
||||||
@ -1762,8 +1757,6 @@ jpgreqbuf_unlock_and_return:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
route.input = zr->card.input[bstat->input].muxsel;
|
|
||||||
|
|
||||||
mutex_lock(&zr->resource_lock);
|
mutex_lock(&zr->resource_lock);
|
||||||
|
|
||||||
if (zr->codec_mode != BUZ_MODE_IDLE) {
|
if (zr->codec_mode != BUZ_MODE_IDLE) {
|
||||||
@ -1775,7 +1768,8 @@ jpgreqbuf_unlock_and_return:
|
|||||||
goto gstat_unlock_and_return;
|
goto gstat_unlock_and_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
decoder_call(zr, video, s_routing, &route);
|
decoder_call(zr, video, s_routing,
|
||||||
|
zr->card.input[bstat->input].muxsel, 0, 0);
|
||||||
|
|
||||||
/* sleep 1 second */
|
/* sleep 1 second */
|
||||||
ssleep(1);
|
ssleep(1);
|
||||||
@ -1785,8 +1779,8 @@ jpgreqbuf_unlock_and_return:
|
|||||||
decoder_call(zr, video, g_input_status, &status);
|
decoder_call(zr, video, g_input_status, &status);
|
||||||
|
|
||||||
/* restore previous input and norm */
|
/* restore previous input and norm */
|
||||||
route.input = zr->card.input[zr->input].muxsel;
|
decoder_call(zr, video, s_routing,
|
||||||
decoder_call(zr, video, s_routing, &route);
|
zr->card.input[zr->input].muxsel, 0, 0);
|
||||||
gstat_unlock_and_return:
|
gstat_unlock_and_return:
|
||||||
mutex_unlock(&zr->resource_lock);
|
mutex_unlock(&zr->resource_lock);
|
||||||
|
|
||||||
|
@ -54,13 +54,13 @@
|
|||||||
=======
|
=======
|
||||||
|
|
||||||
So to specify a complete routing scheme for the msp3400 you will have to
|
So to specify a complete routing scheme for the msp3400 you will have to
|
||||||
specify in the 'input' field of the v4l2_routing struct:
|
specify in the 'input' arg of the s_routing function:
|
||||||
|
|
||||||
1) which tuner input to use
|
1) which tuner input to use
|
||||||
2) which SCART input to use
|
2) which SCART input to use
|
||||||
3) which DSP input to use for each DSP output
|
3) which DSP input to use for each DSP output
|
||||||
|
|
||||||
And in the 'output' field of the v4l2_routing struct you specify:
|
And in the 'output' arg of the s_routing function you specify:
|
||||||
|
|
||||||
1) which SCART input to use for each SCART output
|
1) which SCART input to use for each SCART output
|
||||||
|
|
||||||
|
@ -148,7 +148,8 @@ struct v4l2_subdev_tuner_ops {
|
|||||||
board designs. Usual values for the frequency are 1024000 and 2048000.
|
board designs. Usual values for the frequency are 1024000 and 2048000.
|
||||||
If the frequency is not supported, then -EINVAL is returned.
|
If the frequency is not supported, then -EINVAL is returned.
|
||||||
|
|
||||||
s_routing: used to define the input and/or output pins of an audio chip.
|
s_routing: used to define the input and/or output pins of an audio chip,
|
||||||
|
and any additional configuration data.
|
||||||
Never attempt to use user-level input IDs (e.g. Composite, S-Video,
|
Never attempt to use user-level input IDs (e.g. Composite, S-Video,
|
||||||
Tuner) at this level. An i2c device shouldn't know about whether an
|
Tuner) at this level. An i2c device shouldn't know about whether an
|
||||||
input pin is connected to a Composite connector, become on another
|
input pin is connected to a Composite connector, become on another
|
||||||
@ -159,7 +160,7 @@ struct v4l2_subdev_tuner_ops {
|
|||||||
struct v4l2_subdev_audio_ops {
|
struct v4l2_subdev_audio_ops {
|
||||||
int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
|
int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
|
||||||
int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
|
int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
|
||||||
int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route);
|
int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -200,7 +201,7 @@ struct v4l2_subdev_audio_ops {
|
|||||||
devices.
|
devices.
|
||||||
*/
|
*/
|
||||||
struct v4l2_subdev_video_ops {
|
struct v4l2_subdev_video_ops {
|
||||||
int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route);
|
int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
|
||||||
int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
|
int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
|
||||||
int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
|
int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
|
||||||
int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
|
int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
|
||||||
|
Loading…
Reference in New Issue
Block a user