1a10e763bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
29a0bf528SMauro Carvalho Chehab /*
39a0bf528SMauro Carvalho Chehab  * Linux-DVB Driver for DiBcom's DiB0090 base-band RF Tuner.
49a0bf528SMauro Carvalho Chehab  *
59a0bf528SMauro Carvalho Chehab  * Copyright (C) 2005-7 DiBcom (http://www.dibcom.fr/)
69a0bf528SMauro Carvalho Chehab  */
79a0bf528SMauro Carvalho Chehab #ifndef DIB0090_H
89a0bf528SMauro Carvalho Chehab #define DIB0090_H
99a0bf528SMauro Carvalho Chehab 
109a0bf528SMauro Carvalho Chehab struct dvb_frontend;
119a0bf528SMauro Carvalho Chehab struct i2c_adapter;
129a0bf528SMauro Carvalho Chehab 
139a0bf528SMauro Carvalho Chehab #define DEFAULT_DIB0090_I2C_ADDRESS 0x60
149a0bf528SMauro Carvalho Chehab 
159a0bf528SMauro Carvalho Chehab struct dib0090_io_config {
169a0bf528SMauro Carvalho Chehab 	u32 clock_khz;
179a0bf528SMauro Carvalho Chehab 
189a0bf528SMauro Carvalho Chehab 	u8 pll_bypass:1;
199a0bf528SMauro Carvalho Chehab 	u8 pll_range:1;
209a0bf528SMauro Carvalho Chehab 	u8 pll_prediv:6;
219a0bf528SMauro Carvalho Chehab 	u8 pll_loopdiv:6;
229a0bf528SMauro Carvalho Chehab 
239a0bf528SMauro Carvalho Chehab 	u8 adc_clock_ratio;	/* valid is 8, 7 ,6 */
249a0bf528SMauro Carvalho Chehab 	u16 pll_int_loop_filt;
259a0bf528SMauro Carvalho Chehab };
269a0bf528SMauro Carvalho Chehab 
279a0bf528SMauro Carvalho Chehab struct dib0090_wbd_slope {
289a0bf528SMauro Carvalho Chehab 	u16 max_freq;		/* for every frequency less than or equal to that field: this information is correct */
299a0bf528SMauro Carvalho Chehab 	u16 slope_cold;
309a0bf528SMauro Carvalho Chehab 	u16 offset_cold;
319a0bf528SMauro Carvalho Chehab 	u16 slope_hot;
329a0bf528SMauro Carvalho Chehab 	u16 offset_hot;
339a0bf528SMauro Carvalho Chehab 	u8 wbd_gain;
349a0bf528SMauro Carvalho Chehab };
359a0bf528SMauro Carvalho Chehab 
369a0bf528SMauro Carvalho Chehab struct dib0090_low_if_offset_table {
379a0bf528SMauro Carvalho Chehab 	int std;
389a0bf528SMauro Carvalho Chehab 	u32 RF_freq;
399a0bf528SMauro Carvalho Chehab 	s32 offset_khz;
409a0bf528SMauro Carvalho Chehab };
419a0bf528SMauro Carvalho Chehab 
429a0bf528SMauro Carvalho Chehab struct dib0090_config {
439a0bf528SMauro Carvalho Chehab 	struct dib0090_io_config io;
449a0bf528SMauro Carvalho Chehab 	int (*reset) (struct dvb_frontend *, int);
459a0bf528SMauro Carvalho Chehab 	int (*sleep) (struct dvb_frontend *, int);
469a0bf528SMauro Carvalho Chehab 
479a0bf528SMauro Carvalho Chehab 	/*  offset in kHz */
489a0bf528SMauro Carvalho Chehab 	int freq_offset_khz_uhf;
499a0bf528SMauro Carvalho Chehab 	int freq_offset_khz_vhf;
509a0bf528SMauro Carvalho Chehab 
519a0bf528SMauro Carvalho Chehab 	int (*get_adc_power) (struct dvb_frontend *);
529a0bf528SMauro Carvalho Chehab 
539a0bf528SMauro Carvalho Chehab 	u8 clkouttobamse:1;	/* activate or deactivate clock output */
549a0bf528SMauro Carvalho Chehab 	u8 analog_output;
559a0bf528SMauro Carvalho Chehab 
569a0bf528SMauro Carvalho Chehab 	u8 i2c_address;
579a0bf528SMauro Carvalho Chehab 	/* add drives and other things if necessary */
589a0bf528SMauro Carvalho Chehab 	u16 wbd_vhf_offset;
599a0bf528SMauro Carvalho Chehab 	u16 wbd_cband_offset;
609a0bf528SMauro Carvalho Chehab 	u8 use_pwm_agc;
619a0bf528SMauro Carvalho Chehab 	u8 clkoutdrive;
629a0bf528SMauro Carvalho Chehab 
639a0bf528SMauro Carvalho Chehab 	u8 ls_cfg_pad_drv;
649a0bf528SMauro Carvalho Chehab 	u8 data_tx_drv;
659a0bf528SMauro Carvalho Chehab 
669a0bf528SMauro Carvalho Chehab 	u8 in_soc;
679a0bf528SMauro Carvalho Chehab 	const struct dib0090_low_if_offset_table *low_if;
689a0bf528SMauro Carvalho Chehab 	u8 fref_clock_ratio;
699a0bf528SMauro Carvalho Chehab 	u16 force_cband_input;
709a0bf528SMauro Carvalho Chehab 	struct dib0090_wbd_slope *wbd;
719a0bf528SMauro Carvalho Chehab 	u8 is_dib7090e;
729a0bf528SMauro Carvalho Chehab 	u8 force_crystal_mode;
739a0bf528SMauro Carvalho Chehab };
749a0bf528SMauro Carvalho Chehab 
759b174527SArnd Bergmann #if IS_REACHABLE(CONFIG_DVB_TUNER_DIB0090)
769a0bf528SMauro Carvalho Chehab extern struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config);
779a0bf528SMauro Carvalho Chehab extern struct dvb_frontend *dib0090_fw_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config);
789a0bf528SMauro Carvalho Chehab extern void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast);
799a0bf528SMauro Carvalho Chehab extern void dib0090_pwm_gain_reset(struct dvb_frontend *fe);
809a0bf528SMauro Carvalho Chehab extern u16 dib0090_get_wbd_target(struct dvb_frontend *tuner);
819a0bf528SMauro Carvalho Chehab extern u16 dib0090_get_wbd_offset(struct dvb_frontend *fe);
829a0bf528SMauro Carvalho Chehab extern int dib0090_gain_control(struct dvb_frontend *fe);
839a0bf528SMauro Carvalho Chehab extern enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe);
849a0bf528SMauro Carvalho Chehab extern int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state);
859a0bf528SMauro Carvalho Chehab extern void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt);
869a0bf528SMauro Carvalho Chehab extern void dib0090_set_dc_servo(struct dvb_frontend *fe, u8 DC_servo_cutoff);
879a0bf528SMauro Carvalho Chehab extern int dib0090_set_switch(struct dvb_frontend *fe, u8 sw1, u8 sw2, u8 sw3);
889a0bf528SMauro Carvalho Chehab extern int dib0090_set_vga(struct dvb_frontend *fe, u8 onoff);
899a0bf528SMauro Carvalho Chehab extern int dib0090_update_rframp_7090(struct dvb_frontend *fe,
909a0bf528SMauro Carvalho Chehab 		u8 cfg_sensitivity);
919a0bf528SMauro Carvalho Chehab extern int dib0090_update_tuning_table_7090(struct dvb_frontend *fe,
929a0bf528SMauro Carvalho Chehab 		u8 cfg_sensitivity);
939a0bf528SMauro Carvalho Chehab #else
dib0090_register(struct dvb_frontend * fe,struct i2c_adapter * i2c,const struct dib0090_config * config)949a0bf528SMauro Carvalho Chehab static inline struct dvb_frontend *dib0090_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, const struct dib0090_config *config)
959a0bf528SMauro Carvalho Chehab {
969a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
979a0bf528SMauro Carvalho Chehab 	return NULL;
989a0bf528SMauro Carvalho Chehab }
999a0bf528SMauro Carvalho Chehab 
dib0090_fw_register(struct dvb_frontend * fe,struct i2c_adapter * i2c,struct dib0090_config * config)1009a0bf528SMauro Carvalho Chehab static inline struct dvb_frontend *dib0090_fw_register(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0090_config *config)
1019a0bf528SMauro Carvalho Chehab {
1029a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1039a0bf528SMauro Carvalho Chehab 	return NULL;
1049a0bf528SMauro Carvalho Chehab }
1059a0bf528SMauro Carvalho Chehab 
dib0090_dcc_freq(struct dvb_frontend * fe,u8 fast)1069a0bf528SMauro Carvalho Chehab static inline void dib0090_dcc_freq(struct dvb_frontend *fe, u8 fast)
1079a0bf528SMauro Carvalho Chehab {
1089a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1099a0bf528SMauro Carvalho Chehab }
1109a0bf528SMauro Carvalho Chehab 
dib0090_pwm_gain_reset(struct dvb_frontend * fe)1119a0bf528SMauro Carvalho Chehab static inline void dib0090_pwm_gain_reset(struct dvb_frontend *fe)
1129a0bf528SMauro Carvalho Chehab {
1139a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1149a0bf528SMauro Carvalho Chehab }
1159a0bf528SMauro Carvalho Chehab 
dib0090_get_wbd_target(struct dvb_frontend * tuner)1169a0bf528SMauro Carvalho Chehab static inline u16 dib0090_get_wbd_target(struct dvb_frontend *tuner)
1179a0bf528SMauro Carvalho Chehab {
1189a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1199a0bf528SMauro Carvalho Chehab 	return 0;
1209a0bf528SMauro Carvalho Chehab }
1219a0bf528SMauro Carvalho Chehab 
dib0090_get_wbd_offset(struct dvb_frontend * fe)1229a0bf528SMauro Carvalho Chehab static inline u16 dib0090_get_wbd_offset(struct dvb_frontend *fe)
1239a0bf528SMauro Carvalho Chehab {
1249a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1259a0bf528SMauro Carvalho Chehab 	return 0;
1269a0bf528SMauro Carvalho Chehab }
1279a0bf528SMauro Carvalho Chehab 
dib0090_gain_control(struct dvb_frontend * fe)1289a0bf528SMauro Carvalho Chehab static inline int dib0090_gain_control(struct dvb_frontend *fe)
1299a0bf528SMauro Carvalho Chehab {
1309a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1319a0bf528SMauro Carvalho Chehab 	return -ENODEV;
1329a0bf528SMauro Carvalho Chehab }
1339a0bf528SMauro Carvalho Chehab 
dib0090_get_tune_state(struct dvb_frontend * fe)1349a0bf528SMauro Carvalho Chehab static inline enum frontend_tune_state dib0090_get_tune_state(struct dvb_frontend *fe)
1359a0bf528SMauro Carvalho Chehab {
1369a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1379a0bf528SMauro Carvalho Chehab 	return CT_DONE;
1389a0bf528SMauro Carvalho Chehab }
1399a0bf528SMauro Carvalho Chehab 
dib0090_set_tune_state(struct dvb_frontend * fe,enum frontend_tune_state tune_state)1409a0bf528SMauro Carvalho Chehab static inline int dib0090_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1419a0bf528SMauro Carvalho Chehab {
1429a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1439a0bf528SMauro Carvalho Chehab 	return -ENODEV;
1449a0bf528SMauro Carvalho Chehab }
1459a0bf528SMauro Carvalho Chehab 
dib0090_get_current_gain(struct dvb_frontend * fe,u16 * rf,u16 * bb,u16 * rf_gain_limit,u16 * rflt)1469a0bf528SMauro Carvalho Chehab static inline void dib0090_get_current_gain(struct dvb_frontend *fe, u16 * rf, u16 * bb, u16 * rf_gain_limit, u16 * rflt)
1479a0bf528SMauro Carvalho Chehab {
1489a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1499a0bf528SMauro Carvalho Chehab }
1509a0bf528SMauro Carvalho Chehab 
dib0090_set_dc_servo(struct dvb_frontend * fe,u8 DC_servo_cutoff)1519a0bf528SMauro Carvalho Chehab static inline void dib0090_set_dc_servo(struct dvb_frontend *fe, u8 DC_servo_cutoff)
1529a0bf528SMauro Carvalho Chehab {
1539a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1549a0bf528SMauro Carvalho Chehab }
1559a0bf528SMauro Carvalho Chehab 
dib0090_set_switch(struct dvb_frontend * fe,u8 sw1,u8 sw2,u8 sw3)1569a0bf528SMauro Carvalho Chehab static inline int dib0090_set_switch(struct dvb_frontend *fe,
1579a0bf528SMauro Carvalho Chehab 		u8 sw1, u8 sw2, u8 sw3)
1589a0bf528SMauro Carvalho Chehab {
1599a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1609a0bf528SMauro Carvalho Chehab 	return -ENODEV;
1619a0bf528SMauro Carvalho Chehab }
1629a0bf528SMauro Carvalho Chehab 
dib0090_set_vga(struct dvb_frontend * fe,u8 onoff)1639a0bf528SMauro Carvalho Chehab static inline int dib0090_set_vga(struct dvb_frontend *fe, u8 onoff)
1649a0bf528SMauro Carvalho Chehab {
1659a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1669a0bf528SMauro Carvalho Chehab 	return -ENODEV;
1679a0bf528SMauro Carvalho Chehab }
1689a0bf528SMauro Carvalho Chehab 
dib0090_update_rframp_7090(struct dvb_frontend * fe,u8 cfg_sensitivity)1699a0bf528SMauro Carvalho Chehab static inline int dib0090_update_rframp_7090(struct dvb_frontend *fe,
1709a0bf528SMauro Carvalho Chehab 		u8 cfg_sensitivity)
1719a0bf528SMauro Carvalho Chehab {
1729a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1739a0bf528SMauro Carvalho Chehab 	return -ENODEV;
1749a0bf528SMauro Carvalho Chehab }
1759a0bf528SMauro Carvalho Chehab 
dib0090_update_tuning_table_7090(struct dvb_frontend * fe,u8 cfg_sensitivity)1769a0bf528SMauro Carvalho Chehab static inline int dib0090_update_tuning_table_7090(struct dvb_frontend *fe,
1779a0bf528SMauro Carvalho Chehab 		u8 cfg_sensitivity)
1789a0bf528SMauro Carvalho Chehab {
1799a0bf528SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
1809a0bf528SMauro Carvalho Chehab 	return -ENODEV;
1819a0bf528SMauro Carvalho Chehab }
1829a0bf528SMauro Carvalho Chehab #endif
1839a0bf528SMauro Carvalho Chehab 
1849a0bf528SMauro Carvalho Chehab #endif
185