mxl111sf.h (4404B)
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 31enum 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 38enum mxl111sf_gpio_port_expander { 39 mxl111sf_gpio_hw, 40 mxl111sf_PCA9534, 41}; 42 43struct 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 52enum mxl111sf_pads { 53 MXL111SF_PAD_RF_INPUT, 54 MXL111SF_PAD_OUTPUT, 55 MXL111SF_NUM_PADS 56}; 57 58struct 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 104int mxl111sf_read_reg(struct mxl111sf_state *state, u8 addr, u8 *data); 105int mxl111sf_write_reg(struct mxl111sf_state *state, u8 addr, u8 data); 106 107struct mxl111sf_reg_ctrl_info { 108 u8 addr; 109 u8 mask; 110 u8 data; 111}; 112 113int mxl111sf_write_reg_mask(struct mxl111sf_state *state, 114 u8 addr, u8 mask, u8 data); 115int 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 */ 120int 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 129extern 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_ */