[media] bttv: set initial tv/radio frequencies
authorHans Verkuil <hans.verkuil@cisco.com>
Wed, 6 Feb 2013 14:49:14 +0000 (11:49 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 5 Mar 2013 17:02:58 +0000 (14:02 -0300)
Set an initial frequencies when the driver is loaded. That way G_FREQUENCY will
give a frequency that corresponds with reality.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/pci/bt8xx/bttv-driver.c
drivers/media/pci/bt8xx/bttvp.h

index f6f2b00..546a9f5 100644 (file)
@@ -2007,10 +2007,27 @@ static int bttv_g_frequency(struct file *file, void *priv,
        if (f->tuner)
                return -EINVAL;
 
-       f->frequency = btv->freq;
+       f->frequency = f->type == V4L2_TUNER_RADIO ?
+                               btv->radio_freq : btv->tv_freq;
+
        return 0;
 }
 
+static void bttv_set_frequency(struct bttv *btv, struct v4l2_frequency *f)
+{
+       bttv_call_all(btv, tuner, s_frequency, f);
+       /* s_frequency may clamp the frequency, so get the actual
+          frequency before assigning radio/tv_freq. */
+       bttv_call_all(btv, tuner, g_frequency, f);
+       if (f->type == V4L2_TUNER_RADIO) {
+               btv->radio_freq = f->frequency;
+               if (btv->has_matchbox)
+                       tea5757_set_freq(btv, btv->radio_freq);
+       } else {
+               btv->tv_freq = f->frequency;
+       }
+}
+
 static int bttv_s_frequency(struct file *file, void *priv,
                                        struct v4l2_frequency *f)
 {
@@ -2024,11 +2041,7 @@ static int bttv_s_frequency(struct file *file, void *priv,
        err = v4l2_prio_check(&btv->prio, fh->prio);
        if (err)
                return err;
-
-       btv->freq = f->frequency;
-       bttv_call_all(btv, tuner, s_frequency, f);
-       if (btv->has_matchbox && btv->radio_user)
-               tea5757_set_freq(btv, btv->freq);
+       bttv_set_frequency(btv, f);
        return 0;
 }
 
@@ -4235,6 +4248,11 @@ static void pci_set_command(struct pci_dev *dev)
 
 static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
 {
+       struct v4l2_frequency init_freq = {
+               .tuner = 0,
+               .type = V4L2_TUNER_ANALOG_TV,
+               .frequency = 980,
+       };
        int result;
        unsigned char lat;
        struct bttv *btv;
@@ -4375,6 +4393,10 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
        /* some card-specific stuff (needs working i2c) */
        bttv_init_card2(btv);
        bttv_init_tuner(btv);
+       if (btv->tuner_type != TUNER_ABSENT) {
+               bttv_set_frequency(btv, &init_freq);
+               btv->radio_freq = 90500 * 16; /* 90.5Mhz default */
+       }
        init_irqreg(btv);
 
        /* register video4linux + input */
index 9ec0adb..528e03e 100644 (file)
@@ -418,7 +418,7 @@ struct bttv {
        unsigned int input;
        unsigned int audio;
        unsigned int mute;
-       unsigned long freq;
+       unsigned long tv_freq;
        unsigned int tvnorm;
        int hue, contrast, bright, saturation;
        struct v4l2_framebuffer fbuf;
@@ -442,6 +442,7 @@ struct bttv {
        int has_radio;
        int radio_user;
        int radio_uses_msp_demodulator;
+       unsigned long radio_freq;
 
        /* miro/pinnacle + Aimslab VHX
           philips matchbox (tea5757 radio tuner) support */