Commit e09da11d authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mauro Carvalho Chehab

[media] soc-camera: add V4L2-async support

Add support for asynchronous subdevice probing, using the v4l2-async API.
The legacy synchronous mode is still supported too, which allows to
gradually update drivers and platforms. The selected approach adds a
notifier for each struct soc_camera_device instance, i.e. for each video
device node, even when there are multiple such instances registered with a
single soc-camera host simultaneously.
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Acked-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9aea470b
...@@ -19,11 +19,13 @@ ...@@ -19,11 +19,13 @@
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/videobuf-core.h> #include <media/videobuf-core.h>
#include <media/videobuf2-core.h> #include <media/videobuf2-core.h>
#include <media/v4l2-async.h>
#include <media/v4l2-ctrls.h> #include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
struct file; struct file;
struct soc_camera_desc; struct soc_camera_desc;
struct soc_camera_async_client;
struct soc_camera_device { struct soc_camera_device {
struct list_head list; /* list of all registered devices */ struct list_head list; /* list of all registered devices */
...@@ -50,6 +52,9 @@ struct soc_camera_device { ...@@ -50,6 +52,9 @@ struct soc_camera_device {
int use_count; int use_count;
struct file *streamer; /* stream owner */ struct file *streamer; /* stream owner */
struct v4l2_clk *clk; struct v4l2_clk *clk;
/* Asynchronous subdevice management */
struct soc_camera_async_client *sasc;
/* video buffer queue */
union { union {
struct videobuf_queue vb_vidq; struct videobuf_queue vb_vidq;
struct vb2_queue vb2_vidq; struct vb2_queue vb2_vidq;
...@@ -59,16 +64,30 @@ struct soc_camera_device { ...@@ -59,16 +64,30 @@ struct soc_camera_device {
/* Host supports programmable stride */ /* Host supports programmable stride */
#define SOCAM_HOST_CAP_STRIDE (1 << 0) #define SOCAM_HOST_CAP_STRIDE (1 << 0)
enum soc_camera_subdev_role {
SOCAM_SUBDEV_DATA_SOURCE = 1,
SOCAM_SUBDEV_DATA_SINK,
SOCAM_SUBDEV_DATA_PROCESSOR,
};
struct soc_camera_async_subdev {
struct v4l2_async_subdev asd;
enum soc_camera_subdev_role role;
};
struct soc_camera_host { struct soc_camera_host {
struct v4l2_device v4l2_dev; struct v4l2_device v4l2_dev;
struct list_head list; struct list_head list;
struct mutex host_lock; /* Protect pipeline modifications */ struct mutex host_lock; /* Main synchronisation lock */
struct mutex clk_lock; /* Protect pipeline modifications */
unsigned char nr; /* Host number */ unsigned char nr; /* Host number */
u32 capabilities; u32 capabilities;
struct soc_camera_device *icd; /* Currently attached client */ struct soc_camera_device *icd; /* Currently attached client */
void *priv; void *priv;
const char *drv_name; const char *drv_name;
struct soc_camera_host_ops *ops; struct soc_camera_host_ops *ops;
struct v4l2_async_subdev **asd; /* Flat array, arranged in groups */
int *asd_sizes; /* 0-terminated array of asd group sizes */
}; };
struct soc_camera_host_ops { struct soc_camera_host_ops {
...@@ -161,6 +180,7 @@ struct soc_camera_host_desc { ...@@ -161,6 +180,7 @@ struct soc_camera_host_desc {
}; };
/* /*
* Platform data for "soc-camera-pdrv"
* This MUST be kept binary-identical to struct soc_camera_link below, until * This MUST be kept binary-identical to struct soc_camera_link below, until
* it is completely replaced by this one, after which we can split it into its * it is completely replaced by this one, after which we can split it into its
* two components. * two components.
...@@ -326,6 +346,7 @@ static inline void soc_camera_limit_side(int *start, int *length, ...@@ -326,6 +346,7 @@ static inline void soc_camera_limit_side(int *start, int *length,
unsigned long soc_camera_apply_board_flags(struct soc_camera_subdev_desc *ssdd, unsigned long soc_camera_apply_board_flags(struct soc_camera_subdev_desc *ssdd,
const struct v4l2_mbus_config *cfg); const struct v4l2_mbus_config *cfg);
int soc_camera_power_init(struct device *dev, struct soc_camera_subdev_desc *ssdd);
int soc_camera_power_on(struct device *dev, struct soc_camera_subdev_desc *ssdd, int soc_camera_power_on(struct device *dev, struct soc_camera_subdev_desc *ssdd,
struct v4l2_clk *clk); struct v4l2_clk *clk);
int soc_camera_power_off(struct device *dev, struct soc_camera_subdev_desc *ssdd, int soc_camera_power_off(struct device *dev, struct soc_camera_subdev_desc *ssdd,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment