]> err.no Git - linux-2.6/blobdiff - drivers/media/video/saa7134/saa7134-tvaudio.c
V4L/DVB (5724): Saa7134-tvaudio: kthread conversion
[linux-2.6] / drivers / media / video / saa7134 / saa7134-tvaudio.c
index 0db53d192b2a2b1d40f975b63256066982ba1e3e..18b4817b4aac6edb2ac79f0f6298f24cbdd0fb4f 100644 (file)
@@ -25,9 +25,9 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
+#include <linux/kthread.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
-#include <linux/smp_lock.h>
 #include <asm/div64.h>
 
 #include "saa7134-reg.h"
@@ -72,12 +72,12 @@ static struct mainscan {
        int          carr;
 } mainscan[] = {
        {
-               .name = "M",
-               .std  = V4L2_STD_NTSC | V4L2_STD_PAL_M,
+               .name = "MN",
+               .std  = V4L2_STD_MN,
                .carr = 4500,
        },{
-               .name = "BG",
-               .std  = V4L2_STD_PAL_BG,
+               .name = "BGH",
+               .std  = V4L2_STD_B | V4L2_STD_GH,
                .carr = 5500,
        },{
                .name = "I",
@@ -85,7 +85,7 @@ static struct mainscan {
                .carr = 6000,
        },{
                .name = "DKL",
-               .std  = V4L2_STD_PAL_DK | V4L2_STD_SECAM,
+               .std  = V4L2_STD_DK | V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC,
                .carr = 6500,
        }
 };
@@ -93,76 +93,70 @@ static struct mainscan {
 static struct saa7134_tvaudio tvaudio[] = {
        {
                .name          = "PAL-B/G FM-stereo",
-               .std           = V4L2_STD_PAL,
+               .std           = V4L2_STD_PAL_BG,
                .mode          = TVAUDIO_FM_BG_STEREO,
                .carr1         = 5500,
                .carr2         = 5742,
        },{
                .name          = "PAL-D/K1 FM-stereo",
-               .std           = V4L2_STD_PAL,
+               .std           = V4L2_STD_PAL_DK,
                .carr1         = 6500,
                .carr2         = 6258,
                .mode          = TVAUDIO_FM_BG_STEREO,
        },{
                .name          = "PAL-D/K2 FM-stereo",
-               .std           = V4L2_STD_PAL,
+               .std           = V4L2_STD_PAL_DK,
                .carr1         = 6500,
                .carr2         = 6742,
                .mode          = TVAUDIO_FM_BG_STEREO,
        },{
                .name          = "PAL-D/K3 FM-stereo",
-               .std           = V4L2_STD_PAL,
+               .std           = V4L2_STD_PAL_DK,
                .carr1         = 6500,
                .carr2         = 5742,
                .mode          = TVAUDIO_FM_BG_STEREO,
        },{
                .name          = "PAL-B/G NICAM",
-               .std           = V4L2_STD_PAL,
+               .std           = V4L2_STD_PAL_BG,
                .carr1         = 5500,
                .carr2         = 5850,
                .mode          = TVAUDIO_NICAM_FM,
        },{
                .name          = "PAL-I NICAM",
-               .std           = V4L2_STD_PAL,
+               .std           = V4L2_STD_PAL_I,
                .carr1         = 6000,
                .carr2         = 6552,
                .mode          = TVAUDIO_NICAM_FM,
        },{
                .name          = "PAL-D/K NICAM",
-               .std           = V4L2_STD_PAL,
+               .std           = V4L2_STD_PAL_DK,
                .carr1         = 6500,
                .carr2         = 5850,
                .mode          = TVAUDIO_NICAM_FM,
        },{
                .name          = "SECAM-L NICAM",
-               .std           = V4L2_STD_SECAM,
+               .std           = V4L2_STD_SECAM_L,
                .carr1         = 6500,
                .carr2         = 5850,
                .mode          = TVAUDIO_NICAM_AM,
        },{
-               .name          = "SECAM-L MONO",
-               .std           = V4L2_STD_SECAM,
+               .name          = "SECAM-D/K NICAM",
+               .std           = V4L2_STD_SECAM_DK,
                .carr1         = 6500,
-               .carr2         = -1,
-               .mode          = TVAUDIO_AM_MONO,
+               .carr2         = 5850,
+               .mode          = TVAUDIO_NICAM_FM,
        },{
-               .name          = "SECAM-D/K",
-               .std           = V4L2_STD_SECAM,
-               .carr1         = 6500,
-               .carr2         = -1,
-               .mode          = TVAUDIO_FM_MONO,
+               .name          = "NTSC-A2 FM-stereo",
+               .std           = V4L2_STD_NTSC,
+               .carr1         = 4500,
+               .carr2         = 4724,
+               .mode          = TVAUDIO_FM_K_STEREO,
        },{
                .name          = "NTSC-M",
                .std           = V4L2_STD_NTSC,
                .carr1         = 4500,
                .carr2         = -1,
                .mode          = TVAUDIO_FM_MONO,
-       },{
-               .name          = "NTSC-A2 FM-stereo",
-               .std           = V4L2_STD_NTSC,
-               .carr1         = 4500,
-               .carr2         = 4724,
-               .mode          = TVAUDIO_FM_K_STEREO,
        }
 };
 #define TVAUDIO (sizeof(tvaudio)/sizeof(struct saa7134_tvaudio))
@@ -340,12 +334,6 @@ static void tvaudio_setmode(struct saa7134_dev *dev,
                saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT,  0xa1);
                saa_writeb(SAA7134_NICAM_CONFIG,              0x00);
                break;
-       case TVAUDIO_AM_MONO:
-               saa_writeb(SAA7134_DEMODULATOR,               0x12);
-               saa_writeb(SAA7134_DCXO_IDENT_CTRL,           0x00);
-               saa_writeb(SAA7134_FM_DEEMPHASIS,             0x44);
-               saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT,  0xa0);
-               break;
        case TVAUDIO_FM_SAT_STEREO:
                /* not implemented (yet) */
                break;
@@ -354,10 +342,8 @@ static void tvaudio_setmode(struct saa7134_dev *dev,
 
 static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
 {
-       DECLARE_WAITQUEUE(wait, current);
-
-       add_wait_queue(&dev->thread.wq, &wait);
-       if (dev->thread.scan1 == dev->thread.scan2 && !dev->thread.shutdown) {
+       if (dev->thread.scan1 == dev->thread.scan2 &&
+           !kthread_should_stop()) {
                if (timeout < 0) {
                        set_current_state(TASK_INTERRUPTIBLE);
                        schedule();
@@ -366,7 +352,6 @@ static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
                                                (msecs_to_jiffies(timeout));
                }
        }
-       remove_wait_queue(&dev->thread.wq, &wait);
        return dev->thread.scan1 != dev->thread.scan2;
 }
 
@@ -390,7 +375,6 @@ static int tvaudio_checkcarrier(struct saa7134_dev *dev, struct mainscan *scan)
                }
                printk("\n");
        }
-
        if (dev->tvnorm->id & scan->std) {
                tvaudio_setcarrier(dev,scan->carr-90,scan->carr-90);
                saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
@@ -426,7 +410,6 @@ static int tvaudio_getstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *au
 
        switch (audio->mode) {
        case TVAUDIO_FM_MONO:
-       case TVAUDIO_AM_MONO:
                return V4L2_TUNER_SUB_MONO;
        case TVAUDIO_FM_K_STEREO:
        case TVAUDIO_FM_BG_STEREO:
@@ -495,7 +478,6 @@ static int tvaudio_setstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *au
 
        switch (audio->mode) {
        case TVAUDIO_FM_MONO:
-       case TVAUDIO_AM_MONO:
                /* nothing to do ... */
                break;
        case TVAUDIO_FM_K_STEREO:
@@ -521,11 +503,10 @@ static int tvaudio_thread(void *data)
        unsigned int i, audio, nscan;
        int max1,max2,carrier,rx,mode,lastmode,default_carrier;
 
-       daemonize("%s", dev->name);
        allow_signal(SIGTERM);
        for (;;) {
                tvaudio_sleep(dev,-1);
-               if (dev->thread.shutdown || signal_pending(current))
+               if (kthread_should_stop() || signal_pending(current))
                        goto done;
 
        restart:
@@ -556,6 +537,7 @@ static int tvaudio_thread(void *data)
 
                if (1 == nscan) {
                        /* only one candidate -- skip scan ;) */
+                       dprintk("only one main carrier candidate - skipping scan\n");
                        max1 = 12345;
                        carrier = default_carrier;
                } else {
@@ -603,7 +585,6 @@ static int tvaudio_thread(void *data)
                dev->automute = 0;
                saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x00);
                saa7134_tvaudio_setmute(dev);
-
                /* find the exact tv audio norm */
                for (audio = UNSET, i = 0; i < TVAUDIO; i++) {
                        if (dev->tvnorm->id != UNSET &&
@@ -611,7 +592,7 @@ static int tvaudio_thread(void *data)
                                continue;
                        if (tvaudio[i].carr1 != carrier)
                                continue;
-
+                       /* Note: at least the primary carrier is right here */
                        if (UNSET == audio)
                                audio = i;
                        tvaudio_setmode(dev,&tvaudio[i],"trying");
@@ -626,6 +607,7 @@ static int tvaudio_thread(void *data)
                if (UNSET == audio)
                        continue;
                tvaudio_setmode(dev,&tvaudio[audio],"using");
+
                tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO);
                dev->tvaudio = &tvaudio[audio];
 
@@ -633,7 +615,7 @@ static int tvaudio_thread(void *data)
                for (;;) {
                        if (tvaudio_sleep(dev,5000))
                                goto restart;
-                       if (dev->thread.shutdown || signal_pending(current))
+                       if (kthread_should_stop() || signal_pending(current))
                                break;
                        if (UNSET == dev->thread.mode) {
                                rx = tvaudio_getstereo(dev,&tvaudio[i]);
@@ -649,7 +631,6 @@ static int tvaudio_thread(void *data)
        }
 
  done:
-       complete_and_exit(&dev->thread.exit, 0);
        return 0;
 }
 
@@ -750,7 +731,6 @@ static int mute_input_7133(struct saa7134_dev *dev)
        int mask;
        struct saa7134_input *in;
 
-       /* Hac 0506 route OSS sound simultanously  */
        xbarin = 0x03;
        switch (dev->input->amux) {
        case TV:
@@ -798,7 +778,6 @@ static int tvaudio_thread_ddep(void *data)
        struct saa7134_dev *dev = data;
        u32 value, norms, clock;
 
-       daemonize("%s", dev->name);
        allow_signal(SIGTERM);
 
        clock = saa7134_boards[dev->board].audio_clock;
@@ -812,7 +791,7 @@ static int tvaudio_thread_ddep(void *data)
 
        for (;;) {
                tvaudio_sleep(dev,-1);
-               if (dev->thread.shutdown || signal_pending(current))
+               if (kthread_should_stop() || signal_pending(current))
                        goto done;
 
        restart:
@@ -834,18 +813,16 @@ static int tvaudio_thread_ddep(void *data)
                } else {
                        /* (let chip) scan for sound carrier */
                        norms = 0;
-                       if (dev->tvnorm->id & V4L2_STD_PAL) {
-                               dprintk("PAL scan\n");
-                               norms |= 0x2c; /* B/G + D/K + I */
-                       }
-                       if (dev->tvnorm->id & V4L2_STD_NTSC) {
-                               dprintk("NTSC scan\n");
-                               norms |= 0x40; /* M */
-                       }
-                       if (dev->tvnorm->id & V4L2_STD_SECAM) {
-                               dprintk("SECAM scan\n");
-                               norms |= 0x18; /* L + D/K */
-                       }
+                       if (dev->tvnorm->id & (V4L2_STD_B | V4L2_STD_GH))
+                               norms |= 0x04;
+                       if (dev->tvnorm->id & V4L2_STD_PAL_I)
+                               norms |= 0x20;
+                       if (dev->tvnorm->id & V4L2_STD_DK)
+                               norms |= 0x08;
+                       if (dev->tvnorm->id & V4L2_STD_MN)
+                               norms |= 0x40;
+                       if (dev->tvnorm->id & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC))
+                               norms |= 0x10;
                        if (0 == norms)
                                norms = 0x7c; /* all */
                        dprintk("scanning:%s%s%s%s%s\n",
@@ -894,7 +871,6 @@ static int tvaudio_thread_ddep(void *data)
        }
 
  done:
-       complete_and_exit(&dev->thread.exit, 0);
        return 0;
 }
 
@@ -991,7 +967,6 @@ int saa7134_tvaudio_getstereo(struct saa7134_dev *dev)
 
 int saa7134_tvaudio_init2(struct saa7134_dev *dev)
 {
-       DECLARE_MUTEX_LOCKED(sem);
        int (*my_thread)(void *data) = NULL;
 
        switch (dev->pci->device) {
@@ -1004,15 +979,15 @@ int saa7134_tvaudio_init2(struct saa7134_dev *dev)
                break;
        }
 
-       dev->thread.pid = -1;
+       dev->thread.thread = NULL;
        if (my_thread) {
                /* start tvaudio thread */
-               init_waitqueue_head(&dev->thread.wq);
-               init_completion(&dev->thread.exit);
-               dev->thread.pid = kernel_thread(my_thread,dev,0);
-               if (dev->thread.pid < 0)
+               dev->thread.thread = kthread_run(my_thread, dev, "%s", dev->name);
+               if (IS_ERR(dev->thread.thread)) {
                        printk(KERN_WARNING "%s: kernel_thread() failed\n",
                               dev->name);
+                       /* XXX: missing error handling here */
+               }
                saa7134_tvaudio_do_scan(dev);
        }
 
@@ -1023,21 +998,23 @@ int saa7134_tvaudio_init2(struct saa7134_dev *dev)
 int saa7134_tvaudio_fini(struct saa7134_dev *dev)
 {
        /* shutdown tvaudio thread */
-       if (dev->thread.pid >= 0) {
-               dev->thread.shutdown = 1;
-               wake_up_interruptible(&dev->thread.wq);
-               wait_for_completion(&dev->thread.exit);
-       }
+       if (dev->thread.thread)
+               kthread_stop(dev->thread.thread);
+
        saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */
        return 0;
 }
 
 int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
 {
-       if (dev->thread.pid >= 0) {
+       if (dev->input->amux != TV) {
+               dprintk("sound IF not in use, skipping scan\n");
+               dev->automute = 0;
+               saa7134_tvaudio_setmute(dev);
+       } else if (dev->thread.thread) {
                dev->thread.mode = UNSET;
                dev->thread.scan2++;
-               wake_up_interruptible(&dev->thread.wq);
+               wake_up_process(dev->thread.thread);
        } else {
                dev->automute = 0;
                saa7134_tvaudio_setmute(dev);
@@ -1046,6 +1023,7 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
 }
 
 EXPORT_SYMBOL(saa_dsp_writel);
+EXPORT_SYMBOL(saa7134_tvaudio_setmute);
 
 /* ----------------------------------------------------------- */
 /*
@@ -1053,4 +1031,3 @@ EXPORT_SYMBOL(saa_dsp_writel);
  * c-basic-offset: 8
  * End:
  */
-