fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / media / dvb / frontends / dvb_dummy_fe.c
index 6d9e610..6271b1e 100644 (file)
@@ -1,5 +1,5 @@
-/* 
- *  Driver for Dummy Frontend 
+/*
+ *  Driver for Dummy Frontend
  *
  *  Written by Emard <emard@softhome.net>
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.=
- */    
+ */
 
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/init.h>
+#include <linux/string.h>
+#include <linux/slab.h>
 
 #include "dvb_frontend.h"
+#include "dvb_dummy_fe.h"
 
-static int sct = 0;
 
+struct dvb_dummy_fe_state {
+       struct dvb_frontend frontend;
+};
 
-/* depending on module parameter sct deliver different infos
- */
 
-static struct dvb_frontend_info dvb_s_dummyfe_info = {
-       .name                   = "DVB-S dummy frontend",
-       .type                   = FE_QPSK,
-       .frequency_min          = 950000,
-       .frequency_max          = 2150000,
-       .frequency_stepsize     = 250,           /* kHz for QPSK frontends */
-       .frequency_tolerance    = 29500,
-       .symbol_rate_min        = 1000000,
-       .symbol_rate_max        = 45000000,
-/*      .symbol_rate_tolerance         = ???,*/
-       .notifier_delay          = 50,                /* 1/20 s */
-       .caps = FE_CAN_INVERSION_AUTO | 
-       FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-       FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
-       FE_CAN_QPSK
-};
+static int dvb_dummy_fe_read_status(struct dvb_frontend* fe, fe_status_t* status)
+{
+       *status = FE_HAS_SIGNAL
+               | FE_HAS_CARRIER
+               | FE_HAS_VITERBI
+               | FE_HAS_SYNC
+               | FE_HAS_LOCK;
 
-static struct dvb_frontend_info dvb_c_dummyfe_info = {
-       .name = "DVB-C dummy frontend",
-       .type = FE_QAM,
-       .frequency_stepsize = 62500,
-       .frequency_min = 51000000,
-       .frequency_max = 858000000,
-       .symbol_rate_min = (57840000/2)/64,     /* SACLK/64 == (XIN/2)/64 */
-       .symbol_rate_max = (57840000/2)/4,      /* SACLK/4 */
-#if 0
-       .frequency_tolerance    = ???,
-       .symbol_rate_tolerance  = ???,  /* ppm */  /* == 8% (spec p. 5) */
-       .notifier_delay         = ?,
-#endif
-       .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
-               FE_CAN_QAM_128 | FE_CAN_QAM_256 | 
-               FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO
-};
+       return 0;
+}
 
-static struct dvb_frontend_info dvb_t_dummyfe_info = {
-       .name = "DVB-T dummy frontend",
-       .type = FE_OFDM,
-       .frequency_min = 0,
-       .frequency_max = 863250000,
-       .frequency_stepsize = 62500,
-       /*.frequency_tolerance = */     /* FIXME: 12% of SR */
-       .symbol_rate_min = 0,           /* FIXME */
-       .symbol_rate_max = 9360000,     /* FIXME */
-       .symbol_rate_tolerance = 4000,
-       .notifier_delay = 0,
-       .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-                       FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
-                       FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
-                       FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-                       FE_CAN_TRANSMISSION_MODE_AUTO |
-                       FE_CAN_GUARD_INTERVAL_AUTO |
-                       FE_CAN_HIERARCHY_AUTO,
-};
+static int dvb_dummy_fe_read_ber(struct dvb_frontend* fe, u32* ber)
+{
+       *ber = 0;
+       return 0;
+}
 
-struct dvb_frontend_info *frontend_info(void)
+static int dvb_dummy_fe_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 {
-       switch(sct)
-       {
-       case 2:
-               return &dvb_t_dummyfe_info;
-       case 1:
-               return &dvb_c_dummyfe_info;
-       case 0:
-       default:
-               return &dvb_s_dummyfe_info;
-       }
+       *strength = 0;
+       return 0;
 }
 
+static int dvb_dummy_fe_read_snr(struct dvb_frontend* fe, u16* snr)
+{
+       *snr = 0;
+       return 0;
+}
 
-static int dvbdummyfe_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+static int dvb_dummy_fe_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-        switch (cmd) {
-        case FE_GET_INFO:
-               memcpy (arg, frontend_info(), 
-                       sizeof(struct dvb_frontend_info));
-               break;
-
-        case FE_READ_STATUS:
-       {
-               fe_status_t *status = arg;
-               *status = FE_HAS_SIGNAL
-                       | FE_HAS_CARRIER
-                       | FE_HAS_VITERBI
-                       | FE_HAS_SYNC
-                       | FE_HAS_LOCK;
-               break;
-       }
+       *ucblocks = 0;
+       return 0;
+}
 
