Hi Devin
Yes I agree. Not so good way. I was send because didn't recieved any reply from
Steven Toth.
Main reason do FM radio working right now.
I think you can do next step for writing this workaround and make patch for it.
I'll write config and make some tests for our card.
With my best regards, Dmitry.
> On Tue, Sep 1, 2009 at 9:37 PM, Dmitri Belimov
> wrote:
> > Hi All
> >
> > Add FM radio for the xc5000 silicon tuner chip.
> >
> > diff -r 28f8b0ebd224 linux/drivers/media/common/tuners/xc5000.c
> > --- a/linux/drivers/media/common/tuners/xc5000.c Sun Aug 23
> > 13:55:25 2009 -0300 +++
> > b/linux/drivers/media/common/tuners/xc5000.c Wed Sep 02
> > 06:32:12 2009 +1000 @@ -747,14 +747,11 @@ return ret;
> > }
> >
> > -static int xc5000_set_analog_params(struct dvb_frontend *fe,
> > +static int xc5000_set_tv_freq(struct dvb_frontend *fe,
> > struct analog_parameters *params)
> > {
> > struct xc5000_priv *priv = fe->tuner_priv;
> > int ret;
> > -
> > - if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS)
> > - xc_load_fw_and_init_tuner(fe);
> >
> > dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
> > __func__, params->frequency);
> > @@ -834,6 +831,67 @@
> >
> > return 0;
> > }
> > +
> > +static int xc5000_set_radio_freq(struct dvb_frontend *fe,
> > + struct analog_parameters *params)
> > +{
> > + struct xc5000_priv *priv = fe->tuner_priv;
> > + int ret = -EINVAL;
> > +
> > + dprintk(1, "%s() frequency=%d (in units of khz)\n",
> > + __func__, params->frequency);
> > +
> > + priv->freq_hz = params->frequency * 125 / 2;
> > +
> > + priv->rf_mode = XC_RF_MODE_AIR;
> > +
> > + ret = xc_SetTVStandard(priv,
> > + XC5000_Standard[FM_Radio_INPUT1].VideoMode,
> > + XC5000_Standard[FM_Radio_INPUT1].AudioMode);
> > +
> > + if (ret != XC_RESULT_SUCCESS) {
> > + printk(KERN_ERR "xc5000: xc_SetTVStandard
> > failed\n");
> > + return -EREMOTEIO;
> > + }
> > +
> > + ret = xc_SetSignalSource(priv, priv->rf_mode);
> > + if (ret != XC_RESULT_SUCCESS) {
> > + printk(KERN_ERR
> > + "xc5000: xc_SetSignalSource(%d) failed\n",
> > + priv->rf_mode);
> > + return -EREMOTEIO;
> > + }
> > +
> > + xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
> > +
> > + return 0;
> > +}
> > +
> > +static int xc5000_set_analog_params(struct dvb_frontend *fe,
> > + struct analog_parameters *params)
> > +{
> > + struct xc5000_priv *priv = fe->tuner_priv;
> > + int ret = -EINVAL;
> > +
> > + if (priv->i2c_props.adap == NULL)
> > + return -EINVAL;
> > +
> > + if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS)
> > + xc_load_fw_and_init_tuner(fe);
> > +
> > + switch (params->mode) {
> > + case V4L2_TUNER_RADIO:
> > + ret = xc5000_set_radio_freq(fe, params);
> > + break;
> > + case V4L2_TUNER_ANALOG_TV:
> > + case V4L2_TUNER_DIGITAL_TV:
> > + ret = xc5000_set_tv_freq(fe, params);
> > + break;
> > + }
> > +
> > + return ret;
> > +}
> > +
> >
> > static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
> > {
> >
> > Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov
> >
> >
> > With my best regards, Dmitry.
>
> Hello Dmitri,
>
> A few comments;
>
> I don't think the code should have FM1 hard-coded as the only valid
> input. You should probably add a parameter to the xc500_config struct
> to specify which FM input to use (so the person defining the board
> profile can define which input is appropriate).
>
> Does the signal lock register actually work for FM? I assume it does,
> but I'm not sure.
>
> Also, I would probably have him move the setting of priv->rf_mode
> further down in the function. That way it the xc5000_priv struct
> won't get out of sync with the actual state of the device if the call
> to xc_SetTVStandard() fails.
>
> Other than those two things though it looks ok at first glance.
>
> Devin
>
> --
> Devin J. Heitmueller - Kernel Labs
> http://www.kernellabs.com
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html