3 * Sony CXD2880 DVB-T2/T tuner + demodulator driver
4 * common control interface
6 * Copyright (C) 2016, 2017 Sony Semiconductor Solutions Corporation
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; version 2 of the License.
12 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
15 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
16 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
18 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
19 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
21 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 * You should have received a copy of the GNU General Public License along
24 * with this program; if not, see <http://www.gnu.org/licenses/>.
27 #ifndef CXD2880_TNRDMD_H
28 #define CXD2880_TNRDMD_H
30 #include "cxd2880_common.h"
31 #include "cxd2880_io.h"
32 #include "cxd2880_dtv.h"
33 #include "cxd2880_dvbt.h"
34 #include "cxd2880_dvbt2.h"
36 #define CXD2880_TNRDMD_MAX_CFG_MEM_COUNT 100
38 #define slvt_unfreeze_reg(tnr_dmd) ((void)((tnr_dmd)->io->write_reg\
39 ((tnr_dmd)->io, CXD2880_IO_TGT_DMD, 0x01, 0x00)))
41 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_UNDERFLOW 0x0001
42 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_OVERFLOW 0x0002
43 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_ALMOST_EMPTY 0x0004
44 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_ALMOST_FULL 0x0008
45 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_RRDY 0x0010
46 #define CXD2880_TNRDMD_INTERRUPT_TYPE_ILLEGAL_COMMAND 0x0020
47 #define CXD2880_TNRDMD_INTERRUPT_TYPE_ILLEGAL_ACCESS 0x0040
48 #define CXD2880_TNRDMD_INTERRUPT_TYPE_CPU_ERROR 0x0100
49 #define CXD2880_TNRDMD_INTERRUPT_TYPE_LOCK 0x0200
50 #define CXD2880_TNRDMD_INTERRUPT_TYPE_INV_LOCK 0x0400
51 #define CXD2880_TNRDMD_INTERRUPT_TYPE_NOOFDM 0x0800
52 #define CXD2880_TNRDMD_INTERRUPT_TYPE_EWS 0x1000
53 #define CXD2880_TNRDMD_INTERRUPT_TYPE_EEW 0x2000
54 #define CXD2880_TNRDMD_INTERRUPT_TYPE_FEC_FAIL 0x4000
56 #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_L1POST_OK 0x01
57 #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_DMD_LOCK 0x02
58 #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_TS_LOCK 0x04
60 enum cxd2880_tnrdmd_chip_id
{
61 CXD2880_TNRDMD_CHIP_ID_UNKNOWN
= 0x00,
62 CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X
= 0x62,
63 CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11
= 0x6A
66 #define CXD2880_TNRDMD_CHIP_ID_VALID(chip_id) (((chip_id) == \
67 CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X) || \
68 ((chip_id) == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11))
70 enum cxd2880_tnrdmd_state
{
71 CXD2880_TNRDMD_STATE_UNKNOWN
,
72 CXD2880_TNRDMD_STATE_SLEEP
,
73 CXD2880_TNRDMD_STATE_ACTIVE
,
74 CXD2880_TNRDMD_STATE_INVALID
77 enum cxd2880_tnrdmd_divermode
{
78 CXD2880_TNRDMD_DIVERMODE_SINGLE
,
79 CXD2880_TNRDMD_DIVERMODE_MAIN
,
80 CXD2880_TNRDMD_DIVERMODE_SUB
83 enum cxd2880_tnrdmd_clockmode
{
84 CXD2880_TNRDMD_CLOCKMODE_UNKNOWN
,
85 CXD2880_TNRDMD_CLOCKMODE_A
,
86 CXD2880_TNRDMD_CLOCKMODE_B
,
87 CXD2880_TNRDMD_CLOCKMODE_C
90 enum cxd2880_tnrdmd_tsout_if
{
91 CXD2880_TNRDMD_TSOUT_IF_TS
,
92 CXD2880_TNRDMD_TSOUT_IF_SPI
,
93 CXD2880_TNRDMD_TSOUT_IF_SDIO
96 enum cxd2880_tnrdmd_xtal_share
{
97 CXD2880_TNRDMD_XTAL_SHARE_NONE
,
98 CXD2880_TNRDMD_XTAL_SHARE_EXTREF
,
99 CXD2880_TNRDMD_XTAL_SHARE_MASTER
,
100 CXD2880_TNRDMD_XTAL_SHARE_SLAVE
103 enum cxd2880_tnrdmd_spectrum_sense
{
104 CXD2880_TNRDMD_SPECTRUM_NORMAL
,
105 CXD2880_TNRDMD_SPECTRUM_INV
108 enum cxd2880_tnrdmd_cfg_id
{
109 CXD2880_TNRDMD_CFG_OUTPUT_SEL_MSB
,
110 CXD2880_TNRDMD_CFG_TSVALID_ACTIVE_HI
,
111 CXD2880_TNRDMD_CFG_TSSYNC_ACTIVE_HI
,
112 CXD2880_TNRDMD_CFG_TSERR_ACTIVE_HI
,
113 CXD2880_TNRDMD_CFG_LATCH_ON_POSEDGE
,
114 CXD2880_TNRDMD_CFG_TSCLK_CONT
,
115 CXD2880_TNRDMD_CFG_TSCLK_MASK
,
116 CXD2880_TNRDMD_CFG_TSVALID_MASK
,
117 CXD2880_TNRDMD_CFG_TSERR_MASK
,
118 CXD2880_TNRDMD_CFG_TSERR_VALID_DIS
,
119 CXD2880_TNRDMD_CFG_TSPIN_CURRENT
,
120 CXD2880_TNRDMD_CFG_TSPIN_PULLUP_MANUAL
,
121 CXD2880_TNRDMD_CFG_TSPIN_PULLUP
,
122 CXD2880_TNRDMD_CFG_TSCLK_FREQ
,
123 CXD2880_TNRDMD_CFG_TSBYTECLK_MANUAL
,
124 CXD2880_TNRDMD_CFG_TS_PACKET_GAP
,
125 CXD2880_TNRDMD_CFG_TS_BACKWARDS_COMPATIBLE
,
126 CXD2880_TNRDMD_CFG_PWM_VALUE
,
127 CXD2880_TNRDMD_CFG_INTERRUPT
,
128 CXD2880_TNRDMD_CFG_INTERRUPT_LOCK_SEL
,
129 CXD2880_TNRDMD_CFG_INTERRUPT_INV_LOCK_SEL
,
130 CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_EMPTY_THRS
,
131 CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_FULL_THRS
,
132 CXD2880_TNRDMD_CFG_TS_BUF_RRDY_THRS
,
133 CXD2880_TNRDMD_CFG_FIXED_CLOCKMODE
,
134 CXD2880_TNRDMD_CFG_CABLE_INPUT
,
135 CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_BASE
,
136 CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_LITE
,
137 CXD2880_TNRDMD_CFG_BLINDTUNE_DVBT2_FIRST
,
138 CXD2880_TNRDMD_CFG_DVBT_BERN_PERIOD
,
139 CXD2880_TNRDMD_CFG_DVBT_VBER_PERIOD
,
140 CXD2880_TNRDMD_CFG_DVBT_PER_MES
,
141 CXD2880_TNRDMD_CFG_DVBT2_BBER_MES
,
142 CXD2880_TNRDMD_CFG_DVBT2_LBER_MES
,
143 CXD2880_TNRDMD_CFG_DVBT2_PER_MES
,
144 CXD2880_TNRDMD_CFG_ISDBT_BERPER_PERIOD
147 enum cxd2880_tnrdmd_lock_result
{
148 CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT
,
149 CXD2880_TNRDMD_LOCK_RESULT_LOCKED
,
150 CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED
153 enum cxd2880_tnrdmd_gpio_mode
{
154 CXD2880_TNRDMD_GPIO_MODE_OUTPUT
= 0x00,
155 CXD2880_TNRDMD_GPIO_MODE_INPUT
= 0x01,
156 CXD2880_TNRDMD_GPIO_MODE_INT
= 0x02,
157 CXD2880_TNRDMD_GPIO_MODE_FEC_FAIL
= 0x03,
158 CXD2880_TNRDMD_GPIO_MODE_PWM
= 0x04,
159 CXD2880_TNRDMD_GPIO_MODE_EWS
= 0x05,
160 CXD2880_TNRDMD_GPIO_MODE_EEW
= 0x06
163 enum cxd2880_tnrdmd_serial_ts_clk
{
164 CXD2880_TNRDMD_SERIAL_TS_CLK_FULL
,
165 CXD2880_TNRDMD_SERIAL_TS_CLK_HALF
168 struct cxd2880_tnrdmd_cfg_mem
{
169 enum cxd2880_io_tgt tgt
;
176 struct cxd2880_tnrdmd_pid_cfg
{
181 struct cxd2880_tnrdmd_pid_ftr_cfg
{
183 struct cxd2880_tnrdmd_pid_cfg pid_cfg
[32];
186 struct cxd2880_tnrdmd_ts_buf_info
{
195 struct cxd2880_tnrdmd_lna_thrs
{
200 struct cxd2880_tnrdmd_lna_thrs_tbl_air
{
201 struct cxd2880_tnrdmd_lna_thrs thrs
[24];
204 struct cxd2880_tnrdmd_lna_thrs_tbl_cable
{
205 struct cxd2880_tnrdmd_lna_thrs thrs
[32];
208 struct cxd2880_tnrdmd_create_param
{
209 enum cxd2880_tnrdmd_tsout_if ts_output_if
;
211 enum cxd2880_tnrdmd_xtal_share xtal_share_type
;
218 struct cxd2880_tnrdmd_diver_create_param
{
219 enum cxd2880_tnrdmd_tsout_if ts_output_if
;
228 struct cxd2880_tnrdmd
{
229 struct cxd2880_tnrdmd
*diver_sub
;
230 struct cxd2880_io
*io
;
231 struct cxd2880_tnrdmd_create_param create_param
;
232 enum cxd2880_tnrdmd_divermode diver_mode
;
233 enum cxd2880_tnrdmd_clockmode fixed_clk_mode
;
235 u8 en_fef_intmtnt_base
;
236 u8 en_fef_intmtnt_lite
;
237 u8 blind_tune_dvbt2_first
;
238 enum cxd2880_ret (*rf_lvl_cmpstn
)(struct cxd2880_tnrdmd
*tnr_dmd
,
240 struct cxd2880_tnrdmd_lna_thrs_tbl_air
*lna_thrs_tbl_air
;
241 struct cxd2880_tnrdmd_lna_thrs_tbl_cable
*lna_thrs_tbl_cable
;
242 u8 srl_ts_clk_mod_cnts
;
243 enum cxd2880_tnrdmd_serial_ts_clk srl_ts_clk_frq
;
244 u8 ts_byte_clk_manual_setting
;
245 u8 is_ts_backwards_compatible_mode
;
246 struct cxd2880_tnrdmd_cfg_mem cfg_mem
[CXD2880_TNRDMD_MAX_CFG_MEM_COUNT
];
247 u8 cfg_mem_last_entry
;
248 struct cxd2880_tnrdmd_pid_ftr_cfg pid_ftr_cfg
;
251 enum cxd2880_tnrdmd_chip_id chip_id
;
252 enum cxd2880_tnrdmd_state state
;
253 enum cxd2880_tnrdmd_clockmode clk_mode
;
255 enum cxd2880_dtv_sys sys
;
256 enum cxd2880_dtv_bandwidth bandwidth
;
258 struct cxd2880_atomic cancel
;
261 enum cxd2880_ret
cxd2880_tnrdmd_create(struct cxd2880_tnrdmd
*tnr_dmd
,
262 struct cxd2880_io
*io
,
263 struct cxd2880_tnrdmd_create_param
266 enum cxd2880_ret
cxd2880_tnrdmd_diver_create(struct cxd2880_tnrdmd
268 struct cxd2880_io
*io_main
,
269 struct cxd2880_tnrdmd
*tnr_dmd_sub
,
270 struct cxd2880_io
*io_sub
,
272 cxd2880_tnrdmd_diver_create_param
275 enum cxd2880_ret
cxd2880_tnrdmd_init1(struct cxd2880_tnrdmd
*tnr_dmd
);
277 enum cxd2880_ret
cxd2880_tnrdmd_init2(struct cxd2880_tnrdmd
*tnr_dmd
);
279 enum cxd2880_ret
cxd2880_tnrdmd_check_internal_cpu_status(struct cxd2880_tnrdmd
283 enum cxd2880_ret
cxd2880_tnrdmd_common_tune_setting1(struct cxd2880_tnrdmd
285 enum cxd2880_dtv_sys sys
,
287 enum cxd2880_dtv_bandwidth
288 bandwidth
, u8 one_seg_opt
,
289 u8 one_seg_opt_shft_dir
);
291 enum cxd2880_ret
cxd2880_tnrdmd_common_tune_setting2(struct cxd2880_tnrdmd
293 enum cxd2880_dtv_sys sys
,
294 u8 en_fef_intmtnt_ctrl
);
296 enum cxd2880_ret
cxd2880_tnrdmd_sleep(struct cxd2880_tnrdmd
*tnr_dmd
);
298 enum cxd2880_ret
cxd2880_tnrdmd_set_cfg(struct cxd2880_tnrdmd
*tnr_dmd
,
299 enum cxd2880_tnrdmd_cfg_id id
,
302 enum cxd2880_ret
cxd2880_tnrdmd_gpio_set_cfg(struct cxd2880_tnrdmd
*tnr_dmd
,
305 enum cxd2880_tnrdmd_gpio_mode mode
,
306 u8 open_drain
, u8 invert
);
308 enum cxd2880_ret
cxd2880_tnrdmd_gpio_set_cfg_sub(struct cxd2880_tnrdmd
*tnr_dmd
,
311 enum cxd2880_tnrdmd_gpio_mode
315 enum cxd2880_ret
cxd2880_tnrdmd_gpio_read(struct cxd2880_tnrdmd
*tnr_dmd
,
318 enum cxd2880_ret
cxd2880_tnrdmd_gpio_read_sub(struct cxd2880_tnrdmd
*tnr_dmd
,
321 enum cxd2880_ret
cxd2880_tnrdmd_gpio_write(struct cxd2880_tnrdmd
*tnr_dmd
,
324 enum cxd2880_ret
cxd2880_tnrdmd_gpio_write_sub(struct cxd2880_tnrdmd
*tnr_dmd
,
327 enum cxd2880_ret
cxd2880_tnrdmd_interrupt_read(struct cxd2880_tnrdmd
*tnr_dmd
,
330 enum cxd2880_ret
cxd2880_tnrdmd_interrupt_clear(struct cxd2880_tnrdmd
*tnr_dmd
,
333 enum cxd2880_ret
cxd2880_tnrdmd_ts_buf_clear(struct cxd2880_tnrdmd
*tnr_dmd
,
334 u8 clear_overflow_flag
,
335 u8 clear_underflow_flag
,
338 enum cxd2880_ret
cxd2880_tnrdmd_chip_id(struct cxd2880_tnrdmd
*tnr_dmd
,
339 enum cxd2880_tnrdmd_chip_id
*chip_id
);
341 enum cxd2880_ret
cxd2880_tnrdmd_set_and_save_reg_bits(struct cxd2880_tnrdmd
343 enum cxd2880_io_tgt tgt
,
345 u8 value
, u8 bit_mask
);
347 enum cxd2880_ret
cxd2880_tnrdmd_set_scan_mode(struct cxd2880_tnrdmd
*tnr_dmd
,
348 enum cxd2880_dtv_sys sys
,
351 enum cxd2880_ret
cxd2880_tnrdmd_set_pid_ftr(struct cxd2880_tnrdmd
*tnr_dmd
,
352 struct cxd2880_tnrdmd_pid_ftr_cfg
355 enum cxd2880_ret
cxd2880_tnrdmd_set_rf_lvl_cmpstn(struct cxd2880_tnrdmd
358 cxd2880_ret(*rf_lvl_cmpstn
)
359 (struct cxd2880_tnrdmd
*,
362 enum cxd2880_ret
cxd2880_tnrdmd_set_rf_lvl_cmpstn_sub(struct cxd2880_tnrdmd
366 (*rf_lvl_cmpstn
)(struct
371 enum cxd2880_ret
cxd2880_tnrdmd_set_lna_thrs(struct cxd2880_tnrdmd
*tnr_dmd
,
373 cxd2880_tnrdmd_lna_thrs_tbl_air
376 cxd2880_tnrdmd_lna_thrs_tbl_cable
379 enum cxd2880_ret
cxd2880_tnrdmd_set_lna_thrs_sub(struct cxd2880_tnrdmd
*tnr_dmd
,
381 cxd2880_tnrdmd_lna_thrs_tbl_air
384 cxd2880_tnrdmd_lna_thrs_tbl_cable
387 enum cxd2880_ret
cxd2880_tnrdmd_set_ts_pin_high_low(struct cxd2880_tnrdmd
388 *tnr_dmd
, u8 en
, u8 value
);
390 enum cxd2880_ret
cxd2880_tnrdmd_set_ts_output(struct cxd2880_tnrdmd
*tnr_dmd
,
393 enum cxd2880_ret
slvt_freeze_reg(struct cxd2880_tnrdmd
*tnr_dmd
);