-        case FE_READ_BER:
-       {
-               u32 *ber = (u32 *) arg;
-               *ber = 0;
-               break;
-       }
+static int dvb_dummy_fe_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
+{
+       return 0;
+}
 
-        case FE_READ_SIGNAL_STRENGTH:
-       {
-               u8 signal = 0xff;
-               *((u16*) arg) = (signal << 8) | signal;
-               break;
+static int dvb_dummy_fe_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
+{
+       if (fe->ops->tuner_ops->set_params) {
+               fe->ops->tuner_ops->set_params(fe, p);
+               if (fe->ops->i2c_gate_ctrl) fe->ops->i2c_gate_ctrl(fe, 0);
        }
 
-        case FE_READ_SNR:
-       {
-               u8 snr = 0xf0;
-               *(u16*) arg = (snr << 8) | snr;
-               break;
-       }
+       return 0;
+}
 
-       case FE_READ_UNCORRECTED_BLOCKS: 
-               *(u32*) arg = 0;
-               break;
+static int dvb_dummy_fe_sleep(struct dvb_frontend* fe)
+{
+       return 0;
+}
 
-        case FE_SET_FRONTEND:
-                break;
+static int dvb_dummy_fe_init(struct dvb_frontend* fe)
+{
+       return 0;
+}
 
-       case FE_GET_FRONTEND:
-               break;
+static int dvb_dummy_fe_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
+{
+       return 0;
+}
 
-        case FE_SLEEP:
-               return 0;
+static int dvb_dummy_fe_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage)
+{
+       return 0;
+}
 
-        case FE_INIT:
-               return 0;
+static void dvb_dummy_fe_release(struct dvb_frontend* fe)
+{
+       struct dvb_dummy_fe_state* state = fe->demodulator_priv;
+       kfree(state);
+}
 
-       case FE_SET_TONE:
-               return -EOPNOTSUPP;
+static struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops;
 
-       case FE_SET_VOLTAGE:
-               return 0;
+struct dvb_frontend* dvb_dummy_fe_ofdm_attach(void)
+{
+       struct dvb_dummy_fe_state* state = NULL;
 
-       default:
-               return -EOPNOTSUPP;
-        }
-        return 0;
-} 
+       /* allocate memory for the internal state */
+       state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
+       if (state == NULL) goto error;
 
+       /* create dvb_frontend */
+       memcpy(&state->frontend.ops, &dvb_dummy_fe_ofdm_ops, sizeof(struct dvb_frontend_ops));
+       state->frontend.demodulator_priv = state;
+       return &state->frontend;
 
-static int dvbdummyfe_attach (struct dvb_i2c_bus *i2c, void **data)
-{
-       return dvb_register_frontend (dvbdummyfe_ioctl, i2c, NULL, frontend_info());
+error:
+       kfree(state);
+       return NULL;
 }
 
+static struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops;
 
-static void dvbdummyfe_detach (struct dvb_i2c_bus *i2c, void *data)
+struct dvb_frontend* dvb_dummy_fe_qpsk_attach()
 {
-       dvb_unregister_frontend (dvbdummyfe_ioctl, i2c);
-}
+       struct dvb_dummy_fe_state* state = NULL;
 
+       /* allocate memory for the internal state */
+       state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
+       if (state == NULL) goto error;
 
-static int __init init_dvbdummyfe (void)
-{
-       return dvb_register_i2c_device (THIS_MODULE,
-                                       dvbdummyfe_attach, 
-                                       dvbdummyfe_detach);
+       /* create dvb_frontend */
+       memcpy(&state->frontend.ops, &dvb_dummy_fe_qpsk_ops, sizeof(struct dvb_frontend_ops));
+       state->frontend.demodulator_priv = state;
+       return &state->frontend;
+
+error:
+       kfree(state);
+       return NULL;
 }
 
+static struct dvb_frontend_ops dvb_dummy_fe_qam_ops;
 
-static void __exit exit_dvbdummyfe (void)
+struct dvb_frontend* dvb_dummy_fe_qam_attach()
 {
-       dvb_unregister_i2c_device (dvbdummyfe_attach);
+       struct dvb_dummy_fe_state* state = NULL;
+
+       /* allocate memory for the internal state */
+       state = kmalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
+       if (state == NULL) goto error;
+
+       /* create dvb_frontend */
+       memcpy(&state->frontend.ops, &dvb_dummy_fe_qam_ops, sizeof(struct dvb_frontend_ops));
+       state->frontend.demodulator_priv = state;
+       return &state->frontend;
+
+error:
+       kfree(state);
+       return NULL;
 }
 
