18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *    Support for LGDT3306A - 8VSB/QAM-B
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *    Copyright (C) 2013,2014 Fred Richter <frichter@hauppauge.com>
68c2ecf20Sopenharmony_ci *      based on lgdt3305.[ch] by Michael Krufky
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef _LGDT3306A_H_
108c2ecf20Sopenharmony_ci#define _LGDT3306A_H_
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/i2c.h>
138c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cienum lgdt3306a_mpeg_mode {
178c2ecf20Sopenharmony_ci	LGDT3306A_MPEG_PARALLEL = 0,
188c2ecf20Sopenharmony_ci	LGDT3306A_MPEG_SERIAL = 1,
198c2ecf20Sopenharmony_ci};
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cienum lgdt3306a_tp_clock_edge {
228c2ecf20Sopenharmony_ci	LGDT3306A_TPCLK_RISING_EDGE = 0,
238c2ecf20Sopenharmony_ci	LGDT3306A_TPCLK_FALLING_EDGE = 1,
248c2ecf20Sopenharmony_ci};
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cienum lgdt3306a_tp_valid_polarity {
278c2ecf20Sopenharmony_ci	LGDT3306A_TP_VALID_LOW = 0,
288c2ecf20Sopenharmony_ci	LGDT3306A_TP_VALID_HIGH = 1,
298c2ecf20Sopenharmony_ci};
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct lgdt3306a_config {
328c2ecf20Sopenharmony_ci	u8 i2c_addr;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	/* user defined IF frequency in KHz */
358c2ecf20Sopenharmony_ci	u16 qam_if_khz;
368c2ecf20Sopenharmony_ci	u16 vsb_if_khz;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	/* disable i2c repeater - 0:repeater enabled 1:repeater disabled */
398c2ecf20Sopenharmony_ci	unsigned int deny_i2c_rptr:1;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	/* spectral inversion - 0:disabled 1:enabled */
428c2ecf20Sopenharmony_ci	unsigned int spectral_inversion:1;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	enum lgdt3306a_mpeg_mode mpeg_mode;
458c2ecf20Sopenharmony_ci	enum lgdt3306a_tp_clock_edge tpclk_edge;
468c2ecf20Sopenharmony_ci	enum lgdt3306a_tp_valid_polarity tpvalid_polarity;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	/* demod clock freq in MHz; 24 or 25 supported */
498c2ecf20Sopenharmony_ci	int  xtalMHz;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	/* returned by driver if using i2c bus multiplexing */
528c2ecf20Sopenharmony_ci	struct dvb_frontend **fe;
538c2ecf20Sopenharmony_ci	struct i2c_adapter **i2c_adapter;
548c2ecf20Sopenharmony_ci};
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci#if IS_REACHABLE(CONFIG_DVB_LGDT3306A)
578c2ecf20Sopenharmony_cistruct dvb_frontend *lgdt3306a_attach(const struct lgdt3306a_config *config,
588c2ecf20Sopenharmony_ci				      struct i2c_adapter *i2c_adap);
598c2ecf20Sopenharmony_ci#else
608c2ecf20Sopenharmony_cistatic inline
618c2ecf20Sopenharmony_cistruct dvb_frontend *lgdt3306a_attach(const struct lgdt3306a_config *config,
628c2ecf20Sopenharmony_ci				      struct i2c_adapter *i2c_adap)
638c2ecf20Sopenharmony_ci{
648c2ecf20Sopenharmony_ci	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
658c2ecf20Sopenharmony_ci	return NULL;
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci#endif /* CONFIG_DVB_LGDT3306A */
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci#endif /* _LGDT3306A_H_ */
70