18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci	STV0900/0903 Multistandard Broadcast 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 __STV090x_PRIV_H
118c2ecf20Sopenharmony_ci#define __STV090x_PRIV_H
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define FE_ERROR				0
168c2ecf20Sopenharmony_ci#define FE_NOTICE				1
178c2ecf20Sopenharmony_ci#define FE_INFO					2
188c2ecf20Sopenharmony_ci#define FE_DEBUG				3
198c2ecf20Sopenharmony_ci#define FE_DEBUGREG				4
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define dprintk(__y, __z, format, arg...) do {						\
228c2ecf20Sopenharmony_ci	if (__z) {									\
238c2ecf20Sopenharmony_ci		if	((verbose > FE_ERROR) && (verbose > __y))			\
248c2ecf20Sopenharmony_ci			printk(KERN_ERR "%s: " format "\n", __func__ , ##arg);		\
258c2ecf20Sopenharmony_ci		else if	((verbose > FE_NOTICE) && (verbose > __y))			\
268c2ecf20Sopenharmony_ci			printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg);	\
278c2ecf20Sopenharmony_ci		else if ((verbose > FE_INFO) && (verbose > __y))			\
288c2ecf20Sopenharmony_ci			printk(KERN_INFO "%s: " format "\n", __func__ , ##arg);		\
298c2ecf20Sopenharmony_ci		else if ((verbose > FE_DEBUG) && (verbose > __y))			\
308c2ecf20Sopenharmony_ci			printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg);	\
318c2ecf20Sopenharmony_ci	} else {									\
328c2ecf20Sopenharmony_ci		if (verbose > __y)							\
338c2ecf20Sopenharmony_ci			printk(format, ##arg);						\
348c2ecf20Sopenharmony_ci	}										\
358c2ecf20Sopenharmony_ci} while (0)
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#define STV090x_READ_DEMOD(__state, __reg) ((			\
388c2ecf20Sopenharmony_ci	(__state)->demod == STV090x_DEMODULATOR_1)	?	\
398c2ecf20Sopenharmony_ci	stv090x_read_reg(__state, STV090x_P2_##__reg) :		\
408c2ecf20Sopenharmony_ci	stv090x_read_reg(__state, STV090x_P1_##__reg))
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#define STV090x_WRITE_DEMOD(__state, __reg, __data) ((		\
438c2ecf20Sopenharmony_ci	(__state)->demod == STV090x_DEMODULATOR_1)	?	\
448c2ecf20Sopenharmony_ci	stv090x_write_reg(__state, STV090x_P2_##__reg, __data) :\
458c2ecf20Sopenharmony_ci	stv090x_write_reg(__state, STV090x_P1_##__reg, __data))
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#define STV090x_ADDR_OFFST(__state, __x) ((			\
488c2ecf20Sopenharmony_ci	(__state->demod) == STV090x_DEMODULATOR_1)	?	\
498c2ecf20Sopenharmony_ci		STV090x_P1_##__x :				\
508c2ecf20Sopenharmony_ci		STV090x_P2_##__x)
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#define STV090x_SETFIELD(mask, bitf, val)	(mask = (mask & (~(((1 << STV090x_WIDTH_##bitf) - 1) <<\
548c2ecf20Sopenharmony_ci							 STV090x_OFFST_##bitf))) | \
558c2ecf20Sopenharmony_ci							 (val << STV090x_OFFST_##bitf))
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define STV090x_GETFIELD(val, bitf)		((val >> STV090x_OFFST_##bitf) & ((1 << STV090x_WIDTH_##bitf) - 1))
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#define STV090x_SETFIELD_Px(mask, bitf, val)	(mask = (mask & (~(((1 << STV090x_WIDTH_Px_##bitf) - 1) <<\
618c2ecf20Sopenharmony_ci							 STV090x_OFFST_Px_##bitf))) | \
628c2ecf20Sopenharmony_ci							 (val << STV090x_OFFST_Px_##bitf))
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#define STV090x_GETFIELD_Px(val, bitf)		((val >> STV090x_OFFST_Px_##bitf) & ((1 << STV090x_WIDTH_Px_##bitf) - 1))
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define MAKEWORD16(__a, __b)			(((__a) << 8) | (__b))
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#define MSB(__x)				((__x >> 8) & 0xff)
698c2ecf20Sopenharmony_ci#define LSB(__x)				(__x & 0xff)
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci#define STV090x_IQPOWER_THRESHOLD	  30
738c2ecf20Sopenharmony_ci#define STV090x_SEARCH_AGC2_TH_CUT20	 700
748c2ecf20Sopenharmony_ci#define STV090x_SEARCH_AGC2_TH_CUT30	1400
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci#define STV090x_SEARCH_AGC2_TH(__ver)	\
778c2ecf20Sopenharmony_ci	((__ver <= 0x20) ?		\
788c2ecf20Sopenharmony_ci	STV090x_SEARCH_AGC2_TH_CUT20 :	\
798c2ecf20Sopenharmony_ci	STV090x_SEARCH_AGC2_TH_CUT30)
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cienum stv090x_signal_state {
828c2ecf20Sopenharmony_ci	STV090x_NOAGC1,
838c2ecf20Sopenharmony_ci	STV090x_NOCARRIER,
848c2ecf20Sopenharmony_ci	STV090x_NODATA,
858c2ecf20Sopenharmony_ci	STV090x_DATAOK,
868c2ecf20Sopenharmony_ci	STV090x_RANGEOK,
878c2ecf20Sopenharmony_ci	STV090x_OUTOFRANGE
888c2ecf20Sopenharmony_ci};
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cienum stv090x_fec {
918c2ecf20Sopenharmony_ci	STV090x_PR12 = 0,
928c2ecf20Sopenharmony_ci	STV090x_PR23,
938c2ecf20Sopenharmony_ci	STV090x_PR34,
948c2ecf20Sopenharmony_ci	STV090x_PR45,
958c2ecf20Sopenharmony_ci	STV090x_PR56,
968c2ecf20Sopenharmony_ci	STV090x_PR67,
978c2ecf20Sopenharmony_ci	STV090x_PR78,
988c2ecf20Sopenharmony_ci	STV090x_PR89,
998c2ecf20Sopenharmony_ci	STV090x_PR910,
1008c2ecf20Sopenharmony_ci	STV090x_PRERR
1018c2ecf20Sopenharmony_ci};
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_cienum stv090x_modulation {
1048c2ecf20Sopenharmony_ci	STV090x_QPSK,
1058c2ecf20Sopenharmony_ci	STV090x_8PSK,
1068c2ecf20Sopenharmony_ci	STV090x_16APSK,
1078c2ecf20Sopenharmony_ci	STV090x_32APSK,
1088c2ecf20Sopenharmony_ci	STV090x_UNKNOWN
1098c2ecf20Sopenharmony_ci};
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_cienum stv090x_frame {
1128c2ecf20Sopenharmony_ci	STV090x_LONG_FRAME,
1138c2ecf20Sopenharmony_ci	STV090x_SHORT_FRAME
1148c2ecf20Sopenharmony_ci};
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_cienum stv090x_pilot {
1178c2ecf20Sopenharmony_ci	STV090x_PILOTS_OFF,
1188c2ecf20Sopenharmony_ci	STV090x_PILOTS_ON
1198c2ecf20Sopenharmony_ci};
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_cienum stv090x_rolloff {
1228c2ecf20Sopenharmony_ci	STV090x_RO_35,
1238c2ecf20Sopenharmony_ci	STV090x_RO_25,
1248c2ecf20Sopenharmony_ci	STV090x_RO_20
1258c2ecf20Sopenharmony_ci};
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_cienum stv090x_inversion {
1288c2ecf20Sopenharmony_ci	STV090x_IQ_AUTO,
1298c2ecf20Sopenharmony_ci	STV090x_IQ_NORMAL,
1308c2ecf20Sopenharmony_ci	STV090x_IQ_SWAP
1318c2ecf20Sopenharmony_ci};
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_cienum stv090x_modcod {
1348c2ecf20Sopenharmony_ci	STV090x_DUMMY_PLF = 0,
1358c2ecf20Sopenharmony_ci	STV090x_QPSK_14,
1368c2ecf20Sopenharmony_ci	STV090x_QPSK_13,
1378c2ecf20Sopenharmony_ci	STV090x_QPSK_25,
1388c2ecf20Sopenharmony_ci	STV090x_QPSK_12,
1398c2ecf20Sopenharmony_ci	STV090x_QPSK_35,
1408c2ecf20Sopenharmony_ci	STV090x_QPSK_23,
1418c2ecf20Sopenharmony_ci	STV090x_QPSK_34,
1428c2ecf20Sopenharmony_ci	STV090x_QPSK_45,
1438c2ecf20Sopenharmony_ci	STV090x_QPSK_56,
1448c2ecf20Sopenharmony_ci	STV090x_QPSK_89,
1458c2ecf20Sopenharmony_ci	STV090x_QPSK_910,
1468c2ecf20Sopenharmony_ci	STV090x_8PSK_35,
1478c2ecf20Sopenharmony_ci	STV090x_8PSK_23,
1488c2ecf20Sopenharmony_ci	STV090x_8PSK_34,
1498c2ecf20Sopenharmony_ci	STV090x_8PSK_56,
1508c2ecf20Sopenharmony_ci	STV090x_8PSK_89,
1518c2ecf20Sopenharmony_ci	STV090x_8PSK_910,
1528c2ecf20Sopenharmony_ci	STV090x_16APSK_23,
1538c2ecf20Sopenharmony_ci	STV090x_16APSK_34,
1548c2ecf20Sopenharmony_ci	STV090x_16APSK_45,
1558c2ecf20Sopenharmony_ci	STV090x_16APSK_56,
1568c2ecf20Sopenharmony_ci	STV090x_16APSK_89,
1578c2ecf20Sopenharmony_ci	STV090x_16APSK_910,
1588c2ecf20Sopenharmony_ci	STV090x_32APSK_34,
1598c2ecf20Sopenharmony_ci	STV090x_32APSK_45,
1608c2ecf20Sopenharmony_ci	STV090x_32APSK_56,
1618c2ecf20Sopenharmony_ci	STV090x_32APSK_89,
1628c2ecf20Sopenharmony_ci	STV090x_32APSK_910,
1638c2ecf20Sopenharmony_ci	STV090x_MODCODE_UNKNOWN
1648c2ecf20Sopenharmony_ci};
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_cienum stv090x_search {
1678c2ecf20Sopenharmony_ci	STV090x_SEARCH_DSS = 0,
1688c2ecf20Sopenharmony_ci	STV090x_SEARCH_DVBS1,
1698c2ecf20Sopenharmony_ci	STV090x_SEARCH_DVBS2,
1708c2ecf20Sopenharmony_ci	STV090x_SEARCH_AUTO
1718c2ecf20Sopenharmony_ci};
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_cienum stv090x_algo {
1748c2ecf20Sopenharmony_ci	STV090x_BLIND_SEARCH,
1758c2ecf20Sopenharmony_ci	STV090x_COLD_SEARCH,
1768c2ecf20Sopenharmony_ci	STV090x_WARM_SEARCH
1778c2ecf20Sopenharmony_ci};
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_cienum stv090x_delsys {
1808c2ecf20Sopenharmony_ci	STV090x_ERROR = 0,
1818c2ecf20Sopenharmony_ci	STV090x_DVBS1 = 1,
1828c2ecf20Sopenharmony_ci	STV090x_DVBS2,
1838c2ecf20Sopenharmony_ci	STV090x_DSS
1848c2ecf20Sopenharmony_ci};
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_cistruct stv090x_long_frame_crloop {
1878c2ecf20Sopenharmony_ci	enum stv090x_modcod	modcod;
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	u8 crl_pilots_on_2;
1908c2ecf20Sopenharmony_ci	u8 crl_pilots_off_2;
1918c2ecf20Sopenharmony_ci	u8 crl_pilots_on_5;
1928c2ecf20Sopenharmony_ci	u8 crl_pilots_off_5;
1938c2ecf20Sopenharmony_ci	u8 crl_pilots_on_10;
1948c2ecf20Sopenharmony_ci	u8 crl_pilots_off_10;
1958c2ecf20Sopenharmony_ci	u8 crl_pilots_on_20;
1968c2ecf20Sopenharmony_ci	u8 crl_pilots_off_20;
1978c2ecf20Sopenharmony_ci	u8 crl_pilots_on_30;
1988c2ecf20Sopenharmony_ci	u8 crl_pilots_off_30;
1998c2ecf20Sopenharmony_ci};
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_cistruct stv090x_short_frame_crloop {
2028c2ecf20Sopenharmony_ci	enum stv090x_modulation	modulation;
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	u8 crl_2;  /*      SR <   3M */
2058c2ecf20Sopenharmony_ci	u8 crl_5;  /*  3 < SR <=  7M */
2068c2ecf20Sopenharmony_ci	u8 crl_10; /*  7 < SR <= 15M */
2078c2ecf20Sopenharmony_ci	u8 crl_20; /* 10 < SR <= 25M */
2088c2ecf20Sopenharmony_ci	u8 crl_30; /* 10 < SR <= 45M */
2098c2ecf20Sopenharmony_ci};
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_cistruct stv090x_reg {
2128c2ecf20Sopenharmony_ci	u16 addr;
2138c2ecf20Sopenharmony_ci	u8  data;
2148c2ecf20Sopenharmony_ci};
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_cistruct stv090x_tab {
2178c2ecf20Sopenharmony_ci	s32 real;
2188c2ecf20Sopenharmony_ci	s32 read;
2198c2ecf20Sopenharmony_ci};
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_cistruct stv090x_internal {
2228c2ecf20Sopenharmony_ci	struct i2c_adapter	*i2c_adap;
2238c2ecf20Sopenharmony_ci	u8			i2c_addr;
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	struct mutex		demod_lock; /* Lock access to shared register */
2268c2ecf20Sopenharmony_ci	struct mutex		tuner_lock; /* Lock access to tuners */
2278c2ecf20Sopenharmony_ci	s32			mclk; /* Masterclock Divider factor */
2288c2ecf20Sopenharmony_ci	u32			dev_ver;
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	int			num_used;
2318c2ecf20Sopenharmony_ci};
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_cistruct stv090x_state {
2348c2ecf20Sopenharmony_ci	enum stv090x_device		device;
2358c2ecf20Sopenharmony_ci	enum stv090x_demodulator	demod;
2368c2ecf20Sopenharmony_ci	enum stv090x_mode		demod_mode;
2378c2ecf20Sopenharmony_ci	struct stv090x_internal		*internal;
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci	struct i2c_adapter		*i2c;
2408c2ecf20Sopenharmony_ci	struct stv090x_config	*config;
2418c2ecf20Sopenharmony_ci	struct dvb_frontend		frontend;
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci	u32				*verbose; /* Cached module verbosity */
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci	enum stv090x_delsys		delsys;
2468c2ecf20Sopenharmony_ci	enum stv090x_fec		fec;
2478c2ecf20Sopenharmony_ci	enum stv090x_modulation		modulation;
2488c2ecf20Sopenharmony_ci	enum stv090x_modcod		modcod;
2498c2ecf20Sopenharmony_ci	enum stv090x_search		search_mode;
2508c2ecf20Sopenharmony_ci	enum stv090x_frame		frame_len;
2518c2ecf20Sopenharmony_ci	enum stv090x_pilot		pilots;
2528c2ecf20Sopenharmony_ci	enum stv090x_rolloff		rolloff;
2538c2ecf20Sopenharmony_ci	enum stv090x_inversion		inversion;
2548c2ecf20Sopenharmony_ci	enum stv090x_algo		algo;
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	u32				frequency;
2578c2ecf20Sopenharmony_ci	u32				srate;
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci	s32				tuner_bw;
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci	s32				search_range;
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci	s32				DemodTimeout;
2648c2ecf20Sopenharmony_ci	s32				FecTimeout;
2658c2ecf20Sopenharmony_ci};
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci#endif /* __STV090x_PRIV_H */
268