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);
*/
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;
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,
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__);
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__);
/* 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++;
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;
break;
};
- up (&fepriv->sem);
return err;
}