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)
{
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;
}
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;
/* 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 */
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;
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 */