mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
[media] saa7134: convert to the control framework
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
9db0fb182e
commit
718bde1aa9
@@ -1009,13 +1009,13 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
|
||||
|
||||
/* load i2c helpers */
|
||||
if (card_is_empress(dev)) {
|
||||
struct v4l2_subdev *sd =
|
||||
dev->empress_sd =
|
||||
v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
|
||||
"saa6752hs",
|
||||
saa7134_boards[dev->board].empress_addr, NULL);
|
||||
|
||||
if (sd)
|
||||
sd->grp_id = GRP_EMPRESS;
|
||||
if (dev->empress_sd)
|
||||
dev->empress_sd->grp_id = GRP_EMPRESS;
|
||||
}
|
||||
|
||||
if (saa7134_boards[dev->board].rds_addr) {
|
||||
@@ -1047,6 +1047,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
|
||||
printk(KERN_INFO "%s: Overlay support disabled.\n", dev->name);
|
||||
|
||||
dev->video_dev = vdev_init(dev,&saa7134_video_template,"video");
|
||||
dev->video_dev->ctrl_handler = &dev->ctrl_handler;
|
||||
err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
|
||||
video_nr[dev->nr]);
|
||||
if (err < 0) {
|
||||
@@ -1058,6 +1059,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
|
||||
dev->name, video_device_node_name(dev->video_dev));
|
||||
|
||||
dev->vbi_dev = vdev_init(dev, &saa7134_video_template, "vbi");
|
||||
dev->vbi_dev->ctrl_handler = &dev->ctrl_handler;
|
||||
|
||||
err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
|
||||
vbi_nr[dev->nr]);
|
||||
@@ -1068,6 +1070,7 @@ static int saa7134_initdev(struct pci_dev *pci_dev,
|
||||
|
||||
if (card_has_radio(dev)) {
|
||||
dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
|
||||
dev->radio_dev->ctrl_handler = &dev->radio_ctrl_handler;
|
||||
err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
|
||||
radio_nr[dev->nr]);
|
||||
if (err < 0)
|
||||
|
||||
@@ -316,113 +316,6 @@ static int empress_streamoff(struct file *file, void *priv,
|
||||
return videobuf_streamoff(&dev->empress_tsq);
|
||||
}
|
||||
|
||||
static int empress_s_ext_ctrls(struct file *file, void *priv,
|
||||
struct v4l2_ext_controls *ctrls)
|
||||
{
|
||||
struct saa7134_dev *dev = file->private_data;
|
||||
int err;
|
||||
|
||||
/* count == 0 is abused in saa6752hs.c, so that special
|
||||
case is handled here explicitly. */
|
||||
if (ctrls->count == 0)
|
||||
return 0;
|
||||
|
||||
if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
|
||||
return -EINVAL;
|
||||
|
||||
err = saa_call_empress(dev, core, s_ext_ctrls, ctrls);
|
||||
ts_init_encoder(dev);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int empress_g_ext_ctrls(struct file *file, void *priv,
|
||||
struct v4l2_ext_controls *ctrls)
|
||||
{
|
||||
struct saa7134_dev *dev = file->private_data;
|
||||
|
||||
if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
|
||||
return -EINVAL;
|
||||
return saa_call_empress(dev, core, g_ext_ctrls, ctrls);
|
||||
}
|
||||
|
||||
static int empress_g_ctrl(struct file *file, void *priv,
|
||||
struct v4l2_control *c)
|
||||
{
|
||||
struct saa7134_dev *dev = file->private_data;
|
||||
|
||||
return saa7134_g_ctrl_internal(dev, NULL, c);
|
||||
}
|
||||
|
||||
static int empress_s_ctrl(struct file *file, void *priv,
|
||||
struct v4l2_control *c)
|
||||
{
|
||||
struct saa7134_dev *dev = file->private_data;
|
||||
|
||||
return saa7134_s_ctrl_internal(dev, NULL, c);
|
||||
}
|
||||
|
||||
static int empress_queryctrl(struct file *file, void *priv,
|
||||
struct v4l2_queryctrl *c)
|
||||
{
|
||||
/* Must be sorted from low to high control ID! */
|
||||
static const u32 user_ctrls[] = {
|
||||
V4L2_CID_USER_CLASS,
|
||||
V4L2_CID_BRIGHTNESS,
|
||||
V4L2_CID_CONTRAST,
|
||||
V4L2_CID_SATURATION,
|
||||
V4L2_CID_HUE,
|
||||
V4L2_CID_AUDIO_VOLUME,
|
||||
V4L2_CID_AUDIO_MUTE,
|
||||
V4L2_CID_HFLIP,
|
||||
0
|
||||
};
|
||||
|
||||
/* Must be sorted from low to high control ID! */
|
||||
static const u32 mpeg_ctrls[] = {
|
||||
V4L2_CID_MPEG_CLASS,
|
||||
V4L2_CID_MPEG_STREAM_TYPE,
|
||||
V4L2_CID_MPEG_STREAM_PID_PMT,
|
||||
V4L2_CID_MPEG_STREAM_PID_AUDIO,
|
||||
V4L2_CID_MPEG_STREAM_PID_VIDEO,
|
||||
V4L2_CID_MPEG_STREAM_PID_PCR,
|
||||
V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
|
||||
V4L2_CID_MPEG_AUDIO_ENCODING,
|
||||
V4L2_CID_MPEG_AUDIO_L2_BITRATE,
|
||||
V4L2_CID_MPEG_VIDEO_ENCODING,
|
||||
V4L2_CID_MPEG_VIDEO_ASPECT,
|
||||
V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
|
||||
V4L2_CID_MPEG_VIDEO_BITRATE,
|
||||
V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
|
||||
0
|
||||
};
|
||||
static const u32 *ctrl_classes[] = {
|
||||
user_ctrls,
|
||||
mpeg_ctrls,
|
||||
NULL
|
||||
};
|
||||
struct saa7134_dev *dev = file->private_data;
|
||||
|
||||
c->id = v4l2_ctrl_next(ctrl_classes, c->id);
|
||||
if (c->id == 0)
|
||||
return -EINVAL;
|
||||
if (c->id == V4L2_CID_USER_CLASS || c->id == V4L2_CID_MPEG_CLASS)
|
||||
return v4l2_ctrl_query_fill(c, 0, 0, 0, 0);
|
||||
if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
|
||||
return saa7134_queryctrl(file, priv, c);
|
||||
return saa_call_empress(dev, core, queryctrl, c);
|
||||
}
|
||||
|
||||
static int empress_querymenu(struct file *file, void *priv,
|
||||
struct v4l2_querymenu *c)
|
||||
{
|
||||
struct saa7134_dev *dev = file->private_data;
|
||||
|
||||
if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
|
||||
return -EINVAL;
|
||||
return saa_call_empress(dev, core, querymenu, c);
|
||||
}
|
||||
|
||||
static int empress_s_std(struct file *file, void *priv, v4l2_std_id id)
|
||||
{
|
||||
struct saa7134_dev *dev = file->private_data;
|
||||
@@ -461,15 +354,9 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = {
|
||||
.vidioc_dqbuf = empress_dqbuf,
|
||||
.vidioc_streamon = empress_streamon,
|
||||
.vidioc_streamoff = empress_streamoff,
|
||||
.vidioc_s_ext_ctrls = empress_s_ext_ctrls,
|
||||
.vidioc_g_ext_ctrls = empress_g_ext_ctrls,
|
||||
.vidioc_enum_input = empress_enum_input,
|
||||
.vidioc_g_input = empress_g_input,
|
||||
.vidioc_s_input = empress_s_input,
|
||||
.vidioc_queryctrl = empress_queryctrl,
|
||||
.vidioc_querymenu = empress_querymenu,
|
||||
.vidioc_g_ctrl = empress_g_ctrl,
|
||||
.vidioc_s_ctrl = empress_s_ctrl,
|
||||
.vidioc_s_std = empress_s_std,
|
||||
.vidioc_g_std = empress_g_std,
|
||||
};
|
||||
@@ -501,9 +388,26 @@ static void empress_signal_change(struct saa7134_dev *dev)
|
||||
schedule_work(&dev->empress_workqueue);
|
||||
}
|
||||
|
||||
static bool empress_ctrl_filter(const struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
case V4L2_CID_HUE:
|
||||
case V4L2_CID_CONTRAST:
|
||||
case V4L2_CID_SATURATION:
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
case V4L2_CID_PRIVATE_INVERT:
|
||||
case V4L2_CID_PRIVATE_AUTOMUTE:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int empress_init(struct saa7134_dev *dev)
|
||||
{
|
||||
struct v4l2_ctrl_handler *hdl = &dev->empress_ctrl_handler;
|
||||
int err;
|
||||
|
||||
dprintk("%s: %s\n",dev->name,__func__);
|
||||
@@ -516,6 +420,15 @@ static int empress_init(struct saa7134_dev *dev)
|
||||
snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name),
|
||||
"%s empress (%s)", dev->name,
|
||||
saa7134_boards[dev->board].name);
|
||||
v4l2_ctrl_handler_init(hdl, 21);
|
||||
v4l2_ctrl_add_handler(hdl, &dev->ctrl_handler, empress_ctrl_filter);
|
||||
if (dev->empress_sd)
|
||||
v4l2_ctrl_add_handler(hdl, dev->empress_sd->ctrl_handler, NULL);
|
||||
if (hdl->error) {
|
||||
video_device_release(dev->empress_dev);
|
||||
return hdl->error;
|
||||
}
|
||||
dev->empress_dev->ctrl_handler = hdl;
|
||||
|
||||
INIT_WORK(&dev->empress_workqueue, empress_signal_update);
|
||||
|
||||
@@ -551,6 +464,7 @@ static int empress_fini(struct saa7134_dev *dev)
|
||||
return 0;
|
||||
flush_work(&dev->empress_workqueue);
|
||||
video_unregister_device(dev->empress_dev);
|
||||
v4l2_ctrl_handler_free(&dev->empress_ctrl_handler);
|
||||
dev->empress_dev = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,7 @@
|
||||
#include <media/v4l2-ioctl.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-fh.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/tuner.h>
|
||||
#include <media/rc-core.h>
|
||||
#include <media/ir-kbd-i2c.h>
|
||||
@@ -410,6 +411,11 @@ struct saa7134_board {
|
||||
#define card(dev) (saa7134_boards[dev->board])
|
||||
#define card_in(dev,n) (saa7134_boards[dev->board].inputs[n])
|
||||
|
||||
#define V4L2_CID_PRIVATE_INVERT (V4L2_CID_USER_SAA7134_BASE + 0)
|
||||
#define V4L2_CID_PRIVATE_Y_ODD (V4L2_CID_USER_SAA7134_BASE + 1)
|
||||
#define V4L2_CID_PRIVATE_Y_EVEN (V4L2_CID_USER_SAA7134_BASE + 2)
|
||||
#define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_USER_SAA7134_BASE + 3)
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
/* device / file handle status */
|
||||
|
||||
@@ -595,6 +601,7 @@ struct saa7134_dev {
|
||||
/* various v4l controls */
|
||||
struct saa7134_tvnorm *tvnorm; /* video */
|
||||
struct saa7134_tvaudio *tvaudio;
|
||||
struct v4l2_ctrl_handler ctrl_handler;
|
||||
unsigned int ctl_input;
|
||||
int ctl_bright;
|
||||
int ctl_contrast;
|
||||
@@ -622,6 +629,7 @@ struct saa7134_dev {
|
||||
int last_carrier;
|
||||
int nosignal;
|
||||
unsigned int insuspend;
|
||||
struct v4l2_ctrl_handler radio_ctrl_handler;
|
||||
|
||||
/* I2C keyboard data */
|
||||
struct IR_i2c_init_data init_data;
|
||||
@@ -634,10 +642,12 @@ struct saa7134_dev {
|
||||
|
||||
/* SAA7134_MPEG_EMPRESS only */
|
||||
struct video_device *empress_dev;
|
||||
struct v4l2_subdev *empress_sd;
|
||||
struct videobuf_queue empress_tsq;
|
||||
atomic_t empress_users;
|
||||
struct work_struct empress_workqueue;
|
||||
int empress_started;
|
||||
struct v4l2_ctrl_handler empress_ctrl_handler;
|
||||
|
||||
#if IS_ENABLED(CONFIG_VIDEO_SAA7134_DVB)
|
||||
/* SAA7134_MPEG_DVB only */
|
||||
@@ -757,9 +767,6 @@ extern unsigned int video_debug;
|
||||
extern struct video_device saa7134_video_template;
|
||||
extern struct video_device saa7134_radio_template;
|
||||
|
||||
int saa7134_s_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
|
||||
int saa7134_g_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
|
||||
int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c);
|
||||
int saa7134_s_std_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, v4l2_std_id id);
|
||||
|
||||
int saa7134_videoport_init(struct saa7134_dev *dev);
|
||||
|
||||
@@ -164,6 +164,10 @@ enum v4l2_colorfx {
|
||||
* this driver */
|
||||
#define V4L2_CID_USER_TI_VPE_BASE (V4L2_CID_USER_BASE + 0x1050)
|
||||
|
||||
/* The base for the saa7134 driver controls.
|
||||
* We reserve 16 controls for this driver. */
|
||||
#define V4L2_CID_USER_SAA7134_BASE (V4L2_CID_USER_BASE + 0x1060)
|
||||
|
||||
/* MPEG-class control IDs */
|
||||
/* The MPEG controls are applicable to all codec controls
|
||||
* and the 'MPEG' part of the define is historical */
|
||||
|
||||
Reference in New Issue
Block a user