diff options
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-video.c')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-video.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index 6b7d44a7117f..bea74fd9a520 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
@@ -566,6 +566,7 @@ static void video_mux(struct em28xx *dev, int index) | |||
566 | route.output = 0; | 566 | route.output = 0; |
567 | dev->ctl_input = index; | 567 | dev->ctl_input = index; |
568 | dev->ctl_ainput = INPUT(index)->amux; | 568 | dev->ctl_ainput = INPUT(index)->amux; |
569 | dev->ctl_aoutput = INPUT(index)->aout; | ||
569 | 570 | ||
570 | em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route); | 571 | em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route); |
571 | 572 | ||
@@ -928,20 +929,38 @@ static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a) | |||
928 | { | 929 | { |
929 | struct em28xx_fh *fh = priv; | 930 | struct em28xx_fh *fh = priv; |
930 | struct em28xx *dev = fh->dev; | 931 | struct em28xx *dev = fh->dev; |
931 | unsigned int index = a->index; | ||
932 | 932 | ||
933 | if (a->index > 1) | 933 | switch (a->index) { |
934 | return -EINVAL; | 934 | case EM28XX_AMUX_VIDEO: |
935 | |||
936 | index = dev->ctl_ainput; | ||
937 | |||
938 | if (index == 0) | ||
939 | strcpy(a->name, "Television"); | 935 | strcpy(a->name, "Television"); |
940 | else | 936 | break; |
937 | case EM28XX_AMUX_LINE_IN: | ||
941 | strcpy(a->name, "Line In"); | 938 | strcpy(a->name, "Line In"); |
939 | break; | ||
940 | case EM28XX_AMUX_VIDEO2: | ||
941 | strcpy(a->name, "Television alt"); | ||
942 | break; | ||
943 | case EM28XX_AMUX_PHONE: | ||
944 | strcpy(a->name, "Phone"); | ||
945 | break; | ||
946 | case EM28XX_AMUX_MIC: | ||
947 | strcpy(a->name, "Mic"); | ||
948 | break; | ||
949 | case EM28XX_AMUX_CD: | ||
950 | strcpy(a->name, "CD"); | ||
951 | break; | ||
952 | case EM28XX_AMUX_AUX: | ||
953 | strcpy(a->name, "Aux"); | ||
954 | break; | ||
955 | case EM28XX_AMUX_PCM_OUT: | ||
956 | strcpy(a->name, "PCM"); | ||
957 | break; | ||
958 | default: | ||
959 | return -EINVAL; | ||
960 | } | ||
942 | 961 | ||
962 | a->index = dev->ctl_ainput; | ||
943 | a->capability = V4L2_AUDCAP_STEREO; | 963 | a->capability = V4L2_AUDCAP_STEREO; |
944 | a->index = index; | ||
945 | 964 | ||
946 | return 0; | 965 | return 0; |
947 | } | 966 | } |
@@ -951,9 +970,8 @@ static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a) | |||
951 | struct em28xx_fh *fh = priv; | 970 | struct em28xx_fh *fh = priv; |
952 | struct em28xx *dev = fh->dev; | 971 | struct em28xx *dev = fh->dev; |
953 | 972 | ||
954 | if (a->index != dev->ctl_ainput) | 973 | dev->ctl_ainput = INPUT(a->index)->amux; |
955 | return -EINVAL; | 974 | dev->ctl_aoutput = INPUT(a->index)->aout; |
956 | |||
957 | return 0; | 975 | return 0; |
958 | } | 976 | } |
959 | 977 | ||