| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * cxd2880_tnrdmd.h |
| * Sony CXD2880 DVB-T2/T tuner + demodulator driver |
| * common control interface |
| * |
| * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation |
| */ |
| |
| #ifndef CXD2880_TNRDMD_H |
| #define CXD2880_TNRDMD_H |
| |
| #include <linux/atomic.h> |
| |
| #include "cxd2880_common.h" |
| #include "cxd2880_io.h" |
| #include "cxd2880_dtv.h" |
| #include "cxd2880_dvbt.h" |
| #include "cxd2880_dvbt2.h" |
| |
| #define CXD2880_TNRDMD_MAX_CFG_MEM_COUNT 100 |
| |
| #define slvt_unfreeze_reg(tnr_dmd) ((void)((tnr_dmd)->io->write_reg\ |
| ((tnr_dmd)->io, CXD2880_IO_TGT_DMD, 0x01, 0x00))) |
| |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_UNDERFLOW 0x0001 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_OVERFLOW 0x0002 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_ALMOST_EMPTY 0x0004 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_ALMOST_FULL 0x0008 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_RRDY 0x0010 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_ILLEGAL_COMMAND 0x0020 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_ILLEGAL_ACCESS 0x0040 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_CPU_ERROR 0x0100 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_LOCK 0x0200 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_INV_LOCK 0x0400 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_NOOFDM 0x0800 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_EWS 0x1000 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_EEW 0x2000 |
| #define CXD2880_TNRDMD_INTERRUPT_TYPE_FEC_FAIL 0x4000 |
| |
| #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_L1POST_OK 0x01 |
| #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_DMD_LOCK 0x02 |
| #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_TS_LOCK 0x04 |
| |
| enum cxd2880_tnrdmd_chip_id { |
| CXD2880_TNRDMD_CHIP_ID_UNKNOWN = 0x00, |
| CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X = 0x62, |
| CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11 = 0x6a |
| }; |
| |
| #define CXD2880_TNRDMD_CHIP_ID_VALID(chip_id) \ |
| (((chip_id) == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X) || \ |
| ((chip_id) == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11)) |
| |
| enum cxd2880_tnrdmd_state { |
| CXD2880_TNRDMD_STATE_UNKNOWN, |
| CXD2880_TNRDMD_STATE_SLEEP, |
| CXD2880_TNRDMD_STATE_ACTIVE, |
| CXD2880_TNRDMD_STATE_INVALID |
| }; |
| |
| enum cxd2880_tnrdmd_divermode { |
| CXD2880_TNRDMD_DIVERMODE_SINGLE, |
| CXD2880_TNRDMD_DIVERMODE_MAIN, |
| CXD2880_TNRDMD_DIVERMODE_SUB |
| }; |
| |
| enum cxd2880_tnrdmd_clockmode { |
| CXD2880_TNRDMD_CLOCKMODE_UNKNOWN, |
| CXD2880_TNRDMD_CLOCKMODE_A, |
| CXD2880_TNRDMD_CLOCKMODE_B, |
| CXD2880_TNRDMD_CLOCKMODE_C |
| }; |
| |
| enum cxd2880_tnrdmd_tsout_if { |
| CXD2880_TNRDMD_TSOUT_IF_TS, |
| CXD2880_TNRDMD_TSOUT_IF_SPI, |
| CXD2880_TNRDMD_TSOUT_IF_SDIO |
| }; |
| |
| enum cxd2880_tnrdmd_xtal_share { |
| CXD2880_TNRDMD_XTAL_SHARE_NONE, |
| CXD2880_TNRDMD_XTAL_SHARE_EXTREF, |
| CXD2880_TNRDMD_XTAL_SHARE_MASTER, |
| CXD2880_TNRDMD_XTAL_SHARE_SLAVE |
| }; |
| |
| enum cxd2880_tnrdmd_spectrum_sense { |
| CXD2880_TNRDMD_SPECTRUM_NORMAL, |
| CXD2880_TNRDMD_SPECTRUM_INV |
| }; |
| |
| enum cxd2880_tnrdmd_cfg_id { |
| CXD2880_TNRDMD_CFG_OUTPUT_SEL_MSB, |
| CXD2880_TNRDMD_CFG_TSVALID_ACTIVE_HI, |
| CXD2880_TNRDMD_CFG_TSSYNC_ACTIVE_HI, |
| CXD2880_TNRDMD_CFG_TSERR_ACTIVE_HI, |
| CXD2880_TNRDMD_CFG_LATCH_ON_POSEDGE, |
| CXD2880_TNRDMD_CFG_TSCLK_CONT, |
| CXD2880_TNRDMD_CFG_TSCLK_MASK, |
| CXD2880_TNRDMD_CFG_TSVALID_MASK, |
| CXD2880_TNRDMD_CFG_TSERR_MASK, |
| CXD2880_TNRDMD_CFG_TSERR_VALID_DIS, |
| CXD2880_TNRDMD_CFG_TSPIN_CURRENT, |
| CXD2880_TNRDMD_CFG_TSPIN_PULLUP_MANUAL, |
| CXD2880_TNRDMD_CFG_TSPIN_PULLUP, |
| CXD2880_TNRDMD_CFG_TSCLK_FREQ, |
| CXD2880_TNRDMD_CFG_TSBYTECLK_MANUAL, |
| CXD2880_TNRDMD_CFG_TS_PACKET_GAP, |
| CXD2880_TNRDMD_CFG_TS_BACKWARDS_COMPATIBLE, |
| CXD2880_TNRDMD_CFG_PWM_VALUE, |
| CXD2880_TNRDMD_CFG_INTERRUPT, |
| CXD2880_TNRDMD_CFG_INTERRUPT_LOCK_SEL, |
| CXD2880_TNRDMD_CFG_INTERRUPT_INV_LOCK_SEL, |
| CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_EMPTY_THRS, |
| CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_FULL_THRS, |
| CXD2880_TNRDMD_CFG_TS_BUF_RRDY_THRS, |
| CXD2880_TNRDMD_CFG_FIXED_CLOCKMODE, |
| CXD2880_TNRDMD_CFG_CABLE_INPUT, |
| CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_BASE, |
| CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_LITE, |
| CXD2880_TNRDMD_CFG_BLINDTUNE_DVBT2_FIRST, |
| CXD2880_TNRDMD_CFG_DVBT_BERN_PERIOD, |
| CXD2880_TNRDMD_CFG_DVBT_VBER_PERIOD, |
| CXD2880_TNRDMD_CFG_DVBT_PER_MES, |
| CXD2880_TNRDMD_CFG_DVBT2_BBER_MES, |
| CXD2880_TNRDMD_CFG_DVBT2_LBER_MES, |
| CXD2880_TNRDMD_CFG_DVBT2_PER_MES, |
| }; |
| |
| enum cxd2880_tnrdmd_lock_result { |
| CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT, |
| CXD2880_TNRDMD_LOCK_RESULT_LOCKED, |
| CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED |
| }; |
| |
| enum cxd2880_tnrdmd_gpio_mode { |
| CXD2880_TNRDMD_GPIO_MODE_OUTPUT = 0x00, |
| CXD2880_TNRDMD_GPIO_MODE_INPUT = 0x01, |
| CXD2880_TNRDMD_GPIO_MODE_INT = 0x02, |
| CXD2880_TNRDMD_GPIO_MODE_FEC_FAIL = 0x03, |
| CXD2880_TNRDMD_GPIO_MODE_PWM = 0x04, |
| CXD2880_TNRDMD_GPIO_MODE_EWS = 0x05, |
| CXD2880_TNRDMD_GPIO_MODE_EEW = 0x06 |
| }; |
| |
| enum cxd2880_tnrdmd_serial_ts_clk { |
| CXD2880_TNRDMD_SERIAL_TS_CLK_FULL, |
| CXD2880_TNRDMD_SERIAL_TS_CLK_HALF |
| }; |
| |
| struct cxd2880_tnrdmd_cfg_mem { |
| enum cxd2880_io_tgt tgt; |
| u8 bank; |
| u8 address; |
| u8 value; |
| u8 bit_mask; |
| }; |
| |
| struct cxd2880_tnrdmd_pid_cfg { |
| u8 is_en; |
| u16 pid; |
| }; |
| |
| struct cxd2880_tnrdmd_pid_ftr_cfg { |
| u8 is_negative; |
| struct cxd2880_tnrdmd_pid_cfg pid_cfg[32]; |
| }; |
| |
| struct cxd2880_tnrdmd_lna_thrs { |
| u8 off_on; |
| u8 on_off; |
| }; |
| |
| struct cxd2880_tnrdmd_lna_thrs_tbl_air { |
| struct cxd2880_tnrdmd_lna_thrs thrs[24]; |
| }; |
| |
| struct cxd2880_tnrdmd_lna_thrs_tbl_cable { |
| struct cxd2880_tnrdmd_lna_thrs thrs[32]; |
| }; |
| |
| struct cxd2880_tnrdmd_create_param { |
| enum cxd2880_tnrdmd_tsout_if ts_output_if; |
| u8 en_internal_ldo; |
| enum cxd2880_tnrdmd_xtal_share xtal_share_type; |
| u8 xosc_cap; |
| u8 xosc_i; |
| u8 is_cxd2881gg; |
| u8 stationary_use; |
| }; |
| |
| struct cxd2880_tnrdmd_diver_create_param { |
| enum cxd2880_tnrdmd_tsout_if ts_output_if; |
| u8 en_internal_ldo; |
| u8 xosc_cap_main; |
| u8 xosc_i_main; |
| u8 xosc_i_sub; |
| u8 is_cxd2881gg; |
| u8 stationary_use; |
| }; |
| |
| struct cxd2880_tnrdmd { |
| struct cxd2880_tnrdmd *diver_sub; |
| struct cxd2880_io *io; |
| struct cxd2880_tnrdmd_create_param create_param; |
| enum cxd2880_tnrdmd_divermode diver_mode; |
| enum cxd2880_tnrdmd_clockmode fixed_clk_mode; |
| u8 is_cable_input; |
| u8 en_fef_intmtnt_base; |
| u8 en_fef_intmtnt_lite; |
| u8 blind_tune_dvbt2_first; |
| int (*rf_lvl_cmpstn)(struct cxd2880_tnrdmd *tnr_dmd, |
| int *rf_lvl_db); |
| struct cxd2880_tnrdmd_lna_thrs_tbl_air *lna_thrs_tbl_air; |
| struct cxd2880_tnrdmd_lna_thrs_tbl_cable *lna_thrs_tbl_cable; |
| u8 srl_ts_clk_mod_cnts; |
| enum cxd2880_tnrdmd_serial_ts_clk srl_ts_clk_frq; |
| u8 ts_byte_clk_manual_setting; |
| u8 is_ts_backwards_compatible_mode; |
| struct cxd2880_tnrdmd_cfg_mem cfg_mem[CXD2880_TNRDMD_MAX_CFG_MEM_COUNT]; |
| u8 cfg_mem_last_entry; |
| struct cxd2880_tnrdmd_pid_ftr_cfg pid_ftr_cfg; |
| u8 pid_ftr_cfg_en; |
| void *user; |
| enum cxd2880_tnrdmd_chip_id chip_id; |
| enum cxd2880_tnrdmd_state state; |
| enum cxd2880_tnrdmd_clockmode clk_mode; |
| u32 frequency_khz; |
| enum cxd2880_dtv_sys sys; |
| enum cxd2880_dtv_bandwidth bandwidth; |
| u8 scan_mode; |
| atomic_t cancel; |
| }; |
| |
| int cxd2880_tnrdmd_create(struct cxd2880_tnrdmd *tnr_dmd, |
| struct cxd2880_io *io, |
| struct cxd2880_tnrdmd_create_param |
| *create_param); |
| |
| int cxd2880_tnrdmd_diver_create(struct cxd2880_tnrdmd |
| *tnr_dmd_main, |
| struct cxd2880_io *io_main, |
| struct cxd2880_tnrdmd *tnr_dmd_sub, |
| struct cxd2880_io *io_sub, |
| struct |
| cxd2880_tnrdmd_diver_create_param |
| *create_param); |
| |
| int cxd2880_tnrdmd_init1(struct cxd2880_tnrdmd *tnr_dmd); |
| |
| int cxd2880_tnrdmd_init2(struct cxd2880_tnrdmd *tnr_dmd); |
| |
| int cxd2880_tnrdmd_check_internal_cpu_status(struct cxd2880_tnrdmd |
| *tnr_dmd, |
| u8 *task_completed); |
| |
| int cxd2880_tnrdmd_common_tune_setting1(struct cxd2880_tnrdmd |
| *tnr_dmd, |
| enum cxd2880_dtv_sys sys, |
| u32 frequency_khz, |
| enum cxd2880_dtv_bandwidth |
| bandwidth, u8 one_seg_opt, |
| u8 one_seg_opt_shft_dir); |
| |
| int cxd2880_tnrdmd_common_tune_setting2(struct cxd2880_tnrdmd |
| *tnr_dmd, |
| enum cxd2880_dtv_sys sys, |
| u8 en_fef_intmtnt_ctrl); |
| |
| int cxd2880_tnrdmd_sleep(struct cxd2880_tnrdmd *tnr_dmd); |
| |
| int cxd2880_tnrdmd_set_cfg(struct cxd2880_tnrdmd *tnr_dmd, |
| enum cxd2880_tnrdmd_cfg_id id, |
| int value); |
| |
| int cxd2880_tnrdmd_gpio_set_cfg(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 id, |
| u8 en, |
| enum cxd2880_tnrdmd_gpio_mode mode, |
| u8 open_drain, u8 invert); |
| |
| int cxd2880_tnrdmd_gpio_set_cfg_sub(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 id, |
| u8 en, |
| enum cxd2880_tnrdmd_gpio_mode |
| mode, u8 open_drain, |
| u8 invert); |
| |
| int cxd2880_tnrdmd_gpio_read(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 id, u8 *value); |
| |
| int cxd2880_tnrdmd_gpio_read_sub(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 id, u8 *value); |
| |
| int cxd2880_tnrdmd_gpio_write(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 id, u8 value); |
| |
| int cxd2880_tnrdmd_gpio_write_sub(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 id, u8 value); |
| |
| int cxd2880_tnrdmd_interrupt_read(struct cxd2880_tnrdmd *tnr_dmd, |
| u16 *value); |
| |
| int cxd2880_tnrdmd_interrupt_clear(struct cxd2880_tnrdmd *tnr_dmd, |
| u16 value); |
| |
| int cxd2880_tnrdmd_ts_buf_clear(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 clear_overflow_flag, |
| u8 clear_underflow_flag, |
| u8 clear_buf); |
| |
| int cxd2880_tnrdmd_chip_id(struct cxd2880_tnrdmd *tnr_dmd, |
| enum cxd2880_tnrdmd_chip_id *chip_id); |
| |
| int cxd2880_tnrdmd_set_and_save_reg_bits(struct cxd2880_tnrdmd |
| *tnr_dmd, |
| enum cxd2880_io_tgt tgt, |
| u8 bank, u8 address, |
| u8 value, u8 bit_mask); |
| |
| int cxd2880_tnrdmd_set_scan_mode(struct cxd2880_tnrdmd *tnr_dmd, |
| enum cxd2880_dtv_sys sys, |
| u8 scan_mode_end); |
| |
| int cxd2880_tnrdmd_set_pid_ftr(struct cxd2880_tnrdmd *tnr_dmd, |
| struct cxd2880_tnrdmd_pid_ftr_cfg |
| *pid_ftr_cfg); |
| |
| int cxd2880_tnrdmd_set_rf_lvl_cmpstn(struct cxd2880_tnrdmd |
| *tnr_dmd, |
| int (*rf_lvl_cmpstn) |
| (struct cxd2880_tnrdmd *, |
| int *)); |
| |
| int cxd2880_tnrdmd_set_rf_lvl_cmpstn_sub(struct cxd2880_tnrdmd *tnr_dmd, |
| int (*rf_lvl_cmpstn) |
| (struct cxd2880_tnrdmd *, |
| int *)); |
| |
| int cxd2880_tnrdmd_set_lna_thrs(struct cxd2880_tnrdmd *tnr_dmd, |
| struct |
| cxd2880_tnrdmd_lna_thrs_tbl_air |
| *tbl_air, |
| struct |
| cxd2880_tnrdmd_lna_thrs_tbl_cable |
| *tbl_cable); |
| |
| int cxd2880_tnrdmd_set_lna_thrs_sub(struct cxd2880_tnrdmd *tnr_dmd, |
| struct |
| cxd2880_tnrdmd_lna_thrs_tbl_air |
| *tbl_air, |
| struct |
| cxd2880_tnrdmd_lna_thrs_tbl_cable |
| *tbl_cable); |
| |
| int cxd2880_tnrdmd_set_ts_pin_high_low(struct cxd2880_tnrdmd |
| *tnr_dmd, u8 en, u8 value); |
| |
| int cxd2880_tnrdmd_set_ts_output(struct cxd2880_tnrdmd *tnr_dmd, |
| u8 en); |
| |
| int slvt_freeze_reg(struct cxd2880_tnrdmd *tnr_dmd); |
| |
| #endif |