xref: /linux/drivers/media/dvb-frontends/stb0899_priv.h (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
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