162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci    tda18271.h - header for the Philips / NXP TDA18271 silicon tuner
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci    Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci*/
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __TDA18271_H__
1062306a36Sopenharmony_ci#define __TDA18271_H__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/i2c.h>
1362306a36Sopenharmony_ci#include <media/dvb_frontend.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct tda18271_std_map_item {
1662306a36Sopenharmony_ci	u16 if_freq;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	/* EP3[4:3] */
1962306a36Sopenharmony_ci	unsigned int agc_mode:2;
2062306a36Sopenharmony_ci	/* EP3[2:0] */
2162306a36Sopenharmony_ci	unsigned int std:3;
2262306a36Sopenharmony_ci	/* EP4[7] */
2362306a36Sopenharmony_ci	unsigned int fm_rfn:1;
2462306a36Sopenharmony_ci	/* EP4[4:2] */
2562306a36Sopenharmony_ci	unsigned int if_lvl:3;
2662306a36Sopenharmony_ci	/* EB22[6:0] */
2762306a36Sopenharmony_ci	unsigned int rfagc_top:7;
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct tda18271_std_map {
3162306a36Sopenharmony_ci	struct tda18271_std_map_item fm_radio;
3262306a36Sopenharmony_ci	struct tda18271_std_map_item atv_b;
3362306a36Sopenharmony_ci	struct tda18271_std_map_item atv_dk;
3462306a36Sopenharmony_ci	struct tda18271_std_map_item atv_gh;
3562306a36Sopenharmony_ci	struct tda18271_std_map_item atv_i;
3662306a36Sopenharmony_ci	struct tda18271_std_map_item atv_l;
3762306a36Sopenharmony_ci	struct tda18271_std_map_item atv_lc;
3862306a36Sopenharmony_ci	struct tda18271_std_map_item atv_mn;
3962306a36Sopenharmony_ci	struct tda18271_std_map_item atsc_6;
4062306a36Sopenharmony_ci	struct tda18271_std_map_item dvbt_6;
4162306a36Sopenharmony_ci	struct tda18271_std_map_item dvbt_7;
4262306a36Sopenharmony_ci	struct tda18271_std_map_item dvbt_8;
4362306a36Sopenharmony_ci	struct tda18271_std_map_item qam_6;
4462306a36Sopenharmony_ci	struct tda18271_std_map_item qam_7;
4562306a36Sopenharmony_ci	struct tda18271_std_map_item qam_8;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cienum tda18271_role {
4962306a36Sopenharmony_ci	TDA18271_MASTER = 0,
5062306a36Sopenharmony_ci	TDA18271_SLAVE,
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cienum tda18271_i2c_gate {
5462306a36Sopenharmony_ci	TDA18271_GATE_AUTO = 0,
5562306a36Sopenharmony_ci	TDA18271_GATE_ANALOG,
5662306a36Sopenharmony_ci	TDA18271_GATE_DIGITAL,
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cienum tda18271_output_options {
6062306a36Sopenharmony_ci	/* slave tuner output & loop through & xtal oscillator always on */
6162306a36Sopenharmony_ci	TDA18271_OUTPUT_LT_XT_ON = 0,
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	/* slave tuner output loop through off */
6462306a36Sopenharmony_ci	TDA18271_OUTPUT_LT_OFF = 1,
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	/* xtal oscillator off */
6762306a36Sopenharmony_ci	TDA18271_OUTPUT_XT_OFF = 2,
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cienum tda18271_small_i2c {
7162306a36Sopenharmony_ci	TDA18271_39_BYTE_CHUNK_INIT = 0,
7262306a36Sopenharmony_ci	TDA18271_16_BYTE_CHUNK_INIT = 16,
7362306a36Sopenharmony_ci	TDA18271_08_BYTE_CHUNK_INIT = 8,
7462306a36Sopenharmony_ci	TDA18271_03_BYTE_CHUNK_INIT = 3,
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct tda18271_config {
7862306a36Sopenharmony_ci	/* override default if freq / std settings (optional) */
7962306a36Sopenharmony_ci	struct tda18271_std_map *std_map;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	/* master / slave tuner: master uses main pll, slave uses cal pll */
8262306a36Sopenharmony_ci	enum tda18271_role role;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	/* use i2c gate provided by analog or digital demod */
8562306a36Sopenharmony_ci	enum tda18271_i2c_gate gate;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	/* output options that can be disabled */
8862306a36Sopenharmony_ci	enum tda18271_output_options output_opt;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	/* some i2c providers can't write all 39 registers at once */
9162306a36Sopenharmony_ci	enum tda18271_small_i2c small_i2c;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	/* force rf tracking filter calibration on startup */
9462306a36Sopenharmony_ci	unsigned int rf_cal_on_startup:1;
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	/* prevent any register access during attach(),
9762306a36Sopenharmony_ci	 * delaying both IR & RF calibration until init()
9862306a36Sopenharmony_ci	 * module option 'cal' overrides this delay */
9962306a36Sopenharmony_ci	unsigned int delay_cal:1;
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	/* interface to saa713x / tda829x */
10262306a36Sopenharmony_ci	unsigned int config;
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#define TDA18271_CALLBACK_CMD_AGC_ENABLE 0
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cienum tda18271_mode {
10862306a36Sopenharmony_ci	TDA18271_ANALOG = 0,
10962306a36Sopenharmony_ci	TDA18271_DIGITAL,
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci#if IS_REACHABLE(CONFIG_MEDIA_TUNER_TDA18271)
11362306a36Sopenharmony_ciextern struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
11462306a36Sopenharmony_ci					    struct i2c_adapter *i2c,
11562306a36Sopenharmony_ci					    struct tda18271_config *cfg);
11662306a36Sopenharmony_ci#else
11762306a36Sopenharmony_cistatic inline struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe,
11862306a36Sopenharmony_ci						   u8 addr,
11962306a36Sopenharmony_ci						   struct i2c_adapter *i2c,
12062306a36Sopenharmony_ci						   struct tda18271_config *cfg)
12162306a36Sopenharmony_ci{
12262306a36Sopenharmony_ci	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
12362306a36Sopenharmony_ci	return NULL;
12462306a36Sopenharmony_ci}
12562306a36Sopenharmony_ci#endif
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci#endif /* __TDA18271_H__ */
128