^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Realtek RTL2832 DVB-T demodulator driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2012-2014 Antti Palosaari <crope@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "rtl2832_priv.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define REG_MASK(b) (BIT(b + 1) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) static const struct rtl2832_reg_entry registers[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) [DVBT_SOFT_RST] = {0x101, 2, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) [DVBT_IIC_REPEAT] = {0x101, 3, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) [DVBT_TR_WAIT_MIN_8K] = {0x188, 11, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) [DVBT_RSD_BER_FAIL_VAL] = {0x18f, 15, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) [DVBT_EN_BK_TRK] = {0x1a6, 7, 7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) [DVBT_AD_EN_REG] = {0x008, 7, 7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) [DVBT_AD_EN_REG1] = {0x008, 6, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) [DVBT_EN_BBIN] = {0x1b1, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) [DVBT_MGD_THD0] = {0x195, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) [DVBT_MGD_THD1] = {0x196, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) [DVBT_MGD_THD2] = {0x197, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) [DVBT_MGD_THD3] = {0x198, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) [DVBT_MGD_THD4] = {0x199, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) [DVBT_MGD_THD5] = {0x19a, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) [DVBT_MGD_THD6] = {0x19b, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) [DVBT_MGD_THD7] = {0x19c, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) [DVBT_EN_CACQ_NOTCH] = {0x161, 4, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) [DVBT_AD_AV_REF] = {0x009, 6, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) [DVBT_REG_PI] = {0x00a, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) [DVBT_PIP_ON] = {0x021, 3, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) [DVBT_SCALE1_B92] = {0x292, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) [DVBT_SCALE1_B93] = {0x293, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) [DVBT_SCALE1_BA7] = {0x2a7, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) [DVBT_SCALE1_BA9] = {0x2a9, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) [DVBT_SCALE1_BAA] = {0x2aa, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) [DVBT_SCALE1_BAB] = {0x2ab, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) [DVBT_SCALE1_BAC] = {0x2ac, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) [DVBT_SCALE1_BB0] = {0x2b0, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) [DVBT_SCALE1_BB1] = {0x2b1, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) [DVBT_KB_P1] = {0x164, 3, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) [DVBT_KB_P2] = {0x164, 6, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) [DVBT_KB_P3] = {0x165, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) [DVBT_OPT_ADC_IQ] = {0x006, 5, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) [DVBT_AD_AVI] = {0x009, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) [DVBT_AD_AVQ] = {0x009, 3, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) [DVBT_K1_CR_STEP12] = {0x2ad, 9, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) [DVBT_TRK_KS_P2] = {0x16f, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) [DVBT_TRK_KS_I2] = {0x170, 5, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) [DVBT_TR_THD_SET2] = {0x172, 3, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) [DVBT_TRK_KC_P2] = {0x173, 5, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) [DVBT_TRK_KC_I2] = {0x175, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) [DVBT_CR_THD_SET2] = {0x176, 7, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) [DVBT_PSET_IFFREQ] = {0x119, 21, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) [DVBT_SPEC_INV] = {0x115, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) [DVBT_RSAMP_RATIO] = {0x19f, 27, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) [DVBT_CFREQ_OFF_RATIO] = {0x19d, 23, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) [DVBT_FSM_STAGE] = {0x351, 6, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) [DVBT_RX_CONSTEL] = {0x33c, 3, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) [DVBT_RX_HIER] = {0x33c, 6, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) [DVBT_RX_C_RATE_LP] = {0x33d, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) [DVBT_RX_C_RATE_HP] = {0x33d, 5, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) [DVBT_GI_IDX] = {0x351, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) [DVBT_FFT_MODE_IDX] = {0x351, 2, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) [DVBT_RSD_BER_EST] = {0x34e, 15, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) [DVBT_CE_EST_EVM] = {0x40c, 15, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) [DVBT_RF_AGC_VAL] = {0x35b, 13, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) [DVBT_IF_AGC_VAL] = {0x359, 13, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) [DVBT_DAGC_VAL] = {0x305, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) [DVBT_SFREQ_OFF] = {0x318, 13, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) [DVBT_CFREQ_OFF] = {0x35f, 17, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) [DVBT_POLAR_RF_AGC] = {0x00e, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) [DVBT_POLAR_IF_AGC] = {0x00e, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) [DVBT_AAGC_HOLD] = {0x104, 5, 5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) [DVBT_EN_RF_AGC] = {0x104, 6, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) [DVBT_EN_IF_AGC] = {0x104, 7, 7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) [DVBT_IF_AGC_MIN] = {0x108, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) [DVBT_IF_AGC_MAX] = {0x109, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) [DVBT_RF_AGC_MIN] = {0x10a, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) [DVBT_RF_AGC_MAX] = {0x10b, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) [DVBT_IF_AGC_MAN] = {0x10c, 6, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) [DVBT_IF_AGC_MAN_VAL] = {0x10c, 13, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) [DVBT_RF_AGC_MAN] = {0x10e, 6, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) [DVBT_RF_AGC_MAN_VAL] = {0x10e, 13, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) [DVBT_DAGC_TRG_VAL] = {0x112, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) [DVBT_AGC_TARG_VAL_0] = {0x102, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) [DVBT_AGC_TARG_VAL_8_1] = {0x103, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) [DVBT_AAGC_LOOP_GAIN] = {0x1c7, 5, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) [DVBT_LOOP_GAIN2_3_0] = {0x104, 4, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) [DVBT_LOOP_GAIN2_4] = {0x105, 7, 7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) [DVBT_LOOP_GAIN3] = {0x1c8, 4, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) [DVBT_VTOP1] = {0x106, 5, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) [DVBT_VTOP2] = {0x1c9, 5, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) [DVBT_VTOP3] = {0x1ca, 5, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) [DVBT_KRF1] = {0x1cb, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) [DVBT_KRF2] = {0x107, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) [DVBT_KRF3] = {0x1cd, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) [DVBT_KRF4] = {0x1ce, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) [DVBT_EN_GI_PGA] = {0x1e5, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) [DVBT_THD_LOCK_UP] = {0x1d9, 8, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) [DVBT_THD_LOCK_DW] = {0x1db, 8, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) [DVBT_THD_UP1] = {0x1dd, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) [DVBT_THD_DW1] = {0x1de, 7, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) [DVBT_INTER_CNT_LEN] = {0x1d8, 3, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) [DVBT_GI_PGA_STATE] = {0x1e6, 3, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) [DVBT_EN_AGC_PGA] = {0x1d7, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) [DVBT_CKOUTPAR] = {0x17b, 5, 5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) [DVBT_CKOUT_PWR] = {0x17b, 6, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) [DVBT_SYNC_DUR] = {0x17b, 7, 7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) [DVBT_ERR_DUR] = {0x17c, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) [DVBT_SYNC_LVL] = {0x17c, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) [DVBT_ERR_LVL] = {0x17c, 2, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) [DVBT_VAL_LVL] = {0x17c, 3, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) [DVBT_SERIAL] = {0x17c, 4, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) [DVBT_SER_LSB] = {0x17c, 5, 5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) [DVBT_CDIV_PH0] = {0x17d, 3, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) [DVBT_CDIV_PH1] = {0x17d, 7, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) [DVBT_MPEG_IO_OPT_2_2] = {0x006, 7, 7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) [DVBT_MPEG_IO_OPT_1_0] = {0x007, 7, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) [DVBT_CKOUTPAR_PIP] = {0x0b7, 4, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) [DVBT_CKOUT_PWR_PIP] = {0x0b7, 3, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) [DVBT_SYNC_LVL_PIP] = {0x0b7, 2, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) [DVBT_ERR_LVL_PIP] = {0x0b7, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) [DVBT_VAL_LVL_PIP] = {0x0b7, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) [DVBT_CKOUTPAR_PID] = {0x0b9, 4, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) [DVBT_CKOUT_PWR_PID] = {0x0b9, 3, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) [DVBT_SYNC_LVL_PID] = {0x0b9, 2, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) [DVBT_ERR_LVL_PID] = {0x0b9, 1, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) [DVBT_VAL_LVL_PID] = {0x0b9, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) [DVBT_SM_PASS] = {0x193, 11, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) [DVBT_AD7_SETTING] = {0x011, 15, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) [DVBT_RSSI_R] = {0x301, 6, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) [DVBT_ACI_DET_IND] = {0x312, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) [DVBT_REG_MON] = {0x00d, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) [DVBT_REG_MONSEL] = {0x00d, 2, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) [DVBT_REG_GPE] = {0x00d, 7, 7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) [DVBT_REG_GPO] = {0x010, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) [DVBT_REG_4MSEL] = {0x013, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) u16 reg_start_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) u8 msb, lsb, reading[4], len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) u32 reading_tmp, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) reg_start_addr = registers[reg].start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) msb = registers[reg].msb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) lsb = registers[reg].lsb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) len = (msb >> 3) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) mask = REG_MASK(msb - lsb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) reading_tmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) for (i = 0; i < len; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) reading_tmp |= reading[i] << ((len - 1 - i) * 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) *val = (reading_tmp >> lsb) & mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) static int rtl2832_wr_demod_reg(struct rtl2832_dev *dev, int reg, u32 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) u16 reg_start_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u8 msb, lsb, reading[4], writing[4], len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) u32 reading_tmp, writing_tmp, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) reg_start_addr = registers[reg].start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) msb = registers[reg].msb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) lsb = registers[reg].lsb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) len = (msb >> 3) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) mask = REG_MASK(msb - lsb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) reading_tmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) for (i = 0; i < len; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) reading_tmp |= reading[i] << ((len - 1 - i) * 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) writing_tmp = reading_tmp & ~(mask << lsb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) writing_tmp |= ((val & mask) << lsb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) for (i = 0; i < len; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) ret = regmap_bulk_write(dev->regmap, reg_start_addr, writing, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) static int rtl2832_set_if(struct dvb_frontend *fe, u32 if_freq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) u64 pset_iffreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) u8 en_bbin = (if_freq == 0 ? 0x1 : 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * / CrystalFreqHz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) pset_iffreq = if_freq % dev->pdata->clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) pset_iffreq *= 0x400000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) pset_iffreq = div_u64(pset_iffreq, dev->pdata->clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) pset_iffreq = -pset_iffreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) pset_iffreq = pset_iffreq & 0x3fffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) dev_dbg(&client->dev, "if_frequency=%d pset_iffreq=%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) if_freq, (unsigned)pset_iffreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) ret = rtl2832_wr_demod_reg(dev, DVBT_EN_BBIN, en_bbin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ret = rtl2832_wr_demod_reg(dev, DVBT_PSET_IFFREQ, pset_iffreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) static int rtl2832_init(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) const struct rtl2832_reg_value *init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) int i, ret, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* initialization values for the demodulator registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) struct rtl2832_reg_value rtl2832_initial_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {DVBT_AD_EN_REG, 0x1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {DVBT_AD_EN_REG1, 0x1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {DVBT_RSD_BER_FAIL_VAL, 0x2800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) {DVBT_MGD_THD0, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {DVBT_MGD_THD1, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) {DVBT_MGD_THD2, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {DVBT_MGD_THD3, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {DVBT_MGD_THD4, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {DVBT_MGD_THD5, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) {DVBT_MGD_THD6, 0x37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {DVBT_MGD_THD7, 0x39},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) {DVBT_EN_BK_TRK, 0x0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {DVBT_EN_CACQ_NOTCH, 0x0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) {DVBT_AD_AV_REF, 0x2a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {DVBT_REG_PI, 0x6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {DVBT_PIP_ON, 0x0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) {DVBT_CDIV_PH0, 0x8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) {DVBT_CDIV_PH1, 0x8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) {DVBT_SCALE1_B92, 0x4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) {DVBT_SCALE1_B93, 0xb0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {DVBT_SCALE1_BA7, 0x78},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {DVBT_SCALE1_BA9, 0x28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) {DVBT_SCALE1_BAA, 0x59},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) {DVBT_SCALE1_BAB, 0x83},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {DVBT_SCALE1_BAC, 0xd4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {DVBT_SCALE1_BB0, 0x65},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {DVBT_SCALE1_BB1, 0x43},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) {DVBT_KB_P1, 0x1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) {DVBT_KB_P2, 0x4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) {DVBT_KB_P3, 0x7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) {DVBT_K1_CR_STEP12, 0xa},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) {DVBT_REG_GPE, 0x1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {DVBT_SERIAL, 0x0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {DVBT_CDIV_PH0, 0x9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) {DVBT_CDIV_PH1, 0x9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {DVBT_MPEG_IO_OPT_2_2, 0x0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) {DVBT_MPEG_IO_OPT_1_0, 0x0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {DVBT_TRK_KS_P2, 0x4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {DVBT_TRK_KS_I2, 0x7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {DVBT_TR_THD_SET2, 0x6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) {DVBT_TRK_KC_I2, 0x5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) {DVBT_CR_THD_SET2, 0x1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) rtl2832_initial_regs[i].value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) /* load tuner specific settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) dev_dbg(&client->dev, "load settings for tuner=%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) dev->pdata->tuner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) switch (dev->pdata->tuner) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) case RTL2832_TUNER_FC2580:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) len = ARRAY_SIZE(rtl2832_tuner_init_fc2580);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) init = rtl2832_tuner_init_fc2580;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) case RTL2832_TUNER_FC0012:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) case RTL2832_TUNER_FC0013:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) len = ARRAY_SIZE(rtl2832_tuner_init_fc0012);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) init = rtl2832_tuner_init_fc0012;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) case RTL2832_TUNER_TUA9001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) len = ARRAY_SIZE(rtl2832_tuner_init_tua9001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) init = rtl2832_tuner_init_tua9001;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) case RTL2832_TUNER_E4000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) len = ARRAY_SIZE(rtl2832_tuner_init_e4000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) init = rtl2832_tuner_init_e4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) case RTL2832_TUNER_R820T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) case RTL2832_TUNER_R828D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) len = ARRAY_SIZE(rtl2832_tuner_init_r820t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) init = rtl2832_tuner_init_r820t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) case RTL2832_TUNER_SI2157:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) len = ARRAY_SIZE(rtl2832_tuner_init_si2157);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) init = rtl2832_tuner_init_si2157;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) for (i = 0; i < len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) ret = rtl2832_wr_demod_reg(dev, init[i].reg, init[i].value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /* init stats here in order signal app which stats are supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) c->strength.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) c->cnr.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) c->post_bit_error.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) c->post_bit_count.len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) dev->sleeping = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) static int rtl2832_sleep(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) dev->sleeping = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) dev->fe_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) static int rtl2832_get_tune_settings(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) struct dvb_frontend_tune_settings *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) s->min_delay_ms = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) s->step_size = fe->ops.info.frequency_stepsize_hz * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) s->max_drift = (fe->ops.info.frequency_stepsize_hz * 2) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static int rtl2832_set_frontend(struct dvb_frontend *fe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct dtv_frontend_properties *c = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) int ret, i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) u64 bw_mode, num, num2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) u32 resamp_ratio, cfreq_off_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) static u8 bw_params[3][32] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) /* 6 MHz bandwidth */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 0x19, 0xe0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) /* 7 MHz bandwidth */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 0x19, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* 8 MHz bandwidth */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 0x19, 0xe0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) c->frequency, c->bandwidth_hz, c->inversion);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /* program tuner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) if (fe->ops.tuner_ops.set_params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) fe->ops.tuner_ops.set_params(fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /* If the frontend has get_if_frequency(), use it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) if (fe->ops.tuner_ops.get_if_frequency) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) u32 if_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) ret = rtl2832_set_if(fe, if_freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) switch (c->bandwidth_hz) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) case 6000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) bw_mode = 48000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) case 7000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) i = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) bw_mode = 56000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) case 8000000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) i = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) bw_mode = 64000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) dev_err(&client->dev, "invalid bandwidth_hz %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) c->bandwidth_hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) for (j = 0; j < sizeof(bw_params[0]); j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) ret = regmap_bulk_write(dev->regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 0x11c + j, &bw_params[i][j], 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) /* calculate and set resample ratio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) * / ConstWithBandwidthMode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) num = dev->pdata->clk * 7ULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) num *= 0x400000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) num = div_u64(num, bw_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) resamp_ratio = num & 0x3ffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) ret = rtl2832_wr_demod_reg(dev, DVBT_RSAMP_RATIO, resamp_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) /* calculate and set cfreq off ratio
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) * / (CrystalFreqHz * 7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) num = bw_mode << 20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) num2 = dev->pdata->clk * 7ULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) num = div_u64(num, num2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) num = -num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) cfreq_off_ratio = num & 0xfffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) ret = rtl2832_wr_demod_reg(dev, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) /* soft reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) static int rtl2832_get_frontend(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) struct dtv_frontend_properties *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) u8 buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) if (dev->sleeping)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) ret = regmap_bulk_read(dev->regmap, 0x33c, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) ret = regmap_bulk_read(dev->regmap, 0x351, &buf[2], 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) switch ((buf[0] >> 2) & 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) c->modulation = QPSK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) c->modulation = QAM_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) c->modulation = QAM_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) switch ((buf[2] >> 2) & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) c->transmission_mode = TRANSMISSION_MODE_2K;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) c->transmission_mode = TRANSMISSION_MODE_8K;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) switch ((buf[2] >> 0) & 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) c->guard_interval = GUARD_INTERVAL_1_32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) c->guard_interval = GUARD_INTERVAL_1_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) c->guard_interval = GUARD_INTERVAL_1_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) c->guard_interval = GUARD_INTERVAL_1_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) switch ((buf[0] >> 4) & 7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) c->hierarchy = HIERARCHY_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) c->hierarchy = HIERARCHY_1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) c->hierarchy = HIERARCHY_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) c->hierarchy = HIERARCHY_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) switch ((buf[1] >> 3) & 7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) c->code_rate_HP = FEC_1_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) c->code_rate_HP = FEC_2_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) c->code_rate_HP = FEC_3_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) c->code_rate_HP = FEC_5_6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) c->code_rate_HP = FEC_7_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) switch ((buf[1] >> 0) & 7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) c->code_rate_LP = FEC_1_2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) c->code_rate_LP = FEC_2_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) c->code_rate_LP = FEC_3_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) c->code_rate_LP = FEC_5_6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) c->code_rate_LP = FEC_7_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) struct dtv_frontend_properties *c = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) u32 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) u8 u8tmp, buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) u16 u16tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) *status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (dev->sleeping)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) ret = rtl2832_rd_demod_reg(dev, DVBT_FSM_STAGE, &tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) if (tmp == 11) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) } else if (tmp == 10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) FE_HAS_VITERBI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) dev->fe_status = *status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) /* signal strength */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) if (dev->fe_status & FE_HAS_SIGNAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) /* read digital AGC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) ret = regmap_bulk_read(dev->regmap, 0x305, &u8tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) dev_dbg(&client->dev, "digital agc=%02x", u8tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) u8tmp = ~u8tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) u16tmp = u8tmp << 8 | u8tmp << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) c->strength.stat[0].scale = FE_SCALE_RELATIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) c->strength.stat[0].uvalue = u16tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) /* CNR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) if (dev->fe_status & FE_HAS_VITERBI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) unsigned hierarchy, constellation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) #define CONSTELLATION_NUM 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) #define HIERARCHY_NUM 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {85387325, 85387325, 85387325, 85387325},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) {86676178, 86676178, 87167949, 87795660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) {87659938, 87659938, 87885178, 88241743},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) ret = regmap_bulk_read(dev->regmap, 0x33c, &u8tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) if (constellation > CONSTELLATION_NUM - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) if (hierarchy > HIERARCHY_NUM - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) ret = regmap_bulk_read(dev->regmap, 0x40c, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) u16tmp = buf[0] << 8 | buf[1] << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) if (u16tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) tmp = (constant[constellation][hierarchy] -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) intlog10(u16tmp)) / ((1 << 24) / 10000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) tmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) dev_dbg(&client->dev, "cnr raw=%u\n", u16tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) c->cnr.stat[0].svalue = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) /* BER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) if (dev->fe_status & FE_HAS_LOCK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) ret = regmap_bulk_read(dev->regmap, 0x34e, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) u16tmp = buf[0] << 8 | buf[1] << 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) dev->post_bit_error += u16tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) dev->post_bit_count += 1000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) dev_dbg(&client->dev, "ber errors=%u total=1000000\n", u16tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) struct dtv_frontend_properties *c = &fe->dtv_property_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) /* report SNR in resolution of 0.1 dB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) *snr = div_s64(c->cnr.stat[0].svalue, 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) *snr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) *ber = (dev->post_bit_error - dev->post_bit_error_prev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) dev->post_bit_error_prev = dev->post_bit_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) * I2C gate/mux/repeater logic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) * is delayed here a little bit in order to see if there is sequence of I2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) * messages sent to same I2C bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) static void rtl2832_i2c_gate_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, i2c_gate_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) /* close gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) static int rtl2832_select(struct i2c_mux_core *muxc, u32 chan_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) struct rtl2832_dev *dev = i2c_mux_priv(muxc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) /* terminate possible gate closing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) cancel_delayed_work(&dev->i2c_gate_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /* open gate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) static int rtl2832_deselect(struct i2c_mux_core *muxc, u32 chan_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) struct rtl2832_dev *dev = i2c_mux_priv(muxc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) schedule_delayed_work(&dev->i2c_gate_work, usecs_to_jiffies(100));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) static const struct dvb_frontend_ops rtl2832_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) .delsys = { SYS_DVBT },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) .info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) .name = "Realtek RTL2832 (DVB-T)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) .frequency_min_hz = 174 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) .frequency_max_hz = 862 * MHz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) .frequency_stepsize_hz = 166667,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) .caps = FE_CAN_FEC_1_2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) FE_CAN_FEC_2_3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) FE_CAN_FEC_3_4 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) FE_CAN_FEC_5_6 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) FE_CAN_FEC_7_8 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) FE_CAN_FEC_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) FE_CAN_QPSK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) FE_CAN_QAM_16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) FE_CAN_QAM_64 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) FE_CAN_QAM_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) FE_CAN_TRANSMISSION_MODE_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) FE_CAN_GUARD_INTERVAL_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) FE_CAN_HIERARCHY_AUTO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) FE_CAN_RECOVER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) FE_CAN_MUTE_TS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) .init = rtl2832_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) .sleep = rtl2832_sleep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) .get_tune_settings = rtl2832_get_tune_settings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) .set_frontend = rtl2832_set_frontend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) .get_frontend = rtl2832_get_frontend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) .read_status = rtl2832_read_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) .read_snr = rtl2832_read_snr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) .read_ber = rtl2832_read_ber,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) static bool rtl2832_volatile_reg(struct device *dev, unsigned int reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) switch (reg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) case 0x305:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) case 0x33c:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) case 0x34e:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) case 0x351:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) case 0x40c ... 0x40d:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) static struct dvb_frontend *rtl2832_get_dvb_frontend(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) struct rtl2832_dev *dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) return &dev->fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) static struct i2c_adapter *rtl2832_get_i2c_adapter(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) struct rtl2832_dev *dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) return dev->muxc->adapter[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) static int rtl2832_slave_ts_ctrl(struct i2c_client *client, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct rtl2832_dev *dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) dev_dbg(&client->dev, "enable=%d\n", enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) ret = regmap_bulk_write(dev->regmap, 0x10c, "\x5f\xff", 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x18", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) ret = regmap_bulk_write(dev->regmap, 0x192, "\x7f\xf7\xff", 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) ret = regmap_bulk_write(dev->regmap, 0x192, "\x00\x0f\xff", 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x08", 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) ret = regmap_bulk_write(dev->regmap, 0x10c, "\x00\x00", 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) dev->slave_ts = enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) static int rtl2832_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) u8 u8tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) dev_dbg(&client->dev, "onoff=%d, slave_ts=%d\n", onoff, dev->slave_ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) /* enable / disable PID filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) u8tmp = 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) u8tmp = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) if (dev->slave_ts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) ret = regmap_update_bits(dev->regmap, 0x021, 0xc0, u8tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) ret = regmap_update_bits(dev->regmap, 0x061, 0xc0, u8tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) int onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) struct rtl2832_dev *dev = fe->demodulator_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) struct i2c_client *client = dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) u8 buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d slave_ts=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) index, pid, onoff, dev->slave_ts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) /* skip invalid PIDs (0x2000) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) if (pid > 0x1fff || index > 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) if (onoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) set_bit(index, &dev->filters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) clear_bit(index, &dev->filters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) /* enable / disable PIDs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) buf[0] = (dev->filters >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) buf[1] = (dev->filters >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) buf[2] = (dev->filters >> 16) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) buf[3] = (dev->filters >> 24) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (dev->slave_ts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) ret = regmap_bulk_write(dev->regmap, 0x022, buf, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) ret = regmap_bulk_write(dev->regmap, 0x062, buf, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) /* add PID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) buf[0] = (pid >> 8) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) buf[1] = (pid >> 0) & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) if (dev->slave_ts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) ret = regmap_bulk_write(dev->regmap, 0x026 + 2 * index, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) ret = regmap_bulk_write(dev->regmap, 0x066 + 2 * index, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) static int rtl2832_probe(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) struct rtl2832_platform_data *pdata = client->dev.platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) struct i2c_adapter *i2c = client->adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) struct rtl2832_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) static const struct regmap_range_cfg regmap_range_cfg[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) .selector_reg = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) .selector_mask = 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) .selector_shift = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) .window_start = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) .window_len = 0x100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) .range_min = 0 * 0x100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) .range_max = 5 * 0x100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) /* allocate memory for the internal state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) dev = kzalloc(sizeof(struct rtl2832_dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (dev == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) /* setup the state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) i2c_set_clientdata(client, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) dev->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) dev->pdata = client->dev.platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) dev->sleeping = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) /* create regmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) dev->regmap_config.reg_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) dev->regmap_config.val_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) dev->regmap_config.volatile_reg = rtl2832_volatile_reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) dev->regmap_config.max_register = 5 * 0x100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) dev->regmap_config.ranges = regmap_range_cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) dev->regmap_config.num_ranges = ARRAY_SIZE(regmap_range_cfg),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) dev->regmap_config.cache_type = REGCACHE_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) dev->regmap = regmap_init_i2c(client, &dev->regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if (IS_ERR(dev->regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) ret = PTR_ERR(dev->regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) goto err_kfree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /* check if the demod is there */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) ret = regmap_bulk_read(dev->regmap, 0x000, &tmp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) goto err_regmap_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) /* create muxed i2c adapter for demod tuner bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) dev->muxc = i2c_mux_alloc(i2c, &i2c->dev, 1, 0, I2C_MUX_LOCKED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) rtl2832_select, rtl2832_deselect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) if (!dev->muxc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) goto err_regmap_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) dev->muxc->priv = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) ret = i2c_mux_add_adapter(dev->muxc, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) goto err_regmap_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) /* create dvb_frontend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) memcpy(&dev->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) dev->fe.demodulator_priv = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) /* setup callbacks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) pdata->get_i2c_adapter = rtl2832_get_i2c_adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) pdata->pid_filter = rtl2832_pid_filter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) pdata->regmap = dev->regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) err_regmap_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) regmap_exit(dev->regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) err_kfree:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) dev_dbg(&client->dev, "failed=%d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) static int rtl2832_remove(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) struct rtl2832_dev *dev = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) dev_dbg(&client->dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) cancel_delayed_work_sync(&dev->i2c_gate_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) i2c_mux_del_adapters(dev->muxc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) regmap_exit(dev->regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) static const struct i2c_device_id rtl2832_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {"rtl2832", 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) MODULE_DEVICE_TABLE(i2c, rtl2832_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) static struct i2c_driver rtl2832_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) .name = "rtl2832",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) .suppress_bind_attrs = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) .probe = rtl2832_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) .remove = rtl2832_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) .id_table = rtl2832_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) module_i2c_driver(rtl2832_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) MODULE_LICENSE("GPL");