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