tda10086_write_byte(state, 0x32, 0x00); // irq off
        tda10086_write_byte(state, 0x31, 0x56); // setup AFC
 
-       // setup PLL (assumes 16Mhz XIN)
+       // setup PLL (this assumes SACLK = 96MHz)
        tda10086_write_byte(state, 0x55, 0x2c); // misc PLL setup
-       tda10086_write_byte(state, 0x3a, 0x0b); // M=12
-       tda10086_write_byte(state, 0x3b, 0x01); // P=2
+       if (state->config->xtal_freq == TDA10086_XTAL_16M) {
+               tda10086_write_byte(state, 0x3a, 0x0b); // M=12
+               tda10086_write_byte(state, 0x3b, 0x01); // P=2
+       } else {
+               tda10086_write_byte(state, 0x3a, 0x17); // M=24
+               tda10086_write_byte(state, 0x3b, 0x00); // P=1
+       }
        tda10086_write_mask(state, 0x55, 0x20, 0x00); // powerup PLL
 
        // setup TS interface
 
 #include <linux/dvb/frontend.h>
 #include <linux/firmware.h>
 
+enum tda10086_xtal {
+       TDA10086_XTAL_16M,
+       TDA10086_XTAL_4M
+};
+
 struct tda10086_config
 {
        /* the demodulator's i2c address */
 
        /* do we need the diseqc signal with carrier? */
        u8 diseqc_tone;
+
+       /* frequency of the reference xtal */
+       enum tda10086_xtal xtal_freq;
 };
 
 #if defined(CONFIG_DVB_TDA10086) || (defined(CONFIG_DVB_TDA10086_MODULE) && defined(MODULE))
 
        .demod_address = 0x0e,
        .invert = 0,
        .diseqc_tone = 0,
+       .xtal_freq = TDA10086_XTAL_16M,
+};
+
+static struct tda10086_config sd1878_4m = {
+       .demod_address = 0x0e,
+       .invert = 0,
+       .diseqc_tone = 0,
+       .xtal_freq = TDA10086_XTAL_4M,
 };
 
 /* ------------------------------------------------------------------
                break;
        case SAA7134_BOARD_MD7134_BRIDGE_2:
                dev->dvb.frontend = dvb_attach(tda10086_attach,
-                                               &flydvbs, &dev->i2c_adap);
+                                               &sd1878_4m, &dev->i2c_adap);
                if (dev->dvb.frontend) {
                        struct dvb_frontend *fe;
                        if (dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60,