V4L/DVB (13076): xc5000: make the definition of the FM input part of the xc5000 confi...
authorDevin Heitmueller <dheitmueller@kernellabs.com>
Thu, 24 Sep 2009 16:27:24 +0000 (13:27 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 5 Dec 2009 20:40:13 +0000 (18:40 -0200)
Remove hard-coded definition of the xc5000 FM radio input, making it a
parameter passed in when doing the attach call.

Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/tuners/xc5000.c
drivers/media/common/tuners/xc5000.h

index fc7cb74..d33bf83 100644 (file)
@@ -61,6 +61,7 @@ struct xc5000_priv {
        u32 bandwidth;
        u8  video_standard;
        u8  rf_mode;
+       u8  radio_input;
 };
 
 /* Misc Defines */
@@ -829,17 +830,32 @@ static int xc5000_set_radio_freq(struct dvb_frontend *fe,
 {
        struct xc5000_priv *priv = fe->tuner_priv;
        int ret = -EINVAL;
+       u8 radio_input;
 
        dprintk(1, "%s() frequency=%d (in units of khz)\n",
                __func__, params->frequency);
 
+       if (priv->radio_input == XC5000_RADIO_NOT_CONFIGURED) {
+               dprintk(1, "%s() radio input not configured\n", __func__);
+               return -EINVAL;
+       }
+
+       if (priv->radio_input == XC5000_RADIO_FM1)
+               radio_input = FM_Radio_INPUT1;
+       else if  (priv->radio_input == XC5000_RADIO_FM2)
+               radio_input = FM_Radio_INPUT2;
+       else {
+               dprintk(1, "%s() unknown radio input %d\n", __func__,
+                       priv->radio_input);
+               return -EINVAL;
+       }
+
        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);
+       ret = xc_SetTVStandard(priv, XC5000_Standard[radio_input].VideoMode,
+                              XC5000_Standard[radio_input].AudioMode);
 
        if (ret != XC_RESULT_SUCCESS) {
                printk(KERN_ERR "xc5000: xc_SetTVStandard failed\n");
@@ -1058,6 +1074,9 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
                priv->if_khz = cfg->if_khz;
        }
 
+       if (priv->radio_input == 0)
+               priv->radio_input = cfg->radio_input;
+
        /* Check if firmware has been loaded. It is possible that another
           instance of the driver has loaded the firmware.
         */
index f4c1466..e6d7236 100644 (file)
@@ -30,11 +30,17 @@ struct i2c_adapter;
 struct xc5000_config {
        u8   i2c_address;
        u32  if_khz;
+       u8   radio_input;
 };
 
 /* xc5000 callback command */
 #define XC5000_TUNER_RESET             0
 
+/* Possible Radio inputs */
+#define XC5000_RADIO_NOT_CONFIGURED            0
+#define XC5000_RADIO_FM1                       1
+#define XC5000_RADIO_FM2                       2
+
 /* For each bridge framework, when it attaches either analog or digital,
  * it has to store a reference back to its _core equivalent structure,
  * so that it can service the hardware by steering gpio's etc.