Hi,

On Mon, Dec 09, 2002 at 12:00:28PM +0100, Holger Waechtler wrote:
> unfortunally this is a pretty bad solution if you have multiple cards 
> with different stv0299 based tuner modules - you can't load the same 
> module multiple times with different module parameters.
> 
> We have to implement some autoprobing as you can see it in ves1820.c.

here is a patch against my modified BSRU6 driver (sent Dec 08 2002)
that adds autoprobing.

Peter


---------------------------------------------------------------------------

--- uni_stv0299.c.orig  Sun Dec 22 22:16:04 2002
+++ uni_stv0299.c       Sun Dec 22 22:46:27 2002
@@ -39,9 +39,9 @@
 #define dprintk        if (debug) printk
 
 /* frontend types */
+#define UNKNOWN_FRONTEND  -1
 #define PHILIPS_SU1278SH   0
 #define ALPS_BSRU6         1
-static int ftype = 0;
 
 /* Master Clock = 88 MHz */
 #define M_CLK (88000000UL) 
@@ -231,7 +231,7 @@
 
 
 static
-int tsa5059_write (struct dvb_i2c_bus *i2c, u8 data [4])
+int tsa5059_write (struct dvb_i2c_bus *i2c, u8 data [4], int ftype)
 {
        int ret;
        u8 rpt1 [] = { 0x05, 0xb5 };  /*  enable i2c repeater on stv0299  */
@@ -255,7 +255,7 @@
  *   reference clock comparision frequency of 125 kHz.
  */
 static
-int tsa5059_set_tv_freq        (struct dvb_i2c_bus *i2c, u32 freq)
+int tsa5059_set_tv_freq        (struct dvb_i2c_bus *i2c, u32 freq, int ftype)
 {
         u32 div = freq / 125;
 
@@ -270,7 +270,7 @@
 
        dprintk ("%s\n", __FUNCTION__);
 
-       return tsa5059_write (i2c, buf);
+       return tsa5059_write (i2c, buf, ftype);
 }
 
 
@@ -296,7 +296,7 @@
 
 
 static
-int stv0299_init (struct dvb_i2c_bus *i2c)
+int stv0299_init (struct dvb_i2c_bus *i2c, int ftype)
 {
        int i;
 
@@ -591,6 +591,7 @@
 static
 int uni0299_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
 {
+        int tuner_type = (int)fe->data;
        struct dvb_i2c_bus *i2c = fe->i2c;
 
        dprintk ("%s\n", __FUNCTION__);
@@ -663,7 +664,7 @@
         {
                struct dvb_frontend_parameters *p = arg;
 
-               tsa5059_set_tv_freq (i2c, p->frequency);
+               tsa5059_set_tv_freq (i2c, p->frequency, tuner_type);
                 stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
                 stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
                stv0299_check_inversion (i2c);
@@ -703,7 +704,7 @@
                break;
 
         case FE_INIT:
-               return stv0299_init (i2c);
+               return stv0299_init (i2c, tuner_type);
 
         case FE_RESET:
                stv0299_writereg (i2c, 0x22, 0x00);
@@ -731,11 +732,38 @@
        return 0;
 }
 
+static
+int probe_tuner (struct dvb_i2c_bus *i2c)
+{
+       int type;
 
+        /* read the status register of TSA5059 */
+       u8 rpt[] = { 0x05, 0xb5 };
+        u8 stat [] = { 0 };
+       struct i2c_msg msg1 [] = {{ addr: 0x68, flags: 0,        buf: rpt,  len: 2 },
+                                  { addr: 0x60, flags: I2C_M_RD, buf: stat, len: 1 }};
+       struct i2c_msg msg2 [] = {{ addr: 0x68, flags: 0,        buf: rpt,  len: 2 },
+                                  { addr: 0x61, flags: I2C_M_RD, buf: stat, len: 1 }};
+
+       if (i2c->xfer(i2c, msg1, 2) == 2) {
+               type = PHILIPS_SU1278SH;
+               printk ("%s: setup for tuner SU1278/SH\n", __FILE__);
+       } else if (i2c->xfer(i2c, msg2, 2) == 2) {
+               type = ALPS_BSRU6;
+               printk ("%s: setup for tuner BSRU6, TDQB-S00x, SU1278\n", __FILE__);
+       } else {
+               type = UNKNOWN_FRONTEND;
+               printk ("%s: unknown PLL synthesizer, "
+                       "please report to <[EMAIL PROTECTED]>!!\n",
+                       __FILE__);
+       }
+       return type;
+}
 
 static
 int uni0299_attach (struct dvb_i2c_bus *i2c)
 {
+        int tuner_type;
        u8 id = stv0299_readreg (i2c, 0x00);
 
        dprintk ("%s\n", __FUNCTION__);
@@ -744,7 +772,10 @@
        if (id != 0xa1)
          return -ENODEV;
 
-       dvb_register_frontend (uni0299_ioctl, i2c, NULL, &uni0299_info);
+       if ((tuner_type = probe_tuner(i2c)) < 0)
+               return -ENODEV;
+
+       dvb_register_frontend (uni0299_ioctl, i2c, (void*)tuner_type, &uni0299_info);
 
        return 0;
 }
@@ -782,9 +813,7 @@
 MODULE_PARM(debug,"i");
 MODULE_PARM_DESC(debug, "enable verbose debug messages");
 
-MODULE_PARM(ftype,"i");
-MODULE_PARM_DESC(type, "frontend type");
-
 MODULE_DESCRIPTION("Universal STV0299/TSA5059 DVB Frontend driver");
 MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann");
 MODULE_LICENSE("GPL");
+


-- 
Info:
To unsubscribe send a mail to [EMAIL PROTECTED] with "unsubscribe linux-dvb" as 
subject.

Reply via email to