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