summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.c67
1 files changed, 59 insertions, 8 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
index e68974b2fee9..86af06cf578c 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -1156,9 +1156,16 @@ int tv_property_cache_submit(struct dvb_frontend *fe)
return r;
}
-int tv_property_process(struct dvb_frontend *fe, tv_property_t *tvp)
+static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,
+ unsigned int cmd, void *parg);
+static int dvb_frontend_ioctl_properties(struct inode *inode, struct file *file,
+ unsigned int cmd, void *parg);
+
+int tv_property_process(struct dvb_frontend *fe, tv_property_t *tvp,
+ struct inode *inode, struct file *file)
{
int r = 0;
+ struct dvb_frontend_private *fepriv = fe->frontend_priv;
printk("%s()\n", __FUNCTION__);
tv_property_dump(tvp);
@@ -1181,7 +1188,9 @@ int tv_property_process(struct dvb_frontend *fe, tv_property_t *tvp)
*/
fe->tv_property_cache.state = TV_SEQ_COMPLETE;
printk("%s() Finalised property cache\n", __FUNCTION__);
- r = tv_property_cache_submit(fe);
+ r |= tv_property_cache_submit(fe);
+ r |= dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
+ &fepriv->parameters);
break;
case TV_SET_FREQUENCY:
fe->tv_property_cache.frequency = tvp->u.data;
@@ -1278,10 +1287,25 @@ int tv_property_process(struct dvb_frontend *fe, tv_property_t *tvp)
case TV_GET_ISDB_LAYERC_SEGMENT_WIDTH:
tvp->u.data = fe->tv_property_cache.isdb_layerc_segment_width;
break;
-
+ case TV_SET_VOLTAGE:
+ fe->tv_property_cache.voltage = tvp->u.data;
+ r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_VOLTAGE,
+ &fe->tv_property_cache.voltage);
+ break;
+ case TV_GET_VOLTAGE:
+ tvp->u.data = fe->tv_property_cache.voltage;
+ break;
+ case TV_SET_TONE:
+ fe->tv_property_cache.sectone = tvp->u.data;
+ r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_TONE,
+ (void *)fe->tv_property_cache.sectone);
+ break;
+ case TV_GET_TONE:
+ tvp->u.data = fe->tv_property_cache.sectone;
+ break;
}
- return 0;
+ return r;
}
static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
@@ -1291,7 +1315,6 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
struct dvb_frontend *fe = dvbdev->priv;
struct dvb_frontend_private *fepriv = fe->frontend_priv;
int err = -EOPNOTSUPP;
- tv_property_t* tvp;
dprintk ("%s\n", __func__);
@@ -1306,6 +1329,25 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
if (down_interruptible (&fepriv->sem))
return -ERESTARTSYS;
+ if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
+ err = dvb_frontend_ioctl_properties(inode, file, cmd, parg);
+ else
+ err = dvb_frontend_ioctl_legacy(inode, file, cmd, parg);
+
+ up(&fepriv->sem);
+ return err;
+}
+
+static int dvb_frontend_ioctl_properties(struct inode *inode, struct file *file,
+ unsigned int cmd, void *parg)
+{
+ struct dvb_device *dvbdev = file->private_data;
+ struct dvb_frontend *fe = dvbdev->priv;
+ int err = -EOPNOTSUPP;
+ tv_property_t *tvp;
+
+ dprintk("%s\n", __func__);
+
if(cmd == FE_SET_PROPERTY) {
printk("%s() FE_SET_PROPERTY\n", __FUNCTION__);
@@ -1314,7 +1356,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
/* TODO: ioctl userdata out of range check here */
tvp = parg;
while(tvp->cmd != TV_SEQ_UNDEFINED) {
- tv_property_process(fe, tvp);
+ tv_property_process(fe, tvp, inode, file);
if( (tvp->cmd == TV_SEQ_TERMINATE) || (tvp->cmd == TV_SEQ_COMPLETE) )
break;
tvp++;
@@ -1322,11 +1364,21 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
if(fe->tv_property_cache.state == TV_SEQ_COMPLETE) {
printk("%s() Property cache is full, tuning\n", __FUNCTION__);
- cmd = FE_SET_FRONTEND;
}
err = 0;
}
+ return err;
+}
+
+static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,
+ unsigned int cmd, void *parg)
+{
+ struct dvb_device *dvbdev = file->private_data;
+ struct dvb_frontend *fe = dvbdev->priv;
+ struct dvb_frontend_private *fepriv = fe->frontend_priv;
+ int err = -EOPNOTSUPP;
+
switch (cmd) {
case FE_GET_INFO: {
struct dvb_frontend_info* info = parg;
@@ -1585,7 +1637,6 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
break;
};
- up (&fepriv->sem);
return err;
}