]> git.hungrycats.org Git - linux/commitdiff
[PATCH] DVB: frontend updates
authorMichael Hunold <hunold@linuxtv.org>
Wed, 20 Oct 2004 01:22:24 +0000 (18:22 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 20 Oct 2004 01:22:24 +0000 (18:22 -0700)
- [DVB] all: replace dvb_unregister_frontend_new() with
  dvb_unregister_frontend()

- [DVB] sp887x: fix firmware download, patch by Jose Alberto Reguero

- [DVB] tda1004x: add firmware loading via firmware_class()

- [DVB] dvb_frontend: without hierachical coding, code_rate_LP is
  irrelevant, so we tolerate the otherwise invalid FEC_NONE setting

- [DVB] ves1x93: fixed dropouts on older DVB cards, fix tuning issues
  (Andreas Share / Gregoire Favre),

Signed-off-by: Michael Hunold <hunold@linuxtv.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
16 files changed:
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvb_frontend.h
drivers/media/dvb/dvb-core/dvb_ksyms.c
drivers/media/dvb/frontends/alps_tdmb7.c
drivers/media/dvb/frontends/at76c651.c
drivers/media/dvb/frontends/cx24110.c
drivers/media/dvb/frontends/dvb_dummy_fe.c
drivers/media/dvb/frontends/grundig_29504-401.c
drivers/media/dvb/frontends/grundig_29504-491.c
drivers/media/dvb/frontends/mt312.c
drivers/media/dvb/frontends/mt352.c
drivers/media/dvb/frontends/nxt6000.c
drivers/media/dvb/frontends/stv0299.c
drivers/media/dvb/frontends/ves1820.c
drivers/media/dvb/frontends/ves1x93.c
drivers/media/dvb/ttusb-dec/ttusb_dec.c

index 1e9b36ff5e63d747729e9d0f4247fece2f307911..b9bc7b71a4b4589db6f6ce7d7af7a56e11f97142 100644 (file)
@@ -762,6 +762,13 @@ static int dvb_frontend_ioctl (struct inode *inode, struct file *file,
                        fe->parameters.inversion = INVERSION_AUTO;
                        fetunesettings.parameters.inversion = INVERSION_AUTO;
                }
+               if (fe->info->type == FE_OFDM) {
+                       /* without hierachical coding code_rate_LP is irrelevant,
+                        * so we tolerate the otherwise invalid FEC_NONE setting */
+                       if (fe->parameters.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
+                           fe->parameters.u.ofdm.code_rate_LP == FEC_NONE)
+                               fe->parameters.u.ofdm.code_rate_LP = FEC_AUTO;
+               }
 
                /* get frontend-specific tuning settings */
                if (dvb_frontend_internal_ioctl(&fe->frontend, FE_GET_TUNE_SETTINGS,
@@ -1180,7 +1187,7 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend,
        return 0;
 }
 
-int dvb_unregister_frontend_new (int (*ioctl) (struct dvb_frontend *frontend,
+int dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend,
                                           unsigned int cmd, void *arg),
                             struct dvb_adapter *dvb_adapter)
 {
index 505fd9b1e93d3e7622a18b99b3cc4730d7bf49c2..5d0f5dffbbfae78a45775ce9a6873eff29d1097d 100644 (file)
@@ -42,6 +42,8 @@
 #define I2C_DRIVERID_DVBFE_ALPS_TDMB7  I2C_DRIVERID_EXP2
 #define I2C_DRIVERID_DVBFE_AT76C651    I2C_DRIVERID_EXP2
 #define I2C_DRIVERID_DVBFE_CX24110     I2C_DRIVERID_EXP2
+#define I2C_DRIVERID_DVBFE_CX22702     I2C_DRIVERID_EXP2
+#define I2C_DRIVERID_DVBFE_DIB3000MB   I2C_DRIVERID_EXP2
 #define I2C_DRIVERID_DVBFE_DST         I2C_DRIVERID_EXP2
 #define I2C_DRIVERID_DVBFE_DUMMY       I2C_DRIVERID_EXP2
 #define I2C_DRIVERID_DVBFE_L64781      I2C_DRIVERID_EXP2
@@ -102,7 +104,7 @@ dvb_register_frontend (int (*ioctl) (struct dvb_frontend *frontend,
                       struct module *module);
 
 extern int
-dvb_unregister_frontend_new (int (*ioctl) (struct dvb_frontend *frontend,
+dvb_unregister_frontend (int (*ioctl) (struct dvb_frontend *frontend,
                                       unsigned int cmd, void *arg),
                         struct dvb_adapter *dvb_adapter);
 
index 0cf48c77bf72a9052acbc712154d61cb6a104f41..553200e9e06d49f3f55c289d713f3d91befc01b1 100644 (file)
@@ -24,7 +24,7 @@ EXPORT_SYMBOL(dvbdmx_connect_frontend);
 EXPORT_SYMBOL(dvbdmx_disconnect_frontend);
 
 EXPORT_SYMBOL(dvb_register_frontend);
-EXPORT_SYMBOL(dvb_unregister_frontend_new);
+EXPORT_SYMBOL(dvb_unregister_frontend);
 EXPORT_SYMBOL(dvb_add_frontend_ioctls);
 EXPORT_SYMBOL(dvb_remove_frontend_ioctls);
 EXPORT_SYMBOL(dvb_add_frontend_notifier);
index 716361c07ebfe7bbab78661c236e92698b086426..67043a838b55d996bb1bed013574d6301f9a5e9f 100644 (file)
@@ -470,7 +470,7 @@ static int detach_client (struct i2c_client *client)
 
        dprintk ("%s\n", __FUNCTION__);
 
-       dvb_unregister_frontend_new (tdmb7_ioctl, state->dvb);
+       dvb_unregister_frontend (tdmb7_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index 44c9e9ab3fe67d9fd800cfbd601c28006c9f3d86..0dceacee31d53fdf06f3881a13e73cee8598a364 100644 (file)
@@ -514,7 +514,7 @@ static int detach_client(struct i2c_client *client)
 {
        struct at76c651_state *state = i2c_get_clientdata(client);
 
-       dvb_unregister_frontend_new(at76c651_ioctl, state->dvb);
+       dvb_unregister_frontend(at76c651_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index b81ab2180d9a9a51d7cebd09324c6d83ca1f6c3d..32e36122d278b55c841c98bb7f051e7bbd0efc77 100644 (file)
@@ -708,7 +708,7 @@ static int detach_client (struct i2c_client *client)
 {
        struct cx24110_state *state = i2c_get_clientdata(client);
 
-       dvb_unregister_frontend_new(cx24110_ioctl, state->dvb);
+       dvb_unregister_frontend(cx24110_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index 817b9744c23226d325924c1e65a0f0c86d6b3980..f9538ffa6745e49a2a88001c464610f56dbee020 100644 (file)
@@ -207,7 +207,7 @@ static int dvbdummyfe_detach_client(struct i2c_client *client)
 {
        struct dvb_adapter *dvb = i2c_get_clientdata(client);
 
-       dvb_unregister_frontend_new(dvbdummyfe_ioctl, dvb);
+       dvb_unregister_frontend(dvbdummyfe_ioctl, dvb);
        i2c_detach_client(client);
        kfree(client);
        return 0;
index d713fc7b933fd2590293626499f366276ad2d76b..ea8b26fd2e504a8483810d7348b8d7bc13e66192 100644 (file)
@@ -684,7 +684,7 @@ static int l64781_detach_client(struct i2c_client *client)
 {
        struct l64781_state *state = i2c_get_clientdata(client);
 
-       dvb_unregister_frontend_new(l64781_ioctl, state->dvb);
+       dvb_unregister_frontend(l64781_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index cb21a225506d4e07defdaaab9627a150fdf62bc3..64a6c512f9d9bbdeb7117cf5c0e93b7c72073313 100644 (file)
@@ -492,7 +492,7 @@ static int tda8083_detach_client(struct i2c_client *client)
 {
        struct tda8083_state *state = i2c_get_clientdata(client);
 
-       dvb_unregister_frontend_new (tda8083_ioctl, state->dvb);
+       dvb_unregister_frontend (tda8083_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index f50ab2945835560a5fa594bce0b590e248bbf6fe..db003e12d908c2757135bcc70910d48bd9335d03 100644 (file)
@@ -845,7 +845,7 @@ static int mt312_detach_client(struct i2c_client *client)
 
        dprintk ("%s\n", __FUNCTION__);
 
-       dvb_unregister_frontend_new (mt312_ioctl, state->dvb);
+       dvb_unregister_frontend (mt312_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index 4d90256289363cba2c3e47779e12d16d4af646a5..f855d7dfadeedf8531c91499e2986c416954c77c 100644 (file)
@@ -840,7 +840,7 @@ static int mt352_detach_client(struct i2c_client *client)
 {
        struct mt352_state *state = i2c_get_clientdata(client);
 
-       dvb_unregister_frontend_new (mt352_ioctl, state->dvb);
+       dvb_unregister_frontend (mt352_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index 982a3788b74a67e1dc914c6c53a62ea27bf25d6c..8b342dc95f4944173c52cc1ecbeaaef0f2308e88 100644 (file)
@@ -872,7 +872,7 @@ out:
 static int detach_client(struct i2c_client *client)
 {
        struct nxt6000_config *state = (struct nxt6000_config *) i2c_get_clientdata(client);
-       dvb_unregister_frontend_new(nxt6000_ioctl, state->dvb);
+       dvb_unregister_frontend(nxt6000_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index 26340d63c62abf9e2799ddea67e49f0edd2e5aee..ab146acdd33d046a6e25bc5950793e1a6203a195 100644 (file)
@@ -1414,7 +1414,7 @@ static int detach_client(struct i2c_client *client)
 {
        struct stv0299_state *state = (struct stv0299_state*)i2c_get_clientdata(client);
 
-       dvb_unregister_frontend_new (uni0299_ioctl, state->dvb);
+       dvb_unregister_frontend (uni0299_ioctl, state->dvb);
        i2c_detach_client(client);
        kfree(client);
        kfree(state);
index de7d0b59b22d7a510be61df05c8daedd3a694b7b..40f9b6910e1297ec9f0b07c2ca83dd31d632e8e8 100644 (file)
@@ -578,7 +578,7 @@ static int attach_adapter(struct i2c_adapter *adapter)
 static int detach_client(struct i2c_client *client)
 {
        struct ves1820_state *state = (struct ves1820_state *) i2c_get_clientdata(client);
-       dvb_unregister_frontend_new(ves1820_ioctl, state->dvb);
+       dvb_unregister_frontend(ves1820_ioctl, state->dvb);
        device_remove_file(&client->dev, &dev_attr_client_name);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
index 64ebf16a673ca7db89cae2d736d887a54842729c..83d7f6a9006a1578fea2e6c4148bf3edea5030cd 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/slab.h>
+#include <linux/delay.h>
 
 #include "dvb_frontend.h"
 
@@ -48,7 +49,7 @@ static struct dvb_frontend_info ves1x93_info = {
        .type                   = FE_QPSK,
        .frequency_min          = 950000,
        .frequency_max          = 2150000,
-       .frequency_stepsize     = 250,           /* kHz for QPSK frontends */
+       .frequency_stepsize     = 125,           /* kHz for QPSK frontends */
        .frequency_tolerance    = 29500,
        .symbol_rate_min        = 1000000,
        .symbol_rate_max        = 45000000,
@@ -170,10 +171,26 @@ static int tuner_write (struct i2c_adapter *i2c, u8 *data, u8 len)
  *   set up the downconverter frequency divisor for a
  *   reference clock comparision frequency of 125 kHz.
  */
-static int sp5659_set_tv_freq (struct i2c_adapter *i2c, u32 freq, u8 pwr)
+static int sp5659_set_tv_freq (struct i2c_adapter *i2c, u32 freq)
 {
+       u8 pwr = 0;
+       u8 buf[4];
         u32 div = (freq + 479500) / 125;
-       u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x95, (pwr << 5) | 0x30 };
+
+       if (freq > 2000000) pwr = 3;
+       else if (freq > 1800000) pwr = 2;
+       else if (freq > 1600000) pwr = 1;
+       else if (freq > 1200000) pwr = 0;
+       else if (freq >= 1100000) pwr = 1;
+       else pwr = 2;
+
+       buf[0] = (div >> 8) & 0x7f;
+       buf[1] = div & 0xff;
+       buf[2] = ((div & 0x18000) >> 10) | 0x95;
+       buf[3] = (pwr << 6) | 0x30;
+
+       // NOTE: since we're using a prescaler of 2, we set the
+       // divisor frequency to 62.5kHz and divide by 125 above
 
        return tuner_write (i2c, buf, sizeof(buf));
 }
@@ -195,10 +212,10 @@ static int tsa5059_set_tv_freq (struct i2c_adapter *i2c, u32 freq)
 }
 
 
-static int tuner_set_tv_freq (struct i2c_adapter *i2c, u32 freq, u8 pwr)
+static int tuner_set_tv_freq (struct i2c_adapter *i2c, u32 freq)
 {
        if ((demod_type == DEMOD_VES1893) && (board_type == BOARD_SIEMENS_PCI))
-               return sp5659_set_tv_freq (i2c, freq, pwr);
+               return sp5659_set_tv_freq (i2c, freq);
        else if (demod_type == DEMOD_VES1993)
                return tsa5059_set_tv_freq (i2c, freq);
 
@@ -252,17 +269,10 @@ static int ves1x93_init (struct i2c_adapter *i2c)
 
 static int ves1x93_clr_bit (struct i2c_adapter *i2c)
 {
+       msleep(10);
         ves1x93_writereg (i2c, 0, init_1x93_tab[0] & 0xfe);
         ves1x93_writereg (i2c, 0, init_1x93_tab[0]);
-       msleep(5);
-       return 0;
-}
-
-static int ves1x93_init_aquire (struct i2c_adapter *i2c)
-{
-        ves1x93_writereg (i2c, 3, 0x00);
-       ves1x93_writereg (i2c, 3, init_1x93_tab[3]);
-       msleep(5);
+       msleep(50);
        return 0;
 }
 
@@ -414,26 +424,6 @@ static int ves1x93_set_symbolrate (struct i2c_adapter *i2c, u32 srate)
        return 0;
 }
 
-
-static int ves1x93_afc (struct i2c_adapter *i2c, u32 freq, u32 srate)
-{
-       int afc;
-
-       afc = ((int)((ves1x93_readreg (i2c, 0x0a) << 1) & 0xff))/2;
-       afc = (afc * (int)(srate/1000/8))/16;
-    
-       if (afc) {
-       
-               freq -= afc;
-
-               tuner_set_tv_freq (i2c, freq, 0);
-
-               ves1x93_init_aquire (i2c);
-       }
-       
-       return 0;
-}
-
 static int ves1x93_set_voltage (struct i2c_adapter *i2c, fe_sec_voltage_t voltage)
 {
        switch (voltage) {
@@ -464,6 +454,21 @@ static int ves1x93_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
                fe_status_t *status = arg;
                u8 sync = ves1x93_readreg (i2c, 0x0e);
 
+               /*
+                * The ves1893 sometimes returns sync values that make no sense,
+                * because, e.g., the SIGNAL bit is 0, while some of the higher
+                * bits are 1 (and how can there be a CARRIER w/o a SIGNAL?).
+                * Tests showed that the the VITERBI and SYNC bits are returned
+                * reliably, while the SIGNAL and CARRIER bits ar sometimes wrong.
+                * If such a case occurs, we read the value again, until we get a
+                * valid value.
+                */
+               int maxtry = 10; /* just for safety - let's not get stuck here */
+               while ((sync & 0x03) != 0x03 && (sync & 0x0c) && maxtry--) {
+                       msleep(10);
+                       sync = ves1x93_readreg (i2c, 0x0e);
+               }
+
                *status = 0;
 
                if (sync & 1)
@@ -525,11 +530,10 @@ static int ves1x93_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
         {
                struct dvb_frontend_parameters *p = arg;
 
-               tuner_set_tv_freq (i2c, p->frequency, 0);
+               tuner_set_tv_freq (i2c, p->frequency);
                ves1x93_set_inversion (i2c, p->inversion);
                ves1x93_set_fec (i2c, p->u.qpsk.fec_inner);
                ves1x93_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
-               ves1x93_afc (i2c, p->frequency, p->u.qpsk.symbol_rate);     
                state->inversion = p->inversion;
                 break;
         }
@@ -650,7 +654,7 @@ static int attach_adapter(struct i2c_adapter *adapter)
 static int detach_client(struct i2c_client *client)
 {
        struct ves1x93_state *state = (struct ves1x93_state*)i2c_get_clientdata(client);
-       dvb_unregister_frontend_new(ves1x93_ioctl, state->dvb);
+       dvb_unregister_frontend(ves1x93_ioctl, state->dvb);
        i2c_detach_client(client);
        BUG_ON(state->dvb);
        kfree(client);
index ec31f21f264b390da0e6fafb5d4e212763fee2b5..f46d10c015394f192d792e217defba253b6079ce 100644 (file)
@@ -1689,7 +1689,7 @@ static void ttusb_dec_init_frontend(struct ttusb_dec *dec)
 
 static void ttusb_dec_exit_frontend(struct ttusb_dec *dec)
 {
-       dvb_unregister_frontend_new(dec->frontend_ioctl, dec->adapter);
+       dvb_unregister_frontend(dec->frontend_ioctl, dec->adapter);
 }
 
 static void ttusb_dec_init_filters(struct ttusb_dec *dec)