dvb_dummy_fe.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Driver for Dummy Frontend
  4. *
  5. * Written by Emard <[email protected]>
  6. */
  7. #include <linux/module.h>
  8. #include <linux/init.h>
  9. #include <linux/string.h>
  10. #include <linux/slab.h>
  11. #include <media/dvb_frontend.h>
  12. #include "dvb_dummy_fe.h"
  13. struct dvb_dummy_fe_state {
  14. struct dvb_frontend frontend;
  15. };
  16. static int dvb_dummy_fe_read_status(struct dvb_frontend *fe,
  17. enum fe_status *status)
  18. {
  19. *status = FE_HAS_SIGNAL
  20. | FE_HAS_CARRIER
  21. | FE_HAS_VITERBI
  22. | FE_HAS_SYNC
  23. | FE_HAS_LOCK;
  24. return 0;
  25. }
  26. static int dvb_dummy_fe_read_ber(struct dvb_frontend *fe, u32 *ber)
  27. {
  28. *ber = 0;
  29. return 0;
  30. }
  31. static int dvb_dummy_fe_read_signal_strength(struct dvb_frontend *fe,
  32. u16 *strength)
  33. {
  34. *strength = 0;
  35. return 0;
  36. }
  37. static int dvb_dummy_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
  38. {
  39. *snr = 0;
  40. return 0;
  41. }
  42. static int dvb_dummy_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  43. {
  44. *ucblocks = 0;
  45. return 0;
  46. }
  47. /*
  48. * Should only be implemented if it actually reads something from the hardware.
  49. * Also, it should check for the locks, in order to avoid report wrong data
  50. * to userspace.
  51. */
  52. static int dvb_dummy_fe_get_frontend(struct dvb_frontend *fe,
  53. struct dtv_frontend_properties *p)
  54. {
  55. return 0;
  56. }
  57. static int dvb_dummy_fe_set_frontend(struct dvb_frontend *fe)
  58. {
  59. if (fe->ops.tuner_ops.set_params) {
  60. fe->ops.tuner_ops.set_params(fe);
  61. if (fe->ops.i2c_gate_ctrl)
  62. fe->ops.i2c_gate_ctrl(fe, 0);
  63. }
  64. return 0;
  65. }
  66. static int dvb_dummy_fe_sleep(struct dvb_frontend *fe)
  67. {
  68. return 0;
  69. }
  70. static int dvb_dummy_fe_init(struct dvb_frontend *fe)
  71. {
  72. return 0;
  73. }
  74. static int dvb_dummy_fe_set_tone(struct dvb_frontend *fe,
  75. enum fe_sec_tone_mode tone)
  76. {
  77. return 0;
  78. }
  79. static int dvb_dummy_fe_set_voltage(struct dvb_frontend *fe,
  80. enum fe_sec_voltage voltage)
  81. {
  82. return 0;
  83. }
  84. static void dvb_dummy_fe_release(struct dvb_frontend *fe)
  85. {
  86. struct dvb_dummy_fe_state *state = fe->demodulator_priv;
  87. kfree(state);
  88. }
  89. static const struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops;
  90. struct dvb_frontend *dvb_dummy_fe_ofdm_attach(void)
  91. {
  92. struct dvb_dummy_fe_state *state = NULL;
  93. /* allocate memory for the internal state */
  94. state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
  95. if (!state)
  96. return NULL;
  97. /* create dvb_frontend */
  98. memcpy(&state->frontend.ops,
  99. &dvb_dummy_fe_ofdm_ops,
  100. sizeof(struct dvb_frontend_ops));
  101. state->frontend.demodulator_priv = state;
  102. return &state->frontend;
  103. }
  104. EXPORT_SYMBOL(dvb_dummy_fe_ofdm_attach);
  105. static const struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops;
  106. struct dvb_frontend *dvb_dummy_fe_qpsk_attach(void)
  107. {
  108. struct dvb_dummy_fe_state *state = NULL;
  109. /* allocate memory for the internal state */
  110. state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
  111. if (!state)
  112. return NULL;
  113. /* create dvb_frontend */
  114. memcpy(&state->frontend.ops,
  115. &dvb_dummy_fe_qpsk_ops,
  116. sizeof(struct dvb_frontend_ops));
  117. state->frontend.demodulator_priv = state;
  118. return &state->frontend;
  119. }
  120. EXPORT_SYMBOL(dvb_dummy_fe_qpsk_attach);
  121. static const struct dvb_frontend_ops dvb_dummy_fe_qam_ops;
  122. struct dvb_frontend *dvb_dummy_fe_qam_attach(void)
  123. {
  124. struct dvb_dummy_fe_state *state = NULL;
  125. /* allocate memory for the internal state */
  126. state = kzalloc(sizeof(struct dvb_dummy_fe_state), GFP_KERNEL);
  127. if (!state)
  128. return NULL;
  129. /* create dvb_frontend */
  130. memcpy(&state->frontend.ops,
  131. &dvb_dummy_fe_qam_ops,
  132. sizeof(struct dvb_frontend_ops));
  133. state->frontend.demodulator_priv = state;
  134. return &state->frontend;
  135. }
  136. EXPORT_SYMBOL(dvb_dummy_fe_qam_attach);
  137. static const struct dvb_frontend_ops dvb_dummy_fe_ofdm_ops = {
  138. .delsys = { SYS_DVBT },
  139. .info = {
  140. .name = "Dummy DVB-T",
  141. .frequency_min_hz = 0,
  142. .frequency_max_hz = 863250 * kHz,
  143. .frequency_stepsize_hz = 62500,
  144. .caps = FE_CAN_FEC_1_2 |
  145. FE_CAN_FEC_2_3 |
  146. FE_CAN_FEC_3_4 |
  147. FE_CAN_FEC_4_5 |
  148. FE_CAN_FEC_5_6 |
  149. FE_CAN_FEC_6_7 |
  150. FE_CAN_FEC_7_8 |
  151. FE_CAN_FEC_8_9 |
  152. FE_CAN_FEC_AUTO |
  153. FE_CAN_QAM_16 |
  154. FE_CAN_QAM_64 |
  155. FE_CAN_QAM_AUTO |
  156. FE_CAN_TRANSMISSION_MODE_AUTO |
  157. FE_CAN_GUARD_INTERVAL_AUTO |
  158. FE_CAN_HIERARCHY_AUTO,
  159. },
  160. .release = dvb_dummy_fe_release,
  161. .init = dvb_dummy_fe_init,
  162. .sleep = dvb_dummy_fe_sleep,
  163. .set_frontend = dvb_dummy_fe_set_frontend,
  164. .get_frontend = dvb_dummy_fe_get_frontend,
  165. .read_status = dvb_dummy_fe_read_status,
  166. .read_ber = dvb_dummy_fe_read_ber,
  167. .read_signal_strength = dvb_dummy_fe_read_signal_strength,
  168. .read_snr = dvb_dummy_fe_read_snr,
  169. .read_ucblocks = dvb_dummy_fe_read_ucblocks,
  170. };
  171. static const struct dvb_frontend_ops dvb_dummy_fe_qam_ops = {
  172. .delsys = { SYS_DVBC_ANNEX_A },
  173. .info = {
  174. .name = "Dummy DVB-C",
  175. .frequency_min_hz = 51 * MHz,
  176. .frequency_max_hz = 858 * MHz,
  177. .frequency_stepsize_hz = 62500,
  178. /* symbol_rate_min: SACLK/64 == (XIN/2)/64 */
  179. .symbol_rate_min = (57840000 / 2) / 64,
  180. .symbol_rate_max = (57840000 / 2) / 4, /* SACLK/4 */
  181. .caps = FE_CAN_QAM_16 |
  182. FE_CAN_QAM_32 |
  183. FE_CAN_QAM_64 |
  184. FE_CAN_QAM_128 |
  185. FE_CAN_QAM_256 |
  186. FE_CAN_FEC_AUTO |
  187. FE_CAN_INVERSION_AUTO
  188. },
  189. .release = dvb_dummy_fe_release,
  190. .init = dvb_dummy_fe_init,
  191. .sleep = dvb_dummy_fe_sleep,
  192. .set_frontend = dvb_dummy_fe_set_frontend,
  193. .get_frontend = dvb_dummy_fe_get_frontend,
  194. .read_status = dvb_dummy_fe_read_status,
  195. .read_ber = dvb_dummy_fe_read_ber,
  196. .read_signal_strength = dvb_dummy_fe_read_signal_strength,
  197. .read_snr = dvb_dummy_fe_read_snr,
  198. .read_ucblocks = dvb_dummy_fe_read_ucblocks,
  199. };
  200. static const struct dvb_frontend_ops dvb_dummy_fe_qpsk_ops = {
  201. .delsys = { SYS_DVBS },
  202. .info = {
  203. .name = "Dummy DVB-S",
  204. .frequency_min_hz = 950 * MHz,
  205. .frequency_max_hz = 2150 * MHz,
  206. .frequency_stepsize_hz = 250 * kHz,
  207. .frequency_tolerance_hz = 29500 * kHz,
  208. .symbol_rate_min = 1000000,
  209. .symbol_rate_max = 45000000,
  210. .caps = FE_CAN_INVERSION_AUTO |
  211. FE_CAN_FEC_1_2 |
  212. FE_CAN_FEC_2_3 |
  213. FE_CAN_FEC_3_4 |
  214. FE_CAN_FEC_5_6 |
  215. FE_CAN_FEC_7_8 |
  216. FE_CAN_FEC_AUTO |
  217. FE_CAN_QPSK
  218. },
  219. .release = dvb_dummy_fe_release,
  220. .init = dvb_dummy_fe_init,
  221. .sleep = dvb_dummy_fe_sleep,
  222. .set_frontend = dvb_dummy_fe_set_frontend,
  223. .get_frontend = dvb_dummy_fe_get_frontend,
  224. .read_status = dvb_dummy_fe_read_status,
  225. .read_ber = dvb_dummy_fe_read_ber,
  226. .read_signal_strength = dvb_dummy_fe_read_signal_strength,
  227. .read_snr = dvb_dummy_fe_read_snr,
  228. .read_ucblocks = dvb_dummy_fe_read_ucblocks,
  229. .set_voltage = dvb_dummy_fe_set_voltage,
  230. .set_tone = dvb_dummy_fe_set_tone,
  231. };
  232. MODULE_DESCRIPTION("DVB DUMMY Frontend");
  233. MODULE_AUTHOR("Emard");
  234. MODULE_LICENSE("GPL");