252 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 STB0899 Multistandard Frontend driver4 Copyright (C) Manu Abraham (abraham.manu@gmail.com)5 6 Copyright (C) ST Microelectronics7 8*/9 10#ifndef __STB0899_PRIV_H11#define __STB0899_PRIV_H12 13#include <media/dvb_frontend.h>14#include "stb0899_drv.h"15 16#define FE_ERROR 017#define FE_NOTICE 118#define FE_INFO 219#define FE_DEBUG 320#define FE_DEBUGREG 421 22#define dprintk(x, y, z, format, arg...) do { \23 if (z) { \24 if ((*x > FE_ERROR) && (*x > y)) \25 printk(KERN_ERR "%s: " format "\n", __func__ , ##arg); \26 else if ((*x > FE_NOTICE) && (*x > y)) \27 printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg); \28 else if ((*x > FE_INFO) && (*x > y)) \29 printk(KERN_INFO "%s: " format "\n", __func__ , ##arg); \30 else if ((*x > FE_DEBUG) && (*x > y)) \31 printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg); \32 } else { \33 if (*x > y) \34 printk(format, ##arg); \35 } \36} while(0)37 38#define INRANGE(val, x, y) (((x <= val) && (val <= y)) || \39 ((y <= val) && (val <= x)) ? 1 : 0)40 41#define BYTE0 042#define BYTE1 843#define BYTE2 1644#define BYTE3 2445 46#define GETBYTE(x, y) (((x) >> (y)) & 0xff)47#define MAKEWORD32(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))48#define MAKEWORD16(a, b) (((a) << 8) | (b))49 50#define LSB(x) ((x & 0xff))51#define MSB(y) ((y >> 8) & 0xff)52 53 54#define STB0899_GETFIELD(bitf, val) ((val >> STB0899_OFFST_##bitf) & ((1 << STB0899_WIDTH_##bitf) - 1))55 56 57#define STB0899_SETFIELD(mask, val, width, offset) (mask & (~(((1 << width) - 1) << \58 offset))) | ((val & \59 ((1 << width) - 1)) << offset)60 61#define STB0899_SETFIELD_VAL(bitf, mask, val) (mask = (mask & (~(((1 << STB0899_WIDTH_##bitf) - 1) <<\62 STB0899_OFFST_##bitf))) | \63 (val << STB0899_OFFST_##bitf))64 65 66enum stb0899_status {67 NOAGC1 = 0,68 AGC1OK,69 NOTIMING,70 ANALOGCARRIER,71 TIMINGOK,72 NOAGC2,73 AGC2OK,74 NOCARRIER,75 CARRIEROK,76 NODATA,77 FALSELOCK,78 DATAOK,79 OUTOFRANGE,80 RANGEOK,81 DVBS2_DEMOD_LOCK,82 DVBS2_DEMOD_NOLOCK,83 DVBS2_FEC_LOCK,84 DVBS2_FEC_NOLOCK85};86 87enum stb0899_modcod {88 STB0899_DUMMY_PLF,89 STB0899_QPSK_14,90 STB0899_QPSK_13,91 STB0899_QPSK_25,92 STB0899_QPSK_12,93 STB0899_QPSK_35,94 STB0899_QPSK_23,95 STB0899_QPSK_34,96 STB0899_QPSK_45,97 STB0899_QPSK_56,98 STB0899_QPSK_89,99 STB0899_QPSK_910,100 STB0899_8PSK_35,101 STB0899_8PSK_23,102 STB0899_8PSK_34,103 STB0899_8PSK_56,104 STB0899_8PSK_89,105 STB0899_8PSK_910,106 STB0899_16APSK_23,107 STB0899_16APSK_34,108 STB0899_16APSK_45,109 STB0899_16APSK_56,110 STB0899_16APSK_89,111 STB0899_16APSK_910,112 STB0899_32APSK_34,113 STB0899_32APSK_45,114 STB0899_32APSK_56,115 STB0899_32APSK_89,116 STB0899_32APSK_910117};118 119enum stb0899_frame {120 STB0899_LONG_FRAME,121 STB0899_SHORT_FRAME122};123 124enum stb0899_alpha {125 RRC_20,126 RRC_25,127 RRC_35128};129 130struct stb0899_tab {131 s32 real;132 s32 read;133};134 135enum stb0899_fec {136 STB0899_FEC_1_2 = 13,137 STB0899_FEC_2_3 = 18,138 STB0899_FEC_3_4 = 21,139 STB0899_FEC_5_6 = 24,140 STB0899_FEC_6_7 = 25,141 STB0899_FEC_7_8 = 26142};143 144struct stb0899_params {145 u32 freq; /* Frequency */146 u32 srate; /* Symbol rate */147 enum fe_code_rate fecrate;148};149 150struct stb0899_internal {151 u32 master_clk;152 u32 freq; /* Demod internal Frequency */153 u32 srate; /* Demod internal Symbol rate */154 enum stb0899_fec fecrate; /* Demod internal FEC rate */155 s32 srch_range; /* Demod internal Search Range */156 s32 sub_range; /* Demod current sub range (Hz) */157 s32 tuner_step; /* Tuner step (Hz) */158 s32 tuner_offst; /* Relative offset to carrier (Hz) */159 u32 tuner_bw; /* Current bandwidth of the tuner (Hz) */160 161 s32 mclk; /* Masterclock Divider factor (binary) */162 s32 rolloff; /* Current RollOff of the filter (x100) */163 164 s16 derot_freq; /* Current derotator frequency (Hz) */165 s16 derot_percent;166 167 s16 direction; /* Current derotator search direction */168 s16 derot_step; /* Derotator step (binary value) */169 s16 t_derot; /* Derotator time constant (ms) */170 s16 t_data; /* Data recovery time constant (ms) */171 s16 sub_dir; /* Direction of the next sub range */172 173 s16 t_agc1; /* Agc1 time constant (ms) */174 s16 t_agc2; /* Agc2 time constant (ms) */175 176 u32 lock; /* Demod internal lock state */177 enum stb0899_status status; /* Demod internal status */178 179 /* DVB-S2 */180 s32 agc_gain; /* RF AGC Gain */181 s32 center_freq; /* Nominal carrier frequency */182 s32 av_frame_coarse; /* Coarse carrier freq search frames */183 s32 av_frame_fine; /* Fine carrier freq search frames */184 185 s16 step_size; /* Carrier frequency search step size */186 187 enum stb0899_alpha rrc_alpha;188 enum stb0899_inversion inversion;189 enum stb0899_modcod modcod;190 u8 pilots; /* Pilots found */191 192 enum stb0899_frame frame_length;193 u8 v_status; /* VSTATUS */194 u8 err_ctrl; /* ERRCTRLn */195};196 197struct stb0899_state {198 struct i2c_adapter *i2c;199 struct stb0899_config *config;200 struct dvb_frontend frontend;201 202 u32 *verbose; /* Cached module verbosity level */203 204 struct stb0899_internal internal; /* Device internal parameters */205 206 /* cached params from API */207 enum fe_delivery_system delsys;208 struct stb0899_params params;209 210 u32 rx_freq; /* DiSEqC 2.0 receiver freq */211 struct mutex search_lock;212};213/* stb0899.c */214extern int stb0899_read_reg(struct stb0899_state *state,215 unsigned int reg);216 217extern u32 _stb0899_read_s2reg(struct stb0899_state *state,218 u32 stb0899_i2cdev,219 u32 stb0899_base_addr,220 u16 stb0899_reg_offset);221 222extern int stb0899_read_regs(struct stb0899_state *state,223 unsigned int reg, u8 *buf,224 u32 count);225 226extern int stb0899_write_regs(struct stb0899_state *state,227 unsigned int reg, u8 *data,228 u32 count);229 230extern int stb0899_write_reg(struct stb0899_state *state,231 unsigned int reg,232 u8 data);233 234extern int stb0899_write_s2reg(struct stb0899_state *state,235 u32 stb0899_i2cdev,236 u32 stb0899_base_addr,237 u16 stb0899_reg_offset,238 u32 stb0899_data);239 240extern int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable);241 242 243#define STB0899_READ_S2REG(DEVICE, REG) (_stb0899_read_s2reg(state, DEVICE, STB0899_BASE_##REG, STB0899_OFF0_##REG))244//#define STB0899_WRITE_S2REG(DEVICE, REG, DATA) (_stb0899_write_s2reg(state, DEVICE, STB0899_BASE_##REG, STB0899_OFF0_##REG, DATA))245 246/* stb0899_algo.c */247extern enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state);248extern enum stb0899_status stb0899_dvbs2_algo(struct stb0899_state *state);249extern long stb0899_carr_width(struct stb0899_state *state);250 251#endif //__STB0899_PRIV_H252