aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorCedric Le Goater <clg@fr.ibm.com>2006-09-11 15:31:45 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2006-09-26 11:30:36 -0400
commitbc28287979592c015560f8837a98b63a3be8bbc1 (patch)
tree8103d470146c201dfe811af5374984e13e17f8df /drivers
parentc93a5c34887426daa70f3caf05881fafb1cd687f (diff)
V4L/DVB (4624): Tvaudio: Replaced kernel_thread() with kthread_run()
Replaced kernel_thread() with kthread_run() since kernel_thread() is deprecated in drivers/modules. Removed the completion and the wait queue which are now useless with kthread. Also removed the allow_signal() call as signals don't apply to kernel threads. Fixed a small race condition when thread is stopped. Please check if the timer vs. thread still works fine without the wait queue. Signed-off-by: Cedric Le Goater <clg@fr.ibm.com> Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/tvaudio.c42
1 files changed, 16 insertions, 26 deletions
diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
index 936e3f746fba..fcaef4bf8289 100644
--- a/drivers/media/video/tvaudio.c
+++ b/drivers/media/video/tvaudio.c
@@ -28,6 +28,7 @@
28#include <linux/i2c-algo-bit.h> 28#include <linux/i2c-algo-bit.h>
29#include <linux/init.h> 29#include <linux/init.h>
30#include <linux/smp_lock.h> 30#include <linux/smp_lock.h>
31#include <linux/kthread.h>
31 32
32#include <media/tvaudio.h> 33#include <media/tvaudio.h>
33#include <media/v4l2-common.h> 34#include <media/v4l2-common.h>
@@ -124,11 +125,8 @@ struct CHIPSTATE {
124 int input; 125 int input;
125 126
126 /* thread */ 127 /* thread */
127 pid_t tpid; 128 struct task_struct *thread;
128 struct completion texit;
129 wait_queue_head_t wq;
130 struct timer_list wt; 129 struct timer_list wt;
131 int done;
132 int watch_stereo; 130 int watch_stereo;
133 int audmode; 131 int audmode;
134}; 132};
@@ -264,28 +262,23 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd)
264static void chip_thread_wake(unsigned long data) 262static void chip_thread_wake(unsigned long data)
265{ 263{
266 struct CHIPSTATE *chip = (struct CHIPSTATE*)data; 264 struct CHIPSTATE *chip = (struct CHIPSTATE*)data;
267 wake_up_interruptible(&chip->wq); 265 wake_up_process(chip->thread);
268} 266}
269 267
270static int chip_thread(void *data) 268static int chip_thread(void *data)
271{ 269{
272 DECLARE_WAITQUEUE(wait, current);
273 struct CHIPSTATE *chip = data; 270 struct CHIPSTATE *chip = data;
274 struct CHIPDESC *desc = chiplist + chip->type; 271 struct CHIPDESC *desc = chiplist + chip->type;
275 272
276 daemonize("%s", chip->c.name);
277 allow_signal(SIGTERM);
278 v4l_dbg(1, debug, &chip->c, "%s: thread started\n", chip->c.name); 273 v4l_dbg(1, debug, &chip->c, "%s: thread started\n", chip->c.name);
279 274
280 for (;;) { 275 for (;;) {
281 add_wait_queue(&chip->wq, &wait); 276 set_current_state(TASK_INTERRUPTIBLE);
282 if (!chip->done) { 277 if (!kthread_should_stop())
283 set_current_state(TASK_INTERRUPTIBLE);
284 schedule(); 278 schedule();
285 } 279 set_current_state(TASK_RUNNING);
286 remove_wait_queue(&chip->wq, &wait);
287 try_to_freeze(); 280 try_to_freeze();
288 if (chip->done || signal_pending(current)) 281 if (kthread_should_stop())
289 break; 282 break;
290 v4l_dbg(1, debug, &chip->c, "%s: thread wakeup\n", chip->c.name); 283 v4l_dbg(1, debug, &chip->c, "%s: thread wakeup\n", chip->c.name);
291 284
@@ -301,7 +294,6 @@ static int chip_thread(void *data)
301 } 294 }
302 295
303 v4l_dbg(1, debug, &chip->c, "%s: thread exiting\n", chip->c.name); 296 v4l_dbg(1, debug, &chip->c, "%s: thread exiting\n", chip->c.name);
304 complete_and_exit(&chip->texit, 0);
305 return 0; 297 return 0;
306} 298}
307 299
@@ -1536,19 +1528,18 @@ static int chip_attach(struct i2c_adapter *adap, int addr, int kind)
1536 chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); 1528 chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble));
1537 } 1529 }
1538 1530
1539 chip->tpid = -1; 1531 chip->thread = NULL;
1540 if (desc->checkmode) { 1532 if (desc->checkmode) {
1541 /* start async thread */ 1533 /* start async thread */
1542 init_timer(&chip->wt); 1534 init_timer(&chip->wt);
1543 chip->wt.function = chip_thread_wake; 1535 chip->wt.function = chip_thread_wake;
1544 chip->wt.data = (unsigned long)chip; 1536 chip->wt.data = (unsigned long)chip;
1545 init_waitqueue_head(&chip->wq); 1537 chip->thread = kthread_run(chip_thread, chip, chip->c.name);
1546 init_completion(&chip->texit); 1538 if (IS_ERR(chip->thread)) {
1547 chip->tpid = kernel_thread(chip_thread,(void *)chip,0); 1539 v4l_warn(&chip->c, "%s: failed to create kthread\n",
1548 if (chip->tpid < 0)
1549 v4l_warn(&chip->c, "%s: kernel_thread() failed\n",
1550 chip->c.name); 1540 chip->c.name);
1551 wake_up_interruptible(&chip->wq); 1541 chip->thread = NULL;
1542 }
1552 } 1543 }
1553 return 0; 1544 return 0;
1554} 1545}
@@ -1569,11 +1560,10 @@ static int chip_detach(struct i2c_client *client)
1569 struct CHIPSTATE *chip = i2c_get_clientdata(client); 1560 struct CHIPSTATE *chip = i2c_get_clientdata(client);
1570 1561
1571 del_timer_sync(&chip->wt); 1562 del_timer_sync(&chip->wt);
1572 if (chip->tpid >= 0) { 1563 if (chip->thread) {
1573 /* shutdown async thread */ 1564 /* shutdown async thread */
1574 chip->done = 1; 1565 kthread_stop(chip->thread);
1575 wake_up_interruptible(&chip->wq); 1566 chip->thread = NULL;
1576 wait_for_completion(&chip->texit);
1577 } 1567 }
1578 1568
1579 i2c_detach_client(&chip->c); 1569 i2c_detach_client(&chip->c);