+static struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops = {
+
+       .info = {
+               .name                   = "Dummy DVB-T",
+               .type                   = FE_OFDM,
+               .frequency_min          = 0,
+               .frequency_max          = 863250000,
+               .frequency_stepsize     = 62500,
+               .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+                               FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
+                               FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
+                               FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+                               FE_CAN_TRANSMISSION_MODE_AUTO |
+                               FE_CAN_GUARD_INTERVAL_AUTO |
+                               FE_CAN_HIERARCHY_AUTO,
+       },
+
+       .release = dvb_dummy_fe_release,
+
+       .init = dvb_dummy_fe_init,
+       .sleep = dvb_dummy_fe_sleep,
+
+       .set_frontend = dvb_dummy_fe_set_frontend,
+       .get_frontend = dvb_dummy_fe_get_frontend,
+
+       .read_status = dvb_dummy_fe_read_status,
+       .read_ber = dvb_dummy_fe_read_ber,
+       .read_signal_strength = dvb_dummy_fe_read_signal_strength,
+       .read_snr = dvb_dummy_fe_read_snr,
+       .read_ucblocks = dvb_dummy_fe_read_ucblocks,
+};
 
-module_init(init_dvbdummyfe);
-module_exit(exit_dvbdummyfe);
+static struct dvb_frontend_ops dvb_dummy_fe_qam_ops = {
+
+       .info = {
+               .name                   = "Dummy DVB-C",
+               .type                   = FE_QAM,
+               .frequency_stepsize     = 62500,
+               .frequency_min          = 51000000,
+               .frequency_max          = 858000000,
+               .symbol_rate_min        = (57840000/2)/64,     /* SACLK/64 == (XIN/2)/64 */
+               .symbol_rate_max        = (57840000/2)/4,      /* SACLK/4 */
+               .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
+                       FE_CAN_QAM_128 | FE_CAN_QAM_256 |
+                       FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO
+       },
+
+       .release = dvb_dummy_fe_release,
+
+       .init = dvb_dummy_fe_init,
+       .sleep = dvb_dummy_fe_sleep,
+
+       .set_frontend = dvb_dummy_fe_set_frontend,
+       .get_frontend = dvb_dummy_fe_get_frontend,
+
+       .read_status = dvb_dummy_fe_read_status,
+       .read_ber = dvb_dummy_fe_read_ber,
+       .read_signal_strength = dvb_dummy_fe_read_signal_strength,
+       .read_snr = dvb_dummy_fe_read_snr,
+       .read_ucblocks = dvb_dummy_fe_read_ucblocks,
+};
 
+static struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops = {
+
+       .info = {
+               .name                   = "Dummy DVB-S",
+               .type                   = FE_QPSK,
+               .frequency_min          = 950000,
+               .frequency_max          = 2150000,
+               .frequency_stepsize     = 250,           /* kHz for QPSK frontends */
+               .frequency_tolerance    = 29500,
+               .symbol_rate_min        = 1000000,
+               .symbol_rate_max        = 45000000,
+               .caps = FE_CAN_INVERSION_AUTO |
+                       FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+                       FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
+                       FE_CAN_QPSK
+       },
+
+       .release = dvb_dummy_fe_release,
+
+       .init = dvb_dummy_fe_init,
+       .sleep = dvb_dummy_fe_sleep,
+
+       .set_frontend = dvb_dummy_fe_set_frontend,
+       .get_frontend = dvb_dummy_fe_get_frontend,
+
+       .read_status = dvb_dummy_fe_read_status,
+       .read_ber = dvb_dummy_fe_read_ber,
+       .read_signal_strength = dvb_dummy_fe_read_signal_strength,
+       .read_snr = dvb_dummy_fe_read_snr,
+       .read_ucblocks = dvb_dummy_fe_read_ucblocks,
+
+       .set_voltage = dvb_dummy_fe_set_voltage,
+       .set_tone = dvb_dummy_fe_set_tone,
+};
 
 MODULE_DESCRIPTION("DVB DUMMY Frontend");
 MODULE_AUTHOR("Emard");
 MODULE_LICENSE("GPL");
-MODULE_PARM(sct, "i");
+
+EXPORT_SYMBOL(dvb_dummy_fe_ofdm_attach);
+EXPORT_SYMBOL(dvb_dummy_fe_qam_attach);
+EXPORT_SYMBOL(dvb_dummy_fe_qpsk_attach);