diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2011-07-26 12:29:27 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-11-03 16:27:34 -0400 |
commit | 0d3263f9ad74d60cdcc2beaa365913be85769696 (patch) | |
tree | fbdeca8a16f4f3b432a39b595c748fc79c8e0211 /drivers/media/video/tw9910.c | |
parent | 2ad90b71231a68e2041680e3ae3b7661ebe825ec (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/media/video/tw9910.c')
-rw-r--r-- | drivers/media/video/tw9910.c | 49 |
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 | ||
867 | static 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 | |||
884 | static 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 | |||
865 | static struct v4l2_subdev_video_ops tw9910_subdev_video_ops = { | 908 | static 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 | ||
875 | static struct v4l2_subdev_ops tw9910_subdev_ops = { | 920 | static struct v4l2_subdev_ops tw9910_subdev_ops = { |