|
|
@@ -27,6 +27,7 @@
|
|
|
#include <media/v4l2-event.h>
|
|
|
#include <media/v4l2-device.h>
|
|
|
#include <media/videobuf2-v4l2.h>
|
|
|
+#include <media/v4l2-mc.h>
|
|
|
|
|
|
#include <trace/events/v4l2.h>
|
|
|
|
|
|
@@ -1041,6 +1042,12 @@ static int v4l_querycap(const struct v4l2_ioctl_ops *ops,
|
|
|
static int v4l_s_input(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
+ struct video_device *vfd = video_devdata(file);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = v4l_enable_media_source(vfd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
return ops->vidioc_s_input(file, fh, *(unsigned int *)arg);
|
|
|
}
|
|
|
|
|
|
@@ -1452,6 +1459,9 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
|
|
|
bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
|
|
|
int ret;
|
|
|
|
|
|
+ ret = v4l_enable_media_source(vfd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
v4l_sanitize_format(p);
|
|
|
|
|
|
switch (p->type) {
|
|
|
@@ -1641,7 +1651,11 @@ static int v4l_s_tuner(const struct v4l2_ioctl_ops *ops,
|
|
|
{
|
|
|
struct video_device *vfd = video_devdata(file);
|
|
|
struct v4l2_tuner *p = arg;
|
|
|
+ int ret;
|
|
|
|
|
|
+ ret = v4l_enable_media_source(vfd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
p->type = (vfd->vfl_type == VFL_TYPE_RADIO) ?
|
|
|
V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
|
|
|
return ops->vidioc_s_tuner(file, fh, p);
|
|
|
@@ -1695,7 +1709,11 @@ static int v4l_s_frequency(const struct v4l2_ioctl_ops *ops,
|
|
|
struct video_device *vfd = video_devdata(file);
|
|
|
const struct v4l2_frequency *p = arg;
|
|
|
enum v4l2_tuner_type type;
|
|
|
+ int ret;
|
|
|
|
|
|
+ ret = v4l_enable_media_source(vfd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
if (vfd->vfl_type == VFL_TYPE_SDR) {
|
|
|
if (p->type != V4L2_TUNER_SDR && p->type != V4L2_TUNER_RF)
|
|
|
return -EINVAL;
|
|
|
@@ -1750,7 +1768,11 @@ static int v4l_s_std(const struct v4l2_ioctl_ops *ops,
|
|
|
{
|
|
|
struct video_device *vfd = video_devdata(file);
|
|
|
v4l2_std_id id = *(v4l2_std_id *)arg, norm;
|
|
|
+ int ret;
|
|
|
|
|
|
+ ret = v4l_enable_media_source(vfd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
norm = id & vfd->tvnorms;
|
|
|
if (vfd->tvnorms && !norm) /* Check if std is supported */
|
|
|
return -EINVAL;
|
|
|
@@ -1764,7 +1786,11 @@ static int v4l_querystd(const struct v4l2_ioctl_ops *ops,
|
|
|
{
|
|
|
struct video_device *vfd = video_devdata(file);
|
|
|
v4l2_std_id *p = arg;
|
|
|
+ int ret;
|
|
|
|
|
|
+ ret = v4l_enable_media_source(vfd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
/*
|
|
|
* If no signal is detected, then the driver should return
|
|
|
* V4L2_STD_UNKNOWN. Otherwise it should return tvnorms with
|
|
|
@@ -1783,7 +1809,11 @@ static int v4l_s_hw_freq_seek(const struct v4l2_ioctl_ops *ops,
|
|
|
struct video_device *vfd = video_devdata(file);
|
|
|
struct v4l2_hw_freq_seek *p = arg;
|
|
|
enum v4l2_tuner_type type;
|
|
|
+ int ret;
|
|
|
|
|
|
+ ret = v4l_enable_media_source(vfd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
/* s_hw_freq_seek is not supported for SDR for now */
|
|
|
if (vfd->vfl_type == VFL_TYPE_SDR)
|
|
|
return -EINVAL;
|