V4L/DVB (6330): V4L: saa7134: Fix interaction between tvaudio thread and the freezer

make tvaudio thread freezeable, and add proper support for that

Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Maxim Levitsky 2007-10-13 05:35:33 -03:00 коммит произвёл Mauro Carvalho Chehab
Родитель c458473ebf
Коммит ea63d0b11e
2 изменённых файлов: 24 добавлений и 7 удалений

Просмотреть файл

@ -27,6 +27,7 @@
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/freezer.h>
#include <asm/div64.h> #include <asm/div64.h>
#include "saa7134-reg.h" #include "saa7134-reg.h"
@ -502,13 +503,17 @@ static int tvaudio_thread(void *data)
unsigned int i, audio, nscan; unsigned int i, audio, nscan;
int max1,max2,carrier,rx,mode,lastmode,default_carrier; int max1,max2,carrier,rx,mode,lastmode,default_carrier;
allow_signal(SIGTERM);
set_freezable();
for (;;) { for (;;) {
tvaudio_sleep(dev,-1); tvaudio_sleep(dev,-1);
if (kthread_should_stop() || signal_pending(current)) if (kthread_should_stop())
goto done; goto done;
restart: restart:
try_to_freeze();
dev->thread.scan1 = dev->thread.scan2; dev->thread.scan1 = dev->thread.scan2;
dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1); dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1);
dev->tvaudio = NULL; dev->tvaudio = NULL;
@ -612,9 +617,12 @@ static int tvaudio_thread(void *data)
lastmode = 42; lastmode = 42;
for (;;) { for (;;) {
try_to_freeze();
if (tvaudio_sleep(dev,5000)) if (tvaudio_sleep(dev,5000))
goto restart; goto restart;
if (kthread_should_stop() || signal_pending(current)) if (kthread_should_stop())
break; break;
if (UNSET == dev->thread.mode) { if (UNSET == dev->thread.mode) {
rx = tvaudio_getstereo(dev,&tvaudio[i]); rx = tvaudio_getstereo(dev,&tvaudio[i]);
@ -630,6 +638,7 @@ static int tvaudio_thread(void *data)
} }
done: done:
dev->thread.stopped = 1;
return 0; return 0;
} }
@ -777,7 +786,8 @@ static int tvaudio_thread_ddep(void *data)
struct saa7134_dev *dev = data; struct saa7134_dev *dev = data;
u32 value, norms, clock; u32 value, norms, clock;
allow_signal(SIGTERM);
set_freezable();
clock = saa7134_boards[dev->board].audio_clock; clock = saa7134_boards[dev->board].audio_clock;
if (UNSET != audio_clock_override) if (UNSET != audio_clock_override)
@ -790,10 +800,13 @@ static int tvaudio_thread_ddep(void *data)
for (;;) { for (;;) {
tvaudio_sleep(dev,-1); tvaudio_sleep(dev,-1);
if (kthread_should_stop() || signal_pending(current)) if (kthread_should_stop())
goto done; goto done;
restart: restart:
try_to_freeze();
dev->thread.scan1 = dev->thread.scan2; dev->thread.scan1 = dev->thread.scan2;
dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1); dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1);
@ -870,6 +883,7 @@ static int tvaudio_thread_ddep(void *data)
} }
done: done:
dev->thread.stopped = 1;
return 0; return 0;
} }
@ -997,7 +1011,7 @@ int saa7134_tvaudio_init2(struct saa7134_dev *dev)
int saa7134_tvaudio_fini(struct saa7134_dev *dev) int saa7134_tvaudio_fini(struct saa7134_dev *dev)
{ {
/* shutdown tvaudio thread */ /* shutdown tvaudio thread */
if (dev->thread.thread) if (dev->thread.thread && !dev->thread.stopped)
kthread_stop(dev->thread.thread); kthread_stop(dev->thread.thread);
saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */ saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */
@ -1013,7 +1027,9 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
} else if (dev->thread.thread) { } else if (dev->thread.thread) {
dev->thread.mode = UNSET; dev->thread.mode = UNSET;
dev->thread.scan2++; dev->thread.scan2++;
wake_up_process(dev->thread.thread);
if (!dev->insuspend && !dev->thread.stopped)
wake_up_process(dev->thread.thread);
} else { } else {
dev->automute = 0; dev->automute = 0;
saa7134_tvaudio_setmute(dev); saa7134_tvaudio_setmute(dev);

Просмотреть файл

@ -333,6 +333,7 @@ struct saa7134_thread {
unsigned int scan1; unsigned int scan1;
unsigned int scan2; unsigned int scan2;
unsigned int mode; unsigned int mode;
unsigned int stopped;
}; };
/* buffer for one video/vbi/ts frame */ /* buffer for one video/vbi/ts frame */