1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc. 3*4882a593Smuzhiyun All rights reserved. 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun Redistribution and use in source and binary forms, with or without 6*4882a593Smuzhiyun modification, are permitted provided that the following conditions are met: 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun * Redistributions of source code must retain the above copyright notice, 9*4882a593Smuzhiyun this list of conditions and the following disclaimer. 10*4882a593Smuzhiyun * Redistributions in binary form must reproduce the above copyright notice, 11*4882a593Smuzhiyun this list of conditions and the following disclaimer in the documentation 12*4882a593Smuzhiyun and/or other materials provided with the distribution. 13*4882a593Smuzhiyun * Neither the name of Trident Microsystems nor Hauppauge Computer Works 14*4882a593Smuzhiyun nor the names of its contributors may be used to endorse or promote 15*4882a593Smuzhiyun products derived from this software without specific prior written 16*4882a593Smuzhiyun permission. 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*4882a593Smuzhiyun AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*4882a593Smuzhiyun IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*4882a593Smuzhiyun ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*4882a593Smuzhiyun LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*4882a593Smuzhiyun CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*4882a593Smuzhiyun SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*4882a593Smuzhiyun INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*4882a593Smuzhiyun CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*4882a593Smuzhiyun ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*4882a593Smuzhiyun POSSIBILITY OF SUCH DAMAGE. 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #ifndef __DRXDRIVER_H__ 32*4882a593Smuzhiyun #define __DRXDRIVER_H__ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #include <linux/kernel.h> 35*4882a593Smuzhiyun #include <linux/errno.h> 36*4882a593Smuzhiyun #include <linux/firmware.h> 37*4882a593Smuzhiyun #include <linux/i2c.h> 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* 40*4882a593Smuzhiyun * This structure contains the I2C address, the device ID and a user_data pointer. 41*4882a593Smuzhiyun * The user_data pointer can be used for application specific purposes. 42*4882a593Smuzhiyun */ 43*4882a593Smuzhiyun struct i2c_device_addr { 44*4882a593Smuzhiyun u16 i2c_addr; /* The I2C address of the device. */ 45*4882a593Smuzhiyun u16 i2c_dev_id; /* The device identifier. */ 46*4882a593Smuzhiyun void *user_data; /* User data pointer */ 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* 50*4882a593Smuzhiyun * \def IS_I2C_10BIT( addr ) 51*4882a593Smuzhiyun * \brief Determine if I2C address 'addr' is a 10 bits address or not. 52*4882a593Smuzhiyun * \param addr The I2C address. 53*4882a593Smuzhiyun * \return int. 54*4882a593Smuzhiyun * \retval 0 if address is not a 10 bits I2C address. 55*4882a593Smuzhiyun * \retval 1 if address is a 10 bits I2C address. 56*4882a593Smuzhiyun */ 57*4882a593Smuzhiyun #define IS_I2C_10BIT(addr) \ 58*4882a593Smuzhiyun (((addr) & 0xF8) == 0xF0) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /*------------------------------------------------------------------------------ 61*4882a593Smuzhiyun Exported FUNCTIONS 62*4882a593Smuzhiyun ------------------------------------------------------------------------------*/ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* 65*4882a593Smuzhiyun * \fn drxbsp_i2c_init() 66*4882a593Smuzhiyun * \brief Initialize I2C communication module. 67*4882a593Smuzhiyun * \return int Return status. 68*4882a593Smuzhiyun * \retval 0 Initialization successful. 69*4882a593Smuzhiyun * \retval -EIO Initialization failed. 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun int drxbsp_i2c_init(void); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* 74*4882a593Smuzhiyun * \fn drxbsp_i2c_term() 75*4882a593Smuzhiyun * \brief Terminate I2C communication module. 76*4882a593Smuzhiyun * \return int Return status. 77*4882a593Smuzhiyun * \retval 0 Termination successful. 78*4882a593Smuzhiyun * \retval -EIO Termination failed. 79*4882a593Smuzhiyun */ 80*4882a593Smuzhiyun int drxbsp_i2c_term(void); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* 83*4882a593Smuzhiyun * \fn int drxbsp_i2c_write_read( struct i2c_device_addr *w_dev_addr, 84*4882a593Smuzhiyun * u16 w_count, 85*4882a593Smuzhiyun * u8 * wData, 86*4882a593Smuzhiyun * struct i2c_device_addr *r_dev_addr, 87*4882a593Smuzhiyun * u16 r_count, 88*4882a593Smuzhiyun * u8 * r_data) 89*4882a593Smuzhiyun * \brief Read and/or write count bytes from I2C bus, store them in data[]. 90*4882a593Smuzhiyun * \param w_dev_addr The device i2c address and the device ID to write to 91*4882a593Smuzhiyun * \param w_count The number of bytes to write 92*4882a593Smuzhiyun * \param wData The array to write the data to 93*4882a593Smuzhiyun * \param r_dev_addr The device i2c address and the device ID to read from 94*4882a593Smuzhiyun * \param r_count The number of bytes to read 95*4882a593Smuzhiyun * \param r_data The array to read the data from 96*4882a593Smuzhiyun * \return int Return status. 97*4882a593Smuzhiyun * \retval 0 Success. 98*4882a593Smuzhiyun * \retval -EIO Failure. 99*4882a593Smuzhiyun * \retval -EINVAL Parameter 'wcount' is not zero but parameter 100*4882a593Smuzhiyun * 'wdata' contains NULL. 101*4882a593Smuzhiyun * Idem for 'rcount' and 'rdata'. 102*4882a593Smuzhiyun * Both w_dev_addr and r_dev_addr are NULL. 103*4882a593Smuzhiyun * 104*4882a593Smuzhiyun * This function must implement an atomic write and/or read action on the I2C bus 105*4882a593Smuzhiyun * No other process may use the I2C bus when this function is executing. 106*4882a593Smuzhiyun * The critical section of this function runs from and including the I2C 107*4882a593Smuzhiyun * write, up to and including the I2C read action. 108*4882a593Smuzhiyun * 109*4882a593Smuzhiyun * The device ID can be useful if several devices share an I2C address. 110*4882a593Smuzhiyun * It can be used to control a "switch" on the I2C bus to the correct device. 111*4882a593Smuzhiyun */ 112*4882a593Smuzhiyun int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr, 113*4882a593Smuzhiyun u16 w_count, 114*4882a593Smuzhiyun u8 *wData, 115*4882a593Smuzhiyun struct i2c_device_addr *r_dev_addr, 116*4882a593Smuzhiyun u16 r_count, u8 *r_data); 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* 119*4882a593Smuzhiyun * \fn drxbsp_i2c_error_text() 120*4882a593Smuzhiyun * \brief Returns a human readable error. 121*4882a593Smuzhiyun * Counter part of numerical drx_i2c_error_g. 122*4882a593Smuzhiyun * 123*4882a593Smuzhiyun * \return char* Pointer to human readable error text. 124*4882a593Smuzhiyun */ 125*4882a593Smuzhiyun char *drxbsp_i2c_error_text(void); 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /* 128*4882a593Smuzhiyun * \var drx_i2c_error_g; 129*4882a593Smuzhiyun * \brief I2C specific error codes, platform dependent. 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun extern int drx_i2c_error_g; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define TUNER_MODE_SUB0 0x0001 /* for sub-mode (e.g. RF-AGC setting) */ 134*4882a593Smuzhiyun #define TUNER_MODE_SUB1 0x0002 /* for sub-mode (e.g. RF-AGC setting) */ 135*4882a593Smuzhiyun #define TUNER_MODE_SUB2 0x0004 /* for sub-mode (e.g. RF-AGC setting) */ 136*4882a593Smuzhiyun #define TUNER_MODE_SUB3 0x0008 /* for sub-mode (e.g. RF-AGC setting) */ 137*4882a593Smuzhiyun #define TUNER_MODE_SUB4 0x0010 /* for sub-mode (e.g. RF-AGC setting) */ 138*4882a593Smuzhiyun #define TUNER_MODE_SUB5 0x0020 /* for sub-mode (e.g. RF-AGC setting) */ 139*4882a593Smuzhiyun #define TUNER_MODE_SUB6 0x0040 /* for sub-mode (e.g. RF-AGC setting) */ 140*4882a593Smuzhiyun #define TUNER_MODE_SUB7 0x0080 /* for sub-mode (e.g. RF-AGC setting) */ 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #define TUNER_MODE_DIGITAL 0x0100 /* for digital channel (e.g. DVB-T) */ 143*4882a593Smuzhiyun #define TUNER_MODE_ANALOG 0x0200 /* for analog channel (e.g. PAL) */ 144*4882a593Smuzhiyun #define TUNER_MODE_SWITCH 0x0400 /* during channel switch & scanning */ 145*4882a593Smuzhiyun #define TUNER_MODE_LOCK 0x0800 /* after tuner has locked */ 146*4882a593Smuzhiyun #define TUNER_MODE_6MHZ 0x1000 /* for 6MHz bandwidth channels */ 147*4882a593Smuzhiyun #define TUNER_MODE_7MHZ 0x2000 /* for 7MHz bandwidth channels */ 148*4882a593Smuzhiyun #define TUNER_MODE_8MHZ 0x4000 /* for 8MHz bandwidth channels */ 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define TUNER_MODE_SUB_MAX 8 151*4882a593Smuzhiyun #define TUNER_MODE_SUBALL (TUNER_MODE_SUB0 | TUNER_MODE_SUB1 | \ 152*4882a593Smuzhiyun TUNER_MODE_SUB2 | TUNER_MODE_SUB3 | \ 153*4882a593Smuzhiyun TUNER_MODE_SUB4 | TUNER_MODE_SUB5 | \ 154*4882a593Smuzhiyun TUNER_MODE_SUB6 | TUNER_MODE_SUB7) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun enum tuner_lock_status { 158*4882a593Smuzhiyun TUNER_LOCKED, 159*4882a593Smuzhiyun TUNER_NOT_LOCKED 160*4882a593Smuzhiyun }; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun struct tuner_common { 163*4882a593Smuzhiyun char *name; /* Tuner brand & type name */ 164*4882a593Smuzhiyun s32 min_freq_rf; /* Lowest RF input frequency, in kHz */ 165*4882a593Smuzhiyun s32 max_freq_rf; /* Highest RF input frequency, in kHz */ 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun u8 sub_mode; /* Index to sub-mode in use */ 168*4882a593Smuzhiyun char ***sub_mode_descriptions; /* Pointer to description of sub-modes */ 169*4882a593Smuzhiyun u8 sub_modes; /* Number of available sub-modes */ 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* The following fields will be either 0, NULL or false and do not need 172*4882a593Smuzhiyun initialisation */ 173*4882a593Smuzhiyun void *self_check; /* gives proof of initialization */ 174*4882a593Smuzhiyun bool programmed; /* only valid if self_check is OK */ 175*4882a593Smuzhiyun s32 r_ffrequency; /* only valid if programmed */ 176*4882a593Smuzhiyun s32 i_ffrequency; /* only valid if programmed */ 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun void *my_user_data; /* pointer to associated demod instance */ 179*4882a593Smuzhiyun u16 my_capabilities; /* value for storing application flags */ 180*4882a593Smuzhiyun }; 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun struct tuner_instance; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun typedef int(*tuner_open_func_t) (struct tuner_instance *tuner); 185*4882a593Smuzhiyun typedef int(*tuner_close_func_t) (struct tuner_instance *tuner); 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun typedef int(*tuner_set_frequency_func_t) (struct tuner_instance *tuner, 188*4882a593Smuzhiyun u32 mode, 189*4882a593Smuzhiyun s32 190*4882a593Smuzhiyun frequency); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun typedef int(*tuner_get_frequency_func_t) (struct tuner_instance *tuner, 193*4882a593Smuzhiyun u32 mode, 194*4882a593Smuzhiyun s32 * 195*4882a593Smuzhiyun r_ffrequency, 196*4882a593Smuzhiyun s32 * 197*4882a593Smuzhiyun i_ffrequency); 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun typedef int(*tuner_lock_status_func_t) (struct tuner_instance *tuner, 200*4882a593Smuzhiyun enum tuner_lock_status * 201*4882a593Smuzhiyun lock_stat); 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun typedef int(*tune_ri2c_write_read_func_t) (struct tuner_instance *tuner, 204*4882a593Smuzhiyun struct i2c_device_addr * 205*4882a593Smuzhiyun w_dev_addr, u16 w_count, 206*4882a593Smuzhiyun u8 *wData, 207*4882a593Smuzhiyun struct i2c_device_addr * 208*4882a593Smuzhiyun r_dev_addr, u16 r_count, 209*4882a593Smuzhiyun u8 *r_data); 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun struct tuner_ops { 212*4882a593Smuzhiyun tuner_open_func_t open_func; 213*4882a593Smuzhiyun tuner_close_func_t close_func; 214*4882a593Smuzhiyun tuner_set_frequency_func_t set_frequency_func; 215*4882a593Smuzhiyun tuner_get_frequency_func_t get_frequency_func; 216*4882a593Smuzhiyun tuner_lock_status_func_t lock_status_func; 217*4882a593Smuzhiyun tune_ri2c_write_read_func_t i2c_write_read_func; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun }; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun struct tuner_instance { 222*4882a593Smuzhiyun struct i2c_device_addr my_i2c_dev_addr; 223*4882a593Smuzhiyun struct tuner_common *my_common_attr; 224*4882a593Smuzhiyun void *my_ext_attr; 225*4882a593Smuzhiyun struct tuner_ops *my_funct; 226*4882a593Smuzhiyun }; 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun int drxbsp_tuner_set_frequency(struct tuner_instance *tuner, 229*4882a593Smuzhiyun u32 mode, 230*4882a593Smuzhiyun s32 frequency); 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun int drxbsp_tuner_get_frequency(struct tuner_instance *tuner, 233*4882a593Smuzhiyun u32 mode, 234*4882a593Smuzhiyun s32 *r_ffrequency, 235*4882a593Smuzhiyun s32 *i_ffrequency); 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun int drxbsp_tuner_default_i2c_write_read(struct tuner_instance *tuner, 238*4882a593Smuzhiyun struct i2c_device_addr *w_dev_addr, 239*4882a593Smuzhiyun u16 w_count, 240*4882a593Smuzhiyun u8 *wData, 241*4882a593Smuzhiyun struct i2c_device_addr *r_dev_addr, 242*4882a593Smuzhiyun u16 r_count, u8 *r_data); 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun /************* 245*4882a593Smuzhiyun * 246*4882a593Smuzhiyun * This section configures the DRX Data Access Protocols (DAPs). 247*4882a593Smuzhiyun * 248*4882a593Smuzhiyun **************/ 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* 251*4882a593Smuzhiyun * \def DRXDAP_SINGLE_MASTER 252*4882a593Smuzhiyun * \brief Enable I2C single or I2C multimaster mode on host. 253*4882a593Smuzhiyun * 254*4882a593Smuzhiyun * Set to 1 to enable single master mode 255*4882a593Smuzhiyun * Set to 0 to enable multi master mode 256*4882a593Smuzhiyun * 257*4882a593Smuzhiyun * The actual DAP implementation may be restricted to only one of the modes. 258*4882a593Smuzhiyun * A compiler warning or error will be generated if the DAP implementation 259*4882a593Smuzhiyun * overrides or cannot handle the mode defined below. 260*4882a593Smuzhiyun */ 261*4882a593Smuzhiyun #ifndef DRXDAP_SINGLE_MASTER 262*4882a593Smuzhiyun #define DRXDAP_SINGLE_MASTER 1 263*4882a593Smuzhiyun #endif 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun /* 266*4882a593Smuzhiyun * \def DRXDAP_MAX_WCHUNKSIZE 267*4882a593Smuzhiyun * \brief Defines maximum chunksize of an i2c write action by host. 268*4882a593Smuzhiyun * 269*4882a593Smuzhiyun * This indicates the maximum size of data the I2C device driver is able to 270*4882a593Smuzhiyun * write at a time. This includes I2C device address and register addressing. 271*4882a593Smuzhiyun * 272*4882a593Smuzhiyun * This maximum size may be restricted by the actual DAP implementation. 273*4882a593Smuzhiyun * A compiler warning or error will be generated if the DAP implementation 274*4882a593Smuzhiyun * overrides or cannot handle the chunksize defined below. 275*4882a593Smuzhiyun * 276*4882a593Smuzhiyun * Beware that the DAP uses DRXDAP_MAX_WCHUNKSIZE to create a temporary data 277*4882a593Smuzhiyun * buffer. Do not undefine or choose too large, unless your system is able to 278*4882a593Smuzhiyun * handle a stack buffer of that size. 279*4882a593Smuzhiyun * 280*4882a593Smuzhiyun */ 281*4882a593Smuzhiyun #ifndef DRXDAP_MAX_WCHUNKSIZE 282*4882a593Smuzhiyun #define DRXDAP_MAX_WCHUNKSIZE 60 283*4882a593Smuzhiyun #endif 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun /* 286*4882a593Smuzhiyun * \def DRXDAP_MAX_RCHUNKSIZE 287*4882a593Smuzhiyun * \brief Defines maximum chunksize of an i2c read action by host. 288*4882a593Smuzhiyun * 289*4882a593Smuzhiyun * This indicates the maximum size of data the I2C device driver is able to read 290*4882a593Smuzhiyun * at a time. Minimum value is 2. Also, the read chunk size must be even. 291*4882a593Smuzhiyun * 292*4882a593Smuzhiyun * This maximum size may be restricted by the actual DAP implementation. 293*4882a593Smuzhiyun * A compiler warning or error will be generated if the DAP implementation 294*4882a593Smuzhiyun * overrides or cannot handle the chunksize defined below. 295*4882a593Smuzhiyun */ 296*4882a593Smuzhiyun #ifndef DRXDAP_MAX_RCHUNKSIZE 297*4882a593Smuzhiyun #define DRXDAP_MAX_RCHUNKSIZE 60 298*4882a593Smuzhiyun #endif 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun /************* 301*4882a593Smuzhiyun * 302*4882a593Smuzhiyun * This section describes drxdriver defines. 303*4882a593Smuzhiyun * 304*4882a593Smuzhiyun **************/ 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun /* 307*4882a593Smuzhiyun * \def DRX_UNKNOWN 308*4882a593Smuzhiyun * \brief Generic UNKNOWN value for DRX enumerated types. 309*4882a593Smuzhiyun * 310*4882a593Smuzhiyun * Used to indicate that the parameter value is unknown or not yet initialized. 311*4882a593Smuzhiyun */ 312*4882a593Smuzhiyun #ifndef DRX_UNKNOWN 313*4882a593Smuzhiyun #define DRX_UNKNOWN (254) 314*4882a593Smuzhiyun #endif 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun /* 317*4882a593Smuzhiyun * \def DRX_AUTO 318*4882a593Smuzhiyun * \brief Generic AUTO value for DRX enumerated types. 319*4882a593Smuzhiyun * 320*4882a593Smuzhiyun * Used to instruct the driver to automatically determine the value of the 321*4882a593Smuzhiyun * parameter. 322*4882a593Smuzhiyun */ 323*4882a593Smuzhiyun #ifndef DRX_AUTO 324*4882a593Smuzhiyun #define DRX_AUTO (255) 325*4882a593Smuzhiyun #endif 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun /************* 328*4882a593Smuzhiyun * 329*4882a593Smuzhiyun * This section describes flag definitions for the device capbilities. 330*4882a593Smuzhiyun * 331*4882a593Smuzhiyun **************/ 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* 334*4882a593Smuzhiyun * \brief LNA capability flag 335*4882a593Smuzhiyun * 336*4882a593Smuzhiyun * Device has a Low Noise Amplifier 337*4882a593Smuzhiyun * 338*4882a593Smuzhiyun */ 339*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_LNA (1UL << 0) 340*4882a593Smuzhiyun /* 341*4882a593Smuzhiyun * \brief OOB-RX capability flag 342*4882a593Smuzhiyun * 343*4882a593Smuzhiyun * Device has OOB-RX 344*4882a593Smuzhiyun * 345*4882a593Smuzhiyun */ 346*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_OOBRX (1UL << 1) 347*4882a593Smuzhiyun /* 348*4882a593Smuzhiyun * \brief ATV capability flag 349*4882a593Smuzhiyun * 350*4882a593Smuzhiyun * Device has ATV 351*4882a593Smuzhiyun * 352*4882a593Smuzhiyun */ 353*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_ATV (1UL << 2) 354*4882a593Smuzhiyun /* 355*4882a593Smuzhiyun * \brief DVB-T capability flag 356*4882a593Smuzhiyun * 357*4882a593Smuzhiyun * Device has DVB-T 358*4882a593Smuzhiyun * 359*4882a593Smuzhiyun */ 360*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_DVBT (1UL << 3) 361*4882a593Smuzhiyun /* 362*4882a593Smuzhiyun * \brief ITU-B capability flag 363*4882a593Smuzhiyun * 364*4882a593Smuzhiyun * Device has ITU-B 365*4882a593Smuzhiyun * 366*4882a593Smuzhiyun */ 367*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_ITUB (1UL << 4) 368*4882a593Smuzhiyun /* 369*4882a593Smuzhiyun * \brief Audio capability flag 370*4882a593Smuzhiyun * 371*4882a593Smuzhiyun * Device has Audio 372*4882a593Smuzhiyun * 373*4882a593Smuzhiyun */ 374*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_AUD (1UL << 5) 375*4882a593Smuzhiyun /* 376*4882a593Smuzhiyun * \brief SAW switch capability flag 377*4882a593Smuzhiyun * 378*4882a593Smuzhiyun * Device has SAW switch 379*4882a593Smuzhiyun * 380*4882a593Smuzhiyun */ 381*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_SAWSW (1UL << 6) 382*4882a593Smuzhiyun /* 383*4882a593Smuzhiyun * \brief GPIO1 capability flag 384*4882a593Smuzhiyun * 385*4882a593Smuzhiyun * Device has GPIO1 386*4882a593Smuzhiyun * 387*4882a593Smuzhiyun */ 388*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_GPIO1 (1UL << 7) 389*4882a593Smuzhiyun /* 390*4882a593Smuzhiyun * \brief GPIO2 capability flag 391*4882a593Smuzhiyun * 392*4882a593Smuzhiyun * Device has GPIO2 393*4882a593Smuzhiyun * 394*4882a593Smuzhiyun */ 395*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_GPIO2 (1UL << 8) 396*4882a593Smuzhiyun /* 397*4882a593Smuzhiyun * \brief IRQN capability flag 398*4882a593Smuzhiyun * 399*4882a593Smuzhiyun * Device has IRQN 400*4882a593Smuzhiyun * 401*4882a593Smuzhiyun */ 402*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_IRQN (1UL << 9) 403*4882a593Smuzhiyun /* 404*4882a593Smuzhiyun * \brief 8VSB capability flag 405*4882a593Smuzhiyun * 406*4882a593Smuzhiyun * Device has 8VSB 407*4882a593Smuzhiyun * 408*4882a593Smuzhiyun */ 409*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_8VSB (1UL << 10) 410*4882a593Smuzhiyun /* 411*4882a593Smuzhiyun * \brief SMA-TX capability flag 412*4882a593Smuzhiyun * 413*4882a593Smuzhiyun * Device has SMATX 414*4882a593Smuzhiyun * 415*4882a593Smuzhiyun */ 416*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_SMATX (1UL << 11) 417*4882a593Smuzhiyun /* 418*4882a593Smuzhiyun * \brief SMA-RX capability flag 419*4882a593Smuzhiyun * 420*4882a593Smuzhiyun * Device has SMARX 421*4882a593Smuzhiyun * 422*4882a593Smuzhiyun */ 423*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_SMARX (1UL << 12) 424*4882a593Smuzhiyun /* 425*4882a593Smuzhiyun * \brief ITU-A/C capability flag 426*4882a593Smuzhiyun * 427*4882a593Smuzhiyun * Device has ITU-A/C 428*4882a593Smuzhiyun * 429*4882a593Smuzhiyun */ 430*4882a593Smuzhiyun #define DRX_CAPABILITY_HAS_ITUAC (1UL << 13) 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /*------------------------------------------------------------------------- 433*4882a593Smuzhiyun MACROS 434*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 435*4882a593Smuzhiyun /* Macros to stringify the version number */ 436*4882a593Smuzhiyun #define DRX_VERSIONSTRING(MAJOR, MINOR, PATCH) \ 437*4882a593Smuzhiyun DRX_VERSIONSTRING_HELP(MAJOR)"." \ 438*4882a593Smuzhiyun DRX_VERSIONSTRING_HELP(MINOR)"." \ 439*4882a593Smuzhiyun DRX_VERSIONSTRING_HELP(PATCH) 440*4882a593Smuzhiyun #define DRX_VERSIONSTRING_HELP(NUM) #NUM 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun /* 443*4882a593Smuzhiyun * \brief Macro to create byte array elements from 16 bit integers. 444*4882a593Smuzhiyun * This macro is used to create byte arrays for block writes. 445*4882a593Smuzhiyun * Block writes speed up I2C traffic between host and demod. 446*4882a593Smuzhiyun * The macro takes care of the required byte order in a 16 bits word. 447*4882a593Smuzhiyun * x->lowbyte(x), highbyte(x) 448*4882a593Smuzhiyun */ 449*4882a593Smuzhiyun #define DRX_16TO8(x) ((u8) (((u16)x) & 0xFF)), \ 450*4882a593Smuzhiyun ((u8)((((u16)x)>>8)&0xFF)) 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun /* 453*4882a593Smuzhiyun * \brief Macro to convert 16 bit register value to a s32 454*4882a593Smuzhiyun */ 455*4882a593Smuzhiyun #define DRX_U16TODRXFREQ(x) ((x & 0x8000) ? \ 456*4882a593Smuzhiyun ((s32) \ 457*4882a593Smuzhiyun (((u32) x) | 0xFFFF0000)) : \ 458*4882a593Smuzhiyun ((s32) x)) 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun /*------------------------------------------------------------------------- 461*4882a593Smuzhiyun ENUM 462*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun /* 465*4882a593Smuzhiyun * \enum enum drx_standard 466*4882a593Smuzhiyun * \brief Modulation standards. 467*4882a593Smuzhiyun */ 468*4882a593Smuzhiyun enum drx_standard { 469*4882a593Smuzhiyun DRX_STANDARD_DVBT = 0, /*< Terrestrial DVB-T. */ 470*4882a593Smuzhiyun DRX_STANDARD_8VSB, /*< Terrestrial 8VSB. */ 471*4882a593Smuzhiyun DRX_STANDARD_NTSC, /*< Terrestrial\Cable analog NTSC. */ 472*4882a593Smuzhiyun DRX_STANDARD_PAL_SECAM_BG, 473*4882a593Smuzhiyun /*< Terrestrial analog PAL/SECAM B/G */ 474*4882a593Smuzhiyun DRX_STANDARD_PAL_SECAM_DK, 475*4882a593Smuzhiyun /*< Terrestrial analog PAL/SECAM D/K */ 476*4882a593Smuzhiyun DRX_STANDARD_PAL_SECAM_I, 477*4882a593Smuzhiyun /*< Terrestrial analog PAL/SECAM I */ 478*4882a593Smuzhiyun DRX_STANDARD_PAL_SECAM_L, 479*4882a593Smuzhiyun /*< Terrestrial analog PAL/SECAM L 480*4882a593Smuzhiyun with negative modulation */ 481*4882a593Smuzhiyun DRX_STANDARD_PAL_SECAM_LP, 482*4882a593Smuzhiyun /*< Terrestrial analog PAL/SECAM L 483*4882a593Smuzhiyun with positive modulation */ 484*4882a593Smuzhiyun DRX_STANDARD_ITU_A, /*< Cable ITU ANNEX A. */ 485*4882a593Smuzhiyun DRX_STANDARD_ITU_B, /*< Cable ITU ANNEX B. */ 486*4882a593Smuzhiyun DRX_STANDARD_ITU_C, /*< Cable ITU ANNEX C. */ 487*4882a593Smuzhiyun DRX_STANDARD_ITU_D, /*< Cable ITU ANNEX D. */ 488*4882a593Smuzhiyun DRX_STANDARD_FM, /*< Terrestrial\Cable FM radio */ 489*4882a593Smuzhiyun DRX_STANDARD_DTMB, /*< Terrestrial DTMB standard (China)*/ 490*4882a593Smuzhiyun DRX_STANDARD_UNKNOWN = DRX_UNKNOWN, 491*4882a593Smuzhiyun /*< Standard unknown. */ 492*4882a593Smuzhiyun DRX_STANDARD_AUTO = DRX_AUTO 493*4882a593Smuzhiyun /*< Autodetect standard. */ 494*4882a593Smuzhiyun }; 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun /* 497*4882a593Smuzhiyun * \enum enum drx_standard 498*4882a593Smuzhiyun * \brief Modulation sub-standards. 499*4882a593Smuzhiyun */ 500*4882a593Smuzhiyun enum drx_substandard { 501*4882a593Smuzhiyun DRX_SUBSTANDARD_MAIN = 0, /*< Main subvariant of standard */ 502*4882a593Smuzhiyun DRX_SUBSTANDARD_ATV_BG_SCANDINAVIA, 503*4882a593Smuzhiyun DRX_SUBSTANDARD_ATV_DK_POLAND, 504*4882a593Smuzhiyun DRX_SUBSTANDARD_ATV_DK_CHINA, 505*4882a593Smuzhiyun DRX_SUBSTANDARD_UNKNOWN = DRX_UNKNOWN, 506*4882a593Smuzhiyun /*< Sub-standard unknown. */ 507*4882a593Smuzhiyun DRX_SUBSTANDARD_AUTO = DRX_AUTO 508*4882a593Smuzhiyun /*< Auto (default) sub-standard */ 509*4882a593Smuzhiyun }; 510*4882a593Smuzhiyun 511*4882a593Smuzhiyun /* 512*4882a593Smuzhiyun * \enum enum drx_bandwidth 513*4882a593Smuzhiyun * \brief Channel bandwidth or channel spacing. 514*4882a593Smuzhiyun */ 515*4882a593Smuzhiyun enum drx_bandwidth { 516*4882a593Smuzhiyun DRX_BANDWIDTH_8MHZ = 0, /*< Bandwidth 8 MHz. */ 517*4882a593Smuzhiyun DRX_BANDWIDTH_7MHZ, /*< Bandwidth 7 MHz. */ 518*4882a593Smuzhiyun DRX_BANDWIDTH_6MHZ, /*< Bandwidth 6 MHz. */ 519*4882a593Smuzhiyun DRX_BANDWIDTH_UNKNOWN = DRX_UNKNOWN, 520*4882a593Smuzhiyun /*< Bandwidth unknown. */ 521*4882a593Smuzhiyun DRX_BANDWIDTH_AUTO = DRX_AUTO 522*4882a593Smuzhiyun /*< Auto Set Bandwidth */ 523*4882a593Smuzhiyun }; 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun /* 526*4882a593Smuzhiyun * \enum enum drx_mirror 527*4882a593Smuzhiyun * \brief Indicate if channel spectrum is mirrored or not. 528*4882a593Smuzhiyun */ 529*4882a593Smuzhiyun enum drx_mirror { 530*4882a593Smuzhiyun DRX_MIRROR_NO = 0, /*< Spectrum is not mirrored. */ 531*4882a593Smuzhiyun DRX_MIRROR_YES, /*< Spectrum is mirrored. */ 532*4882a593Smuzhiyun DRX_MIRROR_UNKNOWN = DRX_UNKNOWN, 533*4882a593Smuzhiyun /*< Unknown if spectrum is mirrored. */ 534*4882a593Smuzhiyun DRX_MIRROR_AUTO = DRX_AUTO 535*4882a593Smuzhiyun /*< Autodetect if spectrum is mirrored. */ 536*4882a593Smuzhiyun }; 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun /* 539*4882a593Smuzhiyun * \enum enum drx_modulation 540*4882a593Smuzhiyun * \brief Constellation type of the channel. 541*4882a593Smuzhiyun */ 542*4882a593Smuzhiyun enum drx_modulation { 543*4882a593Smuzhiyun DRX_CONSTELLATION_BPSK = 0, /*< Modulation is BPSK. */ 544*4882a593Smuzhiyun DRX_CONSTELLATION_QPSK, /*< Constellation is QPSK. */ 545*4882a593Smuzhiyun DRX_CONSTELLATION_PSK8, /*< Constellation is PSK8. */ 546*4882a593Smuzhiyun DRX_CONSTELLATION_QAM16, /*< Constellation is QAM16. */ 547*4882a593Smuzhiyun DRX_CONSTELLATION_QAM32, /*< Constellation is QAM32. */ 548*4882a593Smuzhiyun DRX_CONSTELLATION_QAM64, /*< Constellation is QAM64. */ 549*4882a593Smuzhiyun DRX_CONSTELLATION_QAM128, /*< Constellation is QAM128. */ 550*4882a593Smuzhiyun DRX_CONSTELLATION_QAM256, /*< Constellation is QAM256. */ 551*4882a593Smuzhiyun DRX_CONSTELLATION_QAM512, /*< Constellation is QAM512. */ 552*4882a593Smuzhiyun DRX_CONSTELLATION_QAM1024, /*< Constellation is QAM1024. */ 553*4882a593Smuzhiyun DRX_CONSTELLATION_QPSK_NR, /*< Constellation is QPSK_NR */ 554*4882a593Smuzhiyun DRX_CONSTELLATION_UNKNOWN = DRX_UNKNOWN, 555*4882a593Smuzhiyun /*< Constellation unknown. */ 556*4882a593Smuzhiyun DRX_CONSTELLATION_AUTO = DRX_AUTO 557*4882a593Smuzhiyun /*< Autodetect constellation. */ 558*4882a593Smuzhiyun }; 559*4882a593Smuzhiyun 560*4882a593Smuzhiyun /* 561*4882a593Smuzhiyun * \enum enum drx_hierarchy 562*4882a593Smuzhiyun * \brief Hierarchy of the channel. 563*4882a593Smuzhiyun */ 564*4882a593Smuzhiyun enum drx_hierarchy { 565*4882a593Smuzhiyun DRX_HIERARCHY_NONE = 0, /*< None hierarchical channel. */ 566*4882a593Smuzhiyun DRX_HIERARCHY_ALPHA1, /*< Hierarchical channel, alpha=1. */ 567*4882a593Smuzhiyun DRX_HIERARCHY_ALPHA2, /*< Hierarchical channel, alpha=2. */ 568*4882a593Smuzhiyun DRX_HIERARCHY_ALPHA4, /*< Hierarchical channel, alpha=4. */ 569*4882a593Smuzhiyun DRX_HIERARCHY_UNKNOWN = DRX_UNKNOWN, 570*4882a593Smuzhiyun /*< Hierarchy unknown. */ 571*4882a593Smuzhiyun DRX_HIERARCHY_AUTO = DRX_AUTO 572*4882a593Smuzhiyun /*< Autodetect hierarchy. */ 573*4882a593Smuzhiyun }; 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun /* 576*4882a593Smuzhiyun * \enum enum drx_priority 577*4882a593Smuzhiyun * \brief Channel priority in case of hierarchical transmission. 578*4882a593Smuzhiyun */ 579*4882a593Smuzhiyun enum drx_priority { 580*4882a593Smuzhiyun DRX_PRIORITY_LOW = 0, /*< Low priority channel. */ 581*4882a593Smuzhiyun DRX_PRIORITY_HIGH, /*< High priority channel. */ 582*4882a593Smuzhiyun DRX_PRIORITY_UNKNOWN = DRX_UNKNOWN 583*4882a593Smuzhiyun /*< Priority unknown. */ 584*4882a593Smuzhiyun }; 585*4882a593Smuzhiyun 586*4882a593Smuzhiyun /* 587*4882a593Smuzhiyun * \enum enum drx_coderate 588*4882a593Smuzhiyun * \brief Channel priority in case of hierarchical transmission. 589*4882a593Smuzhiyun */ 590*4882a593Smuzhiyun enum drx_coderate { 591*4882a593Smuzhiyun DRX_CODERATE_1DIV2 = 0, /*< Code rate 1/2nd. */ 592*4882a593Smuzhiyun DRX_CODERATE_2DIV3, /*< Code rate 2/3nd. */ 593*4882a593Smuzhiyun DRX_CODERATE_3DIV4, /*< Code rate 3/4nd. */ 594*4882a593Smuzhiyun DRX_CODERATE_5DIV6, /*< Code rate 5/6nd. */ 595*4882a593Smuzhiyun DRX_CODERATE_7DIV8, /*< Code rate 7/8nd. */ 596*4882a593Smuzhiyun DRX_CODERATE_UNKNOWN = DRX_UNKNOWN, 597*4882a593Smuzhiyun /*< Code rate unknown. */ 598*4882a593Smuzhiyun DRX_CODERATE_AUTO = DRX_AUTO 599*4882a593Smuzhiyun /*< Autodetect code rate. */ 600*4882a593Smuzhiyun }; 601*4882a593Smuzhiyun 602*4882a593Smuzhiyun /* 603*4882a593Smuzhiyun * \enum enum drx_guard 604*4882a593Smuzhiyun * \brief Guard interval of a channel. 605*4882a593Smuzhiyun */ 606*4882a593Smuzhiyun enum drx_guard { 607*4882a593Smuzhiyun DRX_GUARD_1DIV32 = 0, /*< Guard interval 1/32nd. */ 608*4882a593Smuzhiyun DRX_GUARD_1DIV16, /*< Guard interval 1/16th. */ 609*4882a593Smuzhiyun DRX_GUARD_1DIV8, /*< Guard interval 1/8th. */ 610*4882a593Smuzhiyun DRX_GUARD_1DIV4, /*< Guard interval 1/4th. */ 611*4882a593Smuzhiyun DRX_GUARD_UNKNOWN = DRX_UNKNOWN, 612*4882a593Smuzhiyun /*< Guard interval unknown. */ 613*4882a593Smuzhiyun DRX_GUARD_AUTO = DRX_AUTO 614*4882a593Smuzhiyun /*< Autodetect guard interval. */ 615*4882a593Smuzhiyun }; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun /* 618*4882a593Smuzhiyun * \enum enum drx_fft_mode 619*4882a593Smuzhiyun * \brief FFT mode. 620*4882a593Smuzhiyun */ 621*4882a593Smuzhiyun enum drx_fft_mode { 622*4882a593Smuzhiyun DRX_FFTMODE_2K = 0, /*< 2K FFT mode. */ 623*4882a593Smuzhiyun DRX_FFTMODE_4K, /*< 4K FFT mode. */ 624*4882a593Smuzhiyun DRX_FFTMODE_8K, /*< 8K FFT mode. */ 625*4882a593Smuzhiyun DRX_FFTMODE_UNKNOWN = DRX_UNKNOWN, 626*4882a593Smuzhiyun /*< FFT mode unknown. */ 627*4882a593Smuzhiyun DRX_FFTMODE_AUTO = DRX_AUTO 628*4882a593Smuzhiyun /*< Autodetect FFT mode. */ 629*4882a593Smuzhiyun }; 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun /* 632*4882a593Smuzhiyun * \enum enum drx_classification 633*4882a593Smuzhiyun * \brief Channel classification. 634*4882a593Smuzhiyun */ 635*4882a593Smuzhiyun enum drx_classification { 636*4882a593Smuzhiyun DRX_CLASSIFICATION_GAUSS = 0, /*< Gaussion noise. */ 637*4882a593Smuzhiyun DRX_CLASSIFICATION_HVY_GAUSS, /*< Heavy Gaussion noise. */ 638*4882a593Smuzhiyun DRX_CLASSIFICATION_COCHANNEL, /*< Co-channel. */ 639*4882a593Smuzhiyun DRX_CLASSIFICATION_STATIC, /*< Static echo. */ 640*4882a593Smuzhiyun DRX_CLASSIFICATION_MOVING, /*< Moving echo. */ 641*4882a593Smuzhiyun DRX_CLASSIFICATION_ZERODB, /*< Zero dB echo. */ 642*4882a593Smuzhiyun DRX_CLASSIFICATION_UNKNOWN = DRX_UNKNOWN, 643*4882a593Smuzhiyun /*< Unknown classification */ 644*4882a593Smuzhiyun DRX_CLASSIFICATION_AUTO = DRX_AUTO 645*4882a593Smuzhiyun /*< Autodetect classification. */ 646*4882a593Smuzhiyun }; 647*4882a593Smuzhiyun 648*4882a593Smuzhiyun /* 649*4882a593Smuzhiyun * /enum enum drx_interleave_mode 650*4882a593Smuzhiyun * /brief Interleave modes 651*4882a593Smuzhiyun */ 652*4882a593Smuzhiyun enum drx_interleave_mode { 653*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J1 = 0, 654*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J1_V2, 655*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J2, 656*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I64_J2, 657*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J3, 658*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I32_J4, 659*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J4, 660*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I16_J8, 661*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J5, 662*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I8_J16, 663*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J6, 664*4882a593Smuzhiyun DRX_INTERLEAVEMODE_RESERVED_11, 665*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J7, 666*4882a593Smuzhiyun DRX_INTERLEAVEMODE_RESERVED_13, 667*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I128_J8, 668*4882a593Smuzhiyun DRX_INTERLEAVEMODE_RESERVED_15, 669*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I12_J17, 670*4882a593Smuzhiyun DRX_INTERLEAVEMODE_I5_J4, 671*4882a593Smuzhiyun DRX_INTERLEAVEMODE_B52_M240, 672*4882a593Smuzhiyun DRX_INTERLEAVEMODE_B52_M720, 673*4882a593Smuzhiyun DRX_INTERLEAVEMODE_B52_M48, 674*4882a593Smuzhiyun DRX_INTERLEAVEMODE_B52_M0, 675*4882a593Smuzhiyun DRX_INTERLEAVEMODE_UNKNOWN = DRX_UNKNOWN, 676*4882a593Smuzhiyun /*< Unknown interleave mode */ 677*4882a593Smuzhiyun DRX_INTERLEAVEMODE_AUTO = DRX_AUTO 678*4882a593Smuzhiyun /*< Autodetect interleave mode */ 679*4882a593Smuzhiyun }; 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun /* 682*4882a593Smuzhiyun * \enum enum drx_carrier_mode 683*4882a593Smuzhiyun * \brief Channel Carrier Mode. 684*4882a593Smuzhiyun */ 685*4882a593Smuzhiyun enum drx_carrier_mode { 686*4882a593Smuzhiyun DRX_CARRIER_MULTI = 0, /*< Multi carrier mode */ 687*4882a593Smuzhiyun DRX_CARRIER_SINGLE, /*< Single carrier mode */ 688*4882a593Smuzhiyun DRX_CARRIER_UNKNOWN = DRX_UNKNOWN, 689*4882a593Smuzhiyun /*< Carrier mode unknown. */ 690*4882a593Smuzhiyun DRX_CARRIER_AUTO = DRX_AUTO /*< Autodetect carrier mode */ 691*4882a593Smuzhiyun }; 692*4882a593Smuzhiyun 693*4882a593Smuzhiyun /* 694*4882a593Smuzhiyun * \enum enum drx_frame_mode 695*4882a593Smuzhiyun * \brief Channel Frame Mode. 696*4882a593Smuzhiyun */ 697*4882a593Smuzhiyun enum drx_frame_mode { 698*4882a593Smuzhiyun DRX_FRAMEMODE_420 = 0, /*< 420 with variable PN */ 699*4882a593Smuzhiyun DRX_FRAMEMODE_595, /*< 595 */ 700*4882a593Smuzhiyun DRX_FRAMEMODE_945, /*< 945 with variable PN */ 701*4882a593Smuzhiyun DRX_FRAMEMODE_420_FIXED_PN, 702*4882a593Smuzhiyun /*< 420 with fixed PN */ 703*4882a593Smuzhiyun DRX_FRAMEMODE_945_FIXED_PN, 704*4882a593Smuzhiyun /*< 945 with fixed PN */ 705*4882a593Smuzhiyun DRX_FRAMEMODE_UNKNOWN = DRX_UNKNOWN, 706*4882a593Smuzhiyun /*< Frame mode unknown. */ 707*4882a593Smuzhiyun DRX_FRAMEMODE_AUTO = DRX_AUTO 708*4882a593Smuzhiyun /*< Autodetect frame mode */ 709*4882a593Smuzhiyun }; 710*4882a593Smuzhiyun 711*4882a593Smuzhiyun /* 712*4882a593Smuzhiyun * \enum enum drx_tps_frame 713*4882a593Smuzhiyun * \brief Frame number in current super-frame. 714*4882a593Smuzhiyun */ 715*4882a593Smuzhiyun enum drx_tps_frame { 716*4882a593Smuzhiyun DRX_TPS_FRAME1 = 0, /*< TPS frame 1. */ 717*4882a593Smuzhiyun DRX_TPS_FRAME2, /*< TPS frame 2. */ 718*4882a593Smuzhiyun DRX_TPS_FRAME3, /*< TPS frame 3. */ 719*4882a593Smuzhiyun DRX_TPS_FRAME4, /*< TPS frame 4. */ 720*4882a593Smuzhiyun DRX_TPS_FRAME_UNKNOWN = DRX_UNKNOWN 721*4882a593Smuzhiyun /*< TPS frame unknown. */ 722*4882a593Smuzhiyun }; 723*4882a593Smuzhiyun 724*4882a593Smuzhiyun /* 725*4882a593Smuzhiyun * \enum enum drx_ldpc 726*4882a593Smuzhiyun * \brief TPS LDPC . 727*4882a593Smuzhiyun */ 728*4882a593Smuzhiyun enum drx_ldpc { 729*4882a593Smuzhiyun DRX_LDPC_0_4 = 0, /*< LDPC 0.4 */ 730*4882a593Smuzhiyun DRX_LDPC_0_6, /*< LDPC 0.6 */ 731*4882a593Smuzhiyun DRX_LDPC_0_8, /*< LDPC 0.8 */ 732*4882a593Smuzhiyun DRX_LDPC_UNKNOWN = DRX_UNKNOWN, 733*4882a593Smuzhiyun /*< LDPC unknown. */ 734*4882a593Smuzhiyun DRX_LDPC_AUTO = DRX_AUTO /*< Autodetect LDPC */ 735*4882a593Smuzhiyun }; 736*4882a593Smuzhiyun 737*4882a593Smuzhiyun /* 738*4882a593Smuzhiyun * \enum enum drx_pilot_mode 739*4882a593Smuzhiyun * \brief Pilot modes in DTMB. 740*4882a593Smuzhiyun */ 741*4882a593Smuzhiyun enum drx_pilot_mode { 742*4882a593Smuzhiyun DRX_PILOT_ON = 0, /*< Pilot On */ 743*4882a593Smuzhiyun DRX_PILOT_OFF, /*< Pilot Off */ 744*4882a593Smuzhiyun DRX_PILOT_UNKNOWN = DRX_UNKNOWN, 745*4882a593Smuzhiyun /*< Pilot unknown. */ 746*4882a593Smuzhiyun DRX_PILOT_AUTO = DRX_AUTO /*< Autodetect Pilot */ 747*4882a593Smuzhiyun }; 748*4882a593Smuzhiyun 749*4882a593Smuzhiyun /* 750*4882a593Smuzhiyun * enum drxu_code_action - indicate if firmware has to be uploaded or verified. 751*4882a593Smuzhiyun * @UCODE_UPLOAD: Upload the microcode image to device 752*4882a593Smuzhiyun * @UCODE_VERIFY: Compare microcode image with code on device 753*4882a593Smuzhiyun */ 754*4882a593Smuzhiyun enum drxu_code_action { 755*4882a593Smuzhiyun UCODE_UPLOAD, 756*4882a593Smuzhiyun UCODE_VERIFY 757*4882a593Smuzhiyun }; 758*4882a593Smuzhiyun 759*4882a593Smuzhiyun /* 760*4882a593Smuzhiyun * \enum enum drx_lock_status * \brief Used to reflect current lock status of demodulator. 761*4882a593Smuzhiyun * 762*4882a593Smuzhiyun * The generic lock states have device dependent semantics. 763*4882a593Smuzhiyun 764*4882a593Smuzhiyun DRX_NEVER_LOCK = 0, 765*4882a593Smuzhiyun **< Device will never lock on this signal * 766*4882a593Smuzhiyun DRX_NOT_LOCKED, 767*4882a593Smuzhiyun **< Device has no lock at all * 768*4882a593Smuzhiyun DRX_LOCK_STATE_1, 769*4882a593Smuzhiyun **< Generic lock state * 770*4882a593Smuzhiyun DRX_LOCK_STATE_2, 771*4882a593Smuzhiyun **< Generic lock state * 772*4882a593Smuzhiyun DRX_LOCK_STATE_3, 773*4882a593Smuzhiyun **< Generic lock state * 774*4882a593Smuzhiyun DRX_LOCK_STATE_4, 775*4882a593Smuzhiyun **< Generic lock state * 776*4882a593Smuzhiyun DRX_LOCK_STATE_5, 777*4882a593Smuzhiyun **< Generic lock state * 778*4882a593Smuzhiyun DRX_LOCK_STATE_6, 779*4882a593Smuzhiyun **< Generic lock state * 780*4882a593Smuzhiyun DRX_LOCK_STATE_7, 781*4882a593Smuzhiyun **< Generic lock state * 782*4882a593Smuzhiyun DRX_LOCK_STATE_8, 783*4882a593Smuzhiyun **< Generic lock state * 784*4882a593Smuzhiyun DRX_LOCK_STATE_9, 785*4882a593Smuzhiyun **< Generic lock state * 786*4882a593Smuzhiyun DRX_LOCKED **< Device is in lock * 787*4882a593Smuzhiyun */ 788*4882a593Smuzhiyun 789*4882a593Smuzhiyun enum drx_lock_status { 790*4882a593Smuzhiyun DRX_NEVER_LOCK = 0, 791*4882a593Smuzhiyun DRX_NOT_LOCKED, 792*4882a593Smuzhiyun DRX_LOCK_STATE_1, 793*4882a593Smuzhiyun DRX_LOCK_STATE_2, 794*4882a593Smuzhiyun DRX_LOCK_STATE_3, 795*4882a593Smuzhiyun DRX_LOCK_STATE_4, 796*4882a593Smuzhiyun DRX_LOCK_STATE_5, 797*4882a593Smuzhiyun DRX_LOCK_STATE_6, 798*4882a593Smuzhiyun DRX_LOCK_STATE_7, 799*4882a593Smuzhiyun DRX_LOCK_STATE_8, 800*4882a593Smuzhiyun DRX_LOCK_STATE_9, 801*4882a593Smuzhiyun DRX_LOCKED 802*4882a593Smuzhiyun }; 803*4882a593Smuzhiyun 804*4882a593Smuzhiyun /* 805*4882a593Smuzhiyun * \enum enum drx_uio* \brief Used to address a User IO (UIO). 806*4882a593Smuzhiyun */ 807*4882a593Smuzhiyun enum drx_uio { 808*4882a593Smuzhiyun DRX_UIO1, 809*4882a593Smuzhiyun DRX_UIO2, 810*4882a593Smuzhiyun DRX_UIO3, 811*4882a593Smuzhiyun DRX_UIO4, 812*4882a593Smuzhiyun DRX_UIO5, 813*4882a593Smuzhiyun DRX_UIO6, 814*4882a593Smuzhiyun DRX_UIO7, 815*4882a593Smuzhiyun DRX_UIO8, 816*4882a593Smuzhiyun DRX_UIO9, 817*4882a593Smuzhiyun DRX_UIO10, 818*4882a593Smuzhiyun DRX_UIO11, 819*4882a593Smuzhiyun DRX_UIO12, 820*4882a593Smuzhiyun DRX_UIO13, 821*4882a593Smuzhiyun DRX_UIO14, 822*4882a593Smuzhiyun DRX_UIO15, 823*4882a593Smuzhiyun DRX_UIO16, 824*4882a593Smuzhiyun DRX_UIO17, 825*4882a593Smuzhiyun DRX_UIO18, 826*4882a593Smuzhiyun DRX_UIO19, 827*4882a593Smuzhiyun DRX_UIO20, 828*4882a593Smuzhiyun DRX_UIO21, 829*4882a593Smuzhiyun DRX_UIO22, 830*4882a593Smuzhiyun DRX_UIO23, 831*4882a593Smuzhiyun DRX_UIO24, 832*4882a593Smuzhiyun DRX_UIO25, 833*4882a593Smuzhiyun DRX_UIO26, 834*4882a593Smuzhiyun DRX_UIO27, 835*4882a593Smuzhiyun DRX_UIO28, 836*4882a593Smuzhiyun DRX_UIO29, 837*4882a593Smuzhiyun DRX_UIO30, 838*4882a593Smuzhiyun DRX_UIO31, 839*4882a593Smuzhiyun DRX_UIO32, 840*4882a593Smuzhiyun DRX_UIO_MAX = DRX_UIO32 841*4882a593Smuzhiyun }; 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun /* 844*4882a593Smuzhiyun * \enum enum drxuio_mode * \brief Used to configure the modus oprandi of a UIO. 845*4882a593Smuzhiyun * 846*4882a593Smuzhiyun * DRX_UIO_MODE_FIRMWARE is an old uio mode. 847*4882a593Smuzhiyun * It is replaced by the modes DRX_UIO_MODE_FIRMWARE0 .. DRX_UIO_MODE_FIRMWARE9. 848*4882a593Smuzhiyun * To be backward compatible DRX_UIO_MODE_FIRMWARE is equivalent to 849*4882a593Smuzhiyun * DRX_UIO_MODE_FIRMWARE0. 850*4882a593Smuzhiyun */ 851*4882a593Smuzhiyun enum drxuio_mode { 852*4882a593Smuzhiyun DRX_UIO_MODE_DISABLE = 0x01, 853*4882a593Smuzhiyun /*< not used, pin is configured as input */ 854*4882a593Smuzhiyun DRX_UIO_MODE_READWRITE = 0x02, 855*4882a593Smuzhiyun /*< used for read/write by application */ 856*4882a593Smuzhiyun DRX_UIO_MODE_FIRMWARE = 0x04, 857*4882a593Smuzhiyun /*< controlled by firmware, function 0 */ 858*4882a593Smuzhiyun DRX_UIO_MODE_FIRMWARE0 = DRX_UIO_MODE_FIRMWARE, 859*4882a593Smuzhiyun /*< same as above */ 860*4882a593Smuzhiyun DRX_UIO_MODE_FIRMWARE1 = 0x08, 861*4882a593Smuzhiyun /*< controlled by firmware, function 1 */ 862*4882a593Smuzhiyun DRX_UIO_MODE_FIRMWARE2 = 0x10, 863*4882a593Smuzhiyun /*< controlled by firmware, function 2 */ 864*4882a593Smuzhiyun DRX_UIO_MODE_FIRMWARE3 = 0x20, 865*4882a593Smuzhiyun /*< controlled by firmware, function 3 */ 866*4882a593Smuzhiyun DRX_UIO_MODE_FIRMWARE4 = 0x40, 867*4882a593Smuzhiyun /*< controlled by firmware, function 4 */ 868*4882a593Smuzhiyun DRX_UIO_MODE_FIRMWARE5 = 0x80 869*4882a593Smuzhiyun /*< controlled by firmware, function 5 */ 870*4882a593Smuzhiyun }; 871*4882a593Smuzhiyun 872*4882a593Smuzhiyun /* 873*4882a593Smuzhiyun * \enum enum drxoob_downstream_standard * \brief Used to select OOB standard. 874*4882a593Smuzhiyun * 875*4882a593Smuzhiyun * Based on ANSI 55-1 and 55-2 876*4882a593Smuzhiyun */ 877*4882a593Smuzhiyun enum drxoob_downstream_standard { 878*4882a593Smuzhiyun DRX_OOB_MODE_A = 0, 879*4882a593Smuzhiyun /*< ANSI 55-1 */ 880*4882a593Smuzhiyun DRX_OOB_MODE_B_GRADE_A, 881*4882a593Smuzhiyun /*< ANSI 55-2 A */ 882*4882a593Smuzhiyun DRX_OOB_MODE_B_GRADE_B 883*4882a593Smuzhiyun /*< ANSI 55-2 B */ 884*4882a593Smuzhiyun }; 885*4882a593Smuzhiyun 886*4882a593Smuzhiyun /*------------------------------------------------------------------------- 887*4882a593Smuzhiyun STRUCTS 888*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 889*4882a593Smuzhiyun 890*4882a593Smuzhiyun /*============================================================================*/ 891*4882a593Smuzhiyun /*============================================================================*/ 892*4882a593Smuzhiyun /*== CTRL CFG related data structures ========================================*/ 893*4882a593Smuzhiyun /*============================================================================*/ 894*4882a593Smuzhiyun /*============================================================================*/ 895*4882a593Smuzhiyun 896*4882a593Smuzhiyun #ifndef DRX_CFG_BASE 897*4882a593Smuzhiyun #define DRX_CFG_BASE 0 898*4882a593Smuzhiyun #endif 899*4882a593Smuzhiyun 900*4882a593Smuzhiyun #define DRX_CFG_MPEG_OUTPUT (DRX_CFG_BASE + 0) /* MPEG TS output */ 901*4882a593Smuzhiyun #define DRX_CFG_PKTERR (DRX_CFG_BASE + 1) /* Packet Error */ 902*4882a593Smuzhiyun #define DRX_CFG_SYMCLK_OFFS (DRX_CFG_BASE + 2) /* Symbol Clk Offset */ 903*4882a593Smuzhiyun #define DRX_CFG_SMA (DRX_CFG_BASE + 3) /* Smart Antenna */ 904*4882a593Smuzhiyun #define DRX_CFG_PINSAFE (DRX_CFG_BASE + 4) /* Pin safe mode */ 905*4882a593Smuzhiyun #define DRX_CFG_SUBSTANDARD (DRX_CFG_BASE + 5) /* substandard */ 906*4882a593Smuzhiyun #define DRX_CFG_AUD_VOLUME (DRX_CFG_BASE + 6) /* volume */ 907*4882a593Smuzhiyun #define DRX_CFG_AUD_RDS (DRX_CFG_BASE + 7) /* rds */ 908*4882a593Smuzhiyun #define DRX_CFG_AUD_AUTOSOUND (DRX_CFG_BASE + 8) /* ASS & ASC */ 909*4882a593Smuzhiyun #define DRX_CFG_AUD_ASS_THRES (DRX_CFG_BASE + 9) /* ASS Thresholds */ 910*4882a593Smuzhiyun #define DRX_CFG_AUD_DEVIATION (DRX_CFG_BASE + 10) /* Deviation */ 911*4882a593Smuzhiyun #define DRX_CFG_AUD_PRESCALE (DRX_CFG_BASE + 11) /* Prescale */ 912*4882a593Smuzhiyun #define DRX_CFG_AUD_MIXER (DRX_CFG_BASE + 12) /* Mixer */ 913*4882a593Smuzhiyun #define DRX_CFG_AUD_AVSYNC (DRX_CFG_BASE + 13) /* AVSync */ 914*4882a593Smuzhiyun #define DRX_CFG_AUD_CARRIER (DRX_CFG_BASE + 14) /* Audio carriers */ 915*4882a593Smuzhiyun #define DRX_CFG_I2S_OUTPUT (DRX_CFG_BASE + 15) /* I2S output */ 916*4882a593Smuzhiyun #define DRX_CFG_ATV_STANDARD (DRX_CFG_BASE + 16) /* ATV standard */ 917*4882a593Smuzhiyun #define DRX_CFG_SQI_SPEED (DRX_CFG_BASE + 17) /* SQI speed */ 918*4882a593Smuzhiyun #define DRX_CTRL_CFG_MAX (DRX_CFG_BASE + 18) /* never to be used */ 919*4882a593Smuzhiyun 920*4882a593Smuzhiyun #define DRX_CFG_PINS_SAFE_MODE DRX_CFG_PINSAFE 921*4882a593Smuzhiyun /*============================================================================*/ 922*4882a593Smuzhiyun /*============================================================================*/ 923*4882a593Smuzhiyun /*== CTRL related data structures ============================================*/ 924*4882a593Smuzhiyun /*============================================================================*/ 925*4882a593Smuzhiyun /*============================================================================*/ 926*4882a593Smuzhiyun 927*4882a593Smuzhiyun /* 928*4882a593Smuzhiyun * struct drxu_code_info Parameters for microcode upload and verfiy. 929*4882a593Smuzhiyun * 930*4882a593Smuzhiyun * @mc_file: microcode file name 931*4882a593Smuzhiyun * 932*4882a593Smuzhiyun * Used by DRX_CTRL_LOAD_UCODE and DRX_CTRL_VERIFY_UCODE 933*4882a593Smuzhiyun */ 934*4882a593Smuzhiyun struct drxu_code_info { 935*4882a593Smuzhiyun char *mc_file; 936*4882a593Smuzhiyun }; 937*4882a593Smuzhiyun 938*4882a593Smuzhiyun /* 939*4882a593Smuzhiyun * \struct drx_mc_version_rec_t 940*4882a593Smuzhiyun * \brief Microcode version record 941*4882a593Smuzhiyun * Version numbers are stored in BCD format, as usual: 942*4882a593Smuzhiyun * o major number = bits 31-20 (first three nibbles of MSW) 943*4882a593Smuzhiyun * o minor number = bits 19-16 (fourth nibble of MSW) 944*4882a593Smuzhiyun * o patch number = bits 15-0 (remaining nibbles in LSW) 945*4882a593Smuzhiyun * 946*4882a593Smuzhiyun * The device type indicates for which the device is meant. It is based on the 947*4882a593Smuzhiyun * JTAG ID, using everything except the bond ID and the metal fix. 948*4882a593Smuzhiyun * 949*4882a593Smuzhiyun * Special values: 950*4882a593Smuzhiyun * - mc_dev_type == 0 => any device allowed 951*4882a593Smuzhiyun * - mc_base_version == 0.0.0 => full microcode (mc_version is the version) 952*4882a593Smuzhiyun * - mc_base_version != 0.0.0 => patch microcode, the base microcode version 953*4882a593Smuzhiyun * (mc_version is the version) 954*4882a593Smuzhiyun */ 955*4882a593Smuzhiyun #define AUX_VER_RECORD 0x8000 956*4882a593Smuzhiyun 957*4882a593Smuzhiyun struct drx_mc_version_rec { 958*4882a593Smuzhiyun u16 aux_type; /* type of aux data - 0x8000 for version record */ 959*4882a593Smuzhiyun u32 mc_dev_type; /* device type, based on JTAG ID */ 960*4882a593Smuzhiyun u32 mc_version; /* version of microcode */ 961*4882a593Smuzhiyun u32 mc_base_version; /* in case of patch: the original microcode version */ 962*4882a593Smuzhiyun }; 963*4882a593Smuzhiyun 964*4882a593Smuzhiyun /*========================================*/ 965*4882a593Smuzhiyun 966*4882a593Smuzhiyun /* 967*4882a593Smuzhiyun * \struct drx_filter_info_t 968*4882a593Smuzhiyun * \brief Parameters for loading filter coefficients 969*4882a593Smuzhiyun * 970*4882a593Smuzhiyun * Used by DRX_CTRL_LOAD_FILTER 971*4882a593Smuzhiyun */ 972*4882a593Smuzhiyun struct drx_filter_info { 973*4882a593Smuzhiyun u8 *data_re; 974*4882a593Smuzhiyun /*< pointer to coefficients for RE */ 975*4882a593Smuzhiyun u8 *data_im; 976*4882a593Smuzhiyun /*< pointer to coefficients for IM */ 977*4882a593Smuzhiyun u16 size_re; 978*4882a593Smuzhiyun /*< size of coefficients for RE */ 979*4882a593Smuzhiyun u16 size_im; 980*4882a593Smuzhiyun /*< size of coefficients for IM */ 981*4882a593Smuzhiyun }; 982*4882a593Smuzhiyun 983*4882a593Smuzhiyun /*========================================*/ 984*4882a593Smuzhiyun 985*4882a593Smuzhiyun /* 986*4882a593Smuzhiyun * \struct struct drx_channel * \brief The set of parameters describing a single channel. 987*4882a593Smuzhiyun * 988*4882a593Smuzhiyun * Used by DRX_CTRL_SET_CHANNEL and DRX_CTRL_GET_CHANNEL. 989*4882a593Smuzhiyun * Only certain fields need to be used for a specific standard. 990*4882a593Smuzhiyun * 991*4882a593Smuzhiyun */ 992*4882a593Smuzhiyun struct drx_channel { 993*4882a593Smuzhiyun s32 frequency; 994*4882a593Smuzhiyun /*< frequency in kHz */ 995*4882a593Smuzhiyun enum drx_bandwidth bandwidth; 996*4882a593Smuzhiyun /*< bandwidth */ 997*4882a593Smuzhiyun enum drx_mirror mirror; /*< mirrored or not on RF */ 998*4882a593Smuzhiyun enum drx_modulation constellation; 999*4882a593Smuzhiyun /*< constellation */ 1000*4882a593Smuzhiyun enum drx_hierarchy hierarchy; 1001*4882a593Smuzhiyun /*< hierarchy */ 1002*4882a593Smuzhiyun enum drx_priority priority; /*< priority */ 1003*4882a593Smuzhiyun enum drx_coderate coderate; /*< coderate */ 1004*4882a593Smuzhiyun enum drx_guard guard; /*< guard interval */ 1005*4882a593Smuzhiyun enum drx_fft_mode fftmode; /*< fftmode */ 1006*4882a593Smuzhiyun enum drx_classification classification; 1007*4882a593Smuzhiyun /*< classification */ 1008*4882a593Smuzhiyun u32 symbolrate; 1009*4882a593Smuzhiyun /*< symbolrate in symbols/sec */ 1010*4882a593Smuzhiyun enum drx_interleave_mode interleavemode; 1011*4882a593Smuzhiyun /*< interleaveMode QAM */ 1012*4882a593Smuzhiyun enum drx_ldpc ldpc; /*< ldpc */ 1013*4882a593Smuzhiyun enum drx_carrier_mode carrier; /*< carrier */ 1014*4882a593Smuzhiyun enum drx_frame_mode framemode; 1015*4882a593Smuzhiyun /*< frame mode */ 1016*4882a593Smuzhiyun enum drx_pilot_mode pilot; /*< pilot mode */ 1017*4882a593Smuzhiyun }; 1018*4882a593Smuzhiyun 1019*4882a593Smuzhiyun /*========================================*/ 1020*4882a593Smuzhiyun 1021*4882a593Smuzhiyun enum drx_cfg_sqi_speed { 1022*4882a593Smuzhiyun DRX_SQI_SPEED_FAST = 0, 1023*4882a593Smuzhiyun DRX_SQI_SPEED_MEDIUM, 1024*4882a593Smuzhiyun DRX_SQI_SPEED_SLOW, 1025*4882a593Smuzhiyun DRX_SQI_SPEED_UNKNOWN = DRX_UNKNOWN 1026*4882a593Smuzhiyun }; 1027*4882a593Smuzhiyun 1028*4882a593Smuzhiyun /*========================================*/ 1029*4882a593Smuzhiyun 1030*4882a593Smuzhiyun /* 1031*4882a593Smuzhiyun * \struct struct drx_complex * A complex number. 1032*4882a593Smuzhiyun * 1033*4882a593Smuzhiyun * Used by DRX_CTRL_CONSTEL. 1034*4882a593Smuzhiyun */ 1035*4882a593Smuzhiyun struct drx_complex { 1036*4882a593Smuzhiyun s16 im; 1037*4882a593Smuzhiyun /*< Imaginary part. */ 1038*4882a593Smuzhiyun s16 re; 1039*4882a593Smuzhiyun /*< Real part. */ 1040*4882a593Smuzhiyun }; 1041*4882a593Smuzhiyun 1042*4882a593Smuzhiyun /*========================================*/ 1043*4882a593Smuzhiyun 1044*4882a593Smuzhiyun /* 1045*4882a593Smuzhiyun * \struct struct drx_frequency_plan * Array element of a frequency plan. 1046*4882a593Smuzhiyun * 1047*4882a593Smuzhiyun * Used by DRX_CTRL_SCAN_INIT. 1048*4882a593Smuzhiyun */ 1049*4882a593Smuzhiyun struct drx_frequency_plan { 1050*4882a593Smuzhiyun s32 first; 1051*4882a593Smuzhiyun /*< First centre frequency in this band */ 1052*4882a593Smuzhiyun s32 last; 1053*4882a593Smuzhiyun /*< Last centre frequency in this band */ 1054*4882a593Smuzhiyun s32 step; 1055*4882a593Smuzhiyun /*< Stepping frequency in this band */ 1056*4882a593Smuzhiyun enum drx_bandwidth bandwidth; 1057*4882a593Smuzhiyun /*< Bandwidth within this frequency band */ 1058*4882a593Smuzhiyun u16 ch_number; 1059*4882a593Smuzhiyun /*< First channel number in this band, or first 1060*4882a593Smuzhiyun index in ch_names */ 1061*4882a593Smuzhiyun char **ch_names; 1062*4882a593Smuzhiyun /*< Optional list of channel names in this 1063*4882a593Smuzhiyun band */ 1064*4882a593Smuzhiyun }; 1065*4882a593Smuzhiyun 1066*4882a593Smuzhiyun /*========================================*/ 1067*4882a593Smuzhiyun 1068*4882a593Smuzhiyun /* 1069*4882a593Smuzhiyun * \struct struct drx_scan_param * Parameters for channel scan. 1070*4882a593Smuzhiyun * 1071*4882a593Smuzhiyun * Used by DRX_CTRL_SCAN_INIT. 1072*4882a593Smuzhiyun */ 1073*4882a593Smuzhiyun struct drx_scan_param { 1074*4882a593Smuzhiyun struct drx_frequency_plan *frequency_plan; 1075*4882a593Smuzhiyun /*< Frequency plan (array)*/ 1076*4882a593Smuzhiyun u16 frequency_plan_size; /*< Number of bands */ 1077*4882a593Smuzhiyun u32 num_tries; /*< Max channels tried */ 1078*4882a593Smuzhiyun s32 skip; /*< Minimum frequency step to take 1079*4882a593Smuzhiyun after a channel is found */ 1080*4882a593Smuzhiyun void *ext_params; /*< Standard specific params */ 1081*4882a593Smuzhiyun }; 1082*4882a593Smuzhiyun 1083*4882a593Smuzhiyun /*========================================*/ 1084*4882a593Smuzhiyun 1085*4882a593Smuzhiyun /* 1086*4882a593Smuzhiyun * \brief Scan commands. 1087*4882a593Smuzhiyun * Used by scanning algorithms. 1088*4882a593Smuzhiyun */ 1089*4882a593Smuzhiyun enum drx_scan_command { 1090*4882a593Smuzhiyun DRX_SCAN_COMMAND_INIT = 0,/*< Initialize scanning */ 1091*4882a593Smuzhiyun DRX_SCAN_COMMAND_NEXT, /*< Next scan */ 1092*4882a593Smuzhiyun DRX_SCAN_COMMAND_STOP /*< Stop scanning */ 1093*4882a593Smuzhiyun }; 1094*4882a593Smuzhiyun 1095*4882a593Smuzhiyun /*========================================*/ 1096*4882a593Smuzhiyun 1097*4882a593Smuzhiyun /* 1098*4882a593Smuzhiyun * \brief Inner scan function prototype. 1099*4882a593Smuzhiyun */ 1100*4882a593Smuzhiyun typedef int(*drx_scan_func_t) (void *scan_context, 1101*4882a593Smuzhiyun enum drx_scan_command scan_command, 1102*4882a593Smuzhiyun struct drx_channel *scan_channel, 1103*4882a593Smuzhiyun bool *get_next_channel); 1104*4882a593Smuzhiyun 1105*4882a593Smuzhiyun /*========================================*/ 1106*4882a593Smuzhiyun 1107*4882a593Smuzhiyun /* 1108*4882a593Smuzhiyun * \struct struct drxtps_info * TPS information, DVB-T specific. 1109*4882a593Smuzhiyun * 1110*4882a593Smuzhiyun * Used by DRX_CTRL_TPS_INFO. 1111*4882a593Smuzhiyun */ 1112*4882a593Smuzhiyun struct drxtps_info { 1113*4882a593Smuzhiyun enum drx_fft_mode fftmode; /*< Fft mode */ 1114*4882a593Smuzhiyun enum drx_guard guard; /*< Guard interval */ 1115*4882a593Smuzhiyun enum drx_modulation constellation; 1116*4882a593Smuzhiyun /*< Constellation */ 1117*4882a593Smuzhiyun enum drx_hierarchy hierarchy; 1118*4882a593Smuzhiyun /*< Hierarchy */ 1119*4882a593Smuzhiyun enum drx_coderate high_coderate; 1120*4882a593Smuzhiyun /*< High code rate */ 1121*4882a593Smuzhiyun enum drx_coderate low_coderate; 1122*4882a593Smuzhiyun /*< Low cod rate */ 1123*4882a593Smuzhiyun enum drx_tps_frame frame; /*< Tps frame */ 1124*4882a593Smuzhiyun u8 length; /*< Length */ 1125*4882a593Smuzhiyun u16 cell_id; /*< Cell id */ 1126*4882a593Smuzhiyun }; 1127*4882a593Smuzhiyun 1128*4882a593Smuzhiyun /*========================================*/ 1129*4882a593Smuzhiyun 1130*4882a593Smuzhiyun /* 1131*4882a593Smuzhiyun * \brief Power mode of device. 1132*4882a593Smuzhiyun * 1133*4882a593Smuzhiyun * Used by DRX_CTRL_SET_POWER_MODE. 1134*4882a593Smuzhiyun */ 1135*4882a593Smuzhiyun enum drx_power_mode { 1136*4882a593Smuzhiyun DRX_POWER_UP = 0, 1137*4882a593Smuzhiyun /*< Generic , Power Up Mode */ 1138*4882a593Smuzhiyun DRX_POWER_MODE_1, 1139*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1140*4882a593Smuzhiyun DRX_POWER_MODE_2, 1141*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1142*4882a593Smuzhiyun DRX_POWER_MODE_3, 1143*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1144*4882a593Smuzhiyun DRX_POWER_MODE_4, 1145*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1146*4882a593Smuzhiyun DRX_POWER_MODE_5, 1147*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1148*4882a593Smuzhiyun DRX_POWER_MODE_6, 1149*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1150*4882a593Smuzhiyun DRX_POWER_MODE_7, 1151*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1152*4882a593Smuzhiyun DRX_POWER_MODE_8, 1153*4882a593Smuzhiyun /*< Device specific , Power Up Mode */ 1154*4882a593Smuzhiyun 1155*4882a593Smuzhiyun DRX_POWER_MODE_9, 1156*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1157*4882a593Smuzhiyun DRX_POWER_MODE_10, 1158*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1159*4882a593Smuzhiyun DRX_POWER_MODE_11, 1160*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1161*4882a593Smuzhiyun DRX_POWER_MODE_12, 1162*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1163*4882a593Smuzhiyun DRX_POWER_MODE_13, 1164*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1165*4882a593Smuzhiyun DRX_POWER_MODE_14, 1166*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1167*4882a593Smuzhiyun DRX_POWER_MODE_15, 1168*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1169*4882a593Smuzhiyun DRX_POWER_MODE_16, 1170*4882a593Smuzhiyun /*< Device specific , Power Down Mode */ 1171*4882a593Smuzhiyun DRX_POWER_DOWN = 255 1172*4882a593Smuzhiyun /*< Generic , Power Down Mode */ 1173*4882a593Smuzhiyun }; 1174*4882a593Smuzhiyun 1175*4882a593Smuzhiyun /*========================================*/ 1176*4882a593Smuzhiyun 1177*4882a593Smuzhiyun /* 1178*4882a593Smuzhiyun * \enum enum drx_module * \brief Software module identification. 1179*4882a593Smuzhiyun * 1180*4882a593Smuzhiyun * Used by DRX_CTRL_VERSION. 1181*4882a593Smuzhiyun */ 1182*4882a593Smuzhiyun enum drx_module { 1183*4882a593Smuzhiyun DRX_MODULE_DEVICE, 1184*4882a593Smuzhiyun DRX_MODULE_MICROCODE, 1185*4882a593Smuzhiyun DRX_MODULE_DRIVERCORE, 1186*4882a593Smuzhiyun DRX_MODULE_DEVICEDRIVER, 1187*4882a593Smuzhiyun DRX_MODULE_DAP, 1188*4882a593Smuzhiyun DRX_MODULE_BSP_I2C, 1189*4882a593Smuzhiyun DRX_MODULE_BSP_TUNER, 1190*4882a593Smuzhiyun DRX_MODULE_BSP_HOST, 1191*4882a593Smuzhiyun DRX_MODULE_UNKNOWN 1192*4882a593Smuzhiyun }; 1193*4882a593Smuzhiyun 1194*4882a593Smuzhiyun /* 1195*4882a593Smuzhiyun * \enum struct drx_version * \brief Version information of one software module. 1196*4882a593Smuzhiyun * 1197*4882a593Smuzhiyun * Used by DRX_CTRL_VERSION. 1198*4882a593Smuzhiyun */ 1199*4882a593Smuzhiyun struct drx_version { 1200*4882a593Smuzhiyun enum drx_module module_type; 1201*4882a593Smuzhiyun /*< Type identifier of the module */ 1202*4882a593Smuzhiyun char *module_name; 1203*4882a593Smuzhiyun /*< Name or description of module */ 1204*4882a593Smuzhiyun u16 v_major; /*< Major version number */ 1205*4882a593Smuzhiyun u16 v_minor; /*< Minor version number */ 1206*4882a593Smuzhiyun u16 v_patch; /*< Patch version number */ 1207*4882a593Smuzhiyun char *v_string; /*< Version as text string */ 1208*4882a593Smuzhiyun }; 1209*4882a593Smuzhiyun 1210*4882a593Smuzhiyun /* 1211*4882a593Smuzhiyun * \enum struct drx_version_list * \brief List element of NULL terminated, linked list for version information. 1212*4882a593Smuzhiyun * 1213*4882a593Smuzhiyun * Used by DRX_CTRL_VERSION. 1214*4882a593Smuzhiyun */ 1215*4882a593Smuzhiyun struct drx_version_list { 1216*4882a593Smuzhiyun struct drx_version *version;/*< Version information */ 1217*4882a593Smuzhiyun struct drx_version_list *next; 1218*4882a593Smuzhiyun /*< Next list element */ 1219*4882a593Smuzhiyun }; 1220*4882a593Smuzhiyun 1221*4882a593Smuzhiyun /*========================================*/ 1222*4882a593Smuzhiyun 1223*4882a593Smuzhiyun /* 1224*4882a593Smuzhiyun * \brief Parameters needed to confiugure a UIO. 1225*4882a593Smuzhiyun * 1226*4882a593Smuzhiyun * Used by DRX_CTRL_UIO_CFG. 1227*4882a593Smuzhiyun */ 1228*4882a593Smuzhiyun struct drxuio_cfg { 1229*4882a593Smuzhiyun enum drx_uio uio; 1230*4882a593Smuzhiyun /*< UIO identifier */ 1231*4882a593Smuzhiyun enum drxuio_mode mode; 1232*4882a593Smuzhiyun /*< UIO operational mode */ 1233*4882a593Smuzhiyun }; 1234*4882a593Smuzhiyun 1235*4882a593Smuzhiyun /*========================================*/ 1236*4882a593Smuzhiyun 1237*4882a593Smuzhiyun /* 1238*4882a593Smuzhiyun * \brief Parameters needed to read from or write to a UIO. 1239*4882a593Smuzhiyun * 1240*4882a593Smuzhiyun * Used by DRX_CTRL_UIO_READ and DRX_CTRL_UIO_WRITE. 1241*4882a593Smuzhiyun */ 1242*4882a593Smuzhiyun struct drxuio_data { 1243*4882a593Smuzhiyun enum drx_uio uio; 1244*4882a593Smuzhiyun /*< UIO identifier */ 1245*4882a593Smuzhiyun bool value; 1246*4882a593Smuzhiyun /*< UIO value (true=1, false=0) */ 1247*4882a593Smuzhiyun }; 1248*4882a593Smuzhiyun 1249*4882a593Smuzhiyun /*========================================*/ 1250*4882a593Smuzhiyun 1251*4882a593Smuzhiyun /* 1252*4882a593Smuzhiyun * \brief Parameters needed to configure OOB. 1253*4882a593Smuzhiyun * 1254*4882a593Smuzhiyun * Used by DRX_CTRL_SET_OOB. 1255*4882a593Smuzhiyun */ 1256*4882a593Smuzhiyun struct drxoob { 1257*4882a593Smuzhiyun s32 frequency; /*< Frequency in kHz */ 1258*4882a593Smuzhiyun enum drxoob_downstream_standard standard; 1259*4882a593Smuzhiyun /*< OOB standard */ 1260*4882a593Smuzhiyun bool spectrum_inverted; /*< If true, then spectrum 1261*4882a593Smuzhiyun is inverted */ 1262*4882a593Smuzhiyun }; 1263*4882a593Smuzhiyun 1264*4882a593Smuzhiyun /*========================================*/ 1265*4882a593Smuzhiyun 1266*4882a593Smuzhiyun /* 1267*4882a593Smuzhiyun * \brief Metrics from OOB. 1268*4882a593Smuzhiyun * 1269*4882a593Smuzhiyun * Used by DRX_CTRL_GET_OOB. 1270*4882a593Smuzhiyun */ 1271*4882a593Smuzhiyun struct drxoob_status { 1272*4882a593Smuzhiyun s32 frequency; /*< Frequency in Khz */ 1273*4882a593Smuzhiyun enum drx_lock_status lock; /*< Lock status */ 1274*4882a593Smuzhiyun u32 mer; /*< MER */ 1275*4882a593Smuzhiyun s32 symbol_rate_offset; /*< Symbolrate offset in ppm */ 1276*4882a593Smuzhiyun }; 1277*4882a593Smuzhiyun 1278*4882a593Smuzhiyun /*========================================*/ 1279*4882a593Smuzhiyun 1280*4882a593Smuzhiyun /* 1281*4882a593Smuzhiyun * \brief Device dependent configuration data. 1282*4882a593Smuzhiyun * 1283*4882a593Smuzhiyun * Used by DRX_CTRL_SET_CFG and DRX_CTRL_GET_CFG. 1284*4882a593Smuzhiyun * A sort of nested drx_ctrl() functionality for device specific controls. 1285*4882a593Smuzhiyun */ 1286*4882a593Smuzhiyun struct drx_cfg { 1287*4882a593Smuzhiyun u32 cfg_type; 1288*4882a593Smuzhiyun /*< Function identifier */ 1289*4882a593Smuzhiyun void *cfg_data; 1290*4882a593Smuzhiyun /*< Function data */ 1291*4882a593Smuzhiyun }; 1292*4882a593Smuzhiyun 1293*4882a593Smuzhiyun /*========================================*/ 1294*4882a593Smuzhiyun 1295*4882a593Smuzhiyun /* 1296*4882a593Smuzhiyun * /struct DRXMpegStartWidth_t 1297*4882a593Smuzhiyun * MStart width [nr MCLK cycles] for serial MPEG output. 1298*4882a593Smuzhiyun */ 1299*4882a593Smuzhiyun 1300*4882a593Smuzhiyun enum drxmpeg_str_width { 1301*4882a593Smuzhiyun DRX_MPEG_STR_WIDTH_1, 1302*4882a593Smuzhiyun DRX_MPEG_STR_WIDTH_8 1303*4882a593Smuzhiyun }; 1304*4882a593Smuzhiyun 1305*4882a593Smuzhiyun /* CTRL CFG MPEG output */ 1306*4882a593Smuzhiyun /* 1307*4882a593Smuzhiyun * \struct struct drx_cfg_mpeg_output * \brief Configuration parameters for MPEG output control. 1308*4882a593Smuzhiyun * 1309*4882a593Smuzhiyun * Used by DRX_CFG_MPEG_OUTPUT, in combination with DRX_CTRL_SET_CFG and 1310*4882a593Smuzhiyun * DRX_CTRL_GET_CFG. 1311*4882a593Smuzhiyun */ 1312*4882a593Smuzhiyun 1313*4882a593Smuzhiyun struct drx_cfg_mpeg_output { 1314*4882a593Smuzhiyun bool enable_mpeg_output;/*< If true, enable MPEG output */ 1315*4882a593Smuzhiyun bool insert_rs_byte; /*< If true, insert RS byte */ 1316*4882a593Smuzhiyun bool enable_parallel; /*< If true, parallel out otherwise 1317*4882a593Smuzhiyun serial */ 1318*4882a593Smuzhiyun bool invert_data; /*< If true, invert DATA signals */ 1319*4882a593Smuzhiyun bool invert_err; /*< If true, invert ERR signal */ 1320*4882a593Smuzhiyun bool invert_str; /*< If true, invert STR signals */ 1321*4882a593Smuzhiyun bool invert_val; /*< If true, invert VAL signals */ 1322*4882a593Smuzhiyun bool invert_clk; /*< If true, invert CLK signals */ 1323*4882a593Smuzhiyun bool static_clk; /*< If true, static MPEG clockrate 1324*4882a593Smuzhiyun will be used, otherwise clockrate 1325*4882a593Smuzhiyun will adapt to the bitrate of the 1326*4882a593Smuzhiyun TS */ 1327*4882a593Smuzhiyun u32 bitrate; /*< Maximum bitrate in b/s in case 1328*4882a593Smuzhiyun static clockrate is selected */ 1329*4882a593Smuzhiyun enum drxmpeg_str_width width_str; 1330*4882a593Smuzhiyun /*< MPEG start width */ 1331*4882a593Smuzhiyun }; 1332*4882a593Smuzhiyun 1333*4882a593Smuzhiyun 1334*4882a593Smuzhiyun /*========================================*/ 1335*4882a593Smuzhiyun 1336*4882a593Smuzhiyun /* 1337*4882a593Smuzhiyun * \struct struct drxi2c_data * \brief Data for I2C via 2nd or 3rd or etc I2C port. 1338*4882a593Smuzhiyun * 1339*4882a593Smuzhiyun * Used by DRX_CTRL_I2C_READWRITE. 1340*4882a593Smuzhiyun * If port_nr is equal to primairy port_nr BSPI2C will be used. 1341*4882a593Smuzhiyun * 1342*4882a593Smuzhiyun */ 1343*4882a593Smuzhiyun struct drxi2c_data { 1344*4882a593Smuzhiyun u16 port_nr; /*< I2C port number */ 1345*4882a593Smuzhiyun struct i2c_device_addr *w_dev_addr; 1346*4882a593Smuzhiyun /*< Write device address */ 1347*4882a593Smuzhiyun u16 w_count; /*< Size of write data in bytes */ 1348*4882a593Smuzhiyun u8 *wData; /*< Pointer to write data */ 1349*4882a593Smuzhiyun struct i2c_device_addr *r_dev_addr; 1350*4882a593Smuzhiyun /*< Read device address */ 1351*4882a593Smuzhiyun u16 r_count; /*< Size of data to read in bytes */ 1352*4882a593Smuzhiyun u8 *r_data; /*< Pointer to read buffer */ 1353*4882a593Smuzhiyun }; 1354*4882a593Smuzhiyun 1355*4882a593Smuzhiyun /*========================================*/ 1356*4882a593Smuzhiyun 1357*4882a593Smuzhiyun /* 1358*4882a593Smuzhiyun * \enum enum drx_aud_standard * \brief Audio standard identifier. 1359*4882a593Smuzhiyun * 1360*4882a593Smuzhiyun * Used by DRX_CTRL_SET_AUD. 1361*4882a593Smuzhiyun */ 1362*4882a593Smuzhiyun enum drx_aud_standard { 1363*4882a593Smuzhiyun DRX_AUD_STANDARD_BTSC, /*< set BTSC standard (USA) */ 1364*4882a593Smuzhiyun DRX_AUD_STANDARD_A2, /*< set A2-Korea FM Stereo */ 1365*4882a593Smuzhiyun DRX_AUD_STANDARD_EIAJ, /*< set to Japanese FM Stereo */ 1366*4882a593Smuzhiyun DRX_AUD_STANDARD_FM_STEREO,/*< set to FM-Stereo Radio */ 1367*4882a593Smuzhiyun DRX_AUD_STANDARD_M_MONO, /*< for 4.5 MHz mono detected */ 1368*4882a593Smuzhiyun DRX_AUD_STANDARD_D_K_MONO, /*< for 6.5 MHz mono detected */ 1369*4882a593Smuzhiyun DRX_AUD_STANDARD_BG_FM, /*< set BG_FM standard */ 1370*4882a593Smuzhiyun DRX_AUD_STANDARD_D_K1, /*< set D_K1 standard */ 1371*4882a593Smuzhiyun DRX_AUD_STANDARD_D_K2, /*< set D_K2 standard */ 1372*4882a593Smuzhiyun DRX_AUD_STANDARD_D_K3, /*< set D_K3 standard */ 1373*4882a593Smuzhiyun DRX_AUD_STANDARD_BG_NICAM_FM, 1374*4882a593Smuzhiyun /*< set BG_NICAM_FM standard */ 1375*4882a593Smuzhiyun DRX_AUD_STANDARD_L_NICAM_AM, 1376*4882a593Smuzhiyun /*< set L_NICAM_AM standard */ 1377*4882a593Smuzhiyun DRX_AUD_STANDARD_I_NICAM_FM, 1378*4882a593Smuzhiyun /*< set I_NICAM_FM standard */ 1379*4882a593Smuzhiyun DRX_AUD_STANDARD_D_K_NICAM_FM, 1380*4882a593Smuzhiyun /*< set D_K_NICAM_FM standard */ 1381*4882a593Smuzhiyun DRX_AUD_STANDARD_NOT_READY,/*< used to detect audio standard */ 1382*4882a593Smuzhiyun DRX_AUD_STANDARD_AUTO = DRX_AUTO, 1383*4882a593Smuzhiyun /*< Automatic Standard Detection */ 1384*4882a593Smuzhiyun DRX_AUD_STANDARD_UNKNOWN = DRX_UNKNOWN 1385*4882a593Smuzhiyun /*< used as auto and for readback */ 1386*4882a593Smuzhiyun }; 1387*4882a593Smuzhiyun 1388*4882a593Smuzhiyun /* CTRL_AUD_GET_STATUS - struct drx_aud_status */ 1389*4882a593Smuzhiyun /* 1390*4882a593Smuzhiyun * \enum enum drx_aud_nicam_status * \brief Status of NICAM carrier. 1391*4882a593Smuzhiyun */ 1392*4882a593Smuzhiyun enum drx_aud_nicam_status { 1393*4882a593Smuzhiyun DRX_AUD_NICAM_DETECTED = 0, 1394*4882a593Smuzhiyun /*< NICAM carrier detected */ 1395*4882a593Smuzhiyun DRX_AUD_NICAM_NOT_DETECTED, 1396*4882a593Smuzhiyun /*< NICAM carrier not detected */ 1397*4882a593Smuzhiyun DRX_AUD_NICAM_BAD /*< NICAM carrier bad quality */ 1398*4882a593Smuzhiyun }; 1399*4882a593Smuzhiyun 1400*4882a593Smuzhiyun /* 1401*4882a593Smuzhiyun * \struct struct drx_aud_status * \brief Audio status characteristics. 1402*4882a593Smuzhiyun */ 1403*4882a593Smuzhiyun struct drx_aud_status { 1404*4882a593Smuzhiyun bool stereo; /*< stereo detection */ 1405*4882a593Smuzhiyun bool carrier_a; /*< carrier A detected */ 1406*4882a593Smuzhiyun bool carrier_b; /*< carrier B detected */ 1407*4882a593Smuzhiyun bool sap; /*< sap / bilingual detection */ 1408*4882a593Smuzhiyun bool rds; /*< RDS data array present */ 1409*4882a593Smuzhiyun enum drx_aud_nicam_status nicam_status; 1410*4882a593Smuzhiyun /*< status of NICAM carrier */ 1411*4882a593Smuzhiyun s8 fm_ident; /*< FM Identification value */ 1412*4882a593Smuzhiyun }; 1413*4882a593Smuzhiyun 1414*4882a593Smuzhiyun /* CTRL_AUD_READ_RDS - DRXRDSdata_t */ 1415*4882a593Smuzhiyun 1416*4882a593Smuzhiyun /* 1417*4882a593Smuzhiyun * \struct DRXRDSdata_t 1418*4882a593Smuzhiyun * \brief Raw RDS data array. 1419*4882a593Smuzhiyun */ 1420*4882a593Smuzhiyun struct drx_cfg_aud_rds { 1421*4882a593Smuzhiyun bool valid; /*< RDS data validation */ 1422*4882a593Smuzhiyun u16 data[18]; /*< data from one RDS data array */ 1423*4882a593Smuzhiyun }; 1424*4882a593Smuzhiyun 1425*4882a593Smuzhiyun /* DRX_CFG_AUD_VOLUME - struct drx_cfg_aud_volume - set/get */ 1426*4882a593Smuzhiyun /* 1427*4882a593Smuzhiyun * \enum DRXAudAVCDecayTime_t 1428*4882a593Smuzhiyun * \brief Automatic volume control configuration. 1429*4882a593Smuzhiyun */ 1430*4882a593Smuzhiyun enum drx_aud_avc_mode { 1431*4882a593Smuzhiyun DRX_AUD_AVC_OFF, /*< Automatic volume control off */ 1432*4882a593Smuzhiyun DRX_AUD_AVC_DECAYTIME_8S, /*< level volume in 8 seconds */ 1433*4882a593Smuzhiyun DRX_AUD_AVC_DECAYTIME_4S, /*< level volume in 4 seconds */ 1434*4882a593Smuzhiyun DRX_AUD_AVC_DECAYTIME_2S, /*< level volume in 2 seconds */ 1435*4882a593Smuzhiyun DRX_AUD_AVC_DECAYTIME_20MS/*< level volume in 20 millisec */ 1436*4882a593Smuzhiyun }; 1437*4882a593Smuzhiyun 1438*4882a593Smuzhiyun /* 1439*4882a593Smuzhiyun * /enum DRXAudMaxAVCGain_t 1440*4882a593Smuzhiyun * /brief Automatic volume control max gain in audio baseband. 1441*4882a593Smuzhiyun */ 1442*4882a593Smuzhiyun enum drx_aud_avc_max_gain { 1443*4882a593Smuzhiyun DRX_AUD_AVC_MAX_GAIN_0DB, /*< maximum AVC gain 0 dB */ 1444*4882a593Smuzhiyun DRX_AUD_AVC_MAX_GAIN_6DB, /*< maximum AVC gain 6 dB */ 1445*4882a593Smuzhiyun DRX_AUD_AVC_MAX_GAIN_12DB /*< maximum AVC gain 12 dB */ 1446*4882a593Smuzhiyun }; 1447*4882a593Smuzhiyun 1448*4882a593Smuzhiyun /* 1449*4882a593Smuzhiyun * /enum DRXAudMaxAVCAtten_t 1450*4882a593Smuzhiyun * /brief Automatic volume control max attenuation in audio baseband. 1451*4882a593Smuzhiyun */ 1452*4882a593Smuzhiyun enum drx_aud_avc_max_atten { 1453*4882a593Smuzhiyun DRX_AUD_AVC_MAX_ATTEN_12DB, 1454*4882a593Smuzhiyun /*< maximum AVC attenuation 12 dB */ 1455*4882a593Smuzhiyun DRX_AUD_AVC_MAX_ATTEN_18DB, 1456*4882a593Smuzhiyun /*< maximum AVC attenuation 18 dB */ 1457*4882a593Smuzhiyun DRX_AUD_AVC_MAX_ATTEN_24DB/*< maximum AVC attenuation 24 dB */ 1458*4882a593Smuzhiyun }; 1459*4882a593Smuzhiyun /* 1460*4882a593Smuzhiyun * \struct struct drx_cfg_aud_volume * \brief Audio volume configuration. 1461*4882a593Smuzhiyun */ 1462*4882a593Smuzhiyun struct drx_cfg_aud_volume { 1463*4882a593Smuzhiyun bool mute; /*< mute overrides volume setting */ 1464*4882a593Smuzhiyun s16 volume; /*< volume, range -114 to 12 dB */ 1465*4882a593Smuzhiyun enum drx_aud_avc_mode avc_mode; /*< AVC auto volume control mode */ 1466*4882a593Smuzhiyun u16 avc_ref_level; /*< AVC reference level */ 1467*4882a593Smuzhiyun enum drx_aud_avc_max_gain avc_max_gain; 1468*4882a593Smuzhiyun /*< AVC max gain selection */ 1469*4882a593Smuzhiyun enum drx_aud_avc_max_atten avc_max_atten; 1470*4882a593Smuzhiyun /*< AVC max attenuation selection */ 1471*4882a593Smuzhiyun s16 strength_left; /*< quasi-peak, left speaker */ 1472*4882a593Smuzhiyun s16 strength_right; /*< quasi-peak, right speaker */ 1473*4882a593Smuzhiyun }; 1474*4882a593Smuzhiyun 1475*4882a593Smuzhiyun /* DRX_CFG_I2S_OUTPUT - struct drx_cfg_i2s_output - set/get */ 1476*4882a593Smuzhiyun /* 1477*4882a593Smuzhiyun * \enum enum drxi2s_mode * \brief I2S output mode. 1478*4882a593Smuzhiyun */ 1479*4882a593Smuzhiyun enum drxi2s_mode { 1480*4882a593Smuzhiyun DRX_I2S_MODE_MASTER, /*< I2S is in master mode */ 1481*4882a593Smuzhiyun DRX_I2S_MODE_SLAVE /*< I2S is in slave mode */ 1482*4882a593Smuzhiyun }; 1483*4882a593Smuzhiyun 1484*4882a593Smuzhiyun /* 1485*4882a593Smuzhiyun * \enum enum drxi2s_word_length * \brief Width of I2S data. 1486*4882a593Smuzhiyun */ 1487*4882a593Smuzhiyun enum drxi2s_word_length { 1488*4882a593Smuzhiyun DRX_I2S_WORDLENGTH_32 = 0,/*< I2S data is 32 bit wide */ 1489*4882a593Smuzhiyun DRX_I2S_WORDLENGTH_16 = 1 /*< I2S data is 16 bit wide */ 1490*4882a593Smuzhiyun }; 1491*4882a593Smuzhiyun 1492*4882a593Smuzhiyun /* 1493*4882a593Smuzhiyun * \enum enum drxi2s_format * \brief Data wordstrobe alignment for I2S. 1494*4882a593Smuzhiyun */ 1495*4882a593Smuzhiyun enum drxi2s_format { 1496*4882a593Smuzhiyun DRX_I2S_FORMAT_WS_WITH_DATA, 1497*4882a593Smuzhiyun /*< I2S data and wordstrobe are aligned */ 1498*4882a593Smuzhiyun DRX_I2S_FORMAT_WS_ADVANCED 1499*4882a593Smuzhiyun /*< I2S data one cycle after wordstrobe */ 1500*4882a593Smuzhiyun }; 1501*4882a593Smuzhiyun 1502*4882a593Smuzhiyun /* 1503*4882a593Smuzhiyun * \enum enum drxi2s_polarity * \brief Polarity of I2S data. 1504*4882a593Smuzhiyun */ 1505*4882a593Smuzhiyun enum drxi2s_polarity { 1506*4882a593Smuzhiyun DRX_I2S_POLARITY_RIGHT,/*< wordstrobe - right high, left low */ 1507*4882a593Smuzhiyun DRX_I2S_POLARITY_LEFT /*< wordstrobe - right low, left high */ 1508*4882a593Smuzhiyun }; 1509*4882a593Smuzhiyun 1510*4882a593Smuzhiyun /* 1511*4882a593Smuzhiyun * \struct struct drx_cfg_i2s_output * \brief I2S output configuration. 1512*4882a593Smuzhiyun */ 1513*4882a593Smuzhiyun struct drx_cfg_i2s_output { 1514*4882a593Smuzhiyun bool output_enable; /*< I2S output enable */ 1515*4882a593Smuzhiyun u32 frequency; /*< range from 8000-48000 Hz */ 1516*4882a593Smuzhiyun enum drxi2s_mode mode; /*< I2S mode, master or slave */ 1517*4882a593Smuzhiyun enum drxi2s_word_length word_length; 1518*4882a593Smuzhiyun /*< I2S wordlength, 16 or 32 bits */ 1519*4882a593Smuzhiyun enum drxi2s_polarity polarity;/*< I2S wordstrobe polarity */ 1520*4882a593Smuzhiyun enum drxi2s_format format; /*< I2S wordstrobe delay to data */ 1521*4882a593Smuzhiyun }; 1522*4882a593Smuzhiyun 1523*4882a593Smuzhiyun /* ------------------------------expert interface-----------------------------*/ 1524*4882a593Smuzhiyun /* 1525*4882a593Smuzhiyun * /enum enum drx_aud_fm_deemphasis * setting for FM-Deemphasis in audio demodulator. 1526*4882a593Smuzhiyun * 1527*4882a593Smuzhiyun */ 1528*4882a593Smuzhiyun enum drx_aud_fm_deemphasis { 1529*4882a593Smuzhiyun DRX_AUD_FM_DEEMPH_50US, 1530*4882a593Smuzhiyun DRX_AUD_FM_DEEMPH_75US, 1531*4882a593Smuzhiyun DRX_AUD_FM_DEEMPH_OFF 1532*4882a593Smuzhiyun }; 1533*4882a593Smuzhiyun 1534*4882a593Smuzhiyun /* 1535*4882a593Smuzhiyun * /enum DRXAudDeviation_t 1536*4882a593Smuzhiyun * setting for deviation mode in audio demodulator. 1537*4882a593Smuzhiyun * 1538*4882a593Smuzhiyun */ 1539*4882a593Smuzhiyun enum drx_cfg_aud_deviation { 1540*4882a593Smuzhiyun DRX_AUD_DEVIATION_NORMAL, 1541*4882a593Smuzhiyun DRX_AUD_DEVIATION_HIGH 1542*4882a593Smuzhiyun }; 1543*4882a593Smuzhiyun 1544*4882a593Smuzhiyun /* 1545*4882a593Smuzhiyun * /enum enum drx_no_carrier_option * setting for carrier, mute/noise. 1546*4882a593Smuzhiyun * 1547*4882a593Smuzhiyun */ 1548*4882a593Smuzhiyun enum drx_no_carrier_option { 1549*4882a593Smuzhiyun DRX_NO_CARRIER_MUTE, 1550*4882a593Smuzhiyun DRX_NO_CARRIER_NOISE 1551*4882a593Smuzhiyun }; 1552*4882a593Smuzhiyun 1553*4882a593Smuzhiyun /* 1554*4882a593Smuzhiyun * \enum DRXAudAutoSound_t 1555*4882a593Smuzhiyun * \brief Automatic Sound 1556*4882a593Smuzhiyun */ 1557*4882a593Smuzhiyun enum drx_cfg_aud_auto_sound { 1558*4882a593Smuzhiyun DRX_AUD_AUTO_SOUND_OFF = 0, 1559*4882a593Smuzhiyun DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON, 1560*4882a593Smuzhiyun DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_OFF 1561*4882a593Smuzhiyun }; 1562*4882a593Smuzhiyun 1563*4882a593Smuzhiyun /* 1564*4882a593Smuzhiyun * \enum DRXAudASSThres_t 1565*4882a593Smuzhiyun * \brief Automatic Sound Select Thresholds 1566*4882a593Smuzhiyun */ 1567*4882a593Smuzhiyun struct drx_cfg_aud_ass_thres { 1568*4882a593Smuzhiyun u16 a2; /* A2 Threshold for ASS configuration */ 1569*4882a593Smuzhiyun u16 btsc; /* BTSC Threshold for ASS configuration */ 1570*4882a593Smuzhiyun u16 nicam; /* Nicam Threshold for ASS configuration */ 1571*4882a593Smuzhiyun }; 1572*4882a593Smuzhiyun 1573*4882a593Smuzhiyun /* 1574*4882a593Smuzhiyun * \struct struct drx_aud_carrier * \brief Carrier detection related parameters 1575*4882a593Smuzhiyun */ 1576*4882a593Smuzhiyun struct drx_aud_carrier { 1577*4882a593Smuzhiyun u16 thres; /* carrier detetcion threshold for primary carrier (A) */ 1578*4882a593Smuzhiyun enum drx_no_carrier_option opt; /* Mute or noise at no carrier detection (A) */ 1579*4882a593Smuzhiyun s32 shift; /* DC level of incoming signal (A) */ 1580*4882a593Smuzhiyun s32 dco; /* frequency adjustment (A) */ 1581*4882a593Smuzhiyun }; 1582*4882a593Smuzhiyun 1583*4882a593Smuzhiyun /* 1584*4882a593Smuzhiyun * \struct struct drx_cfg_aud_carriers * \brief combining carrier A & B to one struct 1585*4882a593Smuzhiyun */ 1586*4882a593Smuzhiyun struct drx_cfg_aud_carriers { 1587*4882a593Smuzhiyun struct drx_aud_carrier a; 1588*4882a593Smuzhiyun struct drx_aud_carrier b; 1589*4882a593Smuzhiyun }; 1590*4882a593Smuzhiyun 1591*4882a593Smuzhiyun /* 1592*4882a593Smuzhiyun * /enum enum drx_aud_i2s_src * Selection of audio source 1593*4882a593Smuzhiyun */ 1594*4882a593Smuzhiyun enum drx_aud_i2s_src { 1595*4882a593Smuzhiyun DRX_AUD_SRC_MONO, 1596*4882a593Smuzhiyun DRX_AUD_SRC_STEREO_OR_AB, 1597*4882a593Smuzhiyun DRX_AUD_SRC_STEREO_OR_A, 1598*4882a593Smuzhiyun DRX_AUD_SRC_STEREO_OR_B}; 1599*4882a593Smuzhiyun 1600*4882a593Smuzhiyun /* 1601*4882a593Smuzhiyun * \enum enum drx_aud_i2s_matrix * \brief Used for selecting I2S output. 1602*4882a593Smuzhiyun */ 1603*4882a593Smuzhiyun enum drx_aud_i2s_matrix { 1604*4882a593Smuzhiyun DRX_AUD_I2S_MATRIX_A_MONO, 1605*4882a593Smuzhiyun /*< A sound only, stereo or mono */ 1606*4882a593Smuzhiyun DRX_AUD_I2S_MATRIX_B_MONO, 1607*4882a593Smuzhiyun /*< B sound only, stereo or mono */ 1608*4882a593Smuzhiyun DRX_AUD_I2S_MATRIX_STEREO, 1609*4882a593Smuzhiyun /*< A+B sound, transparent */ 1610*4882a593Smuzhiyun DRX_AUD_I2S_MATRIX_MONO /*< A+B mixed to mono sum, (L+R)/2 */}; 1611*4882a593Smuzhiyun 1612*4882a593Smuzhiyun /* 1613*4882a593Smuzhiyun * /enum enum drx_aud_fm_matrix * setting for FM-Matrix in audio demodulator. 1614*4882a593Smuzhiyun * 1615*4882a593Smuzhiyun */ 1616*4882a593Smuzhiyun enum drx_aud_fm_matrix { 1617*4882a593Smuzhiyun DRX_AUD_FM_MATRIX_NO_MATRIX, 1618*4882a593Smuzhiyun DRX_AUD_FM_MATRIX_GERMAN, 1619*4882a593Smuzhiyun DRX_AUD_FM_MATRIX_KOREAN, 1620*4882a593Smuzhiyun DRX_AUD_FM_MATRIX_SOUND_A, 1621*4882a593Smuzhiyun DRX_AUD_FM_MATRIX_SOUND_B}; 1622*4882a593Smuzhiyun 1623*4882a593Smuzhiyun /* 1624*4882a593Smuzhiyun * \struct DRXAudMatrices_t 1625*4882a593Smuzhiyun * \brief Mixer settings 1626*4882a593Smuzhiyun */ 1627*4882a593Smuzhiyun struct drx_cfg_aud_mixer { 1628*4882a593Smuzhiyun enum drx_aud_i2s_src source_i2s; 1629*4882a593Smuzhiyun enum drx_aud_i2s_matrix matrix_i2s; 1630*4882a593Smuzhiyun enum drx_aud_fm_matrix matrix_fm; 1631*4882a593Smuzhiyun }; 1632*4882a593Smuzhiyun 1633*4882a593Smuzhiyun /* 1634*4882a593Smuzhiyun * \enum DRXI2SVidSync_t 1635*4882a593Smuzhiyun * \brief Audio/video synchronization, interacts with I2S mode. 1636*4882a593Smuzhiyun * AUTO_1 and AUTO_2 are for automatic video standard detection with preference 1637*4882a593Smuzhiyun * for NTSC or Monochrome, because the frequencies are too close (59.94 & 60 Hz) 1638*4882a593Smuzhiyun */ 1639*4882a593Smuzhiyun enum drx_cfg_aud_av_sync { 1640*4882a593Smuzhiyun DRX_AUD_AVSYNC_OFF,/*< audio/video synchronization is off */ 1641*4882a593Smuzhiyun DRX_AUD_AVSYNC_NTSC, 1642*4882a593Smuzhiyun /*< it is an NTSC system */ 1643*4882a593Smuzhiyun DRX_AUD_AVSYNC_MONOCHROME, 1644*4882a593Smuzhiyun /*< it is a MONOCHROME system */ 1645*4882a593Smuzhiyun DRX_AUD_AVSYNC_PAL_SECAM 1646*4882a593Smuzhiyun /*< it is a PAL/SECAM system */}; 1647*4882a593Smuzhiyun 1648*4882a593Smuzhiyun /* 1649*4882a593Smuzhiyun * \struct struct drx_cfg_aud_prescale * \brief Prescalers 1650*4882a593Smuzhiyun */ 1651*4882a593Smuzhiyun struct drx_cfg_aud_prescale { 1652*4882a593Smuzhiyun u16 fm_deviation; 1653*4882a593Smuzhiyun s16 nicam_gain; 1654*4882a593Smuzhiyun }; 1655*4882a593Smuzhiyun 1656*4882a593Smuzhiyun /* 1657*4882a593Smuzhiyun * \struct struct drx_aud_beep * \brief Beep 1658*4882a593Smuzhiyun */ 1659*4882a593Smuzhiyun struct drx_aud_beep { 1660*4882a593Smuzhiyun s16 volume; /* dB */ 1661*4882a593Smuzhiyun u16 frequency; /* Hz */ 1662*4882a593Smuzhiyun bool mute; 1663*4882a593Smuzhiyun }; 1664*4882a593Smuzhiyun 1665*4882a593Smuzhiyun /* 1666*4882a593Smuzhiyun * \enum enum drx_aud_btsc_detect * \brief BTSC detetcion mode 1667*4882a593Smuzhiyun */ 1668*4882a593Smuzhiyun enum drx_aud_btsc_detect { 1669*4882a593Smuzhiyun DRX_BTSC_STEREO, 1670*4882a593Smuzhiyun DRX_BTSC_MONO_AND_SAP}; 1671*4882a593Smuzhiyun 1672*4882a593Smuzhiyun /* 1673*4882a593Smuzhiyun * \struct struct drx_aud_data * \brief Audio data structure 1674*4882a593Smuzhiyun */ 1675*4882a593Smuzhiyun struct drx_aud_data { 1676*4882a593Smuzhiyun /* audio storage */ 1677*4882a593Smuzhiyun bool audio_is_active; 1678*4882a593Smuzhiyun enum drx_aud_standard audio_standard; 1679*4882a593Smuzhiyun struct drx_cfg_i2s_output i2sdata; 1680*4882a593Smuzhiyun struct drx_cfg_aud_volume volume; 1681*4882a593Smuzhiyun enum drx_cfg_aud_auto_sound auto_sound; 1682*4882a593Smuzhiyun struct drx_cfg_aud_ass_thres ass_thresholds; 1683*4882a593Smuzhiyun struct drx_cfg_aud_carriers carriers; 1684*4882a593Smuzhiyun struct drx_cfg_aud_mixer mixer; 1685*4882a593Smuzhiyun enum drx_cfg_aud_deviation deviation; 1686*4882a593Smuzhiyun enum drx_cfg_aud_av_sync av_sync; 1687*4882a593Smuzhiyun struct drx_cfg_aud_prescale prescale; 1688*4882a593Smuzhiyun enum drx_aud_fm_deemphasis deemph; 1689*4882a593Smuzhiyun enum drx_aud_btsc_detect btsc_detect; 1690*4882a593Smuzhiyun /* rds */ 1691*4882a593Smuzhiyun u16 rds_data_counter; 1692*4882a593Smuzhiyun bool rds_data_present; 1693*4882a593Smuzhiyun }; 1694*4882a593Smuzhiyun 1695*4882a593Smuzhiyun /* 1696*4882a593Smuzhiyun * \enum enum drx_qam_lock_range * \brief QAM lock range mode 1697*4882a593Smuzhiyun */ 1698*4882a593Smuzhiyun enum drx_qam_lock_range { 1699*4882a593Smuzhiyun DRX_QAM_LOCKRANGE_NORMAL, 1700*4882a593Smuzhiyun DRX_QAM_LOCKRANGE_EXTENDED}; 1701*4882a593Smuzhiyun 1702*4882a593Smuzhiyun /*============================================================================*/ 1703*4882a593Smuzhiyun /*============================================================================*/ 1704*4882a593Smuzhiyun /*== Data access structures ==================================================*/ 1705*4882a593Smuzhiyun /*============================================================================*/ 1706*4882a593Smuzhiyun /*============================================================================*/ 1707*4882a593Smuzhiyun 1708*4882a593Smuzhiyun /* Address on device */ 1709*4882a593Smuzhiyun typedef u32 dr_xaddr_t, *pdr_xaddr_t; 1710*4882a593Smuzhiyun 1711*4882a593Smuzhiyun /* Protocol specific flags */ 1712*4882a593Smuzhiyun typedef u32 dr_xflags_t, *pdr_xflags_t; 1713*4882a593Smuzhiyun 1714*4882a593Smuzhiyun /* Write block of data to device */ 1715*4882a593Smuzhiyun typedef int(*drx_write_block_func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1716*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1717*4882a593Smuzhiyun u16 datasize, /* size of data in bytes */ 1718*4882a593Smuzhiyun u8 *data, /* data to send */ 1719*4882a593Smuzhiyun u32 flags); 1720*4882a593Smuzhiyun 1721*4882a593Smuzhiyun /* Read block of data from device */ 1722*4882a593Smuzhiyun typedef int(*drx_read_block_func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1723*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1724*4882a593Smuzhiyun u16 datasize, /* size of data in bytes */ 1725*4882a593Smuzhiyun u8 *data, /* receive buffer */ 1726*4882a593Smuzhiyun u32 flags); 1727*4882a593Smuzhiyun 1728*4882a593Smuzhiyun /* Write 8-bits value to device */ 1729*4882a593Smuzhiyun typedef int(*drx_write_reg8func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1730*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1731*4882a593Smuzhiyun u8 data, /* data to send */ 1732*4882a593Smuzhiyun u32 flags); 1733*4882a593Smuzhiyun 1734*4882a593Smuzhiyun /* Read 8-bits value to device */ 1735*4882a593Smuzhiyun typedef int(*drx_read_reg8func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1736*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1737*4882a593Smuzhiyun u8 *data, /* receive buffer */ 1738*4882a593Smuzhiyun u32 flags); 1739*4882a593Smuzhiyun 1740*4882a593Smuzhiyun /* Read modify write 8-bits value to device */ 1741*4882a593Smuzhiyun typedef int(*drx_read_modify_write_reg8func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1742*4882a593Smuzhiyun u32 waddr, /* write address of register */ 1743*4882a593Smuzhiyun u32 raddr, /* read address of register */ 1744*4882a593Smuzhiyun u8 wdata, /* data to write */ 1745*4882a593Smuzhiyun u8 *rdata); /* data to read */ 1746*4882a593Smuzhiyun 1747*4882a593Smuzhiyun /* Write 16-bits value to device */ 1748*4882a593Smuzhiyun typedef int(*drx_write_reg16func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1749*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1750*4882a593Smuzhiyun u16 data, /* data to send */ 1751*4882a593Smuzhiyun u32 flags); 1752*4882a593Smuzhiyun 1753*4882a593Smuzhiyun /* Read 16-bits value to device */ 1754*4882a593Smuzhiyun typedef int(*drx_read_reg16func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1755*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1756*4882a593Smuzhiyun u16 *data, /* receive buffer */ 1757*4882a593Smuzhiyun u32 flags); 1758*4882a593Smuzhiyun 1759*4882a593Smuzhiyun /* Read modify write 16-bits value to device */ 1760*4882a593Smuzhiyun typedef int(*drx_read_modify_write_reg16func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1761*4882a593Smuzhiyun u32 waddr, /* write address of register */ 1762*4882a593Smuzhiyun u32 raddr, /* read address of register */ 1763*4882a593Smuzhiyun u16 wdata, /* data to write */ 1764*4882a593Smuzhiyun u16 *rdata); /* data to read */ 1765*4882a593Smuzhiyun 1766*4882a593Smuzhiyun /* Write 32-bits value to device */ 1767*4882a593Smuzhiyun typedef int(*drx_write_reg32func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1768*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1769*4882a593Smuzhiyun u32 data, /* data to send */ 1770*4882a593Smuzhiyun u32 flags); 1771*4882a593Smuzhiyun 1772*4882a593Smuzhiyun /* Read 32-bits value to device */ 1773*4882a593Smuzhiyun typedef int(*drx_read_reg32func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1774*4882a593Smuzhiyun u32 addr, /* address of register/memory */ 1775*4882a593Smuzhiyun u32 *data, /* receive buffer */ 1776*4882a593Smuzhiyun u32 flags); 1777*4882a593Smuzhiyun 1778*4882a593Smuzhiyun /* Read modify write 32-bits value to device */ 1779*4882a593Smuzhiyun typedef int(*drx_read_modify_write_reg32func_t) (struct i2c_device_addr *dev_addr, /* address of I2C device */ 1780*4882a593Smuzhiyun u32 waddr, /* write address of register */ 1781*4882a593Smuzhiyun u32 raddr, /* read address of register */ 1782*4882a593Smuzhiyun u32 wdata, /* data to write */ 1783*4882a593Smuzhiyun u32 *rdata); /* data to read */ 1784*4882a593Smuzhiyun 1785*4882a593Smuzhiyun /* 1786*4882a593Smuzhiyun * \struct struct drx_access_func * \brief Interface to an access protocol. 1787*4882a593Smuzhiyun */ 1788*4882a593Smuzhiyun struct drx_access_func { 1789*4882a593Smuzhiyun drx_write_block_func_t write_block_func; 1790*4882a593Smuzhiyun drx_read_block_func_t read_block_func; 1791*4882a593Smuzhiyun drx_write_reg8func_t write_reg8func; 1792*4882a593Smuzhiyun drx_read_reg8func_t read_reg8func; 1793*4882a593Smuzhiyun drx_read_modify_write_reg8func_t read_modify_write_reg8func; 1794*4882a593Smuzhiyun drx_write_reg16func_t write_reg16func; 1795*4882a593Smuzhiyun drx_read_reg16func_t read_reg16func; 1796*4882a593Smuzhiyun drx_read_modify_write_reg16func_t read_modify_write_reg16func; 1797*4882a593Smuzhiyun drx_write_reg32func_t write_reg32func; 1798*4882a593Smuzhiyun drx_read_reg32func_t read_reg32func; 1799*4882a593Smuzhiyun drx_read_modify_write_reg32func_t read_modify_write_reg32func; 1800*4882a593Smuzhiyun }; 1801*4882a593Smuzhiyun 1802*4882a593Smuzhiyun /* Register address and data for register dump function */ 1803*4882a593Smuzhiyun struct drx_reg_dump { 1804*4882a593Smuzhiyun u32 address; 1805*4882a593Smuzhiyun u32 data; 1806*4882a593Smuzhiyun }; 1807*4882a593Smuzhiyun 1808*4882a593Smuzhiyun /*============================================================================*/ 1809*4882a593Smuzhiyun /*============================================================================*/ 1810*4882a593Smuzhiyun /*== Demod instance data structures ==========================================*/ 1811*4882a593Smuzhiyun /*============================================================================*/ 1812*4882a593Smuzhiyun /*============================================================================*/ 1813*4882a593Smuzhiyun 1814*4882a593Smuzhiyun /* 1815*4882a593Smuzhiyun * \struct struct drx_common_attr * \brief Set of common attributes, shared by all DRX devices. 1816*4882a593Smuzhiyun */ 1817*4882a593Smuzhiyun struct drx_common_attr { 1818*4882a593Smuzhiyun /* Microcode (firmware) attributes */ 1819*4882a593Smuzhiyun char *microcode_file; /*< microcode filename */ 1820*4882a593Smuzhiyun bool verify_microcode; 1821*4882a593Smuzhiyun /*< Use microcode verify or not. */ 1822*4882a593Smuzhiyun struct drx_mc_version_rec mcversion; 1823*4882a593Smuzhiyun /*< Version record of microcode from file */ 1824*4882a593Smuzhiyun 1825*4882a593Smuzhiyun /* Clocks and tuner attributes */ 1826*4882a593Smuzhiyun s32 intermediate_freq; 1827*4882a593Smuzhiyun /*< IF,if tuner instance not used. (kHz)*/ 1828*4882a593Smuzhiyun s32 sys_clock_freq; 1829*4882a593Smuzhiyun /*< Systemclock frequency. (kHz) */ 1830*4882a593Smuzhiyun s32 osc_clock_freq; 1831*4882a593Smuzhiyun /*< Oscillator clock frequency. (kHz) */ 1832*4882a593Smuzhiyun s16 osc_clock_deviation; 1833*4882a593Smuzhiyun /*< Oscillator clock deviation. (ppm) */ 1834*4882a593Smuzhiyun bool mirror_freq_spect; 1835*4882a593Smuzhiyun /*< Mirror IF frequency spectrum or not.*/ 1836*4882a593Smuzhiyun 1837*4882a593Smuzhiyun /* Initial MPEG output attributes */ 1838*4882a593Smuzhiyun struct drx_cfg_mpeg_output mpeg_cfg; 1839*4882a593Smuzhiyun /*< MPEG configuration */ 1840*4882a593Smuzhiyun 1841*4882a593Smuzhiyun bool is_opened; /*< if true instance is already opened. */ 1842*4882a593Smuzhiyun 1843*4882a593Smuzhiyun /* Channel scan */ 1844*4882a593Smuzhiyun struct drx_scan_param *scan_param; 1845*4882a593Smuzhiyun /*< scan parameters */ 1846*4882a593Smuzhiyun u16 scan_freq_plan_index; 1847*4882a593Smuzhiyun /*< next index in freq plan */ 1848*4882a593Smuzhiyun s32 scan_next_frequency; 1849*4882a593Smuzhiyun /*< next freq to scan */ 1850*4882a593Smuzhiyun bool scan_ready; /*< scan ready flag */ 1851*4882a593Smuzhiyun u32 scan_max_channels;/*< number of channels in freqplan */ 1852*4882a593Smuzhiyun u32 scan_channels_scanned; 1853*4882a593Smuzhiyun /*< number of channels scanned */ 1854*4882a593Smuzhiyun /* Channel scan - inner loop: demod related */ 1855*4882a593Smuzhiyun drx_scan_func_t scan_function; 1856*4882a593Smuzhiyun /*< function to check channel */ 1857*4882a593Smuzhiyun /* Channel scan - inner loop: SYSObj related */ 1858*4882a593Smuzhiyun void *scan_context; /*< Context Pointer of SYSObj */ 1859*4882a593Smuzhiyun /* Channel scan - parameters for default DTV scan function in core driver */ 1860*4882a593Smuzhiyun u16 scan_demod_lock_timeout; 1861*4882a593Smuzhiyun /*< millisecs to wait for lock */ 1862*4882a593Smuzhiyun enum drx_lock_status scan_desired_lock; 1863*4882a593Smuzhiyun /*< lock requirement for channel found */ 1864*4882a593Smuzhiyun /* scan_active can be used by SetChannel to decide how to program the tuner, 1865*4882a593Smuzhiyun fast or slow (but stable). Usually fast during scan. */ 1866*4882a593Smuzhiyun bool scan_active; /*< true when scan routines are active */ 1867*4882a593Smuzhiyun 1868*4882a593Smuzhiyun /* Power management */ 1869*4882a593Smuzhiyun enum drx_power_mode current_power_mode; 1870*4882a593Smuzhiyun /*< current power management mode */ 1871*4882a593Smuzhiyun 1872*4882a593Smuzhiyun /* Tuner */ 1873*4882a593Smuzhiyun u8 tuner_port_nr; /*< nr of I2C port to which tuner is */ 1874*4882a593Smuzhiyun s32 tuner_min_freq_rf; 1875*4882a593Smuzhiyun /*< minimum RF input frequency, in kHz */ 1876*4882a593Smuzhiyun s32 tuner_max_freq_rf; 1877*4882a593Smuzhiyun /*< maximum RF input frequency, in kHz */ 1878*4882a593Smuzhiyun bool tuner_rf_agc_pol; /*< if true invert RF AGC polarity */ 1879*4882a593Smuzhiyun bool tuner_if_agc_pol; /*< if true invert IF AGC polarity */ 1880*4882a593Smuzhiyun bool tuner_slow_mode; /*< if true invert IF AGC polarity */ 1881*4882a593Smuzhiyun 1882*4882a593Smuzhiyun struct drx_channel current_channel; 1883*4882a593Smuzhiyun /*< current channel parameters */ 1884*4882a593Smuzhiyun enum drx_standard current_standard; 1885*4882a593Smuzhiyun /*< current standard selection */ 1886*4882a593Smuzhiyun enum drx_standard prev_standard; 1887*4882a593Smuzhiyun /*< previous standard selection */ 1888*4882a593Smuzhiyun enum drx_standard di_cache_standard; 1889*4882a593Smuzhiyun /*< standard in DI cache if available */ 1890*4882a593Smuzhiyun bool use_bootloader; /*< use bootloader in open */ 1891*4882a593Smuzhiyun u32 capabilities; /*< capabilities flags */ 1892*4882a593Smuzhiyun u32 product_id; /*< product ID inc. metal fix number */}; 1893*4882a593Smuzhiyun 1894*4882a593Smuzhiyun /* 1895*4882a593Smuzhiyun * Generic functions for DRX devices. 1896*4882a593Smuzhiyun */ 1897*4882a593Smuzhiyun 1898*4882a593Smuzhiyun struct drx_demod_instance; 1899*4882a593Smuzhiyun 1900*4882a593Smuzhiyun /* 1901*4882a593Smuzhiyun * \struct struct drx_demod_instance * \brief Top structure of demodulator instance. 1902*4882a593Smuzhiyun */ 1903*4882a593Smuzhiyun struct drx_demod_instance { 1904*4882a593Smuzhiyun /*< data access protocol functions */ 1905*4882a593Smuzhiyun struct i2c_device_addr *my_i2c_dev_addr; 1906*4882a593Smuzhiyun /*< i2c address and device identifier */ 1907*4882a593Smuzhiyun struct drx_common_attr *my_common_attr; 1908*4882a593Smuzhiyun /*< common DRX attributes */ 1909*4882a593Smuzhiyun void *my_ext_attr; /*< device specific attributes */ 1910*4882a593Smuzhiyun /* generic demodulator data */ 1911*4882a593Smuzhiyun 1912*4882a593Smuzhiyun struct i2c_adapter *i2c; 1913*4882a593Smuzhiyun const struct firmware *firmware; 1914*4882a593Smuzhiyun }; 1915*4882a593Smuzhiyun 1916*4882a593Smuzhiyun /*------------------------------------------------------------------------- 1917*4882a593Smuzhiyun MACROS 1918*4882a593Smuzhiyun Conversion from enum values to human readable form. 1919*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 1920*4882a593Smuzhiyun 1921*4882a593Smuzhiyun /* standard */ 1922*4882a593Smuzhiyun 1923*4882a593Smuzhiyun #define DRX_STR_STANDARD(x) ( \ 1924*4882a593Smuzhiyun (x == DRX_STANDARD_DVBT) ? "DVB-T" : \ 1925*4882a593Smuzhiyun (x == DRX_STANDARD_8VSB) ? "8VSB" : \ 1926*4882a593Smuzhiyun (x == DRX_STANDARD_NTSC) ? "NTSC" : \ 1927*4882a593Smuzhiyun (x == DRX_STANDARD_PAL_SECAM_BG) ? "PAL/SECAM B/G" : \ 1928*4882a593Smuzhiyun (x == DRX_STANDARD_PAL_SECAM_DK) ? "PAL/SECAM D/K" : \ 1929*4882a593Smuzhiyun (x == DRX_STANDARD_PAL_SECAM_I) ? "PAL/SECAM I" : \ 1930*4882a593Smuzhiyun (x == DRX_STANDARD_PAL_SECAM_L) ? "PAL/SECAM L" : \ 1931*4882a593Smuzhiyun (x == DRX_STANDARD_PAL_SECAM_LP) ? "PAL/SECAM LP" : \ 1932*4882a593Smuzhiyun (x == DRX_STANDARD_ITU_A) ? "ITU-A" : \ 1933*4882a593Smuzhiyun (x == DRX_STANDARD_ITU_B) ? "ITU-B" : \ 1934*4882a593Smuzhiyun (x == DRX_STANDARD_ITU_C) ? "ITU-C" : \ 1935*4882a593Smuzhiyun (x == DRX_STANDARD_ITU_D) ? "ITU-D" : \ 1936*4882a593Smuzhiyun (x == DRX_STANDARD_FM) ? "FM" : \ 1937*4882a593Smuzhiyun (x == DRX_STANDARD_DTMB) ? "DTMB" : \ 1938*4882a593Smuzhiyun (x == DRX_STANDARD_AUTO) ? "Auto" : \ 1939*4882a593Smuzhiyun (x == DRX_STANDARD_UNKNOWN) ? "Unknown" : \ 1940*4882a593Smuzhiyun "(Invalid)") 1941*4882a593Smuzhiyun 1942*4882a593Smuzhiyun /* channel */ 1943*4882a593Smuzhiyun 1944*4882a593Smuzhiyun #define DRX_STR_BANDWIDTH(x) ( \ 1945*4882a593Smuzhiyun (x == DRX_BANDWIDTH_8MHZ) ? "8 MHz" : \ 1946*4882a593Smuzhiyun (x == DRX_BANDWIDTH_7MHZ) ? "7 MHz" : \ 1947*4882a593Smuzhiyun (x == DRX_BANDWIDTH_6MHZ) ? "6 MHz" : \ 1948*4882a593Smuzhiyun (x == DRX_BANDWIDTH_AUTO) ? "Auto" : \ 1949*4882a593Smuzhiyun (x == DRX_BANDWIDTH_UNKNOWN) ? "Unknown" : \ 1950*4882a593Smuzhiyun "(Invalid)") 1951*4882a593Smuzhiyun #define DRX_STR_FFTMODE(x) ( \ 1952*4882a593Smuzhiyun (x == DRX_FFTMODE_2K) ? "2k" : \ 1953*4882a593Smuzhiyun (x == DRX_FFTMODE_4K) ? "4k" : \ 1954*4882a593Smuzhiyun (x == DRX_FFTMODE_8K) ? "8k" : \ 1955*4882a593Smuzhiyun (x == DRX_FFTMODE_AUTO) ? "Auto" : \ 1956*4882a593Smuzhiyun (x == DRX_FFTMODE_UNKNOWN) ? "Unknown" : \ 1957*4882a593Smuzhiyun "(Invalid)") 1958*4882a593Smuzhiyun #define DRX_STR_GUARD(x) ( \ 1959*4882a593Smuzhiyun (x == DRX_GUARD_1DIV32) ? "1/32nd" : \ 1960*4882a593Smuzhiyun (x == DRX_GUARD_1DIV16) ? "1/16th" : \ 1961*4882a593Smuzhiyun (x == DRX_GUARD_1DIV8) ? "1/8th" : \ 1962*4882a593Smuzhiyun (x == DRX_GUARD_1DIV4) ? "1/4th" : \ 1963*4882a593Smuzhiyun (x == DRX_GUARD_AUTO) ? "Auto" : \ 1964*4882a593Smuzhiyun (x == DRX_GUARD_UNKNOWN) ? "Unknown" : \ 1965*4882a593Smuzhiyun "(Invalid)") 1966*4882a593Smuzhiyun #define DRX_STR_CONSTELLATION(x) ( \ 1967*4882a593Smuzhiyun (x == DRX_CONSTELLATION_BPSK) ? "BPSK" : \ 1968*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QPSK) ? "QPSK" : \ 1969*4882a593Smuzhiyun (x == DRX_CONSTELLATION_PSK8) ? "PSK8" : \ 1970*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QAM16) ? "QAM16" : \ 1971*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QAM32) ? "QAM32" : \ 1972*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QAM64) ? "QAM64" : \ 1973*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QAM128) ? "QAM128" : \ 1974*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QAM256) ? "QAM256" : \ 1975*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QAM512) ? "QAM512" : \ 1976*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QAM1024) ? "QAM1024" : \ 1977*4882a593Smuzhiyun (x == DRX_CONSTELLATION_QPSK_NR) ? "QPSK_NR" : \ 1978*4882a593Smuzhiyun (x == DRX_CONSTELLATION_AUTO) ? "Auto" : \ 1979*4882a593Smuzhiyun (x == DRX_CONSTELLATION_UNKNOWN) ? "Unknown" : \ 1980*4882a593Smuzhiyun "(Invalid)") 1981*4882a593Smuzhiyun #define DRX_STR_CODERATE(x) ( \ 1982*4882a593Smuzhiyun (x == DRX_CODERATE_1DIV2) ? "1/2nd" : \ 1983*4882a593Smuzhiyun (x == DRX_CODERATE_2DIV3) ? "2/3rd" : \ 1984*4882a593Smuzhiyun (x == DRX_CODERATE_3DIV4) ? "3/4th" : \ 1985*4882a593Smuzhiyun (x == DRX_CODERATE_5DIV6) ? "5/6th" : \ 1986*4882a593Smuzhiyun (x == DRX_CODERATE_7DIV8) ? "7/8th" : \ 1987*4882a593Smuzhiyun (x == DRX_CODERATE_AUTO) ? "Auto" : \ 1988*4882a593Smuzhiyun (x == DRX_CODERATE_UNKNOWN) ? "Unknown" : \ 1989*4882a593Smuzhiyun "(Invalid)") 1990*4882a593Smuzhiyun #define DRX_STR_HIERARCHY(x) ( \ 1991*4882a593Smuzhiyun (x == DRX_HIERARCHY_NONE) ? "None" : \ 1992*4882a593Smuzhiyun (x == DRX_HIERARCHY_ALPHA1) ? "Alpha=1" : \ 1993*4882a593Smuzhiyun (x == DRX_HIERARCHY_ALPHA2) ? "Alpha=2" : \ 1994*4882a593Smuzhiyun (x == DRX_HIERARCHY_ALPHA4) ? "Alpha=4" : \ 1995*4882a593Smuzhiyun (x == DRX_HIERARCHY_AUTO) ? "Auto" : \ 1996*4882a593Smuzhiyun (x == DRX_HIERARCHY_UNKNOWN) ? "Unknown" : \ 1997*4882a593Smuzhiyun "(Invalid)") 1998*4882a593Smuzhiyun #define DRX_STR_PRIORITY(x) ( \ 1999*4882a593Smuzhiyun (x == DRX_PRIORITY_LOW) ? "Low" : \ 2000*4882a593Smuzhiyun (x == DRX_PRIORITY_HIGH) ? "High" : \ 2001*4882a593Smuzhiyun (x == DRX_PRIORITY_UNKNOWN) ? "Unknown" : \ 2002*4882a593Smuzhiyun "(Invalid)") 2003*4882a593Smuzhiyun #define DRX_STR_MIRROR(x) ( \ 2004*4882a593Smuzhiyun (x == DRX_MIRROR_NO) ? "Normal" : \ 2005*4882a593Smuzhiyun (x == DRX_MIRROR_YES) ? "Mirrored" : \ 2006*4882a593Smuzhiyun (x == DRX_MIRROR_AUTO) ? "Auto" : \ 2007*4882a593Smuzhiyun (x == DRX_MIRROR_UNKNOWN) ? "Unknown" : \ 2008*4882a593Smuzhiyun "(Invalid)") 2009*4882a593Smuzhiyun #define DRX_STR_CLASSIFICATION(x) ( \ 2010*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_GAUSS) ? "Gaussion" : \ 2011*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_HVY_GAUSS) ? "Heavy Gaussion" : \ 2012*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_COCHANNEL) ? "Co-channel" : \ 2013*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_STATIC) ? "Static echo" : \ 2014*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_MOVING) ? "Moving echo" : \ 2015*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_ZERODB) ? "Zero dB echo" : \ 2016*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_UNKNOWN) ? "Unknown" : \ 2017*4882a593Smuzhiyun (x == DRX_CLASSIFICATION_AUTO) ? "Auto" : \ 2018*4882a593Smuzhiyun "(Invalid)") 2019*4882a593Smuzhiyun 2020*4882a593Smuzhiyun #define DRX_STR_INTERLEAVEMODE(x) ( \ 2021*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J1) ? "I128_J1" : \ 2022*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J1_V2) ? "I128_J1_V2" : \ 2023*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J2) ? "I128_J2" : \ 2024*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I64_J2) ? "I64_J2" : \ 2025*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J3) ? "I128_J3" : \ 2026*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I32_J4) ? "I32_J4" : \ 2027*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J4) ? "I128_J4" : \ 2028*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I16_J8) ? "I16_J8" : \ 2029*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J5) ? "I128_J5" : \ 2030*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I8_J16) ? "I8_J16" : \ 2031*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J6) ? "I128_J6" : \ 2032*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_RESERVED_11) ? "Reserved 11" : \ 2033*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J7) ? "I128_J7" : \ 2034*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_RESERVED_13) ? "Reserved 13" : \ 2035*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I128_J8) ? "I128_J8" : \ 2036*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_RESERVED_15) ? "Reserved 15" : \ 2037*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I12_J17) ? "I12_J17" : \ 2038*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_I5_J4) ? "I5_J4" : \ 2039*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_B52_M240) ? "B52_M240" : \ 2040*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_B52_M720) ? "B52_M720" : \ 2041*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_B52_M48) ? "B52_M48" : \ 2042*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_B52_M0) ? "B52_M0" : \ 2043*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_UNKNOWN) ? "Unknown" : \ 2044*4882a593Smuzhiyun (x == DRX_INTERLEAVEMODE_AUTO) ? "Auto" : \ 2045*4882a593Smuzhiyun "(Invalid)") 2046*4882a593Smuzhiyun 2047*4882a593Smuzhiyun #define DRX_STR_LDPC(x) ( \ 2048*4882a593Smuzhiyun (x == DRX_LDPC_0_4) ? "0.4" : \ 2049*4882a593Smuzhiyun (x == DRX_LDPC_0_6) ? "0.6" : \ 2050*4882a593Smuzhiyun (x == DRX_LDPC_0_8) ? "0.8" : \ 2051*4882a593Smuzhiyun (x == DRX_LDPC_AUTO) ? "Auto" : \ 2052*4882a593Smuzhiyun (x == DRX_LDPC_UNKNOWN) ? "Unknown" : \ 2053*4882a593Smuzhiyun "(Invalid)") 2054*4882a593Smuzhiyun 2055*4882a593Smuzhiyun #define DRX_STR_CARRIER(x) ( \ 2056*4882a593Smuzhiyun (x == DRX_CARRIER_MULTI) ? "Multi" : \ 2057*4882a593Smuzhiyun (x == DRX_CARRIER_SINGLE) ? "Single" : \ 2058*4882a593Smuzhiyun (x == DRX_CARRIER_AUTO) ? "Auto" : \ 2059*4882a593Smuzhiyun (x == DRX_CARRIER_UNKNOWN) ? "Unknown" : \ 2060*4882a593Smuzhiyun "(Invalid)") 2061*4882a593Smuzhiyun 2062*4882a593Smuzhiyun #define DRX_STR_FRAMEMODE(x) ( \ 2063*4882a593Smuzhiyun (x == DRX_FRAMEMODE_420) ? "420" : \ 2064*4882a593Smuzhiyun (x == DRX_FRAMEMODE_595) ? "595" : \ 2065*4882a593Smuzhiyun (x == DRX_FRAMEMODE_945) ? "945" : \ 2066*4882a593Smuzhiyun (x == DRX_FRAMEMODE_420_FIXED_PN) ? "420 with fixed PN" : \ 2067*4882a593Smuzhiyun (x == DRX_FRAMEMODE_945_FIXED_PN) ? "945 with fixed PN" : \ 2068*4882a593Smuzhiyun (x == DRX_FRAMEMODE_AUTO) ? "Auto" : \ 2069*4882a593Smuzhiyun (x == DRX_FRAMEMODE_UNKNOWN) ? "Unknown" : \ 2070*4882a593Smuzhiyun "(Invalid)") 2071*4882a593Smuzhiyun 2072*4882a593Smuzhiyun #define DRX_STR_PILOT(x) ( \ 2073*4882a593Smuzhiyun (x == DRX_PILOT_ON) ? "On" : \ 2074*4882a593Smuzhiyun (x == DRX_PILOT_OFF) ? "Off" : \ 2075*4882a593Smuzhiyun (x == DRX_PILOT_AUTO) ? "Auto" : \ 2076*4882a593Smuzhiyun (x == DRX_PILOT_UNKNOWN) ? "Unknown" : \ 2077*4882a593Smuzhiyun "(Invalid)") 2078*4882a593Smuzhiyun /* TPS */ 2079*4882a593Smuzhiyun 2080*4882a593Smuzhiyun #define DRX_STR_TPS_FRAME(x) ( \ 2081*4882a593Smuzhiyun (x == DRX_TPS_FRAME1) ? "Frame1" : \ 2082*4882a593Smuzhiyun (x == DRX_TPS_FRAME2) ? "Frame2" : \ 2083*4882a593Smuzhiyun (x == DRX_TPS_FRAME3) ? "Frame3" : \ 2084*4882a593Smuzhiyun (x == DRX_TPS_FRAME4) ? "Frame4" : \ 2085*4882a593Smuzhiyun (x == DRX_TPS_FRAME_UNKNOWN) ? "Unknown" : \ 2086*4882a593Smuzhiyun "(Invalid)") 2087*4882a593Smuzhiyun 2088*4882a593Smuzhiyun /* lock status */ 2089*4882a593Smuzhiyun 2090*4882a593Smuzhiyun #define DRX_STR_LOCKSTATUS(x) ( \ 2091*4882a593Smuzhiyun (x == DRX_NEVER_LOCK) ? "Never" : \ 2092*4882a593Smuzhiyun (x == DRX_NOT_LOCKED) ? "No" : \ 2093*4882a593Smuzhiyun (x == DRX_LOCKED) ? "Locked" : \ 2094*4882a593Smuzhiyun (x == DRX_LOCK_STATE_1) ? "Lock state 1" : \ 2095*4882a593Smuzhiyun (x == DRX_LOCK_STATE_2) ? "Lock state 2" : \ 2096*4882a593Smuzhiyun (x == DRX_LOCK_STATE_3) ? "Lock state 3" : \ 2097*4882a593Smuzhiyun (x == DRX_LOCK_STATE_4) ? "Lock state 4" : \ 2098*4882a593Smuzhiyun (x == DRX_LOCK_STATE_5) ? "Lock state 5" : \ 2099*4882a593Smuzhiyun (x == DRX_LOCK_STATE_6) ? "Lock state 6" : \ 2100*4882a593Smuzhiyun (x == DRX_LOCK_STATE_7) ? "Lock state 7" : \ 2101*4882a593Smuzhiyun (x == DRX_LOCK_STATE_8) ? "Lock state 8" : \ 2102*4882a593Smuzhiyun (x == DRX_LOCK_STATE_9) ? "Lock state 9" : \ 2103*4882a593Smuzhiyun "(Invalid)") 2104*4882a593Smuzhiyun 2105*4882a593Smuzhiyun /* version information , modules */ 2106*4882a593Smuzhiyun #define DRX_STR_MODULE(x) ( \ 2107*4882a593Smuzhiyun (x == DRX_MODULE_DEVICE) ? "Device" : \ 2108*4882a593Smuzhiyun (x == DRX_MODULE_MICROCODE) ? "Microcode" : \ 2109*4882a593Smuzhiyun (x == DRX_MODULE_DRIVERCORE) ? "CoreDriver" : \ 2110*4882a593Smuzhiyun (x == DRX_MODULE_DEVICEDRIVER) ? "DeviceDriver" : \ 2111*4882a593Smuzhiyun (x == DRX_MODULE_BSP_I2C) ? "BSP I2C" : \ 2112*4882a593Smuzhiyun (x == DRX_MODULE_BSP_TUNER) ? "BSP Tuner" : \ 2113*4882a593Smuzhiyun (x == DRX_MODULE_BSP_HOST) ? "BSP Host" : \ 2114*4882a593Smuzhiyun (x == DRX_MODULE_DAP) ? "Data Access Protocol" : \ 2115*4882a593Smuzhiyun (x == DRX_MODULE_UNKNOWN) ? "Unknown" : \ 2116*4882a593Smuzhiyun "(Invalid)") 2117*4882a593Smuzhiyun 2118*4882a593Smuzhiyun #define DRX_STR_POWER_MODE(x) ( \ 2119*4882a593Smuzhiyun (x == DRX_POWER_UP) ? "DRX_POWER_UP " : \ 2120*4882a593Smuzhiyun (x == DRX_POWER_MODE_1) ? "DRX_POWER_MODE_1" : \ 2121*4882a593Smuzhiyun (x == DRX_POWER_MODE_2) ? "DRX_POWER_MODE_2" : \ 2122*4882a593Smuzhiyun (x == DRX_POWER_MODE_3) ? "DRX_POWER_MODE_3" : \ 2123*4882a593Smuzhiyun (x == DRX_POWER_MODE_4) ? "DRX_POWER_MODE_4" : \ 2124*4882a593Smuzhiyun (x == DRX_POWER_MODE_5) ? "DRX_POWER_MODE_5" : \ 2125*4882a593Smuzhiyun (x == DRX_POWER_MODE_6) ? "DRX_POWER_MODE_6" : \ 2126*4882a593Smuzhiyun (x == DRX_POWER_MODE_7) ? "DRX_POWER_MODE_7" : \ 2127*4882a593Smuzhiyun (x == DRX_POWER_MODE_8) ? "DRX_POWER_MODE_8" : \ 2128*4882a593Smuzhiyun (x == DRX_POWER_MODE_9) ? "DRX_POWER_MODE_9" : \ 2129*4882a593Smuzhiyun (x == DRX_POWER_MODE_10) ? "DRX_POWER_MODE_10" : \ 2130*4882a593Smuzhiyun (x == DRX_POWER_MODE_11) ? "DRX_POWER_MODE_11" : \ 2131*4882a593Smuzhiyun (x == DRX_POWER_MODE_12) ? "DRX_POWER_MODE_12" : \ 2132*4882a593Smuzhiyun (x == DRX_POWER_MODE_13) ? "DRX_POWER_MODE_13" : \ 2133*4882a593Smuzhiyun (x == DRX_POWER_MODE_14) ? "DRX_POWER_MODE_14" : \ 2134*4882a593Smuzhiyun (x == DRX_POWER_MODE_15) ? "DRX_POWER_MODE_15" : \ 2135*4882a593Smuzhiyun (x == DRX_POWER_MODE_16) ? "DRX_POWER_MODE_16" : \ 2136*4882a593Smuzhiyun (x == DRX_POWER_DOWN) ? "DRX_POWER_DOWN " : \ 2137*4882a593Smuzhiyun "(Invalid)") 2138*4882a593Smuzhiyun 2139*4882a593Smuzhiyun #define DRX_STR_OOB_STANDARD(x) ( \ 2140*4882a593Smuzhiyun (x == DRX_OOB_MODE_A) ? "ANSI 55-1 " : \ 2141*4882a593Smuzhiyun (x == DRX_OOB_MODE_B_GRADE_A) ? "ANSI 55-2 A" : \ 2142*4882a593Smuzhiyun (x == DRX_OOB_MODE_B_GRADE_B) ? "ANSI 55-2 B" : \ 2143*4882a593Smuzhiyun "(Invalid)") 2144*4882a593Smuzhiyun 2145*4882a593Smuzhiyun #define DRX_STR_AUD_STANDARD(x) ( \ 2146*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_BTSC) ? "BTSC" : \ 2147*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_A2) ? "A2" : \ 2148*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_EIAJ) ? "EIAJ" : \ 2149*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_FM_STEREO) ? "FM Stereo" : \ 2150*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_AUTO) ? "Auto" : \ 2151*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_M_MONO) ? "M-Standard Mono" : \ 2152*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_D_K_MONO) ? "D/K Mono FM" : \ 2153*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_BG_FM) ? "B/G-Dual Carrier FM (A2)" : \ 2154*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_D_K1) ? "D/K1-Dual Carrier FM" : \ 2155*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_D_K2) ? "D/K2-Dual Carrier FM" : \ 2156*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_D_K3) ? "D/K3-Dual Carrier FM" : \ 2157*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_BG_NICAM_FM) ? "B/G-NICAM-FM" : \ 2158*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_L_NICAM_AM) ? "L-NICAM-AM" : \ 2159*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_I_NICAM_FM) ? "I-NICAM-FM" : \ 2160*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_D_K_NICAM_FM) ? "D/K-NICAM-FM" : \ 2161*4882a593Smuzhiyun (x == DRX_AUD_STANDARD_UNKNOWN) ? "Unknown" : \ 2162*4882a593Smuzhiyun "(Invalid)") 2163*4882a593Smuzhiyun #define DRX_STR_AUD_STEREO(x) ( \ 2164*4882a593Smuzhiyun (x == true) ? "Stereo" : \ 2165*4882a593Smuzhiyun (x == false) ? "Mono" : \ 2166*4882a593Smuzhiyun "(Invalid)") 2167*4882a593Smuzhiyun 2168*4882a593Smuzhiyun #define DRX_STR_AUD_SAP(x) ( \ 2169*4882a593Smuzhiyun (x == true) ? "Present" : \ 2170*4882a593Smuzhiyun (x == false) ? "Not present" : \ 2171*4882a593Smuzhiyun "(Invalid)") 2172*4882a593Smuzhiyun 2173*4882a593Smuzhiyun #define DRX_STR_AUD_CARRIER(x) ( \ 2174*4882a593Smuzhiyun (x == true) ? "Present" : \ 2175*4882a593Smuzhiyun (x == false) ? "Not present" : \ 2176*4882a593Smuzhiyun "(Invalid)") 2177*4882a593Smuzhiyun 2178*4882a593Smuzhiyun #define DRX_STR_AUD_RDS(x) ( \ 2179*4882a593Smuzhiyun (x == true) ? "Available" : \ 2180*4882a593Smuzhiyun (x == false) ? "Not Available" : \ 2181*4882a593Smuzhiyun "(Invalid)") 2182*4882a593Smuzhiyun 2183*4882a593Smuzhiyun #define DRX_STR_AUD_NICAM_STATUS(x) ( \ 2184*4882a593Smuzhiyun (x == DRX_AUD_NICAM_DETECTED) ? "Detected" : \ 2185*4882a593Smuzhiyun (x == DRX_AUD_NICAM_NOT_DETECTED) ? "Not detected" : \ 2186*4882a593Smuzhiyun (x == DRX_AUD_NICAM_BAD) ? "Bad" : \ 2187*4882a593Smuzhiyun "(Invalid)") 2188*4882a593Smuzhiyun 2189*4882a593Smuzhiyun #define DRX_STR_RDS_VALID(x) ( \ 2190*4882a593Smuzhiyun (x == true) ? "Valid" : \ 2191*4882a593Smuzhiyun (x == false) ? "Not Valid" : \ 2192*4882a593Smuzhiyun "(Invalid)") 2193*4882a593Smuzhiyun 2194*4882a593Smuzhiyun /*------------------------------------------------------------------------- 2195*4882a593Smuzhiyun Access macros 2196*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 2197*4882a593Smuzhiyun 2198*4882a593Smuzhiyun /* 2199*4882a593Smuzhiyun * \brief Create a compilable reference to the microcode attribute 2200*4882a593Smuzhiyun * \param d pointer to demod instance 2201*4882a593Smuzhiyun * 2202*4882a593Smuzhiyun * Used as main reference to an attribute field. 2203*4882a593Smuzhiyun * Used by both macro implementation and function implementation. 2204*4882a593Smuzhiyun * These macros are defined to avoid duplication of code in macro and function 2205*4882a593Smuzhiyun * definitions that handle access of demod common or extended attributes. 2206*4882a593Smuzhiyun * 2207*4882a593Smuzhiyun */ 2208*4882a593Smuzhiyun 2209*4882a593Smuzhiyun #define DRX_ATTR_MCRECORD(d) ((d)->my_common_attr->mcversion) 2210*4882a593Smuzhiyun #define DRX_ATTR_MIRRORFREQSPECT(d) ((d)->my_common_attr->mirror_freq_spect) 2211*4882a593Smuzhiyun #define DRX_ATTR_CURRENTPOWERMODE(d)((d)->my_common_attr->current_power_mode) 2212*4882a593Smuzhiyun #define DRX_ATTR_ISOPENED(d) ((d)->my_common_attr->is_opened) 2213*4882a593Smuzhiyun #define DRX_ATTR_USEBOOTLOADER(d) ((d)->my_common_attr->use_bootloader) 2214*4882a593Smuzhiyun #define DRX_ATTR_CURRENTSTANDARD(d) ((d)->my_common_attr->current_standard) 2215*4882a593Smuzhiyun #define DRX_ATTR_PREVSTANDARD(d) ((d)->my_common_attr->prev_standard) 2216*4882a593Smuzhiyun #define DRX_ATTR_CACHESTANDARD(d) ((d)->my_common_attr->di_cache_standard) 2217*4882a593Smuzhiyun #define DRX_ATTR_CURRENTCHANNEL(d) ((d)->my_common_attr->current_channel) 2218*4882a593Smuzhiyun #define DRX_ATTR_MICROCODE(d) ((d)->my_common_attr->microcode) 2219*4882a593Smuzhiyun #define DRX_ATTR_VERIFYMICROCODE(d) ((d)->my_common_attr->verify_microcode) 2220*4882a593Smuzhiyun #define DRX_ATTR_CAPABILITIES(d) ((d)->my_common_attr->capabilities) 2221*4882a593Smuzhiyun #define DRX_ATTR_PRODUCTID(d) ((d)->my_common_attr->product_id) 2222*4882a593Smuzhiyun #define DRX_ATTR_INTERMEDIATEFREQ(d) ((d)->my_common_attr->intermediate_freq) 2223*4882a593Smuzhiyun #define DRX_ATTR_SYSCLOCKFREQ(d) ((d)->my_common_attr->sys_clock_freq) 2224*4882a593Smuzhiyun #define DRX_ATTR_TUNERRFAGCPOL(d) ((d)->my_common_attr->tuner_rf_agc_pol) 2225*4882a593Smuzhiyun #define DRX_ATTR_TUNERIFAGCPOL(d) ((d)->my_common_attr->tuner_if_agc_pol) 2226*4882a593Smuzhiyun #define DRX_ATTR_TUNERSLOWMODE(d) ((d)->my_common_attr->tuner_slow_mode) 2227*4882a593Smuzhiyun #define DRX_ATTR_TUNERSPORTNR(d) ((d)->my_common_attr->tuner_port_nr) 2228*4882a593Smuzhiyun #define DRX_ATTR_I2CADDR(d) ((d)->my_i2c_dev_addr->i2c_addr) 2229*4882a593Smuzhiyun #define DRX_ATTR_I2CDEVID(d) ((d)->my_i2c_dev_addr->i2c_dev_id) 2230*4882a593Smuzhiyun #define DRX_ISMCVERTYPE(x) ((x) == AUX_VER_RECORD) 2231*4882a593Smuzhiyun 2232*4882a593Smuzhiyun /*************************/ 2233*4882a593Smuzhiyun 2234*4882a593Smuzhiyun /* Macros with device-specific handling are converted to CFG functions */ 2235*4882a593Smuzhiyun 2236*4882a593Smuzhiyun #define DRX_ACCESSMACRO_SET(demod, value, cfg_name, data_type) \ 2237*4882a593Smuzhiyun do { \ 2238*4882a593Smuzhiyun struct drx_cfg config; \ 2239*4882a593Smuzhiyun data_type cfg_data; \ 2240*4882a593Smuzhiyun config.cfg_type = cfg_name; \ 2241*4882a593Smuzhiyun config.cfg_data = &cfg_data; \ 2242*4882a593Smuzhiyun cfg_data = value; \ 2243*4882a593Smuzhiyun drx_ctrl(demod, DRX_CTRL_SET_CFG, &config); \ 2244*4882a593Smuzhiyun } while (0) 2245*4882a593Smuzhiyun 2246*4882a593Smuzhiyun #define DRX_ACCESSMACRO_GET(demod, value, cfg_name, data_type, error_value) \ 2247*4882a593Smuzhiyun do { \ 2248*4882a593Smuzhiyun int cfg_status; \ 2249*4882a593Smuzhiyun struct drx_cfg config; \ 2250*4882a593Smuzhiyun data_type cfg_data; \ 2251*4882a593Smuzhiyun config.cfg_type = cfg_name; \ 2252*4882a593Smuzhiyun config.cfg_data = &cfg_data; \ 2253*4882a593Smuzhiyun cfg_status = drx_ctrl(demod, DRX_CTRL_GET_CFG, &config); \ 2254*4882a593Smuzhiyun if (cfg_status == 0) { \ 2255*4882a593Smuzhiyun value = cfg_data; \ 2256*4882a593Smuzhiyun } else { \ 2257*4882a593Smuzhiyun value = (data_type)error_value; \ 2258*4882a593Smuzhiyun } \ 2259*4882a593Smuzhiyun } while (0) 2260*4882a593Smuzhiyun 2261*4882a593Smuzhiyun /* Configuration functions for usage by Access (XS) Macros */ 2262*4882a593Smuzhiyun 2263*4882a593Smuzhiyun #ifndef DRX_XS_CFG_BASE 2264*4882a593Smuzhiyun #define DRX_XS_CFG_BASE (500) 2265*4882a593Smuzhiyun #endif 2266*4882a593Smuzhiyun 2267*4882a593Smuzhiyun #define DRX_XS_CFG_PRESET (DRX_XS_CFG_BASE + 0) 2268*4882a593Smuzhiyun #define DRX_XS_CFG_AUD_BTSC_DETECT (DRX_XS_CFG_BASE + 1) 2269*4882a593Smuzhiyun #define DRX_XS_CFG_QAM_LOCKRANGE (DRX_XS_CFG_BASE + 2) 2270*4882a593Smuzhiyun 2271*4882a593Smuzhiyun /* Access Macros with device-specific handling */ 2272*4882a593Smuzhiyun 2273*4882a593Smuzhiyun #define DRX_SET_PRESET(d, x) \ 2274*4882a593Smuzhiyun DRX_ACCESSMACRO_SET((d), (x), DRX_XS_CFG_PRESET, char*) 2275*4882a593Smuzhiyun #define DRX_GET_PRESET(d, x) \ 2276*4882a593Smuzhiyun DRX_ACCESSMACRO_GET((d), (x), DRX_XS_CFG_PRESET, char*, "ERROR") 2277*4882a593Smuzhiyun 2278*4882a593Smuzhiyun #define DRX_SET_AUD_BTSC_DETECT(d, x) DRX_ACCESSMACRO_SET((d), (x), \ 2279*4882a593Smuzhiyun DRX_XS_CFG_AUD_BTSC_DETECT, enum drx_aud_btsc_detect) 2280*4882a593Smuzhiyun #define DRX_GET_AUD_BTSC_DETECT(d, x) DRX_ACCESSMACRO_GET((d), (x), \ 2281*4882a593Smuzhiyun DRX_XS_CFG_AUD_BTSC_DETECT, enum drx_aud_btsc_detect, DRX_UNKNOWN) 2282*4882a593Smuzhiyun 2283*4882a593Smuzhiyun #define DRX_SET_QAM_LOCKRANGE(d, x) DRX_ACCESSMACRO_SET((d), (x), \ 2284*4882a593Smuzhiyun DRX_XS_CFG_QAM_LOCKRANGE, enum drx_qam_lock_range) 2285*4882a593Smuzhiyun #define DRX_GET_QAM_LOCKRANGE(d, x) DRX_ACCESSMACRO_GET((d), (x), \ 2286*4882a593Smuzhiyun DRX_XS_CFG_QAM_LOCKRANGE, enum drx_qam_lock_range, DRX_UNKNOWN) 2287*4882a593Smuzhiyun 2288*4882a593Smuzhiyun /* 2289*4882a593Smuzhiyun * \brief Macro to check if std is an ATV standard 2290*4882a593Smuzhiyun * \retval true std is an ATV standard 2291*4882a593Smuzhiyun * \retval false std is an ATV standard 2292*4882a593Smuzhiyun */ 2293*4882a593Smuzhiyun #define DRX_ISATVSTD(std) (((std) == DRX_STANDARD_PAL_SECAM_BG) || \ 2294*4882a593Smuzhiyun ((std) == DRX_STANDARD_PAL_SECAM_DK) || \ 2295*4882a593Smuzhiyun ((std) == DRX_STANDARD_PAL_SECAM_I) || \ 2296*4882a593Smuzhiyun ((std) == DRX_STANDARD_PAL_SECAM_L) || \ 2297*4882a593Smuzhiyun ((std) == DRX_STANDARD_PAL_SECAM_LP) || \ 2298*4882a593Smuzhiyun ((std) == DRX_STANDARD_NTSC) || \ 2299*4882a593Smuzhiyun ((std) == DRX_STANDARD_FM)) 2300*4882a593Smuzhiyun 2301*4882a593Smuzhiyun /* 2302*4882a593Smuzhiyun * \brief Macro to check if std is an QAM standard 2303*4882a593Smuzhiyun * \retval true std is an QAM standards 2304*4882a593Smuzhiyun * \retval false std is an QAM standards 2305*4882a593Smuzhiyun */ 2306*4882a593Smuzhiyun #define DRX_ISQAMSTD(std) (((std) == DRX_STANDARD_ITU_A) || \ 2307*4882a593Smuzhiyun ((std) == DRX_STANDARD_ITU_B) || \ 2308*4882a593Smuzhiyun ((std) == DRX_STANDARD_ITU_C) || \ 2309*4882a593Smuzhiyun ((std) == DRX_STANDARD_ITU_D)) 2310*4882a593Smuzhiyun 2311*4882a593Smuzhiyun /* 2312*4882a593Smuzhiyun * \brief Macro to check if std is VSB standard 2313*4882a593Smuzhiyun * \retval true std is VSB standard 2314*4882a593Smuzhiyun * \retval false std is not VSB standard 2315*4882a593Smuzhiyun */ 2316*4882a593Smuzhiyun #define DRX_ISVSBSTD(std) ((std) == DRX_STANDARD_8VSB) 2317*4882a593Smuzhiyun 2318*4882a593Smuzhiyun /* 2319*4882a593Smuzhiyun * \brief Macro to check if std is DVBT standard 2320*4882a593Smuzhiyun * \retval true std is DVBT standard 2321*4882a593Smuzhiyun * \retval false std is not DVBT standard 2322*4882a593Smuzhiyun */ 2323*4882a593Smuzhiyun #define DRX_ISDVBTSTD(std) ((std) == DRX_STANDARD_DVBT) 2324*4882a593Smuzhiyun 2325*4882a593Smuzhiyun /*------------------------------------------------------------------------- 2326*4882a593Smuzhiyun THE END 2327*4882a593Smuzhiyun -------------------------------------------------------------------------*/ 2328*4882a593Smuzhiyun #endif /* __DRXDRIVER_H__ */ 2329