0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "rtl2832_priv.h"
0010
0011 #define REG_MASK(b) (BIT(b + 1) - 1)
0012
0013 static const struct rtl2832_reg_entry registers[] = {
0014 [DVBT_SOFT_RST] = {0x101, 2, 2},
0015 [DVBT_IIC_REPEAT] = {0x101, 3, 3},
0016 [DVBT_TR_WAIT_MIN_8K] = {0x188, 11, 2},
0017 [DVBT_RSD_BER_FAIL_VAL] = {0x18f, 15, 0},
0018 [DVBT_EN_BK_TRK] = {0x1a6, 7, 7},
0019 [DVBT_AD_EN_REG] = {0x008, 7, 7},
0020 [DVBT_AD_EN_REG1] = {0x008, 6, 6},
0021 [DVBT_EN_BBIN] = {0x1b1, 0, 0},
0022 [DVBT_MGD_THD0] = {0x195, 7, 0},
0023 [DVBT_MGD_THD1] = {0x196, 7, 0},
0024 [DVBT_MGD_THD2] = {0x197, 7, 0},
0025 [DVBT_MGD_THD3] = {0x198, 7, 0},
0026 [DVBT_MGD_THD4] = {0x199, 7, 0},
0027 [DVBT_MGD_THD5] = {0x19a, 7, 0},
0028 [DVBT_MGD_THD6] = {0x19b, 7, 0},
0029 [DVBT_MGD_THD7] = {0x19c, 7, 0},
0030 [DVBT_EN_CACQ_NOTCH] = {0x161, 4, 4},
0031 [DVBT_AD_AV_REF] = {0x009, 6, 0},
0032 [DVBT_REG_PI] = {0x00a, 2, 0},
0033 [DVBT_PIP_ON] = {0x021, 3, 3},
0034 [DVBT_SCALE1_B92] = {0x292, 7, 0},
0035 [DVBT_SCALE1_B93] = {0x293, 7, 0},
0036 [DVBT_SCALE1_BA7] = {0x2a7, 7, 0},
0037 [DVBT_SCALE1_BA9] = {0x2a9, 7, 0},
0038 [DVBT_SCALE1_BAA] = {0x2aa, 7, 0},
0039 [DVBT_SCALE1_BAB] = {0x2ab, 7, 0},
0040 [DVBT_SCALE1_BAC] = {0x2ac, 7, 0},
0041 [DVBT_SCALE1_BB0] = {0x2b0, 7, 0},
0042 [DVBT_SCALE1_BB1] = {0x2b1, 7, 0},
0043 [DVBT_KB_P1] = {0x164, 3, 1},
0044 [DVBT_KB_P2] = {0x164, 6, 4},
0045 [DVBT_KB_P3] = {0x165, 2, 0},
0046 [DVBT_OPT_ADC_IQ] = {0x006, 5, 4},
0047 [DVBT_AD_AVI] = {0x009, 1, 0},
0048 [DVBT_AD_AVQ] = {0x009, 3, 2},
0049 [DVBT_K1_CR_STEP12] = {0x2ad, 9, 4},
0050 [DVBT_TRK_KS_P2] = {0x16f, 2, 0},
0051 [DVBT_TRK_KS_I2] = {0x170, 5, 3},
0052 [DVBT_TR_THD_SET2] = {0x172, 3, 0},
0053 [DVBT_TRK_KC_P2] = {0x173, 5, 3},
0054 [DVBT_TRK_KC_I2] = {0x175, 2, 0},
0055 [DVBT_CR_THD_SET2] = {0x176, 7, 6},
0056 [DVBT_PSET_IFFREQ] = {0x119, 21, 0},
0057 [DVBT_SPEC_INV] = {0x115, 0, 0},
0058 [DVBT_RSAMP_RATIO] = {0x19f, 27, 2},
0059 [DVBT_CFREQ_OFF_RATIO] = {0x19d, 23, 4},
0060 [DVBT_FSM_STAGE] = {0x351, 6, 3},
0061 [DVBT_RX_CONSTEL] = {0x33c, 3, 2},
0062 [DVBT_RX_HIER] = {0x33c, 6, 4},
0063 [DVBT_RX_C_RATE_LP] = {0x33d, 2, 0},
0064 [DVBT_RX_C_RATE_HP] = {0x33d, 5, 3},
0065 [DVBT_GI_IDX] = {0x351, 1, 0},
0066 [DVBT_FFT_MODE_IDX] = {0x351, 2, 2},
0067 [DVBT_RSD_BER_EST] = {0x34e, 15, 0},
0068 [DVBT_CE_EST_EVM] = {0x40c, 15, 0},
0069 [DVBT_RF_AGC_VAL] = {0x35b, 13, 0},
0070 [DVBT_IF_AGC_VAL] = {0x359, 13, 0},
0071 [DVBT_DAGC_VAL] = {0x305, 7, 0},
0072 [DVBT_SFREQ_OFF] = {0x318, 13, 0},
0073 [DVBT_CFREQ_OFF] = {0x35f, 17, 0},
0074 [DVBT_POLAR_RF_AGC] = {0x00e, 1, 1},
0075 [DVBT_POLAR_IF_AGC] = {0x00e, 0, 0},
0076 [DVBT_AAGC_HOLD] = {0x104, 5, 5},
0077 [DVBT_EN_RF_AGC] = {0x104, 6, 6},
0078 [DVBT_EN_IF_AGC] = {0x104, 7, 7},
0079 [DVBT_IF_AGC_MIN] = {0x108, 7, 0},
0080 [DVBT_IF_AGC_MAX] = {0x109, 7, 0},
0081 [DVBT_RF_AGC_MIN] = {0x10a, 7, 0},
0082 [DVBT_RF_AGC_MAX] = {0x10b, 7, 0},
0083 [DVBT_IF_AGC_MAN] = {0x10c, 6, 6},
0084 [DVBT_IF_AGC_MAN_VAL] = {0x10c, 13, 0},
0085 [DVBT_RF_AGC_MAN] = {0x10e, 6, 6},
0086 [DVBT_RF_AGC_MAN_VAL] = {0x10e, 13, 0},
0087 [DVBT_DAGC_TRG_VAL] = {0x112, 7, 0},
0088 [DVBT_AGC_TARG_VAL_0] = {0x102, 0, 0},
0089 [DVBT_AGC_TARG_VAL_8_1] = {0x103, 7, 0},
0090 [DVBT_AAGC_LOOP_GAIN] = {0x1c7, 5, 1},
0091 [DVBT_LOOP_GAIN2_3_0] = {0x104, 4, 1},
0092 [DVBT_LOOP_GAIN2_4] = {0x105, 7, 7},
0093 [DVBT_LOOP_GAIN3] = {0x1c8, 4, 0},
0094 [DVBT_VTOP1] = {0x106, 5, 0},
0095 [DVBT_VTOP2] = {0x1c9, 5, 0},
0096 [DVBT_VTOP3] = {0x1ca, 5, 0},
0097 [DVBT_KRF1] = {0x1cb, 7, 0},
0098 [DVBT_KRF2] = {0x107, 7, 0},
0099 [DVBT_KRF3] = {0x1cd, 7, 0},
0100 [DVBT_KRF4] = {0x1ce, 7, 0},
0101 [DVBT_EN_GI_PGA] = {0x1e5, 0, 0},
0102 [DVBT_THD_LOCK_UP] = {0x1d9, 8, 0},
0103 [DVBT_THD_LOCK_DW] = {0x1db, 8, 0},
0104 [DVBT_THD_UP1] = {0x1dd, 7, 0},
0105 [DVBT_THD_DW1] = {0x1de, 7, 0},
0106 [DVBT_INTER_CNT_LEN] = {0x1d8, 3, 0},
0107 [DVBT_GI_PGA_STATE] = {0x1e6, 3, 3},
0108 [DVBT_EN_AGC_PGA] = {0x1d7, 0, 0},
0109 [DVBT_CKOUTPAR] = {0x17b, 5, 5},
0110 [DVBT_CKOUT_PWR] = {0x17b, 6, 6},
0111 [DVBT_SYNC_DUR] = {0x17b, 7, 7},
0112 [DVBT_ERR_DUR] = {0x17c, 0, 0},
0113 [DVBT_SYNC_LVL] = {0x17c, 1, 1},
0114 [DVBT_ERR_LVL] = {0x17c, 2, 2},
0115 [DVBT_VAL_LVL] = {0x17c, 3, 3},
0116 [DVBT_SERIAL] = {0x17c, 4, 4},
0117 [DVBT_SER_LSB] = {0x17c, 5, 5},
0118 [DVBT_CDIV_PH0] = {0x17d, 3, 0},
0119 [DVBT_CDIV_PH1] = {0x17d, 7, 4},
0120 [DVBT_MPEG_IO_OPT_2_2] = {0x006, 7, 7},
0121 [DVBT_MPEG_IO_OPT_1_0] = {0x007, 7, 6},
0122 [DVBT_CKOUTPAR_PIP] = {0x0b7, 4, 4},
0123 [DVBT_CKOUT_PWR_PIP] = {0x0b7, 3, 3},
0124 [DVBT_SYNC_LVL_PIP] = {0x0b7, 2, 2},
0125 [DVBT_ERR_LVL_PIP] = {0x0b7, 1, 1},
0126 [DVBT_VAL_LVL_PIP] = {0x0b7, 0, 0},
0127 [DVBT_CKOUTPAR_PID] = {0x0b9, 4, 4},
0128 [DVBT_CKOUT_PWR_PID] = {0x0b9, 3, 3},
0129 [DVBT_SYNC_LVL_PID] = {0x0b9, 2, 2},
0130 [DVBT_ERR_LVL_PID] = {0x0b9, 1, 1},
0131 [DVBT_VAL_LVL_PID] = {0x0b9, 0, 0},
0132 [DVBT_SM_PASS] = {0x193, 11, 0},
0133 [DVBT_AD7_SETTING] = {0x011, 15, 0},
0134 [DVBT_RSSI_R] = {0x301, 6, 0},
0135 [DVBT_ACI_DET_IND] = {0x312, 0, 0},
0136 [DVBT_REG_MON] = {0x00d, 1, 0},
0137 [DVBT_REG_MONSEL] = {0x00d, 2, 2},
0138 [DVBT_REG_GPE] = {0x00d, 7, 7},
0139 [DVBT_REG_GPO] = {0x010, 0, 0},
0140 [DVBT_REG_4MSEL] = {0x013, 0, 0},
0141 };
0142
0143 static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val)
0144 {
0145 struct i2c_client *client = dev->client;
0146 int ret, i;
0147 u16 reg_start_addr;
0148 u8 msb, lsb, reading[4], len;
0149 u32 reading_tmp, mask;
0150
0151 reg_start_addr = registers[reg].start_address;
0152 msb = registers[reg].msb;
0153 lsb = registers[reg].lsb;
0154 len = (msb >> 3) + 1;
0155 mask = REG_MASK(msb - lsb);
0156
0157 ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len);
0158 if (ret)
0159 goto err;
0160
0161 reading_tmp = 0;
0162 for (i = 0; i < len; i++)
0163 reading_tmp |= reading[i] << ((len - 1 - i) * 8);
0164
0165 *val = (reading_tmp >> lsb) & mask;
0166
0167 return 0;
0168 err:
0169 dev_dbg(&client->dev, "failed=%d\n", ret);
0170 return ret;
0171 }
0172
0173 static int rtl2832_wr_demod_reg(struct rtl2832_dev *dev, int reg, u32 val)
0174 {
0175 struct i2c_client *client = dev->client;
0176 int ret, i;
0177 u16 reg_start_addr;
0178 u8 msb, lsb, reading[4], writing[4], len;
0179 u32 reading_tmp, writing_tmp, mask;
0180
0181 reg_start_addr = registers[reg].start_address;
0182 msb = registers[reg].msb;
0183 lsb = registers[reg].lsb;
0184 len = (msb >> 3) + 1;
0185 mask = REG_MASK(msb - lsb);
0186
0187 ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len);
0188 if (ret)
0189 goto err;
0190
0191 reading_tmp = 0;
0192 for (i = 0; i < len; i++)
0193 reading_tmp |= reading[i] << ((len - 1 - i) * 8);
0194
0195 writing_tmp = reading_tmp & ~(mask << lsb);
0196 writing_tmp |= ((val & mask) << lsb);
0197
0198 for (i = 0; i < len; i++)
0199 writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
0200
0201 ret = regmap_bulk_write(dev->regmap, reg_start_addr, writing, len);
0202 if (ret)
0203 goto err;
0204
0205 return 0;
0206 err:
0207 dev_dbg(&client->dev, "failed=%d\n", ret);
0208 return ret;
0209 }
0210
0211 static int rtl2832_set_if(struct dvb_frontend *fe, u32 if_freq)
0212 {
0213 struct rtl2832_dev *dev = fe->demodulator_priv;
0214 struct i2c_client *client = dev->client;
0215 int ret;
0216 u64 pset_iffreq;
0217 u8 en_bbin = (if_freq == 0 ? 0x1 : 0x0);
0218
0219
0220
0221
0222
0223 pset_iffreq = if_freq % dev->pdata->clk;
0224 pset_iffreq *= 0x400000;
0225 pset_iffreq = div_u64(pset_iffreq, dev->pdata->clk);
0226 pset_iffreq = -pset_iffreq;
0227 pset_iffreq = pset_iffreq & 0x3fffff;
0228 dev_dbg(&client->dev, "if_frequency=%d pset_iffreq=%08x\n",
0229 if_freq, (unsigned)pset_iffreq);
0230
0231 ret = rtl2832_wr_demod_reg(dev, DVBT_EN_BBIN, en_bbin);
0232 if (ret)
0233 goto err;
0234
0235 ret = rtl2832_wr_demod_reg(dev, DVBT_PSET_IFFREQ, pset_iffreq);
0236 if (ret)
0237 goto err;
0238
0239 return 0;
0240 err:
0241 dev_dbg(&client->dev, "failed=%d\n", ret);
0242 return ret;
0243 }
0244
0245 static int rtl2832_init(struct dvb_frontend *fe)
0246 {
0247 struct rtl2832_dev *dev = fe->demodulator_priv;
0248 struct i2c_client *client = dev->client;
0249 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
0250 const struct rtl2832_reg_value *init;
0251 int i, ret, len;
0252
0253 struct rtl2832_reg_value rtl2832_initial_regs[] = {
0254 {DVBT_AD_EN_REG, 0x1},
0255 {DVBT_AD_EN_REG1, 0x1},
0256 {DVBT_RSD_BER_FAIL_VAL, 0x2800},
0257 {DVBT_MGD_THD0, 0x10},
0258 {DVBT_MGD_THD1, 0x20},
0259 {DVBT_MGD_THD2, 0x20},
0260 {DVBT_MGD_THD3, 0x40},
0261 {DVBT_MGD_THD4, 0x22},
0262 {DVBT_MGD_THD5, 0x32},
0263 {DVBT_MGD_THD6, 0x37},
0264 {DVBT_MGD_THD7, 0x39},
0265 {DVBT_EN_BK_TRK, 0x0},
0266 {DVBT_EN_CACQ_NOTCH, 0x0},
0267 {DVBT_AD_AV_REF, 0x2a},
0268 {DVBT_REG_PI, 0x6},
0269 {DVBT_PIP_ON, 0x0},
0270 {DVBT_CDIV_PH0, 0x8},
0271 {DVBT_CDIV_PH1, 0x8},
0272 {DVBT_SCALE1_B92, 0x4},
0273 {DVBT_SCALE1_B93, 0xb0},
0274 {DVBT_SCALE1_BA7, 0x78},
0275 {DVBT_SCALE1_BA9, 0x28},
0276 {DVBT_SCALE1_BAA, 0x59},
0277 {DVBT_SCALE1_BAB, 0x83},
0278 {DVBT_SCALE1_BAC, 0xd4},
0279 {DVBT_SCALE1_BB0, 0x65},
0280 {DVBT_SCALE1_BB1, 0x43},
0281 {DVBT_KB_P1, 0x1},
0282 {DVBT_KB_P2, 0x4},
0283 {DVBT_KB_P3, 0x7},
0284 {DVBT_K1_CR_STEP12, 0xa},
0285 {DVBT_REG_GPE, 0x1},
0286 {DVBT_SERIAL, 0x0},
0287 {DVBT_CDIV_PH0, 0x9},
0288 {DVBT_CDIV_PH1, 0x9},
0289 {DVBT_MPEG_IO_OPT_2_2, 0x0},
0290 {DVBT_MPEG_IO_OPT_1_0, 0x0},
0291 {DVBT_TRK_KS_P2, 0x4},
0292 {DVBT_TRK_KS_I2, 0x7},
0293 {DVBT_TR_THD_SET2, 0x6},
0294 {DVBT_TRK_KC_I2, 0x5},
0295 {DVBT_CR_THD_SET2, 0x1},
0296 };
0297
0298 dev_dbg(&client->dev, "\n");
0299
0300 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
0301 if (ret)
0302 goto err;
0303
0304 for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
0305 ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
0306 rtl2832_initial_regs[i].value);
0307 if (ret)
0308 goto err;
0309 }
0310
0311
0312 dev_dbg(&client->dev, "load settings for tuner=%02x\n",
0313 dev->pdata->tuner);
0314 switch (dev->pdata->tuner) {
0315 case RTL2832_TUNER_FC2580:
0316 len = ARRAY_SIZE(rtl2832_tuner_init_fc2580);
0317 init = rtl2832_tuner_init_fc2580;
0318 break;
0319 case RTL2832_TUNER_FC0012:
0320 case RTL2832_TUNER_FC0013:
0321 len = ARRAY_SIZE(rtl2832_tuner_init_fc0012);
0322 init = rtl2832_tuner_init_fc0012;
0323 break;
0324 case RTL2832_TUNER_TUA9001:
0325 len = ARRAY_SIZE(rtl2832_tuner_init_tua9001);
0326 init = rtl2832_tuner_init_tua9001;
0327 break;
0328 case RTL2832_TUNER_E4000:
0329 len = ARRAY_SIZE(rtl2832_tuner_init_e4000);
0330 init = rtl2832_tuner_init_e4000;
0331 break;
0332 case RTL2832_TUNER_R820T:
0333 case RTL2832_TUNER_R828D:
0334 len = ARRAY_SIZE(rtl2832_tuner_init_r820t);
0335 init = rtl2832_tuner_init_r820t;
0336 break;
0337 case RTL2832_TUNER_SI2157:
0338 len = ARRAY_SIZE(rtl2832_tuner_init_si2157);
0339 init = rtl2832_tuner_init_si2157;
0340 break;
0341 default:
0342 ret = -EINVAL;
0343 goto err;
0344 }
0345
0346 for (i = 0; i < len; i++) {
0347 ret = rtl2832_wr_demod_reg(dev, init[i].reg, init[i].value);
0348 if (ret)
0349 goto err;
0350 }
0351
0352
0353 c->strength.len = 1;
0354 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0355 c->cnr.len = 1;
0356 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0357 c->post_bit_error.len = 1;
0358 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0359 c->post_bit_count.len = 1;
0360 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0361 dev->sleeping = false;
0362
0363 return 0;
0364 err:
0365 dev_dbg(&client->dev, "failed=%d\n", ret);
0366 return ret;
0367 }
0368
0369 static int rtl2832_sleep(struct dvb_frontend *fe)
0370 {
0371 struct rtl2832_dev *dev = fe->demodulator_priv;
0372 struct i2c_client *client = dev->client;
0373 int ret;
0374
0375 dev_dbg(&client->dev, "\n");
0376
0377 dev->sleeping = true;
0378 dev->fe_status = 0;
0379
0380 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
0381 if (ret)
0382 goto err;
0383
0384 return 0;
0385 err:
0386 dev_dbg(&client->dev, "failed=%d\n", ret);
0387 return ret;
0388 }
0389
0390 static int rtl2832_get_tune_settings(struct dvb_frontend *fe,
0391 struct dvb_frontend_tune_settings *s)
0392 {
0393 struct rtl2832_dev *dev = fe->demodulator_priv;
0394 struct i2c_client *client = dev->client;
0395
0396 dev_dbg(&client->dev, "\n");
0397 s->min_delay_ms = 1000;
0398 s->step_size = fe->ops.info.frequency_stepsize_hz * 2;
0399 s->max_drift = (fe->ops.info.frequency_stepsize_hz * 2) + 1;
0400 return 0;
0401 }
0402
0403 static int rtl2832_set_frontend(struct dvb_frontend *fe)
0404 {
0405 struct rtl2832_dev *dev = fe->demodulator_priv;
0406 struct i2c_client *client = dev->client;
0407 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0408 int ret, i, j;
0409 u64 bw_mode, num, num2;
0410 u32 resamp_ratio, cfreq_off_ratio;
0411 static u8 bw_params[3][32] = {
0412
0413 {
0414 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
0415 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
0416 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
0417 0x19, 0xe0,
0418 },
0419
0420
0421 {
0422 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
0423 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
0424 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
0425 0x19, 0x10,
0426 },
0427
0428
0429 {
0430 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
0431 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
0432 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
0433 0x19, 0xe0,
0434 },
0435 };
0436
0437 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
0438 c->frequency, c->bandwidth_hz, c->inversion);
0439
0440
0441 if (fe->ops.tuner_ops.set_params)
0442 fe->ops.tuner_ops.set_params(fe);
0443
0444
0445 if (fe->ops.tuner_ops.get_if_frequency) {
0446 u32 if_freq;
0447
0448 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
0449 if (ret)
0450 goto err;
0451
0452 ret = rtl2832_set_if(fe, if_freq);
0453 if (ret)
0454 goto err;
0455 }
0456
0457 switch (c->bandwidth_hz) {
0458 case 6000000:
0459 i = 0;
0460 bw_mode = 48000000;
0461 break;
0462 case 7000000:
0463 i = 1;
0464 bw_mode = 56000000;
0465 break;
0466 case 8000000:
0467 i = 2;
0468 bw_mode = 64000000;
0469 break;
0470 default:
0471 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
0472 c->bandwidth_hz);
0473 ret = -EINVAL;
0474 goto err;
0475 }
0476
0477 for (j = 0; j < sizeof(bw_params[0]); j++) {
0478 ret = regmap_bulk_write(dev->regmap,
0479 0x11c + j, &bw_params[i][j], 1);
0480 if (ret)
0481 goto err;
0482 }
0483
0484
0485
0486
0487
0488 num = dev->pdata->clk * 7ULL;
0489 num *= 0x400000;
0490 num = div_u64(num, bw_mode);
0491 resamp_ratio = num & 0x3ffffff;
0492 ret = rtl2832_wr_demod_reg(dev, DVBT_RSAMP_RATIO, resamp_ratio);
0493 if (ret)
0494 goto err;
0495
0496
0497
0498
0499
0500 num = bw_mode << 20;
0501 num2 = dev->pdata->clk * 7ULL;
0502 num = div_u64(num, num2);
0503 num = -num;
0504 cfreq_off_ratio = num & 0xfffff;
0505 ret = rtl2832_wr_demod_reg(dev, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
0506 if (ret)
0507 goto err;
0508
0509
0510 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
0511 if (ret)
0512 goto err;
0513
0514 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
0515 if (ret)
0516 goto err;
0517
0518 return 0;
0519 err:
0520 dev_dbg(&client->dev, "failed=%d\n", ret);
0521 return ret;
0522 }
0523
0524 static int rtl2832_get_frontend(struct dvb_frontend *fe,
0525 struct dtv_frontend_properties *c)
0526 {
0527 struct rtl2832_dev *dev = fe->demodulator_priv;
0528 struct i2c_client *client = dev->client;
0529 int ret;
0530 u8 buf[3];
0531
0532 if (dev->sleeping)
0533 return 0;
0534
0535 ret = regmap_bulk_read(dev->regmap, 0x33c, buf, 2);
0536 if (ret)
0537 goto err;
0538
0539 ret = regmap_bulk_read(dev->regmap, 0x351, &buf[2], 1);
0540 if (ret)
0541 goto err;
0542
0543 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
0544
0545 switch ((buf[0] >> 2) & 3) {
0546 case 0:
0547 c->modulation = QPSK;
0548 break;
0549 case 1:
0550 c->modulation = QAM_16;
0551 break;
0552 case 2:
0553 c->modulation = QAM_64;
0554 break;
0555 }
0556
0557 switch ((buf[2] >> 2) & 1) {
0558 case 0:
0559 c->transmission_mode = TRANSMISSION_MODE_2K;
0560 break;
0561 case 1:
0562 c->transmission_mode = TRANSMISSION_MODE_8K;
0563 }
0564
0565 switch ((buf[2] >> 0) & 3) {
0566 case 0:
0567 c->guard_interval = GUARD_INTERVAL_1_32;
0568 break;
0569 case 1:
0570 c->guard_interval = GUARD_INTERVAL_1_16;
0571 break;
0572 case 2:
0573 c->guard_interval = GUARD_INTERVAL_1_8;
0574 break;
0575 case 3:
0576 c->guard_interval = GUARD_INTERVAL_1_4;
0577 break;
0578 }
0579
0580 switch ((buf[0] >> 4) & 7) {
0581 case 0:
0582 c->hierarchy = HIERARCHY_NONE;
0583 break;
0584 case 1:
0585 c->hierarchy = HIERARCHY_1;
0586 break;
0587 case 2:
0588 c->hierarchy = HIERARCHY_2;
0589 break;
0590 case 3:
0591 c->hierarchy = HIERARCHY_4;
0592 break;
0593 }
0594
0595 switch ((buf[1] >> 3) & 7) {
0596 case 0:
0597 c->code_rate_HP = FEC_1_2;
0598 break;
0599 case 1:
0600 c->code_rate_HP = FEC_2_3;
0601 break;
0602 case 2:
0603 c->code_rate_HP = FEC_3_4;
0604 break;
0605 case 3:
0606 c->code_rate_HP = FEC_5_6;
0607 break;
0608 case 4:
0609 c->code_rate_HP = FEC_7_8;
0610 break;
0611 }
0612
0613 switch ((buf[1] >> 0) & 7) {
0614 case 0:
0615 c->code_rate_LP = FEC_1_2;
0616 break;
0617 case 1:
0618 c->code_rate_LP = FEC_2_3;
0619 break;
0620 case 2:
0621 c->code_rate_LP = FEC_3_4;
0622 break;
0623 case 3:
0624 c->code_rate_LP = FEC_5_6;
0625 break;
0626 case 4:
0627 c->code_rate_LP = FEC_7_8;
0628 break;
0629 }
0630
0631 return 0;
0632 err:
0633 dev_dbg(&client->dev, "failed=%d\n", ret);
0634 return ret;
0635 }
0636
0637 static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
0638 {
0639 struct rtl2832_dev *dev = fe->demodulator_priv;
0640 struct i2c_client *client = dev->client;
0641 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0642 int ret;
0643 u32 tmp;
0644 u8 u8tmp, buf[2];
0645 u16 u16tmp;
0646
0647 dev_dbg(&client->dev, "\n");
0648
0649 *status = 0;
0650 if (dev->sleeping)
0651 return 0;
0652
0653 ret = rtl2832_rd_demod_reg(dev, DVBT_FSM_STAGE, &tmp);
0654 if (ret)
0655 goto err;
0656
0657 if (tmp == 11) {
0658 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
0659 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
0660 } else if (tmp == 10) {
0661 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
0662 FE_HAS_VITERBI;
0663 }
0664
0665 dev->fe_status = *status;
0666
0667
0668 if (dev->fe_status & FE_HAS_SIGNAL) {
0669
0670 ret = regmap_bulk_read(dev->regmap, 0x305, &u8tmp, 1);
0671 if (ret)
0672 goto err;
0673
0674 dev_dbg(&client->dev, "digital agc=%02x", u8tmp);
0675
0676 u8tmp = ~u8tmp;
0677 u16tmp = u8tmp << 8 | u8tmp << 0;
0678
0679 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
0680 c->strength.stat[0].uvalue = u16tmp;
0681 } else {
0682 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0683 }
0684
0685
0686 if (dev->fe_status & FE_HAS_VITERBI) {
0687 unsigned hierarchy, constellation;
0688 #define CONSTELLATION_NUM 3
0689 #define HIERARCHY_NUM 4
0690 static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
0691 {85387325, 85387325, 85387325, 85387325},
0692 {86676178, 86676178, 87167949, 87795660},
0693 {87659938, 87659938, 87885178, 88241743},
0694 };
0695
0696 ret = regmap_bulk_read(dev->regmap, 0x33c, &u8tmp, 1);
0697 if (ret)
0698 goto err;
0699
0700 constellation = (u8tmp >> 2) & 0x03;
0701 ret = -EINVAL;
0702 if (constellation > CONSTELLATION_NUM - 1)
0703 goto err;
0704
0705 hierarchy = (u8tmp >> 4) & 0x07;
0706 if (hierarchy > HIERARCHY_NUM - 1)
0707 goto err;
0708
0709 ret = regmap_bulk_read(dev->regmap, 0x40c, buf, 2);
0710 if (ret)
0711 goto err;
0712
0713 u16tmp = buf[0] << 8 | buf[1] << 0;
0714 if (u16tmp)
0715 tmp = (constant[constellation][hierarchy] -
0716 intlog10(u16tmp)) / ((1 << 24) / 10000);
0717 else
0718 tmp = 0;
0719
0720 dev_dbg(&client->dev, "cnr raw=%u\n", u16tmp);
0721
0722 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
0723 c->cnr.stat[0].svalue = tmp;
0724 } else {
0725 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0726 }
0727
0728
0729 if (dev->fe_status & FE_HAS_LOCK) {
0730 ret = regmap_bulk_read(dev->regmap, 0x34e, buf, 2);
0731 if (ret)
0732 goto err;
0733
0734 u16tmp = buf[0] << 8 | buf[1] << 0;
0735 dev->post_bit_error += u16tmp;
0736 dev->post_bit_count += 1000000;
0737
0738 dev_dbg(&client->dev, "ber errors=%u total=1000000\n", u16tmp);
0739
0740 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
0741 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
0742 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
0743 c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
0744 } else {
0745 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0746 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
0747 }
0748
0749 return 0;
0750 err:
0751 dev_dbg(&client->dev, "failed=%d\n", ret);
0752 return ret;
0753 }
0754
0755 static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
0756 {
0757 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0758
0759
0760 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
0761 *snr = div_s64(c->cnr.stat[0].svalue, 100);
0762 else
0763 *snr = 0;
0764
0765 return 0;
0766 }
0767
0768 static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
0769 {
0770 struct rtl2832_dev *dev = fe->demodulator_priv;
0771
0772 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
0773 dev->post_bit_error_prev = dev->post_bit_error;
0774
0775 return 0;
0776 }
0777
0778
0779
0780
0781
0782
0783
0784 static void rtl2832_i2c_gate_work(struct work_struct *work)
0785 {
0786 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, i2c_gate_work.work);
0787 struct i2c_client *client = dev->client;
0788 int ret;
0789
0790
0791 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x00);
0792 if (ret)
0793 goto err;
0794
0795 return;
0796 err:
0797 dev_dbg(&client->dev, "failed=%d\n", ret);
0798 }
0799
0800 static int rtl2832_select(struct i2c_mux_core *muxc, u32 chan_id)
0801 {
0802 struct rtl2832_dev *dev = i2c_mux_priv(muxc);
0803 struct i2c_client *client = dev->client;
0804 int ret;
0805
0806
0807 cancel_delayed_work(&dev->i2c_gate_work);
0808
0809
0810 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
0811 if (ret)
0812 goto err;
0813
0814 return 0;
0815 err:
0816 dev_dbg(&client->dev, "failed=%d\n", ret);
0817 return ret;
0818 }
0819
0820 static int rtl2832_deselect(struct i2c_mux_core *muxc, u32 chan_id)
0821 {
0822 struct rtl2832_dev *dev = i2c_mux_priv(muxc);
0823
0824 schedule_delayed_work(&dev->i2c_gate_work, usecs_to_jiffies(100));
0825 return 0;
0826 }
0827
0828 static const struct dvb_frontend_ops rtl2832_ops = {
0829 .delsys = { SYS_DVBT },
0830 .info = {
0831 .name = "Realtek RTL2832 (DVB-T)",
0832 .frequency_min_hz = 174 * MHz,
0833 .frequency_max_hz = 862 * MHz,
0834 .frequency_stepsize_hz = 166667,
0835 .caps = FE_CAN_FEC_1_2 |
0836 FE_CAN_FEC_2_3 |
0837 FE_CAN_FEC_3_4 |
0838 FE_CAN_FEC_5_6 |
0839 FE_CAN_FEC_7_8 |
0840 FE_CAN_FEC_AUTO |
0841 FE_CAN_QPSK |
0842 FE_CAN_QAM_16 |
0843 FE_CAN_QAM_64 |
0844 FE_CAN_QAM_AUTO |
0845 FE_CAN_TRANSMISSION_MODE_AUTO |
0846 FE_CAN_GUARD_INTERVAL_AUTO |
0847 FE_CAN_HIERARCHY_AUTO |
0848 FE_CAN_RECOVER |
0849 FE_CAN_MUTE_TS
0850 },
0851
0852 .init = rtl2832_init,
0853 .sleep = rtl2832_sleep,
0854
0855 .get_tune_settings = rtl2832_get_tune_settings,
0856
0857 .set_frontend = rtl2832_set_frontend,
0858 .get_frontend = rtl2832_get_frontend,
0859
0860 .read_status = rtl2832_read_status,
0861 .read_snr = rtl2832_read_snr,
0862 .read_ber = rtl2832_read_ber,
0863 };
0864
0865 static bool rtl2832_volatile_reg(struct device *dev, unsigned int reg)
0866 {
0867 switch (reg) {
0868 case 0x305:
0869 case 0x33c:
0870 case 0x34e:
0871 case 0x351:
0872 case 0x40c ... 0x40d:
0873 return true;
0874 default:
0875 break;
0876 }
0877
0878 return false;
0879 }
0880
0881 static struct dvb_frontend *rtl2832_get_dvb_frontend(struct i2c_client *client)
0882 {
0883 struct rtl2832_dev *dev = i2c_get_clientdata(client);
0884
0885 dev_dbg(&client->dev, "\n");
0886 return &dev->fe;
0887 }
0888
0889 static struct i2c_adapter *rtl2832_get_i2c_adapter(struct i2c_client *client)
0890 {
0891 struct rtl2832_dev *dev = i2c_get_clientdata(client);
0892
0893 dev_dbg(&client->dev, "\n");
0894 return dev->muxc->adapter[0];
0895 }
0896
0897 static int rtl2832_slave_ts_ctrl(struct i2c_client *client, bool enable)
0898 {
0899 struct rtl2832_dev *dev = i2c_get_clientdata(client);
0900 int ret;
0901
0902 dev_dbg(&client->dev, "enable=%d\n", enable);
0903
0904 if (enable) {
0905 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
0906 if (ret)
0907 goto err;
0908 ret = regmap_bulk_write(dev->regmap, 0x10c, "\x5f\xff", 2);
0909 if (ret)
0910 goto err;
0911 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
0912 if (ret)
0913 goto err;
0914 ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x18", 1);
0915 if (ret)
0916 goto err;
0917 ret = regmap_bulk_write(dev->regmap, 0x192, "\x7f\xf7\xff", 3);
0918 if (ret)
0919 goto err;
0920 } else {
0921 ret = regmap_bulk_write(dev->regmap, 0x192, "\x00\x0f\xff", 3);
0922 if (ret)
0923 goto err;
0924 ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x08", 1);
0925 if (ret)
0926 goto err;
0927 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0);
0928 if (ret)
0929 goto err;
0930 ret = regmap_bulk_write(dev->regmap, 0x10c, "\x00\x00", 2);
0931 if (ret)
0932 goto err;
0933 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
0934 if (ret)
0935 goto err;
0936 }
0937
0938 dev->slave_ts = enable;
0939
0940 return 0;
0941 err:
0942 dev_dbg(&client->dev, "failed=%d\n", ret);
0943 return ret;
0944 }
0945
0946 static int rtl2832_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
0947 {
0948 struct rtl2832_dev *dev = fe->demodulator_priv;
0949 struct i2c_client *client = dev->client;
0950 int ret;
0951 u8 u8tmp;
0952
0953 dev_dbg(&client->dev, "onoff=%d, slave_ts=%d\n", onoff, dev->slave_ts);
0954
0955
0956 if (onoff)
0957 u8tmp = 0x80;
0958 else
0959 u8tmp = 0x00;
0960
0961 if (dev->slave_ts)
0962 ret = regmap_update_bits(dev->regmap, 0x021, 0xc0, u8tmp);
0963 else
0964 ret = regmap_update_bits(dev->regmap, 0x061, 0xc0, u8tmp);
0965 if (ret)
0966 goto err;
0967
0968 return 0;
0969 err:
0970 dev_dbg(&client->dev, "failed=%d\n", ret);
0971 return ret;
0972 }
0973
0974 static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid,
0975 int onoff)
0976 {
0977 struct rtl2832_dev *dev = fe->demodulator_priv;
0978 struct i2c_client *client = dev->client;
0979 int ret;
0980 u8 buf[4];
0981
0982 dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d slave_ts=%d\n",
0983 index, pid, onoff, dev->slave_ts);
0984
0985
0986 if (pid > 0x1fff || index > 32)
0987 return 0;
0988
0989 if (onoff)
0990 set_bit(index, &dev->filters);
0991 else
0992 clear_bit(index, &dev->filters);
0993
0994
0995 buf[0] = (dev->filters >> 0) & 0xff;
0996 buf[1] = (dev->filters >> 8) & 0xff;
0997 buf[2] = (dev->filters >> 16) & 0xff;
0998 buf[3] = (dev->filters >> 24) & 0xff;
0999
1000 if (dev->slave_ts)
1001 ret = regmap_bulk_write(dev->regmap, 0x022, buf, 4);
1002 else
1003 ret = regmap_bulk_write(dev->regmap, 0x062, buf, 4);
1004 if (ret)
1005 goto err;
1006
1007
1008 buf[0] = (pid >> 8) & 0xff;
1009 buf[1] = (pid >> 0) & 0xff;
1010
1011 if (dev->slave_ts)
1012 ret = regmap_bulk_write(dev->regmap, 0x026 + 2 * index, buf, 2);
1013 else
1014 ret = regmap_bulk_write(dev->regmap, 0x066 + 2 * index, buf, 2);
1015 if (ret)
1016 goto err;
1017
1018 return 0;
1019 err:
1020 dev_dbg(&client->dev, "failed=%d\n", ret);
1021 return ret;
1022 }
1023
1024 static int rtl2832_probe(struct i2c_client *client,
1025 const struct i2c_device_id *id)
1026 {
1027 struct rtl2832_platform_data *pdata = client->dev.platform_data;
1028 struct i2c_adapter *i2c = client->adapter;
1029 struct rtl2832_dev *dev;
1030 int ret;
1031 u8 tmp;
1032 static const struct regmap_range_cfg regmap_range_cfg[] = {
1033 {
1034 .selector_reg = 0x00,
1035 .selector_mask = 0xff,
1036 .selector_shift = 0,
1037 .window_start = 0,
1038 .window_len = 0x100,
1039 .range_min = 0 * 0x100,
1040 .range_max = 5 * 0x100,
1041 },
1042 };
1043
1044 dev_dbg(&client->dev, "\n");
1045
1046
1047 dev = kzalloc(sizeof(struct rtl2832_dev), GFP_KERNEL);
1048 if (dev == NULL) {
1049 ret = -ENOMEM;
1050 goto err;
1051 }
1052
1053
1054 i2c_set_clientdata(client, dev);
1055 dev->client = client;
1056 dev->pdata = client->dev.platform_data;
1057 dev->sleeping = true;
1058 INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work);
1059
1060 dev->regmap_config.reg_bits = 8;
1061 dev->regmap_config.val_bits = 8;
1062 dev->regmap_config.volatile_reg = rtl2832_volatile_reg;
1063 dev->regmap_config.max_register = 5 * 0x100;
1064 dev->regmap_config.ranges = regmap_range_cfg;
1065 dev->regmap_config.num_ranges = ARRAY_SIZE(regmap_range_cfg);
1066 dev->regmap_config.cache_type = REGCACHE_NONE;
1067 dev->regmap = regmap_init_i2c(client, &dev->regmap_config);
1068 if (IS_ERR(dev->regmap)) {
1069 ret = PTR_ERR(dev->regmap);
1070 goto err_kfree;
1071 }
1072
1073
1074 ret = regmap_bulk_read(dev->regmap, 0x000, &tmp, 1);
1075 if (ret)
1076 goto err_regmap_exit;
1077
1078
1079 dev->muxc = i2c_mux_alloc(i2c, &i2c->dev, 1, 0, I2C_MUX_LOCKED,
1080 rtl2832_select, rtl2832_deselect);
1081 if (!dev->muxc) {
1082 ret = -ENOMEM;
1083 goto err_regmap_exit;
1084 }
1085 dev->muxc->priv = dev;
1086 ret = i2c_mux_add_adapter(dev->muxc, 0, 0, 0);
1087 if (ret)
1088 goto err_regmap_exit;
1089
1090
1091 memcpy(&dev->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
1092 dev->fe.demodulator_priv = dev;
1093
1094
1095 pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
1096 pdata->get_i2c_adapter = rtl2832_get_i2c_adapter;
1097 pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl;
1098 pdata->pid_filter = rtl2832_pid_filter;
1099 pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
1100 pdata->regmap = dev->regmap;
1101
1102 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
1103 return 0;
1104 err_regmap_exit:
1105 regmap_exit(dev->regmap);
1106 err_kfree:
1107 kfree(dev);
1108 err:
1109 dev_dbg(&client->dev, "failed=%d\n", ret);
1110 return ret;
1111 }
1112
1113 static int rtl2832_remove(struct i2c_client *client)
1114 {
1115 struct rtl2832_dev *dev = i2c_get_clientdata(client);
1116
1117 dev_dbg(&client->dev, "\n");
1118
1119 cancel_delayed_work_sync(&dev->i2c_gate_work);
1120
1121 i2c_mux_del_adapters(dev->muxc);
1122
1123 regmap_exit(dev->regmap);
1124
1125 kfree(dev);
1126
1127 return 0;
1128 }
1129
1130 static const struct i2c_device_id rtl2832_id_table[] = {
1131 {"rtl2832", 0},
1132 {}
1133 };
1134 MODULE_DEVICE_TABLE(i2c, rtl2832_id_table);
1135
1136 static struct i2c_driver rtl2832_driver = {
1137 .driver = {
1138 .name = "rtl2832",
1139 .suppress_bind_attrs = true,
1140 },
1141 .probe = rtl2832_probe,
1142 .remove = rtl2832_remove,
1143 .id_table = rtl2832_id_table,
1144 };
1145
1146 module_i2c_driver(rtl2832_driver);
1147
1148 MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
1149 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1150 MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1151 MODULE_LICENSE("GPL");