Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Driver for Dummy Frontend
0004  *
0005  *  Written by Emard <emard@softhome.net>
0006  */
0007 
0008 #include <linux/module.h>
0009 #include <linux/init.h>
0010 #include <linux/string.h>
0011 #include <linux/slab.h>
0012 
0013 #include <media/dvb_frontend.h>
0014 #include "dvb_dummy_fe.h"
0015 
0016 
0017 struct dvb_dummy_fe_state {
0018     struct dvb_frontend frontend;
0019 };
0020 
0021 
0022 static int dvb_dummy_fe_read_status(struct dvb_frontend *fe,
0023                     enum fe_status *status)
0024 {
0025     *status = FE_HAS_SIGNAL
0026         | FE_HAS_CARRIER
0027         | FE_HAS_VITERBI
0028         | FE_HAS_SYNC
0029         | FE_HAS_LOCK;
0030 
0031     return 0;
0032 }
0033 
0034 static int dvb_dummy_fe_read_ber(struct dvb_frontend *fe, u32 *ber)
0035 {
0036     *ber = 0;
0037     return 0;
0038 }
0039 
0040 static int dvb_dummy_fe_read_signal_strength(struct dvb_frontend *fe,
0041                          u16 *strength)
0042 {
0043     *strength = 0;
0044     return 0;
0045 }
0046 
0047 static int dvb_dummy_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
0048 {
0049     *snr = 0;
0050     return 0;
0051 }
0052 
0053 static int dvb_dummy_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
0054 {
0055     *ucblocks = 0;
0056     return 0;
0057 }
0058 
0059 /*
0060  * Should only be implemented if it actually reads something from the hardware.
0061  * Also, it should check for the locks, in order to avoid report wrong data
0062  * to userspace.
0063  */
0064 static int dvb_dummy_fe_get_frontend(struct dvb_frontend *fe,
0065                      struct dtv_frontend_properties *p)
0066 {
0067     return 0;
0068 }
0069 
0070 static int dvb_dummy_fe_set_frontend(struct dvb_frontend *fe)
0071 {
0072     if (fe->ops.tuner_ops.set_params) {
0073         fe->ops.tuner_ops.set_params(fe);
0074         if (fe->ops.i2c_gate_ctrl)
0075             fe->ops.i2c_gate_ctrl(fe, 0);
0076     }
0077 
0078     return 0;
0079 }
0080 
0081 static int dvb_dummy_fe_sleep(struct dvb_frontend *fe)
0082 {
0083     return 0;
0084 }
0085 
0086 static int dvb_dummy_fe_init(struct dvb_frontend *fe)
0087 {
0088     return 0;
0089 }
0090 
0091 static int dvb_dummy_fe_set_tone(struct dvb_frontend *fe,
0092                  enum fe_sec_tone_mode tone)
0093 {
0094     return 0;
0095 }
0096 
0097 static int dvb_dummy_fe_set_voltage(struct dvb_frontend *fe,
0098                     enum fe_sec_voltage voltage)
0099 {
0100     return 0;
0101 }
0102 
0103 static void dvb_dummy_fe_release(struct dvb_frontend *fe)
0104 {
0105     struct dvb_dummy_fe_state *state = fe->demodulator_priv;
0106 
0107     kfree(state);
0108 }
0109 
0110 static const struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops;
0111 
0112 struct dvb_frontend *dvb_dummy_fe_ofdm_attach(void)
0113 {
0114     struct dvb_dummy_fe_state *state = NULL;
0115 
0116     /* allocate memory for the internal state */
0117     state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
0118     if (!state)
0119         return NULL;
0120 
0121     /* create dvb_frontend */
0122     memcpy(&state->frontend.ops,
0123            &dvb_dummy_fe_ofdm_ops,
0124            sizeof(struct dvb_frontend_ops));
0125 
0126     state->frontend.demodulator_priv = state;
0127     return &state->frontend;
0128 }
0129 EXPORT_SYMBOL(dvb_dummy_fe_ofdm_attach);
0130 
0131 static const struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops;
0132 
0133 struct dvb_frontend *dvb_dummy_fe_qpsk_attach(void)
0134 {
0135     struct dvb_dummy_fe_state *state = NULL;
0136 
0137     /* allocate memory for the internal state */
0138     state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
0139     if (!state)
0140         return NULL;
0141 
0142     /* create dvb_frontend */
0143     memcpy(&state->frontend.ops,
0144            &dvb_dummy_fe_qpsk_ops,
0145            sizeof(struct dvb_frontend_ops));
0146 
0147     state->frontend.demodulator_priv = state;
0148     return &state->frontend;
0149 }
0150 EXPORT_SYMBOL(dvb_dummy_fe_qpsk_attach);
0151 
0152 static const struct dvb_frontend_ops dvb_dummy_fe_qam_ops;
0153 
0154 struct dvb_frontend *dvb_dummy_fe_qam_attach(void)
0155 {
0156     struct dvb_dummy_fe_state *state = NULL;
0157 
0158     /* allocate memory for the internal state */
0159     state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
0160     if (!state)
0161         return NULL;
0162 
0163     /* create dvb_frontend */
0164     memcpy(&state->frontend.ops,
0165            &dvb_dummy_fe_qam_ops,
0166            sizeof(struct dvb_frontend_ops));
0167 
0168     state->frontend.demodulator_priv = state;
0169     return &state->frontend;
0170 }
0171 EXPORT_SYMBOL(dvb_dummy_fe_qam_attach);
0172 
0173 static const struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops = {
0174     .delsys = { SYS_DVBT },
0175     .info = {
0176         .name           = "Dummy DVB-T",
0177         .frequency_min_hz   = 0,
0178         .frequency_max_hz   = 863250 * kHz,
0179         .frequency_stepsize_hz  = 62500,
0180         .caps = FE_CAN_FEC_1_2 |
0181             FE_CAN_FEC_2_3 |
0182             FE_CAN_FEC_3_4 |
0183             FE_CAN_FEC_4_5 |
0184             FE_CAN_FEC_5_6 |
0185             FE_CAN_FEC_6_7 |
0186             FE_CAN_FEC_7_8 |
0187             FE_CAN_FEC_8_9 |
0188             FE_CAN_FEC_AUTO |
0189             FE_CAN_QAM_16 |
0190             FE_CAN_QAM_64 |
0191             FE_CAN_QAM_AUTO |
0192             FE_CAN_TRANSMISSION_MODE_AUTO |
0193             FE_CAN_GUARD_INTERVAL_AUTO |
0194             FE_CAN_HIERARCHY_AUTO,
0195     },
0196 
0197     .release = dvb_dummy_fe_release,
0198 
0199     .init = dvb_dummy_fe_init,
0200     .sleep = dvb_dummy_fe_sleep,
0201 
0202     .set_frontend = dvb_dummy_fe_set_frontend,
0203     .get_frontend = dvb_dummy_fe_get_frontend,
0204 
0205     .read_status = dvb_dummy_fe_read_status,
0206     .read_ber = dvb_dummy_fe_read_ber,
0207     .read_signal_strength = dvb_dummy_fe_read_signal_strength,
0208     .read_snr = dvb_dummy_fe_read_snr,
0209     .read_ucblocks = dvb_dummy_fe_read_ucblocks,
0210 };
0211 
0212 static const struct dvb_frontend_ops dvb_dummy_fe_qam_ops = {
0213     .delsys = { SYS_DVBC_ANNEX_A },
0214     .info = {
0215         .name           = "Dummy DVB-C",
0216         .frequency_min_hz   =  51 * MHz,
0217         .frequency_max_hz   = 858 * MHz,
0218         .frequency_stepsize_hz  = 62500,
0219         /* symbol_rate_min: SACLK/64 == (XIN/2)/64 */
0220         .symbol_rate_min    = (57840000 / 2) / 64,
0221         .symbol_rate_max    = (57840000 / 2) / 4,   /* SACLK/4 */
0222         .caps = FE_CAN_QAM_16 |
0223             FE_CAN_QAM_32 |
0224             FE_CAN_QAM_64 |
0225             FE_CAN_QAM_128 |
0226             FE_CAN_QAM_256 |
0227             FE_CAN_FEC_AUTO |
0228             FE_CAN_INVERSION_AUTO
0229     },
0230 
0231     .release = dvb_dummy_fe_release,
0232 
0233     .init = dvb_dummy_fe_init,
0234     .sleep = dvb_dummy_fe_sleep,
0235 
0236     .set_frontend = dvb_dummy_fe_set_frontend,
0237     .get_frontend = dvb_dummy_fe_get_frontend,
0238 
0239     .read_status = dvb_dummy_fe_read_status,
0240     .read_ber = dvb_dummy_fe_read_ber,
0241     .read_signal_strength = dvb_dummy_fe_read_signal_strength,
0242     .read_snr = dvb_dummy_fe_read_snr,
0243     .read_ucblocks = dvb_dummy_fe_read_ucblocks,
0244 };
0245 
0246 static const struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops = {
0247     .delsys = { SYS_DVBS },
0248     .info = {
0249         .name           = "Dummy DVB-S",
0250         .frequency_min_hz   =  950 * MHz,
0251         .frequency_max_hz   = 2150 * MHz,
0252         .frequency_stepsize_hz  = 250 * kHz,
0253         .frequency_tolerance_hz = 29500 * kHz,
0254         .symbol_rate_min    = 1000000,
0255         .symbol_rate_max    = 45000000,
0256         .caps = FE_CAN_INVERSION_AUTO |
0257             FE_CAN_FEC_1_2 |
0258             FE_CAN_FEC_2_3 |
0259             FE_CAN_FEC_3_4 |
0260             FE_CAN_FEC_5_6 |
0261             FE_CAN_FEC_7_8 |
0262             FE_CAN_FEC_AUTO |
0263             FE_CAN_QPSK
0264     },
0265 
0266     .release = dvb_dummy_fe_release,
0267 
0268     .init = dvb_dummy_fe_init,
0269     .sleep = dvb_dummy_fe_sleep,
0270 
0271     .set_frontend = dvb_dummy_fe_set_frontend,
0272     .get_frontend = dvb_dummy_fe_get_frontend,
0273 
0274     .read_status = dvb_dummy_fe_read_status,
0275     .read_ber = dvb_dummy_fe_read_ber,
0276     .read_signal_strength = dvb_dummy_fe_read_signal_strength,
0277     .read_snr = dvb_dummy_fe_read_snr,
0278     .read_ucblocks = dvb_dummy_fe_read_ucblocks,
0279 
0280     .set_voltage = dvb_dummy_fe_set_voltage,
0281     .set_tone = dvb_dummy_fe_set_tone,
0282 };
0283 
0284 MODULE_DESCRIPTION("DVB DUMMY Frontend");
0285 MODULE_AUTHOR("Emard");
0286 MODULE_LICENSE("GPL");