media: Add video bus switch
Subsystems (2)
RFC 9/13 media: Add video bus switch
N900 contains front and back camera, with a switch between the two. This adds support for the switch component, and it is now possible to select between front and back cameras during runtime.
FIXME: need to get acks and merge device tree support.
Signed-off-by Sebastian Reichel <[email protected]>
Signed-off-by Ivaylo Dimitrov <[email protected]>
Signed-off-by Pavel Machek <[email protected]>
--- .config | 1 + drivers/media/platform/Kconfig | 10 + drivers/media/platform/Makefile | 2 + drivers/media/platform/omap3isp/ispccp2.c | 23 +- drivers/media/platform/video-bus-switch.c | 389 ++++++++++++++++++++++++++++++ include/media/v4l2-subdev.h | 9 +- include/uapi/linux/media.h | 2 + 7 files changed, 432 insertions(+), 4 deletions(-) create mode 100644 drivers/media/platform/video-bus-switch.c
.config +1 -0
@@ -2128,6 +2128,7 @@ CONFIG_V4L_PLATFORM_DRIVERS=y # CONFIG_VIDEO_OMAP2_VOUT is not set CONFIG_VIDEO_OMAP3=y # CONFIG_VIDEO_OMAP3_DEBUG is not set +CONFIG_VIDEO_BUS_SWITCH=y # CONFIG_SOC_CAMERA is not set # CONFIG_VIDEO_XILINX is not set # CONFIG_V4L_MEM2MEM_DRIVERS is not set
drivers/media/platform/Kconfig +10 -0
@@ -91,6 +91,16 @@ config VIDEO_OMAP3_DEBUG ---help--- Enable debug messages on OMAP 3 camera controller driver. +config VIDEO_BUS_SWITCH + tristate "Video Bus switch" + depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API + depends on MEDIA_CONTROLLER + depends on OF + ---help--- + Driver for a GPIO controlled video bus switch, which is used to + connect two camera sensors to the same port a the image signal + processor. + config VIDEO_PXA27x tristate "PXA27x Quick Capture Interface driver" depends on VIDEO_DEV && VIDEO_V4L2 && HAS_DMA
drivers/media/platform/Makefile +2 -0
@@ -11,6 +11,8 @@ obj-$(CONFIG_VIDEO_MMP_CAMERA) += marvell-ccic/ obj-$(CONFIG_VIDEO_OMAP3) += omap3isp/ obj-$(CONFIG_VIDEO_PXA27x) += pxa_camera.o +obj-$(CONFIG_VIDEO_BUS_SWITCH) += video-bus-switch.o + obj-$(CONFIG_VIDEO_VIU) += fsl-viu.o obj-$(CONFIG_VIDEO_VIVID) += vivid/
drivers/media/platform/omap3isp/ispccp2.c +21 -2
@@ -171,7 +171,7 @@ static int ccp2_if_enable(struct isp_ccp2_device *ccp2, u8 enable) pad =media_entity_remote_pad (&ccp2->pads[CCP2_PAD_SINK ]); sensor =media_entity_to_v4l2_subdev (pad->entity); -/* Struct isp_bus_cfg has union inside */ +/* Struct isp_bus_cfg has union inside */ buscfg = &((struct isp_bus_cfg *)sensor->host_priv)->bus.ccp2;
@@ -383,7 +383,7 @@ void __isp_of_parse_node_csi1(struct device *dev,*/ static int ccp2_if_configure (struct isp_ccp2_device *ccp2) { -const struct isp_bus_cfg *buscfg; +struct isp_bus_cfg *buscfg;struct v4l2_mbus_framefmt *format;struct media_pad *pad;struct v4l2_subdev *sensor;
@@ -396,6 +396,25 @@ static int ccp2_if_configure(struct isp_ccp2_device *ccp2) sensor =media_entity_to_v4l2_subdev (pad->entity); buscfg = sensor->host_priv; + { +struct v4l2_subdev *subdev2; +struct v4l2_of_endpoint vep; + + subdev2 =media_entity_to_v4l2_subdev (pad->entity); + +printk ("if_configure... subdev %p\n" , subdev2); +/* fixme: vep.base.port is wrong? */ + ret =v4l2_subdev_call (subdev2, video, g_endpoint_config, &vep); +printk ("if_configure ret %d\n" , ret); +if (ret ==0 ) { +struct isp_ccp2_cfg prev_cfg = buscfg->bus.ccp2; +printk ("Success: have configuration\n" ); +printk ("Compare: %d\n" ,memcmp (&prev_cfg, &buscfg->bus.ccp2,sizeof (prev_cfg))); +__isp_of_parse_node_csi1 (NULL , &buscfg->bus.ccp2, &vep); +printk ("Configured ok?\n" ); + } + } + ret =ccp2_phyif_config (ccp2, &buscfg->bus.ccp2);if (ret <0 )return ret;
drivers/media/platform/video-bus-switch.c new file +389 -0
389 lines not on this page · raw message
include/media/v4l2-subdev.h +7 -2
@@ -25,6 +25,7 @@#include <media/v4l2-dev.h> #include <media/v4l2-fh.h> #include <media/v4l2-mediabus.h> +#include <media/v4l2-of.h> /* generic v4l2_device notify callback notification values */ #define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32)
@@ -351,7 +352,7 @@ struct v4l2_mbus_frame_desc {* OUTPUT device. This is ignored by video capture devices. * * @g_input_status: get input status. Same as the status field in the -* &struct &v4l2_input +* &struct &v4l2_input. * * @s_stream: used to notify the driver that a video stream will start or has * stopped.
@@ -374,7 +375,7 @@ struct v4l2_mbus_frame_desc {* * @query_dv_timings: callback for %VIDIOC_QUERY_DV_TIMINGS ioctl handler code. * -* @g_mbus_config: get supported mediabus configurations +* @g_mbus_config: get supported mediabus configurations. * * @s_mbus_config: set a certain mediabus configuration. This operation is added * for compatibility with soc-camera drivers and should not be used by new
@@ -383,6 +384,8 @@ struct v4l2_mbus_frame_desc {* @s_rx_buffer: set a host allocated memory buffer for the subdev. The subdev * can adjust @size to a lower value and must not write more data to the * buffer starting at @data than the original value of @size. +* +* @g_endpoint_config: get link configuration required by this device. */ struct v4l2_subdev_video_ops {int (*s_routing)(struct v4l2_subdev *sd,u32 input,u32 output,u32 config);
@@ -415,6 +418,8 @@ struct v4l2_subdev_video_ops { const struct v4l2_mbus_config *cfg);int (*s_rx_buffer)(struct v4l2_subdev *sd,void *buf,unsigned int *size); +int (*g_endpoint_config)(struct v4l2_subdev *sd, +struct v4l2_of_endpoint *cfg); };/**
include/uapi/linux/media.h +2 -0
@@ -103,6 +103,7 @@ struct media_device_info {#define MEDIA_ENT_F_PROC_VIDEO_LUT (MEDIA_ENT_F_BASE + 0x4004)#define MEDIA_ENT_F_PROC_VIDEO_SCALER (MEDIA_ENT_F_BASE + 0x4005)#define MEDIA_ENT_F_PROC_VIDEO_STATISTICS (MEDIA_ENT_F_BASE + 0x4006) +#define MEDIA_ENT_F_PROC_VIDEO_SWITCH (MEDIA_ENT_F_BASE + 0x4007)/* * Connectors
@@ -148,6 +149,7 @@ struct media_device_info {*/ #define MEDIA_ENT_F_TUNER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 5) +#define MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN MEDIA_ENT_F_OLD_SUBDEV_BASE#if !defined(__KERNEL__) || defined(__NEED_MEDIA_LEGACY_API)
Signature · 6 lines
2.1.4 -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html