[media] r820t: Allow disabling IMR callibration
authorMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 11 Apr 2013 13:59:12 +0000 (10:59 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 17 Apr 2013 00:33:36 +0000 (21:33 -0300)
The rtl-sdr library disabled IMR callibration. While I'm not sure
yet why, it could be a good idea to add a modprobe parameter here,
to allow to also disable it. There are two rationale behind it:
- It helps to compare USB dumps between rtl-sdr and the Kernel module;
- If rtl-sdr disabled it, perhaps there's a good reason (e. g. it
  might not be actually working, or it might be causing some trouble).
For both cases, it seems useful to add a modprobe parameter to allow
testing the device with both configurations.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Tested-by: Antti Palosaari <crope@iki.fi>
drivers/media/tuners/r820t.c

index 0125de897c8d45c8bd1f455f05ee10873d4a8218..2e6a690ffb1a7f0a270aec2ffae9f8d2296c9c40 100644 (file)
@@ -56,6 +56,11 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "enable verbose debug messages");
 
+static int no_imr_cal;
+module_param(no_imr_cal, int, 0444);
+MODULE_PARM_DESC(no_imr_cal, "Disable IMR calibration at module init");
+
+
 /*
  * enums and structures
  */
@@ -87,7 +92,8 @@ struct r820t_priv {
        u32                             int_freq;
        u8                              fil_cal_code;
        bool                            imr_done;
-
+       bool                            has_lock;
+       bool                            init_done;
        struct r820t_sect_type          imr_data[NUM_IMR];
 
        /* Store current mode */
@@ -95,8 +101,6 @@ struct r820t_priv {
        enum v4l2_tuner_type            type;
        v4l2_std_id                     std;
        u32                             bw;     /* in MHz */
-
-       bool                            has_lock;
 };
 
 struct r820t_freq_range {
@@ -1999,7 +2003,7 @@ static int r820t_imr_callibrate(struct r820t_priv *priv)
        int rc, i;
        int xtal_cap = 0;
 
-       if (priv->imr_done)
+       if (priv->init_done)
                return 0;
 
        /* Initialize registers */
@@ -2024,6 +2028,16 @@ static int r820t_imr_callibrate(struct r820t_priv *priv)
                priv->xtal_cap_sel = xtal_cap;
        }
 
+       /*
+        * Disables IMR callibration. That emulates the same behaviour
+        * as what is done by rtl-sdr userspace library. Useful for testing
+        */
+       if (no_imr_cal) {
+               priv->init_done = true;
+
+               return 0;
+       }
+
        /* Initialize registers */
        rc = r820t_write(priv, 0x05,
                         r820t_init_array, sizeof(r820t_init_array));
@@ -2050,6 +2064,7 @@ static int r820t_imr_callibrate(struct r820t_priv *priv)
        if (rc < 0)
                return rc;
 
+       priv->init_done = true;
        priv->imr_done = true;
 
        return 0;