T_ANALOG_TV, type, p->std);
 }
 
+static unsigned int demod_type [] = {
+       [XC3028_FE_DEFAULT]     = 0,
+       [XC3028_FE_LG60]        = LG60,
+       [XC3028_FE_ATI638]      = ATI638,
+       [XC3028_FE_OREN538]     = OREN538,
+       [XC3028_FE_OREN36]      = OREN36,
+       [XC3028_FE_TOYOTA388]   = TOYOTA388,
+       [XC3028_FE_TOYOTA794]   = TOYOTA794,
+       [XC3028_FE_DIBCOM52]    = DIBCOM52,
+       [XC3028_FE_ZARLINK456]  = ZARLINK456,
+       [XC3028_FE_CHINA]       = CHINA,
+};
+
 static int xc2028_set_params(struct dvb_frontend *fe,
                             struct dvb_frontend_parameters *p)
 {
                tuner_err("error: bandwidth not supported.\n");
        };
 
+       if (priv->ctrl.demod < 0 || priv->ctrl.demod > ARRAY_SIZE(demod_type))
+               tuner_err("error: demod type invalid. Assuming default.\n");
+       else
+               type |= demod_type[priv->ctrl.demod];
+
        return generic_set_freq(fe, p->frequency,
                                T_DIGITAL_TV, type, 0);
 }
 
 
 #define XC2028_DEFAULT_FIRMWARE "xc3028-v27.fw"
 
+enum xc2028_demod_types
+{
+       XC3028_FE_DEFAULT = 0,
+       XC3028_FE_LG60,         /* IF = 6.00 MHz */
+       XC3028_FE_ATI638,       /* IF = 6.38 MHz */
+       XC3028_FE_OREN538,      /* IF = 5.38 MHz */
+       XC3028_FE_OREN36,       /* IF = 3.60 MHz */
+       XC3028_FE_TOYOTA388,    /* IF = 3.88 MHz */
+       XC3028_FE_TOYOTA794,    /* IF = 7.94 MHz */
+       XC3028_FE_DIBCOM52,     /* IF = 5.20 MHz */
+       XC3028_FE_ZARLINK456,   /* IF = 4.56 MHz */
+       XC3028_FE_CHINA,        /* IF = 5.20 MHz */
+};
+
 struct xc2028_ctrl {
        char                    *fname;
        int                     max_len;
        unsigned int            mts   :1;
        unsigned int            d2633 :1;
        unsigned int            input1:1;
+       enum xc2028_demod_types demod;
 };
 
 struct xc2028_config {