1*74ba9207SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 28bd135baSManu Abraham /* 38bd135baSManu Abraham STB0899 Multistandard Frontend driver 48bd135baSManu Abraham Copyright (C) Manu Abraham (abraham.manu@gmail.com) 58bd135baSManu Abraham 68bd135baSManu Abraham Copyright (C) ST Microelectronics 78bd135baSManu Abraham 88bd135baSManu Abraham */ 98bd135baSManu Abraham 108bd135baSManu Abraham #ifndef __STB0899_PRIV_H 118bd135baSManu Abraham #define __STB0899_PRIV_H 128bd135baSManu Abraham 13fada1935SMauro Carvalho Chehab #include <media/dvb_frontend.h> 148bd135baSManu Abraham #include "stb0899_drv.h" 158bd135baSManu Abraham 168bd135baSManu Abraham #define FE_ERROR 0 178bd135baSManu Abraham #define FE_NOTICE 1 188bd135baSManu Abraham #define FE_INFO 2 198bd135baSManu Abraham #define FE_DEBUG 3 208bd135baSManu Abraham #define FE_DEBUGREG 4 218bd135baSManu Abraham 228bd135baSManu Abraham #define dprintk(x, y, z, format, arg...) do { \ 238bd135baSManu Abraham if (z) { \ 24c615a27aSReinhard Nissl if ((*x > FE_ERROR) && (*x > y)) \ 258bd135baSManu Abraham printk(KERN_ERR "%s: " format "\n", __func__ , ##arg); \ 26c615a27aSReinhard Nissl else if ((*x > FE_NOTICE) && (*x > y)) \ 278bd135baSManu Abraham printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg); \ 28c615a27aSReinhard Nissl else if ((*x > FE_INFO) && (*x > y)) \ 298bd135baSManu Abraham printk(KERN_INFO "%s: " format "\n", __func__ , ##arg); \ 30c615a27aSReinhard Nissl else if ((*x > FE_DEBUG) && (*x > y)) \ 318bd135baSManu Abraham printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg); \ 328bd135baSManu Abraham } else { \ 33c615a27aSReinhard Nissl if (*x > y) \ 348bd135baSManu Abraham printk(format, ##arg); \ 358bd135baSManu Abraham } \ 368bd135baSManu Abraham } while(0) 378bd135baSManu Abraham 388bd135baSManu Abraham #define INRANGE(val, x, y) (((x <= val) && (val <= y)) || \ 398bd135baSManu Abraham ((y <= val) && (val <= x)) ? 1 : 0) 408bd135baSManu Abraham 418bd135baSManu Abraham #define BYTE0 0 428bd135baSManu Abraham #define BYTE1 8 438bd135baSManu Abraham #define BYTE2 16 448bd135baSManu Abraham #define BYTE3 24 458bd135baSManu Abraham 468bd135baSManu Abraham #define GETBYTE(x, y) (((x) >> (y)) & 0xff) 478bd135baSManu Abraham #define MAKEWORD32(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) 488bd135baSManu Abraham #define MAKEWORD16(a, b) (((a) << 8) | (b)) 498bd135baSManu Abraham 508bd135baSManu Abraham #define LSB(x) ((x & 0xff)) 518bd135baSManu Abraham #define MSB(y) ((y >> 8) & 0xff) 528bd135baSManu Abraham 538bd135baSManu Abraham 548bd135baSManu Abraham #define STB0899_GETFIELD(bitf, val) ((val >> STB0899_OFFST_##bitf) & ((1 << STB0899_WIDTH_##bitf) - 1)) 558bd135baSManu Abraham 568bd135baSManu Abraham 578bd135baSManu Abraham #define STB0899_SETFIELD(mask, val, width, offset) (mask & (~(((1 << width) - 1) << \ 588bd135baSManu Abraham offset))) | ((val & \ 598bd135baSManu Abraham ((1 << width) - 1)) << offset) 608bd135baSManu Abraham 618bd135baSManu Abraham #define STB0899_SETFIELD_VAL(bitf, mask, val) (mask = (mask & (~(((1 << STB0899_WIDTH_##bitf) - 1) <<\ 628bd135baSManu Abraham STB0899_OFFST_##bitf))) | \ 638bd135baSManu Abraham (val << STB0899_OFFST_##bitf)) 648bd135baSManu Abraham 658bd135baSManu Abraham 668bd135baSManu Abraham enum stb0899_status { 678bd135baSManu Abraham NOAGC1 = 0, 688bd135baSManu Abraham AGC1OK, 698bd135baSManu Abraham NOTIMING, 708bd135baSManu Abraham ANALOGCARRIER, 718bd135baSManu Abraham TIMINGOK, 728bd135baSManu Abraham NOAGC2, 738bd135baSManu Abraham AGC2OK, 748bd135baSManu Abraham NOCARRIER, 758bd135baSManu Abraham CARRIEROK, 768bd135baSManu Abraham NODATA, 778bd135baSManu Abraham FALSELOCK, 788bd135baSManu Abraham DATAOK, 798bd135baSManu Abraham OUTOFRANGE, 808bd135baSManu Abraham RANGEOK, 818bd135baSManu Abraham DVBS2_DEMOD_LOCK, 828bd135baSManu Abraham DVBS2_DEMOD_NOLOCK, 838bd135baSManu Abraham DVBS2_FEC_LOCK, 848bd135baSManu Abraham DVBS2_FEC_NOLOCK 858bd135baSManu Abraham }; 868bd135baSManu Abraham 878bd135baSManu Abraham enum stb0899_modcod { 888bd135baSManu Abraham STB0899_DUMMY_PLF, 898bd135baSManu Abraham STB0899_QPSK_14, 908bd135baSManu Abraham STB0899_QPSK_13, 918bd135baSManu Abraham STB0899_QPSK_25, 928bd135baSManu Abraham STB0899_QPSK_12, 938bd135baSManu Abraham STB0899_QPSK_35, 948bd135baSManu Abraham STB0899_QPSK_23, 958bd135baSManu Abraham STB0899_QPSK_34, 968bd135baSManu Abraham STB0899_QPSK_45, 978bd135baSManu Abraham STB0899_QPSK_56, 988bd135baSManu Abraham STB0899_QPSK_89, 998bd135baSManu Abraham STB0899_QPSK_910, 1008bd135baSManu Abraham STB0899_8PSK_35, 1018bd135baSManu Abraham STB0899_8PSK_23, 1028bd135baSManu Abraham STB0899_8PSK_34, 1038bd135baSManu Abraham STB0899_8PSK_56, 1048bd135baSManu Abraham STB0899_8PSK_89, 1058bd135baSManu Abraham STB0899_8PSK_910, 1068bd135baSManu Abraham STB0899_16APSK_23, 1078bd135baSManu Abraham STB0899_16APSK_34, 1088bd135baSManu Abraham STB0899_16APSK_45, 1098bd135baSManu Abraham STB0899_16APSK_56, 1108bd135baSManu Abraham STB0899_16APSK_89, 1118bd135baSManu Abraham STB0899_16APSK_910, 1128bd135baSManu Abraham STB0899_32APSK_34, 1138bd135baSManu Abraham STB0899_32APSK_45, 1148bd135baSManu Abraham STB0899_32APSK_56, 1158bd135baSManu Abraham STB0899_32APSK_89, 1168bd135baSManu Abraham STB0899_32APSK_910 1178bd135baSManu Abraham }; 1188bd135baSManu Abraham 1198bd135baSManu Abraham enum stb0899_frame { 1208bd135baSManu Abraham STB0899_LONG_FRAME, 1218bd135baSManu Abraham STB0899_SHORT_FRAME 1228bd135baSManu Abraham }; 1238bd135baSManu Abraham 1248bd135baSManu Abraham enum stb0899_alpha { 1258bd135baSManu Abraham RRC_20, 1268bd135baSManu Abraham RRC_25, 1278bd135baSManu Abraham RRC_35 1288bd135baSManu Abraham }; 1298bd135baSManu Abraham 1308bd135baSManu Abraham struct stb0899_tab { 1318bd135baSManu Abraham s32 real; 1328bd135baSManu Abraham s32 read; 1338bd135baSManu Abraham }; 1348bd135baSManu Abraham 1358bd135baSManu Abraham enum stb0899_fec { 1368bd135baSManu Abraham STB0899_FEC_1_2 = 13, 1378bd135baSManu Abraham STB0899_FEC_2_3 = 18, 1388bd135baSManu Abraham STB0899_FEC_3_4 = 21, 1398bd135baSManu Abraham STB0899_FEC_5_6 = 24, 1408bd135baSManu Abraham STB0899_FEC_6_7 = 25, 1418bd135baSManu Abraham STB0899_FEC_7_8 = 26 1428bd135baSManu Abraham }; 1438bd135baSManu Abraham 1448bd135baSManu Abraham struct stb0899_params { 1458bd135baSManu Abraham u32 freq; /* Frequency */ 1468bd135baSManu Abraham u32 srate; /* Symbol rate */ 1473f400925SManu Abraham enum fe_code_rate fecrate; 1488bd135baSManu Abraham }; 1498bd135baSManu Abraham 1508bd135baSManu Abraham struct stb0899_internal { 1518bd135baSManu Abraham u32 master_clk; 1528bd135baSManu Abraham u32 freq; /* Demod internal Frequency */ 1538bd135baSManu Abraham u32 srate; /* Demod internal Symbol rate */ 1548bd135baSManu Abraham enum stb0899_fec fecrate; /* Demod internal FEC rate */ 155b5d067b8SManu Abraham s32 srch_range; /* Demod internal Search Range */ 156b5d067b8SManu Abraham s32 sub_range; /* Demod current sub range (Hz) */ 157b5d067b8SManu Abraham s32 tuner_step; /* Tuner step (Hz) */ 158b5d067b8SManu Abraham s32 tuner_offst; /* Relative offset to carrier (Hz) */ 1598bd135baSManu Abraham u32 tuner_bw; /* Current bandwidth of the tuner (Hz) */ 1608bd135baSManu Abraham 1618bd135baSManu Abraham s32 mclk; /* Masterclock Divider factor (binary) */ 1628bd135baSManu Abraham s32 rolloff; /* Current RollOff of the filter (x100) */ 1638bd135baSManu Abraham 1648bd135baSManu Abraham s16 derot_freq; /* Current derotator frequency (Hz) */ 1658bd135baSManu Abraham s16 derot_percent; 1668bd135baSManu Abraham 1678bd135baSManu Abraham s16 direction; /* Current derotator search direction */ 1688bd135baSManu Abraham s16 derot_step; /* Derotator step (binary value) */ 1698bd135baSManu Abraham s16 t_derot; /* Derotator time constant (ms) */ 1708bd135baSManu Abraham s16 t_data; /* Data recovery time constant (ms) */ 1718bd135baSManu Abraham s16 sub_dir; /* Direction of the next sub range */ 1728bd135baSManu Abraham 1738bd135baSManu Abraham s16 t_agc1; /* Agc1 time constant (ms) */ 1748bd135baSManu Abraham s16 t_agc2; /* Agc2 time constant (ms) */ 1758bd135baSManu Abraham 1768bd135baSManu Abraham u32 lock; /* Demod internal lock state */ 1778bd135baSManu Abraham enum stb0899_status status; /* Demod internal status */ 1788bd135baSManu Abraham 1798bd135baSManu Abraham /* DVB-S2 */ 1808bd135baSManu Abraham s32 agc_gain; /* RF AGC Gain */ 1818bd135baSManu Abraham s32 center_freq; /* Nominal carrier frequency */ 1828bd135baSManu Abraham s32 av_frame_coarse; /* Coarse carrier freq search frames */ 1838bd135baSManu Abraham s32 av_frame_fine; /* Fine carrier freq search frames */ 1848bd135baSManu Abraham 1858bd135baSManu Abraham s16 step_size; /* Carrier frequency search step size */ 1868bd135baSManu Abraham 1878bd135baSManu Abraham enum stb0899_alpha rrc_alpha; 1888bd135baSManu Abraham enum stb0899_inversion inversion; 1898bd135baSManu Abraham enum stb0899_modcod modcod; 1908bd135baSManu Abraham u8 pilots; /* Pilots found */ 1918bd135baSManu Abraham 1928bd135baSManu Abraham enum stb0899_frame frame_length; 1938bd135baSManu Abraham u8 v_status; /* VSTATUS */ 1948bd135baSManu Abraham u8 err_ctrl; /* ERRCTRLn */ 1958bd135baSManu Abraham }; 1968bd135baSManu Abraham 1978bd135baSManu Abraham struct stb0899_state { 1988bd135baSManu Abraham struct i2c_adapter *i2c; 1998bd135baSManu Abraham struct stb0899_config *config; 2008bd135baSManu Abraham struct dvb_frontend frontend; 2018bd135baSManu Abraham 202c615a27aSReinhard Nissl u32 *verbose; /* Cached module verbosity level */ 2038bd135baSManu Abraham 2048bd135baSManu Abraham struct stb0899_internal internal; /* Device internal parameters */ 2058bd135baSManu Abraham 2068bd135baSManu Abraham /* cached params from API */ 2073f400925SManu Abraham enum fe_delivery_system delsys; 2088bd135baSManu Abraham struct stb0899_params params; 2098bd135baSManu Abraham 2108bd135baSManu Abraham u32 rx_freq; /* DiSEqC 2.0 receiver freq */ 2118bd135baSManu Abraham struct mutex search_lock; 2128bd135baSManu Abraham }; 2138bd135baSManu Abraham /* stb0899.c */ 2148bd135baSManu Abraham extern int stb0899_read_reg(struct stb0899_state *state, 2158bd135baSManu Abraham unsigned int reg); 2168bd135baSManu Abraham 2178bd135baSManu Abraham extern u32 _stb0899_read_s2reg(struct stb0899_state *state, 2188bd135baSManu Abraham u32 stb0899_i2cdev, 2198bd135baSManu Abraham u32 stb0899_base_addr, 2208bd135baSManu Abraham u16 stb0899_reg_offset); 2218bd135baSManu Abraham 2228bd135baSManu Abraham extern int stb0899_read_regs(struct stb0899_state *state, 2238bd135baSManu Abraham unsigned int reg, u8 *buf, 2243d6a3bebSManu Abraham u32 count); 2258bd135baSManu Abraham 2268bd135baSManu Abraham extern int stb0899_write_regs(struct stb0899_state *state, 2278bd135baSManu Abraham unsigned int reg, u8 *data, 22885eabac4SManu Abraham u32 count); 2298bd135baSManu Abraham 2308bd135baSManu Abraham extern int stb0899_write_reg(struct stb0899_state *state, 2318bd135baSManu Abraham unsigned int reg, 2328bd135baSManu Abraham u8 data); 2338bd135baSManu Abraham 2348bd135baSManu Abraham extern int stb0899_write_s2reg(struct stb0899_state *state, 2358bd135baSManu Abraham u32 stb0899_i2cdev, 2368bd135baSManu Abraham u32 stb0899_base_addr, 2378bd135baSManu Abraham u16 stb0899_reg_offset, 2388bd135baSManu Abraham u32 stb0899_data); 2398bd135baSManu Abraham 24040e8ce3dSManu Abraham extern int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable); 24140e8ce3dSManu Abraham 2428bd135baSManu Abraham 2438bd135baSManu Abraham #define STB0899_READ_S2REG(DEVICE, REG) (_stb0899_read_s2reg(state, DEVICE, STB0899_BASE_##REG, STB0899_OFF0_##REG)) 2448bd135baSManu Abraham //#define STB0899_WRITE_S2REG(DEVICE, REG, DATA) (_stb0899_write_s2reg(state, DEVICE, STB0899_BASE_##REG, STB0899_OFF0_##REG, DATA)) 2458bd135baSManu Abraham 2468bd135baSManu Abraham /* stb0899_algo.c */ 2478bd135baSManu Abraham extern enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state); 2488bd135baSManu Abraham extern enum stb0899_status stb0899_dvbs2_algo(struct stb0899_state *state); 2498bd135baSManu Abraham extern long stb0899_carr_width(struct stb0899_state *state); 2508bd135baSManu Abraham 2518bd135baSManu Abraham #endif //__STB0899_PRIV_H 252