V4L/DVB (3712): Fix video input setting of em28xx, use _INT_S_VIDEO_ROUTING in tvp5150
authorHans Verkuil <hverkuil@xs4all.nl>
Sun, 2 Apr 2006 16:35:00 +0000 (13:35 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sun, 25 Jun 2006 04:57:38 +0000 (01:57 -0300)
- Use new routing input defines in em28xx-cards.c
- Fix S-Video settings for tvp5150-based cards (input was copied from saa7115
  based cards and worked only because S-Video was selected in the default: case)
- Replace VIDIOC_S_INPUT by VIDIOC_INT_S_VIDEO_ROUTING in em28xx-video.c
- Remove the now obsolete VIDIOC_S_INPUT handler in saa7115.c
- Add VIDIOC_INT_G/S_VIDEO_ROUTING in tvp5150.c
- Add new media/tvp5150.h with the routing defines.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/saa7115.c
drivers/media/video/tvp5150.c
include/media/tvp5150.h [new file with mode: 0644]

index 3ba3439db580f605a32a5fc3b5982c810387e0f3..eb8132bff31348dac61a2e46ed18acfa6a4a68ac 100644 (file)
@@ -29,6 +29,8 @@
 #include <linux/usb.h>
 #include <media/tuner.h>
 #include <media/msp3400.h>
+#include <media/saa7115.h>
+#include <media/tvp5150.h>
 #include <media/tveeprom.h>
 #include <media/audiochip.h>
 #include <media/v4l2-common.h>
@@ -46,11 +48,11 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input           = {{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -64,11 +66,11 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input           = {{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -82,11 +84,11 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input           = {{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -100,15 +102,15 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input          = {{
                        .type     = EM28XX_VMUX_TELEVISION,
-                       .vmux     = 2,
+                       .vmux     = SAA7115_COMPOSITE2,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -122,15 +124,15 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input          = {{
                        .type     = EM28XX_VMUX_TELEVISION,
-                       .vmux     = 2,
+                       .vmux     = SAA7115_COMPOSITE2,
                        .amux     = 0,
                },{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -146,11 +148,11 @@ struct em28xx_board em28xx_boards[] = {
                /*FIXME: S-Video not tested */
                .input          = {{
                        .type     = EM28XX_VMUX_TELEVISION,
-                       .vmux     = 0,
+                       .vmux     = TVP5150_COMPOSITE0,
                        .amux     = MSP_INPUT_DEFAULT,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 2,
+                       .vmux     = TVP5150_SVIDEO,
                        .amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
                                        MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
                }},
@@ -165,15 +167,15 @@ struct em28xx_board em28xx_boards[] = {
                .decoder        = EM28XX_SAA7114,
                .input          = {{
                        .type     = EM28XX_VMUX_TELEVISION,
-                       .vmux     = 4,
+                       .vmux     = SAA7115_COMPOSITE4,
                        .amux     = 0,
                },{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -188,15 +190,15 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input          = {{
                        .type     = EM28XX_VMUX_TELEVISION,
-                       .vmux     = 2,
+                       .vmux     = SAA7115_COMPOSITE2,
                        .amux     = 0,
                },{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -211,15 +213,15 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input          = {{
                        .type     = EM28XX_VMUX_TELEVISION,
-                       .vmux     = 2,
+                       .vmux     = SAA7115_COMPOSITE2,
                        .amux     = 0,
                },{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -234,15 +236,15 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input          = {{
                        .type     = EM28XX_VMUX_TELEVISION,
-                       .vmux     = 2,
+                       .vmux     = SAA7115_COMPOSITE2,
                        .amux     = 0,
                },{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
@@ -254,11 +256,11 @@ struct em28xx_board em28xx_boards[] = {
                .decoder      = EM28XX_SAA7113,
                .input          = {{
                        .type     = EM28XX_VMUX_COMPOSITE1,
-                       .vmux     = 0,
+                       .vmux     = SAA7115_COMPOSITE0,
                        .amux     = 1,
                },{
                        .type     = EM28XX_VMUX_SVIDEO,
-                       .vmux     = 9,
+                       .vmux     = SAA7115_SVIDEO3,
                        .amux     = 1,
                }},
        },
index cf7cdf9ef6178e50f3cf1596bf65b856a5fa5df6..1a0062b649a8e171ee7fbd7af00f135117b4faa5 100644 (file)
@@ -170,8 +170,12 @@ static int em28xx_config(struct em28xx *dev)
 static void em28xx_config_i2c(struct em28xx *dev)
 {
        struct v4l2_frequency f;
+       struct v4l2_routing route;
+
+       route.input = INPUT(dev->ctl_input)->vmux;
+       route.output = 0;
        em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, NULL);
-       em28xx_i2c_call_clients(dev, VIDIOC_S_INPUT, &dev->ctl_input);
+       em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
        em28xx_i2c_call_clients(dev, VIDIOC_STREAMON, NULL);
 
        /* configure tuner */
@@ -206,19 +210,19 @@ static void em28xx_empty_framequeues(struct em28xx *dev)
 
 static void video_mux(struct em28xx *dev, int index)
 {
-       int input, ainput;
+       int ainput;
+       struct v4l2_routing route;
 
-       input = INPUT(index)->vmux;
+       route.input = INPUT(index)->vmux;
+       route.output = 0;
        dev->ctl_input = index;
        dev->ctl_ainput = INPUT(index)->amux;
 
-       em28xx_i2c_call_clients(dev, VIDIOC_S_INPUT, &input);
+       em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
 
-       em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,input,dev->ctl_ainput);
+       em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,route.input,dev->ctl_ainput);
 
        if (dev->has_msp34xx) {
-               struct v4l2_routing route;
-
                if (dev->i2s_speed)
                        em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed);
                route.input = dev->ctl_ainput;
index edea9e3d2dca00b7d0b2f281b935d0e8c3d875b8..f4843bb453472dc07dcd9139fdc8f3438334ba93 100644 (file)
@@ -1238,34 +1238,6 @@ static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *ar
                break;
        }
 
-       case VIDIOC_G_INPUT:
-               *(int *)arg = state->input;
-               break;
-
-       case VIDIOC_S_INPUT:
-               v4l_dbg(1, debug, client, "decoder set input %d\n", *iarg);
-               /* inputs from 0-9 are available */
-               if (*iarg < 0 || *iarg > 9) {
-                       return -EINVAL;
-               }
-
-               if (state->input == *iarg)
-                       break;
-               v4l_dbg(1, debug, client, "now setting %s input\n",
-                       *iarg >= 6 ? "S-Video" : "Composite");
-               state->input = *iarg;
-
-               /* select mode */
-               saa7115_write(client, 0x02,
-                             (saa7115_read(client, 0x02) & 0xf0) |
-                              state->input);
-
-               /* bypass chrominance trap for modes 6..9 */
-               saa7115_write(client, 0x09,
-                             (saa7115_read(client, 0x09) & 0x7f) |
-                              (state->input < 6 ? 0x0 : 0x80));
-               break;
-
        case VIDIOC_STREAMON:
        case VIDIOC_STREAMOFF:
                v4l_dbg(1, debug, client, "%s output\n",
index dab4973bcf8261f4e5cd3eac842bec218e76f388..b167ffab25202106da0bc956b8304430a48634e8 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/delay.h>
 #include <linux/video_decoder.h>
 #include <media/v4l2-common.h>
+#include <media/tvp5150.h>
 
 #include "tvp5150_reg.h"
 
@@ -89,7 +90,7 @@ struct tvp5150 {
        struct i2c_client *client;
 
        v4l2_std_id norm;       /* Current set standard */
-       int input;
+       struct v4l2_routing route;
        int enable;
        int bright;
        int contrast;
@@ -283,29 +284,26 @@ static void dump_reg(struct i2c_client *c)
 /****************************************************************************
                        Basic functions
  ****************************************************************************/
-enum tvp5150_input {
-       TVP5150_ANALOG_CH0 = 0,
-       TVP5150_SVIDEO = 1,
-       TVP5150_ANALOG_CH1 = 2,
-       TVP5150_BLACK_SCREEN = 8
-};
 
-static inline void tvp5150_selmux(struct i2c_client *c,
-                                 enum tvp5150_input input)
+static inline void tvp5150_selmux(struct i2c_client *c)
 {
        int opmode=0;
-
        struct tvp5150 *decoder = i2c_get_clientdata(c);
+       int input = 0;
 
-       if (!decoder->enable)
-               input |= TVP5150_BLACK_SCREEN;
+       if ((decoder->route.output & TVP5150_BLACK_SCREEN) || !decoder->enable)
+               input = 8;
 
        switch (input) {
-       case TVP5150_ANALOG_CH0:
-       case TVP5150_ANALOG_CH1:
+       case TVP5150_COMPOSITE1:
+               input |= 2;
+               /* fall through */
+       case TVP5150_COMPOSITE0:
                opmode=0x30;            /* TV Mode */
                break;
+       case TVP5150_SVIDEO:
        default:
+               input |= 1;
                opmode=0;               /* Auto Mode */
                break;
        }
@@ -790,7 +788,7 @@ static inline void tvp5150_reset(struct i2c_client *c)
        tvp5150_vdp_init(c, vbi_ram_default);
 
        /* Selects decoder input */
-       tvp5150_selmux(c, decoder->input);
+       tvp5150_selmux(c);
 
        /* Initializes TVP5150 to stream enabled values */
        tvp5150_write_inittab(c, tvp5150_init_enable);
@@ -860,6 +858,21 @@ static int tvp5150_command(struct i2c_client *c,
        case VIDIOC_INT_RESET:
                tvp5150_reset(c);
                break;
+       case VIDIOC_INT_G_VIDEO_ROUTING:
+       {
+               struct v4l2_routing *route = arg;
+
+               *route = decoder->route;
+               break;
+       }
+       case VIDIOC_INT_S_VIDEO_ROUTING:
+       {
+               struct v4l2_routing *route = arg;
+
+               decoder->route = *route;
+               tvp5150_selmux(c);
+               break;
+       }
        case VIDIOC_S_STD:
                if (decoder->norm == *(v4l2_std_id *)arg)
                        break;
@@ -1063,7 +1076,7 @@ static int tvp5150_detect_client(struct i2c_adapter *adapter,
        rv = i2c_attach_client(c);
 
        core->norm = V4L2_STD_ALL;      /* Default is autodetect */
-       core->input = 2;
+       core->route.input = TVP5150_COMPOSITE1;
        core->enable = 1;
        core->bright = 32768;
        core->contrast = 32768;
diff --git a/include/media/tvp5150.h b/include/media/tvp5150.h
new file mode 100644 (file)
index 0000000..72bd2a2
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+    tvp5150.h - definition for tvp5150 inputs
+
+    Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl)
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _TVP5150_H_
+#define _TVP5150_H_
+
+/* TVP5150 HW inputs */
+#define TVP5150_COMPOSITE0 0
+#define TVP5150_COMPOSITE1 1
+#define TVP5150_SVIDEO     2
+
+/* TVP5150 HW outputs */
+#define TVP5150_NORMAL       0
+#define TVP5150_BLACK_SCREEN 1
+
+#endif
+