diff options
| author | Oliver Endriss <o.endriss@gmx.de> | 2007-08-25 11:00:23 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-10-09 21:06:59 -0400 |
| commit | 48136e1e93195b56dc3d9b0730917241b3365633 (patch) | |
| tree | 56314dc49a2c092a090424326d65a3c34be622d0 /drivers/media/dvb/dvb-core | |
| parent | 226835d7e0a1136bce2a0b923e0832ab47450a30 (diff) | |
V4L/DVB (6105): dvb_frontend: ts_bus_ctrl() handling fixed
ts_bus_ctrl() should only be called by
- the first open
- the last release call.
Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/dvb/dvb-core')
| -rw-r--r-- | drivers/media/dvb/dvb-core/dvb_frontend.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 880d499cd36a..07c0db2abfbc 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
| @@ -1056,18 +1056,15 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) | |||
| 1056 | 1056 | ||
| 1057 | dprintk ("%s\n", __FUNCTION__); | 1057 | dprintk ("%s\n", __FUNCTION__); |
| 1058 | 1058 | ||
| 1059 | if ((ret = dvb_generic_open (inode, file)) < 0) | 1059 | if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) { |
| 1060 | return ret; | 1060 | if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0) |
| 1061 | |||
| 1062 | if (fe->ops.ts_bus_ctrl) { | ||
| 1063 | if ((ret = fe->ops.ts_bus_ctrl (fe, 1)) < 0) { | ||
| 1064 | dvb_generic_release (inode, file); | ||
| 1065 | return ret; | 1061 | return ret; |
| 1066 | } | ||
| 1067 | } | 1062 | } |
| 1068 | 1063 | ||
| 1069 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { | 1064 | if ((ret = dvb_generic_open (inode, file)) < 0) |
| 1065 | goto err1; | ||
| 1070 | 1066 | ||
| 1067 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { | ||
| 1071 | /* normal tune mode when opened R/W */ | 1068 | /* normal tune mode when opened R/W */ |
| 1072 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; | 1069 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; |
| 1073 | fepriv->tone = -1; | 1070 | fepriv->tone = -1; |
| @@ -1075,13 +1072,20 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) | |||
| 1075 | 1072 | ||
| 1076 | ret = dvb_frontend_start (fe); | 1073 | ret = dvb_frontend_start (fe); |
| 1077 | if (ret) | 1074 | if (ret) |
| 1078 | dvb_generic_release (inode, file); | 1075 | goto err2; |
| 1079 | 1076 | ||
| 1080 | /* empty event queue */ | 1077 | /* empty event queue */ |
| 1081 | fepriv->events.eventr = fepriv->events.eventw = 0; | 1078 | fepriv->events.eventr = fepriv->events.eventw = 0; |
| 1082 | } | 1079 | } |
| 1083 | 1080 | ||
| 1084 | return ret; | 1081 | return ret; |
| 1082 | |||
| 1083 | err2: | ||
| 1084 | dvb_generic_release(inode, file); | ||
| 1085 | err1: | ||
| 1086 | if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) | ||
| 1087 | fe->ops.ts_bus_ctrl(fe, 0); | ||
| 1088 | return ret; | ||
| 1085 | } | 1089 | } |
| 1086 | 1090 | ||
| 1087 | static int dvb_frontend_release(struct inode *inode, struct file *file) | 1091 | static int dvb_frontend_release(struct inode *inode, struct file *file) |
| @@ -1096,16 +1100,18 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) | |||
| 1096 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) | 1100 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) |
| 1097 | fepriv->release_jiffies = jiffies; | 1101 | fepriv->release_jiffies = jiffies; |
| 1098 | 1102 | ||
| 1099 | if (fe->ops.ts_bus_ctrl) | ||
| 1100 | fe->ops.ts_bus_ctrl (fe, 0); | ||
| 1101 | |||
| 1102 | ret = dvb_generic_release (inode, file); | 1103 | ret = dvb_generic_release (inode, file); |
| 1103 | 1104 | ||
| 1104 | if (dvbdev->users==-1 && fepriv->exit==1) { | 1105 | if (dvbdev->users == -1) { |
| 1105 | fops_put(file->f_op); | 1106 | if (fepriv->exit == 1) { |
| 1106 | file->f_op = NULL; | 1107 | fops_put(file->f_op); |
| 1107 | wake_up(&dvbdev->wait_queue); | 1108 | file->f_op = NULL; |
| 1109 | wake_up(&dvbdev->wait_queue); | ||
| 1110 | } | ||
| 1111 | if (fe->ops.ts_bus_ctrl) | ||
| 1112 | fe->ops.ts_bus_ctrl(fe, 0); | ||
| 1108 | } | 1113 | } |
| 1114 | |||
| 1109 | return ret; | 1115 | return ret; |
| 1110 | } | 1116 | } |
| 1111 | 1117 | ||
