aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2011-07-26 12:29:27 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-11-03 16:27:34 -0400
commit0d3263f9ad74d60cdcc2beaa365913be85769696 (patch)
treefbdeca8a16f4f3b432a39b595c748fc79c8e0211 /drivers
parent2ad90b71231a68e2041680e3ae3b7661ebe825ec (diff)
[media] V4L: tw9910: support the new mbus-config subdev ops
Extend the driver to also support [gs]_mbus_config() subdevice video operations. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/tw9910.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/drivers/media/video/tw9910.c b/drivers/media/video/tw9910.c
index 686512eefed8..4f9fbf2ba35d 100644
--- a/drivers/media/video/tw9910.c
+++ b/drivers/media/video/tw9910.c
@@ -23,10 +23,12 @@
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/videodev2.h> 25#include <linux/videodev2.h>
26#include <media/v4l2-chip-ident.h> 26
27#include <media/v4l2-subdev.h>
28#include <media/soc_camera.h> 27#include <media/soc_camera.h>
28#include <media/soc_mediabus.h>
29#include <media/tw9910.h> 29#include <media/tw9910.h>
30#include <media/v4l2-chip-ident.h>
31#include <media/v4l2-subdev.h>
30 32
31#define GET_ID(val) ((val & 0xF8) >> 3) 33#define GET_ID(val) ((val & 0xF8) >> 3)
32#define GET_REV(val) (val & 0x07) 34#define GET_REV(val) (val & 0x07)
@@ -862,6 +864,47 @@ static int tw9910_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
862 return 0; 864 return 0;
863} 865}
864 866
867static int tw9910_g_mbus_config(struct v4l2_subdev *sd,
868 struct v4l2_mbus_config *cfg)
869{
870 struct i2c_client *client = v4l2_get_subdevdata(sd);
871 struct soc_camera_device *icd = client->dev.platform_data;
872 struct soc_camera_link *icl = to_soc_camera_link(icd);
873
874 cfg->flags = V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_MASTER |
875 V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_LOW |
876 V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_LOW |
877 V4L2_MBUS_DATA_ACTIVE_HIGH;
878 cfg->type = V4L2_MBUS_PARALLEL;
879 cfg->flags = soc_camera_apply_board_flags(icl, cfg);
880
881 return 0;
882}
883
884static int tw9910_s_mbus_config(struct v4l2_subdev *sd,
885 const struct v4l2_mbus_config *cfg)
886{
887 struct i2c_client *client = v4l2_get_subdevdata(sd);
888 struct soc_camera_device *icd = client->dev.platform_data;
889 struct soc_camera_link *icl = to_soc_camera_link(icd);
890 u8 val = VSSL_VVALID | HSSL_DVALID;
891 unsigned long flags = soc_camera_apply_board_flags(icl, cfg);
892
893 /*
894 * set OUTCTR1
895 *
896 * We use VVALID and DVALID signals to control VSYNC and HSYNC
897 * outputs, in this mode their polarity is inverted.
898 */
899 if (flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
900 val |= HSP_HI;
901
902 if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
903 val |= VSP_HI;
904
905 return i2c_smbus_write_byte_data(client, OUTCTR1, val);
906}
907
865static struct v4l2_subdev_video_ops tw9910_subdev_video_ops = { 908static struct v4l2_subdev_video_ops tw9910_subdev_video_ops = {
866 .s_stream = tw9910_s_stream, 909 .s_stream = tw9910_s_stream,
867 .g_mbus_fmt = tw9910_g_fmt, 910 .g_mbus_fmt = tw9910_g_fmt,
@@ -870,6 +913,8 @@ static struct v4l2_subdev_video_ops tw9910_subdev_video_ops = {
870 .cropcap = tw9910_cropcap, 913 .cropcap = tw9910_cropcap,
871 .g_crop = tw9910_g_crop, 914 .g_crop = tw9910_g_crop,
872 .enum_mbus_fmt = tw9910_enum_fmt, 915 .enum_mbus_fmt = tw9910_enum_fmt,
916 .g_mbus_config = tw9910_g_mbus_config,
917 .s_mbus_config = tw9910_s_mbus_config,
873}; 918};
874 919
875static struct v4l2_subdev_ops tw9910_subdev_ops = { 920static struct v4l2_subdev_ops tw9910_subdev_ops = {