1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * cxd2880_tnrdmd.h 4 * Sony CXD2880 DVB-T2/T tuner + demodulator driver 5 * common control interface 6 * 7 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation 8 */ 9 10 #ifndef CXD2880_TNRDMD_H 11 #define CXD2880_TNRDMD_H 12 13 #include <linux/atomic.h> 14 15 #include "cxd2880_common.h" 16 #include "cxd2880_io.h" 17 #include "cxd2880_dtv.h" 18 #include "cxd2880_dvbt.h" 19 #include "cxd2880_dvbt2.h" 20 21 #define CXD2880_TNRDMD_MAX_CFG_MEM_COUNT 100 22 23 #define slvt_unfreeze_reg(tnr_dmd) ((void)((tnr_dmd)->io->write_reg\ 24 ((tnr_dmd)->io, CXD2880_IO_TGT_DMD, 0x01, 0x00))) 25 26 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_UNDERFLOW 0x0001 27 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_OVERFLOW 0x0002 28 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_ALMOST_EMPTY 0x0004 29 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_ALMOST_FULL 0x0008 30 #define CXD2880_TNRDMD_INTERRUPT_TYPE_BUF_RRDY 0x0010 31 #define CXD2880_TNRDMD_INTERRUPT_TYPE_ILLEGAL_COMMAND 0x0020 32 #define CXD2880_TNRDMD_INTERRUPT_TYPE_ILLEGAL_ACCESS 0x0040 33 #define CXD2880_TNRDMD_INTERRUPT_TYPE_CPU_ERROR 0x0100 34 #define CXD2880_TNRDMD_INTERRUPT_TYPE_LOCK 0x0200 35 #define CXD2880_TNRDMD_INTERRUPT_TYPE_INV_LOCK 0x0400 36 #define CXD2880_TNRDMD_INTERRUPT_TYPE_NOOFDM 0x0800 37 #define CXD2880_TNRDMD_INTERRUPT_TYPE_EWS 0x1000 38 #define CXD2880_TNRDMD_INTERRUPT_TYPE_EEW 0x2000 39 #define CXD2880_TNRDMD_INTERRUPT_TYPE_FEC_FAIL 0x4000 40 41 #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_L1POST_OK 0x01 42 #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_DMD_LOCK 0x02 43 #define CXD2880_TNRDMD_INTERRUPT_LOCK_SEL_TS_LOCK 0x04 44 45 enum cxd2880_tnrdmd_chip_id { 46 CXD2880_TNRDMD_CHIP_ID_UNKNOWN = 0x00, 47 CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X = 0x62, 48 CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11 = 0x6a 49 }; 50 51 #define CXD2880_TNRDMD_CHIP_ID_VALID(chip_id) \ 52 (((chip_id) == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X) || \ 53 ((chip_id) == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11)) 54 55 enum cxd2880_tnrdmd_state { 56 CXD2880_TNRDMD_STATE_UNKNOWN, 57 CXD2880_TNRDMD_STATE_SLEEP, 58 CXD2880_TNRDMD_STATE_ACTIVE, 59 CXD2880_TNRDMD_STATE_INVALID 60 }; 61 62 enum cxd2880_tnrdmd_divermode { 63 CXD2880_TNRDMD_DIVERMODE_SINGLE, 64 CXD2880_TNRDMD_DIVERMODE_MAIN, 65 CXD2880_TNRDMD_DIVERMODE_SUB 66 }; 67 68 enum cxd2880_tnrdmd_clockmode { 69 CXD2880_TNRDMD_CLOCKMODE_UNKNOWN, 70 CXD2880_TNRDMD_CLOCKMODE_A, 71 CXD2880_TNRDMD_CLOCKMODE_B, 72 CXD2880_TNRDMD_CLOCKMODE_C 73 }; 74 75 enum cxd2880_tnrdmd_tsout_if { 76 CXD2880_TNRDMD_TSOUT_IF_TS, 77 CXD2880_TNRDMD_TSOUT_IF_SPI, 78 CXD2880_TNRDMD_TSOUT_IF_SDIO 79 }; 80 81 enum cxd2880_tnrdmd_xtal_share { 82 CXD2880_TNRDMD_XTAL_SHARE_NONE, 83 CXD2880_TNRDMD_XTAL_SHARE_EXTREF, 84 CXD2880_TNRDMD_XTAL_SHARE_MASTER, 85 CXD2880_TNRDMD_XTAL_SHARE_SLAVE 86 }; 87 88 enum cxd2880_tnrdmd_spectrum_sense { 89 CXD2880_TNRDMD_SPECTRUM_NORMAL, 90 CXD2880_TNRDMD_SPECTRUM_INV 91 }; 92 93 enum cxd2880_tnrdmd_cfg_id { 94 CXD2880_TNRDMD_CFG_OUTPUT_SEL_MSB, 95 CXD2880_TNRDMD_CFG_TSVALID_ACTIVE_HI, 96 CXD2880_TNRDMD_CFG_TSSYNC_ACTIVE_HI, 97 CXD2880_TNRDMD_CFG_TSERR_ACTIVE_HI, 98 CXD2880_TNRDMD_CFG_LATCH_ON_POSEDGE, 99 CXD2880_TNRDMD_CFG_TSCLK_CONT, 100 CXD2880_TNRDMD_CFG_TSCLK_MASK, 101 CXD2880_TNRDMD_CFG_TSVALID_MASK, 102 CXD2880_TNRDMD_CFG_TSERR_MASK, 103 CXD2880_TNRDMD_CFG_TSERR_VALID_DIS, 104 CXD2880_TNRDMD_CFG_TSPIN_CURRENT, 105 CXD2880_TNRDMD_CFG_TSPIN_PULLUP_MANUAL, 106 CXD2880_TNRDMD_CFG_TSPIN_PULLUP, 107 CXD2880_TNRDMD_CFG_TSCLK_FREQ, 108 CXD2880_TNRDMD_CFG_TSBYTECLK_MANUAL, 109 CXD2880_TNRDMD_CFG_TS_PACKET_GAP, 110 CXD2880_TNRDMD_CFG_TS_BACKWARDS_COMPATIBLE, 111 CXD2880_TNRDMD_CFG_PWM_VALUE, 112 CXD2880_TNRDMD_CFG_INTERRUPT, 113 CXD2880_TNRDMD_CFG_INTERRUPT_LOCK_SEL, 114 CXD2880_TNRDMD_CFG_INTERRUPT_INV_LOCK_SEL, 115 CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_EMPTY_THRS, 116 CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_FULL_THRS, 117 CXD2880_TNRDMD_CFG_TS_BUF_RRDY_THRS, 118 CXD2880_TNRDMD_CFG_FIXED_CLOCKMODE, 119 CXD2880_TNRDMD_CFG_CABLE_INPUT, 120 CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_BASE, 121 CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_LITE, 122 CXD2880_TNRDMD_CFG_BLINDTUNE_DVBT2_FIRST, 123 CXD2880_TNRDMD_CFG_DVBT_BERN_PERIOD, 124 CXD2880_TNRDMD_CFG_DVBT_VBER_PERIOD, 125 CXD2880_TNRDMD_CFG_DVBT_PER_MES, 126 CXD2880_TNRDMD_CFG_DVBT2_BBER_MES, 127 CXD2880_TNRDMD_CFG_DVBT2_LBER_MES, 128 CXD2880_TNRDMD_CFG_DVBT2_PER_MES, 129 }; 130 131 enum cxd2880_tnrdmd_lock_result { 132 CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT, 133 CXD2880_TNRDMD_LOCK_RESULT_LOCKED, 134 CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED 135 }; 136 137 enum cxd2880_tnrdmd_gpio_mode { 138 CXD2880_TNRDMD_GPIO_MODE_OUTPUT = 0x00, 139 CXD2880_TNRDMD_GPIO_MODE_INPUT = 0x01, 140 CXD2880_TNRDMD_GPIO_MODE_INT = 0x02, 141 CXD2880_TNRDMD_GPIO_MODE_FEC_FAIL = 0x03, 142 CXD2880_TNRDMD_GPIO_MODE_PWM = 0x04, 143 CXD2880_TNRDMD_GPIO_MODE_EWS = 0x05, 144 CXD2880_TNRDMD_GPIO_MODE_EEW = 0x06 145 }; 146 147 enum cxd2880_tnrdmd_serial_ts_clk { 148 CXD2880_TNRDMD_SERIAL_TS_CLK_FULL, 149 CXD2880_TNRDMD_SERIAL_TS_CLK_HALF 150 }; 151 152 struct cxd2880_tnrdmd_cfg_mem { 153 enum cxd2880_io_tgt tgt; 154 u8 bank; 155 u8 address; 156 u8 value; 157 u8 bit_mask; 158 }; 159 160 struct cxd2880_tnrdmd_pid_cfg { 161 u8 is_en; 162 u16 pid; 163 }; 164 165 struct cxd2880_tnrdmd_pid_ftr_cfg { 166 u8 is_negative; 167 struct cxd2880_tnrdmd_pid_cfg pid_cfg[32]; 168 }; 169 170 struct cxd2880_tnrdmd_lna_thrs { 171 u8 off_on; 172 u8 on_off; 173 }; 174 175 struct cxd2880_tnrdmd_lna_thrs_tbl_air { 176 struct cxd2880_tnrdmd_lna_thrs thrs[24]; 177 }; 178 179 struct cxd2880_tnrdmd_lna_thrs_tbl_cable { 180 struct cxd2880_tnrdmd_lna_thrs thrs[32]; 181 }; 182 183 struct cxd2880_tnrdmd_create_param { 184 enum cxd2880_tnrdmd_tsout_if ts_output_if; 185 u8 en_internal_ldo; 186 enum cxd2880_tnrdmd_xtal_share xtal_share_type; 187 u8 xosc_cap; 188 u8 xosc_i; 189 u8 is_cxd2881gg; 190 u8 stationary_use; 191 }; 192 193 struct cxd2880_tnrdmd_diver_create_param { 194 enum cxd2880_tnrdmd_tsout_if ts_output_if; 195 u8 en_internal_ldo; 196 u8 xosc_cap_main; 197 u8 xosc_i_main; 198 u8 xosc_i_sub; 199 u8 is_cxd2881gg; 200 u8 stationary_use; 201 }; 202 203 struct cxd2880_tnrdmd { 204 struct cxd2880_tnrdmd *diver_sub; 205 struct cxd2880_io *io; 206 struct cxd2880_tnrdmd_create_param create_param; 207 enum cxd2880_tnrdmd_divermode diver_mode; 208 enum cxd2880_tnrdmd_clockmode fixed_clk_mode; 209 u8 is_cable_input; 210 u8 en_fef_intmtnt_base; 211 u8 en_fef_intmtnt_lite; 212 u8 blind_tune_dvbt2_first; 213 int (*rf_lvl_cmpstn)(struct cxd2880_tnrdmd *tnr_dmd, 214 int *rf_lvl_db); 215 struct cxd2880_tnrdmd_lna_thrs_tbl_air *lna_thrs_tbl_air; 216 struct cxd2880_tnrdmd_lna_thrs_tbl_cable *lna_thrs_tbl_cable; 217 u8 srl_ts_clk_mod_cnts; 218 enum cxd2880_tnrdmd_serial_ts_clk srl_ts_clk_frq; 219 u8 ts_byte_clk_manual_setting; 220 u8 is_ts_backwards_compatible_mode; 221 struct cxd2880_tnrdmd_cfg_mem cfg_mem[CXD2880_TNRDMD_MAX_CFG_MEM_COUNT]; 222 u8 cfg_mem_last_entry; 223 struct cxd2880_tnrdmd_pid_ftr_cfg pid_ftr_cfg; 224 u8 pid_ftr_cfg_en; 225 void *user; 226 enum cxd2880_tnrdmd_chip_id chip_id; 227 enum cxd2880_tnrdmd_state state; 228 enum cxd2880_tnrdmd_clockmode clk_mode; 229 u32 frequency_khz; 230 enum cxd2880_dtv_sys sys; 231 enum cxd2880_dtv_bandwidth bandwidth; 232 u8 scan_mode; 233 atomic_t cancel; 234 }; 235 236 int cxd2880_tnrdmd_create(struct cxd2880_tnrdmd *tnr_dmd, 237 struct cxd2880_io *io, 238 struct cxd2880_tnrdmd_create_param 239 *create_param); 240 241 int cxd2880_tnrdmd_diver_create(struct cxd2880_tnrdmd 242 *tnr_dmd_main, 243 struct cxd2880_io *io_main, 244 struct cxd2880_tnrdmd *tnr_dmd_sub, 245 struct cxd2880_io *io_sub, 246 struct 247 cxd2880_tnrdmd_diver_create_param 248 *create_param); 249 250 int cxd2880_tnrdmd_init1(struct cxd2880_tnrdmd *tnr_dmd); 251 252 int cxd2880_tnrdmd_init2(struct cxd2880_tnrdmd *tnr_dmd); 253 254 int cxd2880_tnrdmd_check_internal_cpu_status(struct cxd2880_tnrdmd 255 *tnr_dmd, 256 u8 *task_completed); 257 258 int cxd2880_tnrdmd_common_tune_setting1(struct cxd2880_tnrdmd 259 *tnr_dmd, 260 enum cxd2880_dtv_sys sys, 261 u32 frequency_khz, 262 enum cxd2880_dtv_bandwidth 263 bandwidth, u8 one_seg_opt, 264 u8 one_seg_opt_shft_dir); 265 266 int cxd2880_tnrdmd_common_tune_setting2(struct cxd2880_tnrdmd 267 *tnr_dmd, 268 enum cxd2880_dtv_sys sys, 269 u8 en_fef_intmtnt_ctrl); 270 271 int cxd2880_tnrdmd_sleep(struct cxd2880_tnrdmd *tnr_dmd); 272 273 int cxd2880_tnrdmd_set_cfg(struct cxd2880_tnrdmd *tnr_dmd, 274 enum cxd2880_tnrdmd_cfg_id id, 275 int value); 276 277 int cxd2880_tnrdmd_gpio_set_cfg(struct cxd2880_tnrdmd *tnr_dmd, 278 u8 id, 279 u8 en, 280 enum cxd2880_tnrdmd_gpio_mode mode, 281 u8 open_drain, u8 invert); 282 283 int cxd2880_tnrdmd_gpio_set_cfg_sub(struct cxd2880_tnrdmd *tnr_dmd, 284 u8 id, 285 u8 en, 286 enum cxd2880_tnrdmd_gpio_mode 287 mode, u8 open_drain, 288 u8 invert); 289 290 int cxd2880_tnrdmd_gpio_read(struct cxd2880_tnrdmd *tnr_dmd, 291 u8 id, u8 *value); 292 293 int cxd2880_tnrdmd_gpio_read_sub(struct cxd2880_tnrdmd *tnr_dmd, 294 u8 id, u8 *value); 295 296 int cxd2880_tnrdmd_gpio_write(struct cxd2880_tnrdmd *tnr_dmd, 297 u8 id, u8 value); 298 299 int cxd2880_tnrdmd_gpio_write_sub(struct cxd2880_tnrdmd *tnr_dmd, 300 u8 id, u8 value); 301 302 int cxd2880_tnrdmd_interrupt_read(struct cxd2880_tnrdmd *tnr_dmd, 303 u16 *value); 304 305 int cxd2880_tnrdmd_interrupt_clear(struct cxd2880_tnrdmd *tnr_dmd, 306 u16 value); 307 308 int cxd2880_tnrdmd_ts_buf_clear(struct cxd2880_tnrdmd *tnr_dmd, 309 u8 clear_overflow_flag, 310 u8 clear_underflow_flag, 311 u8 clear_buf); 312 313 int cxd2880_tnrdmd_chip_id(struct cxd2880_tnrdmd *tnr_dmd, 314 enum cxd2880_tnrdmd_chip_id *chip_id); 315 316 int cxd2880_tnrdmd_set_and_save_reg_bits(struct cxd2880_tnrdmd 317 *tnr_dmd, 318 enum cxd2880_io_tgt tgt, 319 u8 bank, u8 address, 320 u8 value, u8 bit_mask); 321 322 int cxd2880_tnrdmd_set_scan_mode(struct cxd2880_tnrdmd *tnr_dmd, 323 enum cxd2880_dtv_sys sys, 324 u8 scan_mode_end); 325 326 int cxd2880_tnrdmd_set_pid_ftr(struct cxd2880_tnrdmd *tnr_dmd, 327 struct cxd2880_tnrdmd_pid_ftr_cfg 328 *pid_ftr_cfg); 329 330 int cxd2880_tnrdmd_set_rf_lvl_cmpstn(struct cxd2880_tnrdmd 331 *tnr_dmd, 332 int (*rf_lvl_cmpstn) 333 (struct cxd2880_tnrdmd *, 334 int *)); 335 336 int cxd2880_tnrdmd_set_rf_lvl_cmpstn_sub(struct cxd2880_tnrdmd *tnr_dmd, 337 int (*rf_lvl_cmpstn) 338 (struct cxd2880_tnrdmd *, 339 int *)); 340 341 int cxd2880_tnrdmd_set_lna_thrs(struct cxd2880_tnrdmd *tnr_dmd, 342 struct 343 cxd2880_tnrdmd_lna_thrs_tbl_air 344 *tbl_air, 345 struct 346 cxd2880_tnrdmd_lna_thrs_tbl_cable 347 *tbl_cable); 348 349 int cxd2880_tnrdmd_set_lna_thrs_sub(struct cxd2880_tnrdmd *tnr_dmd, 350 struct 351 cxd2880_tnrdmd_lna_thrs_tbl_air 352 *tbl_air, 353 struct 354 cxd2880_tnrdmd_lna_thrs_tbl_cable 355 *tbl_cable); 356 357 int cxd2880_tnrdmd_set_ts_pin_high_low(struct cxd2880_tnrdmd 358 *tnr_dmd, u8 en, u8 value); 359 360 int cxd2880_tnrdmd_set_ts_output(struct cxd2880_tnrdmd *tnr_dmd, 361 u8 en); 362 363 int slvt_freeze_reg(struct cxd2880_tnrdmd *tnr_dmd); 364 365 #endif 366