116216333SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
29a0bf528SMauro Carvalho Chehab /*
39a0bf528SMauro Carvalho Chehab  * Sony CXD2820R demodulator driver
49a0bf528SMauro Carvalho Chehab  *
59a0bf528SMauro Carvalho Chehab  * Copyright (C) 2010 Antti Palosaari <crope@iki.fi>
69a0bf528SMauro Carvalho Chehab  */
79a0bf528SMauro Carvalho Chehab 
89a0bf528SMauro Carvalho Chehab 
99a0bf528SMauro Carvalho Chehab #ifndef CXD2820R_PRIV_H
109a0bf528SMauro Carvalho Chehab #define CXD2820R_PRIV_H
119a0bf528SMauro Carvalho Chehab 
129a0bf528SMauro Carvalho Chehab #include <linux/dvb/version.h>
13fada1935SMauro Carvalho Chehab #include <media/dvb_frontend.h>
14*f97fa3dcSAndy Shevchenko #include <linux/int_log.h>
159a0bf528SMauro Carvalho Chehab #include "cxd2820r.h"
16d3bb03ecSLinus Walleij #include <linux/gpio/driver.h> /* For gpio_chip */
172832fd31SAntti Palosaari #include <linux/math64.h>
1843e2ea63SAntti Palosaari #include <linux/regmap.h>
199a0bf528SMauro Carvalho Chehab 
209a0bf528SMauro Carvalho Chehab struct reg_val_mask {
219a0bf528SMauro Carvalho Chehab 	u32 reg;
229a0bf528SMauro Carvalho Chehab 	u8  val;
239a0bf528SMauro Carvalho Chehab 	u8  mask;
249a0bf528SMauro Carvalho Chehab };
259a0bf528SMauro Carvalho Chehab 
26fcd09f65SAntti Palosaari #define CXD2820R_CLK 41000000
27fcd09f65SAntti Palosaari 
289a0bf528SMauro Carvalho Chehab struct cxd2820r_priv {
2907fdf7d9SAntti Palosaari 	struct i2c_client *client[2];
3043e2ea63SAntti Palosaari 	struct regmap *regmap[2];
319a0bf528SMauro Carvalho Chehab 	struct i2c_adapter *i2c;
329a0bf528SMauro Carvalho Chehab 	struct dvb_frontend fe;
3307fdf7d9SAntti Palosaari 	u8 ts_mode;
3407fdf7d9SAntti Palosaari 	bool ts_clk_inv;
3507fdf7d9SAntti Palosaari 	bool if_agc_polarity;
3607fdf7d9SAntti Palosaari 	bool spec_inv;
3707fdf7d9SAntti Palosaari 
384aa4fd86SAntti Palosaari 	u64 post_bit_error_prev_dvbv3;
392832fd31SAntti Palosaari 	u64 post_bit_error;
409a0bf528SMauro Carvalho Chehab 
419a0bf528SMauro Carvalho Chehab 	bool ber_running;
429a0bf528SMauro Carvalho Chehab 
431e8f31f3SAntti Palosaari #define GPIO_COUNT 3
441e8f31f3SAntti Palosaari 	u8 gpio[GPIO_COUNT];
451e8f31f3SAntti Palosaari #ifdef CONFIG_GPIOLIB
461e8f31f3SAntti Palosaari 	struct gpio_chip gpio_chip;
471e8f31f3SAntti Palosaari #endif
489a0bf528SMauro Carvalho Chehab 
490df289a2SMauro Carvalho Chehab 	enum fe_delivery_system delivery_system;
509a0bf528SMauro Carvalho Chehab 	bool last_tune_failed; /* for switch between T and T2 tune */
519a0bf528SMauro Carvalho Chehab };
529a0bf528SMauro Carvalho Chehab 
539a0bf528SMauro Carvalho Chehab /* cxd2820r_core.c */
549a0bf528SMauro Carvalho Chehab 
551e8f31f3SAntti Palosaari int cxd2820r_gpio(struct dvb_frontend *fe, u8 *gpio);
569a0bf528SMauro Carvalho Chehab 
5743e2ea63SAntti Palosaari int cxd2820r_wr_reg_val_mask_tab(struct cxd2820r_priv *priv,
5843e2ea63SAntti Palosaari 				 const struct reg_val_mask *tab, int tab_len);
5943e2ea63SAntti Palosaari 
609a0bf528SMauro Carvalho Chehab int cxd2820r_wr_reg_mask(struct cxd2820r_priv *priv, u32 reg, u8 val,
619a0bf528SMauro Carvalho Chehab 	u8 mask);
629a0bf528SMauro Carvalho Chehab 
639a0bf528SMauro Carvalho Chehab int cxd2820r_wr_regs(struct cxd2820r_priv *priv, u32 reginfo, u8 *val,
649a0bf528SMauro Carvalho Chehab 	int len);
659a0bf528SMauro Carvalho Chehab 
669a0bf528SMauro Carvalho Chehab int cxd2820r_wr_regs(struct cxd2820r_priv *priv, u32 reginfo, u8 *val,
679a0bf528SMauro Carvalho Chehab 	int len);
689a0bf528SMauro Carvalho Chehab 
699a0bf528SMauro Carvalho Chehab int cxd2820r_rd_regs(struct cxd2820r_priv *priv, u32 reginfo, u8 *val,
709a0bf528SMauro Carvalho Chehab 	int len);
719a0bf528SMauro Carvalho Chehab 
729a0bf528SMauro Carvalho Chehab int cxd2820r_wr_reg(struct cxd2820r_priv *priv, u32 reg, u8 val);
739a0bf528SMauro Carvalho Chehab 
749a0bf528SMauro Carvalho Chehab int cxd2820r_rd_reg(struct cxd2820r_priv *priv, u32 reg, u8 *val);
759a0bf528SMauro Carvalho Chehab 
769a0bf528SMauro Carvalho Chehab /* cxd2820r_c.c */
779a0bf528SMauro Carvalho Chehab 
787e3e68bcSMauro Carvalho Chehab int cxd2820r_get_frontend_c(struct dvb_frontend *fe,
797e3e68bcSMauro Carvalho Chehab 			    struct dtv_frontend_properties *p);
809a0bf528SMauro Carvalho Chehab 
819a0bf528SMauro Carvalho Chehab int cxd2820r_set_frontend_c(struct dvb_frontend *fe);
829a0bf528SMauro Carvalho Chehab 
830df289a2SMauro Carvalho Chehab int cxd2820r_read_status_c(struct dvb_frontend *fe, enum fe_status *status);
849a0bf528SMauro Carvalho Chehab 
859a0bf528SMauro Carvalho Chehab int cxd2820r_init_c(struct dvb_frontend *fe);
869a0bf528SMauro Carvalho Chehab 
879a0bf528SMauro Carvalho Chehab int cxd2820r_sleep_c(struct dvb_frontend *fe);
889a0bf528SMauro Carvalho Chehab 
899a0bf528SMauro Carvalho Chehab int cxd2820r_get_tune_settings_c(struct dvb_frontend *fe,
909a0bf528SMauro Carvalho Chehab 	struct dvb_frontend_tune_settings *s);
919a0bf528SMauro Carvalho Chehab 
929a0bf528SMauro Carvalho Chehab /* cxd2820r_t.c */
939a0bf528SMauro Carvalho Chehab 
947e3e68bcSMauro Carvalho Chehab int cxd2820r_get_frontend_t(struct dvb_frontend *fe,
957e3e68bcSMauro Carvalho Chehab 			    struct dtv_frontend_properties *p);
969a0bf528SMauro Carvalho Chehab 
979a0bf528SMauro Carvalho Chehab int cxd2820r_set_frontend_t(struct dvb_frontend *fe);
989a0bf528SMauro Carvalho Chehab 
990df289a2SMauro Carvalho Chehab int cxd2820r_read_status_t(struct dvb_frontend *fe, enum fe_status *status);
1009a0bf528SMauro Carvalho Chehab 
1019a0bf528SMauro Carvalho Chehab int cxd2820r_init_t(struct dvb_frontend *fe);
1029a0bf528SMauro Carvalho Chehab 
1039a0bf528SMauro Carvalho Chehab int cxd2820r_sleep_t(struct dvb_frontend *fe);
1049a0bf528SMauro Carvalho Chehab 
1059a0bf528SMauro Carvalho Chehab int cxd2820r_get_tune_settings_t(struct dvb_frontend *fe,
1069a0bf528SMauro Carvalho Chehab 	struct dvb_frontend_tune_settings *s);
1079a0bf528SMauro Carvalho Chehab 
1089a0bf528SMauro Carvalho Chehab /* cxd2820r_t2.c */
1099a0bf528SMauro Carvalho Chehab 
1107e3e68bcSMauro Carvalho Chehab int cxd2820r_get_frontend_t2(struct dvb_frontend *fe,
1117e3e68bcSMauro Carvalho Chehab 			     struct dtv_frontend_properties *p);
1129a0bf528SMauro Carvalho Chehab 
1139a0bf528SMauro Carvalho Chehab int cxd2820r_set_frontend_t2(struct dvb_frontend *fe);
1149a0bf528SMauro Carvalho Chehab 
1150df289a2SMauro Carvalho Chehab int cxd2820r_read_status_t2(struct dvb_frontend *fe, enum fe_status *status);
1169a0bf528SMauro Carvalho Chehab 
1179a0bf528SMauro Carvalho Chehab int cxd2820r_init_t2(struct dvb_frontend *fe);
1189a0bf528SMauro Carvalho Chehab 
1199a0bf528SMauro Carvalho Chehab int cxd2820r_sleep_t2(struct dvb_frontend *fe);
1209a0bf528SMauro Carvalho Chehab 
1219a0bf528SMauro Carvalho Chehab int cxd2820r_get_tune_settings_t2(struct dvb_frontend *fe,
1229a0bf528SMauro Carvalho Chehab 	struct dvb_frontend_tune_settings *s);
1239a0bf528SMauro Carvalho Chehab 
1249a0bf528SMauro Carvalho Chehab #endif /* CXD2820R_PRIV_H */
125