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