mxl111sf.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2010-2014 Michael Krufky ([email protected])
  4. *
  5. * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
  6. */
  7. #ifndef _DVB_USB_MXL111SF_H_
  8. #define _DVB_USB_MXL111SF_H_
  9. #ifdef DVB_USB_LOG_PREFIX
  10. #undef DVB_USB_LOG_PREFIX
  11. #endif
  12. #define DVB_USB_LOG_PREFIX "mxl111sf"
  13. #include "dvb_usb.h"
  14. #include <media/tveeprom.h>
  15. #include <media/media-entity.h>
  16. /* Max transfer size done by I2C transfer functions */
  17. #define MXL_MAX_XFER_SIZE 64
  18. #define MXL_EP1_REG_READ 1
  19. #define MXL_EP2_REG_WRITE 2
  20. #define MXL_EP3_INTERRUPT 3
  21. #define MXL_EP4_MPEG2 4
  22. #define MXL_EP5_I2S 5
  23. #define MXL_EP6_656 6
  24. #define MXL_EP6_MPEG2 6
  25. #ifdef USING_ENUM_mxl111sf_current_mode
  26. enum mxl111sf_current_mode {
  27. mxl_mode_dvbt = MXL_EP4_MPEG2,
  28. mxl_mode_mh = MXL_EP5_I2S,
  29. mxl_mode_atsc = MXL_EP6_MPEG2,
  30. };
  31. #endif
  32. enum mxl111sf_gpio_port_expander {
  33. mxl111sf_gpio_hw,
  34. mxl111sf_PCA9534,
  35. };
  36. struct mxl111sf_adap_state {
  37. int alt_mode;
  38. int gpio_mode;
  39. int device_mode;
  40. int ep6_clockphase;
  41. int (*fe_init)(struct dvb_frontend *);
  42. int (*fe_sleep)(struct dvb_frontend *);
  43. };
  44. enum mxl111sf_pads {
  45. MXL111SF_PAD_RF_INPUT,
  46. MXL111SF_PAD_OUTPUT,
  47. MXL111SF_NUM_PADS
  48. };
  49. struct mxl111sf_state {
  50. struct dvb_usb_device *d;
  51. enum mxl111sf_gpio_port_expander gpio_port_expander;
  52. u8 port_expander_addr;
  53. u8 chip_id;
  54. u8 chip_ver;
  55. #define MXL111SF_V6 1
  56. #define MXL111SF_V8_100 2
  57. #define MXL111SF_V8_200 3
  58. u8 chip_rev;
  59. #ifdef USING_ENUM_mxl111sf_current_mode
  60. enum mxl111sf_current_mode current_mode;
  61. #endif
  62. #define MXL_TUNER_MODE 0
  63. #define MXL_SOC_MODE 1
  64. #define MXL_DEV_MODE_MASK 0x01
  65. #if 1
  66. int device_mode;
  67. #endif
  68. /* use usb alt setting 1 for EP4 ISOC transfer (dvb-t),
  69. EP5 BULK transfer (atsc-mh),
  70. EP6 BULK transfer (atsc/qam),
  71. use usb alt setting 2 for EP4 BULK transfer (dvb-t),
  72. EP5 ISOC transfer (atsc-mh),
  73. EP6 ISOC transfer (atsc/qam),
  74. */
  75. int alt_mode;
  76. int gpio_mode;
  77. struct tveeprom tv;
  78. struct mutex fe_lock;
  79. u8 num_frontends;
  80. struct mxl111sf_adap_state adap_state[3];
  81. u8 sndbuf[MXL_MAX_XFER_SIZE];
  82. u8 rcvbuf[MXL_MAX_XFER_SIZE];
  83. struct mutex msg_lock;
  84. #ifdef CONFIG_MEDIA_CONTROLLER_DVB
  85. struct media_entity tuner;
  86. struct media_pad tuner_pads[MXL111SF_NUM_PADS];
  87. #endif
  88. };
  89. int mxl111sf_read_reg(struct mxl111sf_state *state, u8 addr, u8 *data);
  90. int mxl111sf_write_reg(struct mxl111sf_state *state, u8 addr, u8 data);
  91. struct mxl111sf_reg_ctrl_info {
  92. u8 addr;
  93. u8 mask;
  94. u8 data;
  95. };
  96. int mxl111sf_write_reg_mask(struct mxl111sf_state *state,
  97. u8 addr, u8 mask, u8 data);
  98. int mxl111sf_ctrl_program_regs(struct mxl111sf_state *state,
  99. struct mxl111sf_reg_ctrl_info *ctrl_reg_info);
  100. /* needed for hardware i2c functions in mxl111sf-i2c.c:
  101. * mxl111sf_i2c_send_data / mxl111sf_i2c_get_data */
  102. int mxl111sf_ctrl_msg(struct mxl111sf_state *state,
  103. u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen);
  104. #define mxl_printk(kern, fmt, arg...) \
  105. printk(kern "%s: " fmt "\n", __func__, ##arg)
  106. #define mxl_info(fmt, arg...) \
  107. mxl_printk(KERN_INFO, fmt, ##arg)
  108. extern int dvb_usb_mxl111sf_debug;
  109. #define mxl_debug(fmt, arg...) \
  110. if (dvb_usb_mxl111sf_debug) \
  111. mxl_printk(KERN_DEBUG, fmt, ##arg)
  112. #define MXL_I2C_DBG 0x04
  113. #define MXL_ADV_DBG 0x10
  114. #define mxl_debug_adv(fmt, arg...) \
  115. if (dvb_usb_mxl111sf_debug & MXL_ADV_DBG) \
  116. mxl_printk(KERN_DEBUG, fmt, ##arg)
  117. #define mxl_i2c(fmt, arg...) \
  118. if (dvb_usb_mxl111sf_debug & MXL_I2C_DBG) \
  119. mxl_printk(KERN_DEBUG, fmt, ##arg)
  120. #define mxl_i2c_adv(fmt, arg...) \
  121. if ((dvb_usb_mxl111sf_debug & (MXL_I2C_DBG | MXL_ADV_DBG)) == \
  122. (MXL_I2C_DBG | MXL_ADV_DBG)) \
  123. mxl_printk(KERN_DEBUG, fmt, ##arg)
  124. /* The following allows the mxl_fail() macro defined below to work
  125. * in externel modules, such as mxl111sf-tuner.ko, even though
  126. * dvb_usb_mxl111sf_debug is not defined within those modules */
  127. #if (defined(__MXL111SF_TUNER_H__)) || (defined(__MXL111SF_DEMOD_H__))
  128. #define MXL_ADV_DEBUG_ENABLED MXL_ADV_DBG
  129. #else
  130. #define MXL_ADV_DEBUG_ENABLED dvb_usb_mxl111sf_debug
  131. #endif
  132. #define mxl_fail(ret) \
  133. ({ \
  134. int __ret; \
  135. __ret = (ret < 0); \
  136. if ((__ret) && (MXL_ADV_DEBUG_ENABLED & MXL_ADV_DBG)) \
  137. mxl_printk(KERN_ERR, "error %d on line %d", \
  138. ret, __LINE__); \
  139. __ret; \
  140. })
  141. #endif /* _DVB_USB_MXL111SF_H_ */