1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
29a0bf528SMauro Carvalho Chehab /*
39a0bf528SMauro Carvalho Chehab  *    Support for LG Electronics LGDT3304 and LGDT3305 - VSB/QAM
49a0bf528SMauro Carvalho Chehab  *
59a0bf528SMauro Carvalho Chehab  *    Copyright (C) 2008, 2009, 2010 Michael Krufky <mkrufky@linuxtv.org>
69a0bf528SMauro Carvalho Chehab  */
79a0bf528SMauro Carvalho Chehab 
89a0bf528SMauro Carvalho Chehab #ifndef _LGDT3305_H_
99a0bf528SMauro Carvalho Chehab #define _LGDT3305_H_
109a0bf528SMauro Carvalho Chehab 
119a0bf528SMauro Carvalho Chehab #include <linux/i2c.h>
12fada1935SMauro Carvalho Chehab #include <media/dvb_frontend.h>
139a0bf528SMauro Carvalho Chehab 
149a0bf528SMauro Carvalho Chehab 
159a0bf528SMauro Carvalho Chehab enum lgdt3305_mpeg_mode {
169a0bf528SMauro Carvalho Chehab 	LGDT3305_MPEG_PARALLEL = 0,
179a0bf528SMauro Carvalho Chehab 	LGDT3305_MPEG_SERIAL = 1,
189a0bf528SMauro Carvalho Chehab };
199a0bf528SMauro Carvalho Chehab 
209a0bf528SMauro Carvalho Chehab enum lgdt3305_tp_clock_edge {
219a0bf528SMauro Carvalho Chehab 	LGDT3305_TPCLK_RISING_EDGE = 0,
229a0bf528SMauro Carvalho Chehab 	LGDT3305_TPCLK_FALLING_EDGE = 1,
239a0bf528SMauro Carvalho Chehab };
249a0bf528SMauro Carvalho Chehab 
2527f7ef7cSMichael Ira Krufky enum lgdt3305_tp_clock_mode {
2627f7ef7cSMichael Ira Krufky 	LGDT3305_TPCLK_GATED = 0,
2727f7ef7cSMichael Ira Krufky 	LGDT3305_TPCLK_FIXED = 1,
2827f7ef7cSMichael Ira Krufky };
2927f7ef7cSMichael Ira Krufky 
309a0bf528SMauro Carvalho Chehab enum lgdt3305_tp_valid_polarity {
319a0bf528SMauro Carvalho Chehab 	LGDT3305_TP_VALID_LOW = 0,
329a0bf528SMauro Carvalho Chehab 	LGDT3305_TP_VALID_HIGH = 1,
339a0bf528SMauro Carvalho Chehab };
349a0bf528SMauro Carvalho Chehab 
359a0bf528SMauro Carvalho Chehab enum lgdt_demod_chip_type {
369a0bf528SMauro Carvalho Chehab 	LGDT3305 = 0,
379a0bf528SMauro Carvalho Chehab 	LGDT3304 = 1,
389a0bf528SMauro Carvalho Chehab };
399a0bf528SMauro Carvalho Chehab 
409a0bf528SMauro Carvalho Chehab struct lgdt3305_config {
419a0bf528SMauro Carvalho Chehab 	u8 i2c_addr;
429a0bf528SMauro Carvalho Chehab 
439a0bf528SMauro Carvalho Chehab 	/* user defined IF frequency in KHz */
449a0bf528SMauro Carvalho Chehab 	u16 qam_if_khz;
459a0bf528SMauro Carvalho Chehab 	u16 vsb_if_khz;
469a0bf528SMauro Carvalho Chehab 
479a0bf528SMauro Carvalho Chehab 	/* AGC Power reference - defaults are used if left unset */
489a0bf528SMauro Carvalho Chehab 	u16 usref_8vsb;   /* default: 0x32c4 */
499a0bf528SMauro Carvalho Chehab 	u16 usref_qam64;  /* default: 0x5400 */
509a0bf528SMauro Carvalho Chehab 	u16 usref_qam256; /* default: 0x2a80 */
519a0bf528SMauro Carvalho Chehab 
529a0bf528SMauro Carvalho Chehab 	/* disable i2c repeater - 0:repeater enabled 1:repeater disabled */
539a0bf528SMauro Carvalho Chehab 	unsigned int deny_i2c_rptr:1;
549a0bf528SMauro Carvalho Chehab 
559a0bf528SMauro Carvalho Chehab 	/* spectral inversion - 0:disabled 1:enabled */
569a0bf528SMauro Carvalho Chehab 	unsigned int spectral_inversion:1;
579a0bf528SMauro Carvalho Chehab 
589a0bf528SMauro Carvalho Chehab 	/* use RF AGC loop - 0:disabled 1:enabled */
599a0bf528SMauro Carvalho Chehab 	unsigned int rf_agc_loop:1;
609a0bf528SMauro Carvalho Chehab 
619a0bf528SMauro Carvalho Chehab 	enum lgdt3305_mpeg_mode mpeg_mode;
629a0bf528SMauro Carvalho Chehab 	enum lgdt3305_tp_clock_edge tpclk_edge;
6327f7ef7cSMichael Ira Krufky 	enum lgdt3305_tp_clock_mode tpclk_mode;
649a0bf528SMauro Carvalho Chehab 	enum lgdt3305_tp_valid_polarity tpvalid_polarity;
659a0bf528SMauro Carvalho Chehab 	enum lgdt_demod_chip_type demod_chip;
669a0bf528SMauro Carvalho Chehab };
679a0bf528SMauro Carvalho Chehab 
689b174527SArnd Bergmann #if IS_REACHABLE(CONFIG_DVB_LGDT3305)
699a0bf528SMauro Carvalho Chehab extern
709a0bf528SMauro Carvalho Chehab struct dvb_frontend *lgdt3305_attach(const struct lgdt3305_config *config,
719a0bf528SMauro Carvalho Chehab 				     struct i2c_adapter *i2c_adap);
729a0bf528SMauro Carvalho Chehab #else
739a0bf528SMauro Carvalho Chehab static inline
lgdt3305_attach(const struct lgdt3305_config * config,struct i2c_adapter * i2c_adap)749a0bf528SMauro Carvalho Chehab struct dvb_frontend *lgdt3305_attach(const struct lgdt3305_config *config,
759a0bf528SMauro Carvalho Chehab 				     struct i2c_adapter *i2c_adap)
769a0bf528SMauro Carvalho Chehab {
779a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
789a0bf528SMauro Carvalho Chehab 	return NULL;
799a0bf528SMauro Carvalho Chehab }
809a0bf528SMauro Carvalho Chehab #endif /* CONFIG_DVB_LGDT3305 */
819a0bf528SMauro Carvalho Chehab 
829a0bf528SMauro Carvalho Chehab #endif /* _LGDT3305_H_ */
83