18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci    tda18271.h - header for the Philips / NXP TDA18271 silicon tuner
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci    Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci*/
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef __TDA18271_H__
108c2ecf20Sopenharmony_ci#define __TDA18271_H__
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/i2c.h>
138c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct tda18271_std_map_item {
168c2ecf20Sopenharmony_ci	u16 if_freq;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	/* EP3[4:3] */
198c2ecf20Sopenharmony_ci	unsigned int agc_mode:2;
208c2ecf20Sopenharmony_ci	/* EP3[2:0] */
218c2ecf20Sopenharmony_ci	unsigned int std:3;
228c2ecf20Sopenharmony_ci	/* EP4[7] */
238c2ecf20Sopenharmony_ci	unsigned int fm_rfn:1;
248c2ecf20Sopenharmony_ci	/* EP4[4:2] */
258c2ecf20Sopenharmony_ci	unsigned int if_lvl:3;
268c2ecf20Sopenharmony_ci	/* EB22[6:0] */
278c2ecf20Sopenharmony_ci	unsigned int rfagc_top:7;
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistruct tda18271_std_map {
318c2ecf20Sopenharmony_ci	struct tda18271_std_map_item fm_radio;
328c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atv_b;
338c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atv_dk;
348c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atv_gh;
358c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atv_i;
368c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atv_l;
378c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atv_lc;
388c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atv_mn;
398c2ecf20Sopenharmony_ci	struct tda18271_std_map_item atsc_6;
408c2ecf20Sopenharmony_ci	struct tda18271_std_map_item dvbt_6;
418c2ecf20Sopenharmony_ci	struct tda18271_std_map_item dvbt_7;
428c2ecf20Sopenharmony_ci	struct tda18271_std_map_item dvbt_8;
438c2ecf20Sopenharmony_ci	struct tda18271_std_map_item qam_6;
448c2ecf20Sopenharmony_ci	struct tda18271_std_map_item qam_7;
458c2ecf20Sopenharmony_ci	struct tda18271_std_map_item qam_8;
468c2ecf20Sopenharmony_ci};
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cienum tda18271_role {
498c2ecf20Sopenharmony_ci	TDA18271_MASTER = 0,
508c2ecf20Sopenharmony_ci	TDA18271_SLAVE,
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cienum tda18271_i2c_gate {
548c2ecf20Sopenharmony_ci	TDA18271_GATE_AUTO = 0,
558c2ecf20Sopenharmony_ci	TDA18271_GATE_ANALOG,
568c2ecf20Sopenharmony_ci	TDA18271_GATE_DIGITAL,
578c2ecf20Sopenharmony_ci};
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cienum tda18271_output_options {
608c2ecf20Sopenharmony_ci	/* slave tuner output & loop through & xtal oscillator always on */
618c2ecf20Sopenharmony_ci	TDA18271_OUTPUT_LT_XT_ON = 0,
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	/* slave tuner output loop through off */
648c2ecf20Sopenharmony_ci	TDA18271_OUTPUT_LT_OFF = 1,
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci	/* xtal oscillator off */
678c2ecf20Sopenharmony_ci	TDA18271_OUTPUT_XT_OFF = 2,
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cienum tda18271_small_i2c {
718c2ecf20Sopenharmony_ci	TDA18271_39_BYTE_CHUNK_INIT = 0,
728c2ecf20Sopenharmony_ci	TDA18271_16_BYTE_CHUNK_INIT = 16,
738c2ecf20Sopenharmony_ci	TDA18271_08_BYTE_CHUNK_INIT = 8,
748c2ecf20Sopenharmony_ci	TDA18271_03_BYTE_CHUNK_INIT = 3,
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cistruct tda18271_config {
788c2ecf20Sopenharmony_ci	/* override default if freq / std settings (optional) */
798c2ecf20Sopenharmony_ci	struct tda18271_std_map *std_map;
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci	/* master / slave tuner: master uses main pll, slave uses cal pll */
828c2ecf20Sopenharmony_ci	enum tda18271_role role;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	/* use i2c gate provided by analog or digital demod */
858c2ecf20Sopenharmony_ci	enum tda18271_i2c_gate gate;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	/* output options that can be disabled */
888c2ecf20Sopenharmony_ci	enum tda18271_output_options output_opt;
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	/* some i2c providers can't write all 39 registers at once */
918c2ecf20Sopenharmony_ci	enum tda18271_small_i2c small_i2c;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	/* force rf tracking filter calibration on startup */
948c2ecf20Sopenharmony_ci	unsigned int rf_cal_on_startup:1;
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci	/* prevent any register access during attach(),
978c2ecf20Sopenharmony_ci	 * delaying both IR & RF calibration until init()
988c2ecf20Sopenharmony_ci	 * module option 'cal' overrides this delay */
998c2ecf20Sopenharmony_ci	unsigned int delay_cal:1;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	/* interface to saa713x / tda829x */
1028c2ecf20Sopenharmony_ci	unsigned int config;
1038c2ecf20Sopenharmony_ci};
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci#define TDA18271_CALLBACK_CMD_AGC_ENABLE 0
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_cienum tda18271_mode {
1088c2ecf20Sopenharmony_ci	TDA18271_ANALOG = 0,
1098c2ecf20Sopenharmony_ci	TDA18271_DIGITAL,
1108c2ecf20Sopenharmony_ci};
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci#if IS_REACHABLE(CONFIG_MEDIA_TUNER_TDA18271)
1138c2ecf20Sopenharmony_ciextern struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
1148c2ecf20Sopenharmony_ci					    struct i2c_adapter *i2c,
1158c2ecf20Sopenharmony_ci					    struct tda18271_config *cfg);
1168c2ecf20Sopenharmony_ci#else
1178c2ecf20Sopenharmony_cistatic inline struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe,
1188c2ecf20Sopenharmony_ci						   u8 addr,
1198c2ecf20Sopenharmony_ci						   struct i2c_adapter *i2c,
1208c2ecf20Sopenharmony_ci						   struct tda18271_config *cfg)
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1238c2ecf20Sopenharmony_ci	return NULL;
1248c2ecf20Sopenharmony_ci}
1258c2ecf20Sopenharmony_ci#endif
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci#endif /* __TDA18271_H__ */
128