0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/moduleparam.h>
0013 #include <linux/init.h>
0014 #include <linux/delay.h>
0015 #include <linux/firmware.h>
0016 #include <linux/i2c.h>
0017 #include <linux/hardirq.h>
0018 #include <asm/div64.h>
0019
0020 #include <media/dvb_frontend.h>
0021 #include "drxk.h"
0022 #include "drxk_hard.h"
0023 #include <media/dvb_math.h>
0024
0025 static int power_down_dvbt(struct drxk_state *state, bool set_power_mode);
0026 static int power_down_qam(struct drxk_state *state);
0027 static int set_dvbt_standard(struct drxk_state *state,
0028 enum operation_mode o_mode);
0029 static int set_qam_standard(struct drxk_state *state,
0030 enum operation_mode o_mode);
0031 static int set_qam(struct drxk_state *state, u16 intermediate_freqk_hz,
0032 s32 tuner_freq_offset);
0033 static int set_dvbt_standard(struct drxk_state *state,
0034 enum operation_mode o_mode);
0035 static int dvbt_start(struct drxk_state *state);
0036 static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
0037 s32 tuner_freq_offset);
0038 static int get_qam_lock_status(struct drxk_state *state, u32 *p_lock_status);
0039 static int get_dvbt_lock_status(struct drxk_state *state, u32 *p_lock_status);
0040 static int switch_antenna_to_qam(struct drxk_state *state);
0041 static int switch_antenna_to_dvbt(struct drxk_state *state);
0042
0043 static bool is_dvbt(struct drxk_state *state)
0044 {
0045 return state->m_operation_mode == OM_DVBT;
0046 }
0047
0048 static bool is_qam(struct drxk_state *state)
0049 {
0050 return state->m_operation_mode == OM_QAM_ITU_A ||
0051 state->m_operation_mode == OM_QAM_ITU_B ||
0052 state->m_operation_mode == OM_QAM_ITU_C;
0053 }
0054
0055 #define NOA1ROM 0
0056
0057 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
0058 #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
0059
0060 #define DEFAULT_MER_83 165
0061 #define DEFAULT_MER_93 250
0062
0063 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
0064 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
0065 #endif
0066
0067 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
0068 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
0069 #endif
0070
0071 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
0072 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
0073
0074 #ifndef DRXK_KI_RAGC_ATV
0075 #define DRXK_KI_RAGC_ATV 4
0076 #endif
0077 #ifndef DRXK_KI_IAGC_ATV
0078 #define DRXK_KI_IAGC_ATV 6
0079 #endif
0080 #ifndef DRXK_KI_DAGC_ATV
0081 #define DRXK_KI_DAGC_ATV 7
0082 #endif
0083
0084 #ifndef DRXK_KI_RAGC_QAM
0085 #define DRXK_KI_RAGC_QAM 3
0086 #endif
0087 #ifndef DRXK_KI_IAGC_QAM
0088 #define DRXK_KI_IAGC_QAM 4
0089 #endif
0090 #ifndef DRXK_KI_DAGC_QAM
0091 #define DRXK_KI_DAGC_QAM 7
0092 #endif
0093 #ifndef DRXK_KI_RAGC_DVBT
0094 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
0095 #endif
0096 #ifndef DRXK_KI_IAGC_DVBT
0097 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
0098 #endif
0099 #ifndef DRXK_KI_DAGC_DVBT
0100 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
0101 #endif
0102
0103 #ifndef DRXK_AGC_DAC_OFFSET
0104 #define DRXK_AGC_DAC_OFFSET (0x800)
0105 #endif
0106
0107 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
0108 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
0109 #endif
0110
0111 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
0112 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
0113 #endif
0114
0115 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
0116 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
0117 #endif
0118
0119 #ifndef DRXK_QAM_SYMBOLRATE_MAX
0120 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
0121 #endif
0122
0123 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
0124 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
0125 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
0126 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
0127 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
0128 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
0129 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
0130 #define DRXK_BL_ROM_OFFSET_UCODE 0
0131
0132 #define DRXK_BLC_TIMEOUT 100
0133
0134 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
0135 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
0136
0137 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
0138
0139 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
0140 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
0141 #endif
0142
0143 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
0144 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
0145 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
0146 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
0147 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
0148
0149 static unsigned int debug;
0150 module_param(debug, int, 0644);
0151 MODULE_PARM_DESC(debug, "enable debug messages");
0152
0153 #define dprintk(level, fmt, arg...) do { \
0154 if (debug >= level) \
0155 printk(KERN_DEBUG KBUILD_MODNAME ": %s " fmt, __func__, ##arg); \
0156 } while (0)
0157
0158 static inline u32 Frac28a(u32 a, u32 c)
0159 {
0160 int i = 0;
0161 u32 Q1 = 0;
0162 u32 R0 = 0;
0163
0164 R0 = (a % c) << 4;
0165 Q1 = a / c;
0166
0167
0168
0169
0170
0171 for (i = 0; i < 7; i++) {
0172 Q1 = (Q1 << 4) | (R0 / c);
0173 R0 = (R0 % c) << 4;
0174 }
0175
0176 if ((R0 >> 3) >= c)
0177 Q1++;
0178
0179 return Q1;
0180 }
0181
0182 static inline u32 log10times100(u32 value)
0183 {
0184 return (100L * intlog10(value)) >> 24;
0185 }
0186
0187
0188
0189
0190
0191 static int drxk_i2c_lock(struct drxk_state *state)
0192 {
0193 i2c_lock_bus(state->i2c, I2C_LOCK_SEGMENT);
0194 state->drxk_i2c_exclusive_lock = true;
0195
0196 return 0;
0197 }
0198
0199 static void drxk_i2c_unlock(struct drxk_state *state)
0200 {
0201 if (!state->drxk_i2c_exclusive_lock)
0202 return;
0203
0204 i2c_unlock_bus(state->i2c, I2C_LOCK_SEGMENT);
0205 state->drxk_i2c_exclusive_lock = false;
0206 }
0207
0208 static int drxk_i2c_transfer(struct drxk_state *state, struct i2c_msg *msgs,
0209 unsigned len)
0210 {
0211 if (state->drxk_i2c_exclusive_lock)
0212 return __i2c_transfer(state->i2c, msgs, len);
0213 else
0214 return i2c_transfer(state->i2c, msgs, len);
0215 }
0216
0217 static int i2c_read1(struct drxk_state *state, u8 adr, u8 *val)
0218 {
0219 struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
0220 .buf = val, .len = 1}
0221 };
0222
0223 return drxk_i2c_transfer(state, msgs, 1);
0224 }
0225
0226 static int i2c_write(struct drxk_state *state, u8 adr, u8 *data, int len)
0227 {
0228 int status;
0229 struct i2c_msg msg = {
0230 .addr = adr, .flags = 0, .buf = data, .len = len };
0231
0232 dprintk(3, ":");
0233 if (debug > 2) {
0234 int i;
0235 for (i = 0; i < len; i++)
0236 pr_cont(" %02x", data[i]);
0237 pr_cont("\n");
0238 }
0239 status = drxk_i2c_transfer(state, &msg, 1);
0240 if (status >= 0 && status != 1)
0241 status = -EIO;
0242
0243 if (status < 0)
0244 pr_err("i2c write error at addr 0x%02x\n", adr);
0245
0246 return status;
0247 }
0248
0249 static int i2c_read(struct drxk_state *state,
0250 u8 adr, u8 *msg, int len, u8 *answ, int alen)
0251 {
0252 int status;
0253 struct i2c_msg msgs[2] = {
0254 {.addr = adr, .flags = 0,
0255 .buf = msg, .len = len},
0256 {.addr = adr, .flags = I2C_M_RD,
0257 .buf = answ, .len = alen}
0258 };
0259
0260 status = drxk_i2c_transfer(state, msgs, 2);
0261 if (status != 2) {
0262 if (debug > 2)
0263 pr_cont(": ERROR!\n");
0264 if (status >= 0)
0265 status = -EIO;
0266
0267 pr_err("i2c read error at addr 0x%02x\n", adr);
0268 return status;
0269 }
0270 if (debug > 2) {
0271 int i;
0272 dprintk(2, ": read from");
0273 for (i = 0; i < len; i++)
0274 pr_cont(" %02x", msg[i]);
0275 pr_cont(", value = ");
0276 for (i = 0; i < alen; i++)
0277 pr_cont(" %02x", answ[i]);
0278 pr_cont("\n");
0279 }
0280 return 0;
0281 }
0282
0283 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
0284 {
0285 int status;
0286 u8 adr = state->demod_address, mm1[4], mm2[2], len;
0287
0288 if (state->single_master)
0289 flags |= 0xC0;
0290
0291 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
0292 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
0293 mm1[1] = ((reg >> 16) & 0xFF);
0294 mm1[2] = ((reg >> 24) & 0xFF) | flags;
0295 mm1[3] = ((reg >> 7) & 0xFF);
0296 len = 4;
0297 } else {
0298 mm1[0] = ((reg << 1) & 0xFF);
0299 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
0300 len = 2;
0301 }
0302 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
0303 status = i2c_read(state, adr, mm1, len, mm2, 2);
0304 if (status < 0)
0305 return status;
0306 if (data)
0307 *data = mm2[0] | (mm2[1] << 8);
0308
0309 return 0;
0310 }
0311
0312 static int read16(struct drxk_state *state, u32 reg, u16 *data)
0313 {
0314 return read16_flags(state, reg, data, 0);
0315 }
0316
0317 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
0318 {
0319 int status;
0320 u8 adr = state->demod_address, mm1[4], mm2[4], len;
0321
0322 if (state->single_master)
0323 flags |= 0xC0;
0324
0325 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
0326 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
0327 mm1[1] = ((reg >> 16) & 0xFF);
0328 mm1[2] = ((reg >> 24) & 0xFF) | flags;
0329 mm1[3] = ((reg >> 7) & 0xFF);
0330 len = 4;
0331 } else {
0332 mm1[0] = ((reg << 1) & 0xFF);
0333 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
0334 len = 2;
0335 }
0336 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
0337 status = i2c_read(state, adr, mm1, len, mm2, 4);
0338 if (status < 0)
0339 return status;
0340 if (data)
0341 *data = mm2[0] | (mm2[1] << 8) |
0342 (mm2[2] << 16) | (mm2[3] << 24);
0343
0344 return 0;
0345 }
0346
0347 static int read32(struct drxk_state *state, u32 reg, u32 *data)
0348 {
0349 return read32_flags(state, reg, data, 0);
0350 }
0351
0352 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
0353 {
0354 u8 adr = state->demod_address, mm[6], len;
0355
0356 if (state->single_master)
0357 flags |= 0xC0;
0358 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
0359 mm[0] = (((reg << 1) & 0xFF) | 0x01);
0360 mm[1] = ((reg >> 16) & 0xFF);
0361 mm[2] = ((reg >> 24) & 0xFF) | flags;
0362 mm[3] = ((reg >> 7) & 0xFF);
0363 len = 4;
0364 } else {
0365 mm[0] = ((reg << 1) & 0xFF);
0366 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
0367 len = 2;
0368 }
0369 mm[len] = data & 0xff;
0370 mm[len + 1] = (data >> 8) & 0xff;
0371
0372 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
0373 return i2c_write(state, adr, mm, len + 2);
0374 }
0375
0376 static int write16(struct drxk_state *state, u32 reg, u16 data)
0377 {
0378 return write16_flags(state, reg, data, 0);
0379 }
0380
0381 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
0382 {
0383 u8 adr = state->demod_address, mm[8], len;
0384
0385 if (state->single_master)
0386 flags |= 0xC0;
0387 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
0388 mm[0] = (((reg << 1) & 0xFF) | 0x01);
0389 mm[1] = ((reg >> 16) & 0xFF);
0390 mm[2] = ((reg >> 24) & 0xFF) | flags;
0391 mm[3] = ((reg >> 7) & 0xFF);
0392 len = 4;
0393 } else {
0394 mm[0] = ((reg << 1) & 0xFF);
0395 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
0396 len = 2;
0397 }
0398 mm[len] = data & 0xff;
0399 mm[len + 1] = (data >> 8) & 0xff;
0400 mm[len + 2] = (data >> 16) & 0xff;
0401 mm[len + 3] = (data >> 24) & 0xff;
0402 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
0403
0404 return i2c_write(state, adr, mm, len + 4);
0405 }
0406
0407 static int write32(struct drxk_state *state, u32 reg, u32 data)
0408 {
0409 return write32_flags(state, reg, data, 0);
0410 }
0411
0412 static int write_block(struct drxk_state *state, u32 address,
0413 const int block_size, const u8 p_block[])
0414 {
0415 int status = 0, blk_size = block_size;
0416 u8 flags = 0;
0417
0418 if (state->single_master)
0419 flags |= 0xC0;
0420
0421 while (blk_size > 0) {
0422 int chunk = blk_size > state->m_chunk_size ?
0423 state->m_chunk_size : blk_size;
0424 u8 *adr_buf = &state->chunk[0];
0425 u32 adr_length = 0;
0426
0427 if (DRXDAP_FASI_LONG_FORMAT(address) || (flags != 0)) {
0428 adr_buf[0] = (((address << 1) & 0xFF) | 0x01);
0429 adr_buf[1] = ((address >> 16) & 0xFF);
0430 adr_buf[2] = ((address >> 24) & 0xFF);
0431 adr_buf[3] = ((address >> 7) & 0xFF);
0432 adr_buf[2] |= flags;
0433 adr_length = 4;
0434 if (chunk == state->m_chunk_size)
0435 chunk -= 2;
0436 } else {
0437 adr_buf[0] = ((address << 1) & 0xFF);
0438 adr_buf[1] = (((address >> 16) & 0x0F) |
0439 ((address >> 18) & 0xF0));
0440 adr_length = 2;
0441 }
0442 memcpy(&state->chunk[adr_length], p_block, chunk);
0443 dprintk(2, "(0x%08x, 0x%02x)\n", address, flags);
0444 if (debug > 1) {
0445 int i;
0446 if (p_block)
0447 for (i = 0; i < chunk; i++)
0448 pr_cont(" %02x", p_block[i]);
0449 pr_cont("\n");
0450 }
0451 status = i2c_write(state, state->demod_address,
0452 &state->chunk[0], chunk + adr_length);
0453 if (status < 0) {
0454 pr_err("%s: i2c write error at addr 0x%02x\n",
0455 __func__, address);
0456 break;
0457 }
0458 p_block += chunk;
0459 address += (chunk >> 1);
0460 blk_size -= chunk;
0461 }
0462 return status;
0463 }
0464
0465 #ifndef DRXK_MAX_RETRIES_POWERUP
0466 #define DRXK_MAX_RETRIES_POWERUP 20
0467 #endif
0468
0469 static int power_up_device(struct drxk_state *state)
0470 {
0471 int status;
0472 u8 data = 0;
0473 u16 retry_count = 0;
0474
0475 dprintk(1, "\n");
0476
0477 status = i2c_read1(state, state->demod_address, &data);
0478 if (status < 0) {
0479 do {
0480 data = 0;
0481 status = i2c_write(state, state->demod_address,
0482 &data, 1);
0483 usleep_range(10000, 11000);
0484 retry_count++;
0485 if (status < 0)
0486 continue;
0487 status = i2c_read1(state, state->demod_address,
0488 &data);
0489 } while (status < 0 &&
0490 (retry_count < DRXK_MAX_RETRIES_POWERUP));
0491 if (status < 0 && retry_count >= DRXK_MAX_RETRIES_POWERUP)
0492 goto error;
0493 }
0494
0495
0496 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
0497 if (status < 0)
0498 goto error;
0499 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
0500 if (status < 0)
0501 goto error;
0502
0503 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
0504 if (status < 0)
0505 goto error;
0506
0507 state->m_current_power_mode = DRX_POWER_UP;
0508
0509 error:
0510 if (status < 0)
0511 pr_err("Error %d on %s\n", status, __func__);
0512
0513 return status;
0514 }
0515
0516
0517 static int init_state(struct drxk_state *state)
0518 {
0519
0520
0521
0522
0523 u32 ul_vsb_if_agc_mode = DRXK_AGC_CTRL_AUTO;
0524 u32 ul_vsb_if_agc_output_level = 0;
0525 u32 ul_vsb_if_agc_min_level = 0;
0526 u32 ul_vsb_if_agc_max_level = 0x7FFF;
0527 u32 ul_vsb_if_agc_speed = 3;
0528
0529 u32 ul_vsb_rf_agc_mode = DRXK_AGC_CTRL_AUTO;
0530 u32 ul_vsb_rf_agc_output_level = 0;
0531 u32 ul_vsb_rf_agc_min_level = 0;
0532 u32 ul_vsb_rf_agc_max_level = 0x7FFF;
0533 u32 ul_vsb_rf_agc_speed = 3;
0534 u32 ul_vsb_rf_agc_top = 9500;
0535 u32 ul_vsb_rf_agc_cut_off_current = 4000;
0536
0537 u32 ul_atv_if_agc_mode = DRXK_AGC_CTRL_AUTO;
0538 u32 ul_atv_if_agc_output_level = 0;
0539 u32 ul_atv_if_agc_min_level = 0;
0540 u32 ul_atv_if_agc_max_level = 0;
0541 u32 ul_atv_if_agc_speed = 3;
0542
0543 u32 ul_atv_rf_agc_mode = DRXK_AGC_CTRL_OFF;
0544 u32 ul_atv_rf_agc_output_level = 0;
0545 u32 ul_atv_rf_agc_min_level = 0;
0546 u32 ul_atv_rf_agc_max_level = 0;
0547 u32 ul_atv_rf_agc_top = 9500;
0548 u32 ul_atv_rf_agc_cut_off_current = 4000;
0549 u32 ul_atv_rf_agc_speed = 3;
0550
0551 u32 ulQual83 = DEFAULT_MER_83;
0552 u32 ulQual93 = DEFAULT_MER_93;
0553
0554 u32 ul_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
0555 u32 ul_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
0556
0557
0558
0559
0560 u32 ul_gpio_cfg = 0x0113;
0561 u32 ul_invert_ts_clock = 0;
0562 u32 ul_ts_data_strength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
0563 u32 ul_dvbt_bitrate = 50000000;
0564 u32 ul_dvbc_bitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
0565
0566 u32 ul_insert_rs_byte = 0;
0567
0568 u32 ul_rf_mirror = 1;
0569 u32 ul_power_down = 0;
0570
0571 dprintk(1, "\n");
0572
0573 state->m_has_lna = false;
0574 state->m_has_dvbt = false;
0575 state->m_has_dvbc = false;
0576 state->m_has_atv = false;
0577 state->m_has_oob = false;
0578 state->m_has_audio = false;
0579
0580 if (!state->m_chunk_size)
0581 state->m_chunk_size = 124;
0582
0583 state->m_osc_clock_freq = 0;
0584 state->m_smart_ant_inverted = false;
0585 state->m_b_p_down_open_bridge = false;
0586
0587
0588 state->m_sys_clock_freq = 151875;
0589
0590
0591 state->m_hi_cfg_timing_div = ((state->m_sys_clock_freq / 1000) *
0592 HI_I2C_DELAY) / 1000;
0593
0594 if (state->m_hi_cfg_timing_div > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
0595 state->m_hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
0596 state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
0597
0598 state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
0599
0600 state->m_b_power_down = (ul_power_down != 0);
0601
0602 state->m_drxk_a3_patch_code = false;
0603
0604
0605
0606 state->m_vsb_if_agc_cfg.ctrl_mode = ul_vsb_if_agc_mode;
0607 state->m_vsb_if_agc_cfg.output_level = ul_vsb_if_agc_output_level;
0608 state->m_vsb_if_agc_cfg.min_output_level = ul_vsb_if_agc_min_level;
0609 state->m_vsb_if_agc_cfg.max_output_level = ul_vsb_if_agc_max_level;
0610 state->m_vsb_if_agc_cfg.speed = ul_vsb_if_agc_speed;
0611 state->m_vsb_pga_cfg = 140;
0612
0613
0614 state->m_vsb_rf_agc_cfg.ctrl_mode = ul_vsb_rf_agc_mode;
0615 state->m_vsb_rf_agc_cfg.output_level = ul_vsb_rf_agc_output_level;
0616 state->m_vsb_rf_agc_cfg.min_output_level = ul_vsb_rf_agc_min_level;
0617 state->m_vsb_rf_agc_cfg.max_output_level = ul_vsb_rf_agc_max_level;
0618 state->m_vsb_rf_agc_cfg.speed = ul_vsb_rf_agc_speed;
0619 state->m_vsb_rf_agc_cfg.top = ul_vsb_rf_agc_top;
0620 state->m_vsb_rf_agc_cfg.cut_off_current = ul_vsb_rf_agc_cut_off_current;
0621 state->m_vsb_pre_saw_cfg.reference = 0x07;
0622 state->m_vsb_pre_saw_cfg.use_pre_saw = true;
0623
0624 state->m_Quality83percent = DEFAULT_MER_83;
0625 state->m_Quality93percent = DEFAULT_MER_93;
0626 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
0627 state->m_Quality83percent = ulQual83;
0628 state->m_Quality93percent = ulQual93;
0629 }
0630
0631
0632 state->m_atv_if_agc_cfg.ctrl_mode = ul_atv_if_agc_mode;
0633 state->m_atv_if_agc_cfg.output_level = ul_atv_if_agc_output_level;
0634 state->m_atv_if_agc_cfg.min_output_level = ul_atv_if_agc_min_level;
0635 state->m_atv_if_agc_cfg.max_output_level = ul_atv_if_agc_max_level;
0636 state->m_atv_if_agc_cfg.speed = ul_atv_if_agc_speed;
0637
0638
0639 state->m_atv_rf_agc_cfg.ctrl_mode = ul_atv_rf_agc_mode;
0640 state->m_atv_rf_agc_cfg.output_level = ul_atv_rf_agc_output_level;
0641 state->m_atv_rf_agc_cfg.min_output_level = ul_atv_rf_agc_min_level;
0642 state->m_atv_rf_agc_cfg.max_output_level = ul_atv_rf_agc_max_level;
0643 state->m_atv_rf_agc_cfg.speed = ul_atv_rf_agc_speed;
0644 state->m_atv_rf_agc_cfg.top = ul_atv_rf_agc_top;
0645 state->m_atv_rf_agc_cfg.cut_off_current = ul_atv_rf_agc_cut_off_current;
0646 state->m_atv_pre_saw_cfg.reference = 0x04;
0647 state->m_atv_pre_saw_cfg.use_pre_saw = true;
0648
0649
0650
0651 state->m_dvbt_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
0652 state->m_dvbt_rf_agc_cfg.output_level = 0;
0653 state->m_dvbt_rf_agc_cfg.min_output_level = 0;
0654 state->m_dvbt_rf_agc_cfg.max_output_level = 0xFFFF;
0655 state->m_dvbt_rf_agc_cfg.top = 0x2100;
0656 state->m_dvbt_rf_agc_cfg.cut_off_current = 4000;
0657 state->m_dvbt_rf_agc_cfg.speed = 1;
0658
0659
0660
0661 state->m_dvbt_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
0662 state->m_dvbt_if_agc_cfg.output_level = 0;
0663 state->m_dvbt_if_agc_cfg.min_output_level = 0;
0664 state->m_dvbt_if_agc_cfg.max_output_level = 9000;
0665 state->m_dvbt_if_agc_cfg.top = 13424;
0666 state->m_dvbt_if_agc_cfg.cut_off_current = 0;
0667 state->m_dvbt_if_agc_cfg.speed = 3;
0668 state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay = 30;
0669 state->m_dvbt_if_agc_cfg.ingain_tgt_max = 30000;
0670
0671
0672 state->m_dvbt_pre_saw_cfg.reference = 4;
0673 state->m_dvbt_pre_saw_cfg.use_pre_saw = false;
0674
0675
0676 state->m_qam_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
0677 state->m_qam_rf_agc_cfg.output_level = 0;
0678 state->m_qam_rf_agc_cfg.min_output_level = 6023;
0679 state->m_qam_rf_agc_cfg.max_output_level = 27000;
0680 state->m_qam_rf_agc_cfg.top = 0x2380;
0681 state->m_qam_rf_agc_cfg.cut_off_current = 4000;
0682 state->m_qam_rf_agc_cfg.speed = 3;
0683
0684
0685 state->m_qam_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
0686 state->m_qam_if_agc_cfg.output_level = 0;
0687 state->m_qam_if_agc_cfg.min_output_level = 0;
0688 state->m_qam_if_agc_cfg.max_output_level = 9000;
0689 state->m_qam_if_agc_cfg.top = 0x0511;
0690 state->m_qam_if_agc_cfg.cut_off_current = 0;
0691 state->m_qam_if_agc_cfg.speed = 3;
0692 state->m_qam_if_agc_cfg.ingain_tgt_max = 5119;
0693 state->m_qam_if_agc_cfg.fast_clip_ctrl_delay = 50;
0694
0695 state->m_qam_pga_cfg = 140;
0696 state->m_qam_pre_saw_cfg.reference = 4;
0697 state->m_qam_pre_saw_cfg.use_pre_saw = false;
0698
0699 state->m_operation_mode = OM_NONE;
0700 state->m_drxk_state = DRXK_UNINITIALIZED;
0701
0702
0703 state->m_enable_mpeg_output = true;
0704 state->m_insert_rs_byte = false;
0705 state->m_invert_data = false;
0706 state->m_invert_err = false;
0707 state->m_invert_str = false;
0708 state->m_invert_val = false;
0709 state->m_invert_clk = (ul_invert_ts_clock != 0);
0710
0711
0712
0713
0714 state->m_dvbt_bitrate = ul_dvbt_bitrate;
0715 state->m_dvbc_bitrate = ul_dvbc_bitrate;
0716
0717 state->m_ts_data_strength = (ul_ts_data_strength & 0x07);
0718
0719
0720 state->m_mpeg_ts_static_bitrate = 19392658;
0721 state->m_disable_te_ihandling = false;
0722
0723 if (ul_insert_rs_byte)
0724 state->m_insert_rs_byte = true;
0725
0726 state->m_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
0727 if (ul_mpeg_lock_time_out < 10000)
0728 state->m_mpeg_lock_time_out = ul_mpeg_lock_time_out;
0729 state->m_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
0730 if (ul_demod_lock_time_out < 10000)
0731 state->m_demod_lock_time_out = ul_demod_lock_time_out;
0732
0733
0734 state->m_constellation = DRX_CONSTELLATION_AUTO;
0735 state->m_qam_interleave_mode = DRXK_QAM_I12_J17;
0736 state->m_fec_rs_plen = 204 * 8;
0737 state->m_fec_rs_prescale = 1;
0738
0739 state->m_sqi_speed = DRXK_DVBT_SQI_SPEED_MEDIUM;
0740 state->m_agcfast_clip_ctrl_delay = 0;
0741
0742 state->m_gpio_cfg = ul_gpio_cfg;
0743
0744 state->m_b_power_down = false;
0745 state->m_current_power_mode = DRX_POWER_DOWN;
0746
0747 state->m_rfmirror = (ul_rf_mirror == 0);
0748 state->m_if_agc_pol = false;
0749 return 0;
0750 }
0751
0752 static int drxx_open(struct drxk_state *state)
0753 {
0754 int status = 0;
0755 u32 jtag = 0;
0756 u16 bid = 0;
0757 u16 key = 0;
0758
0759 dprintk(1, "\n");
0760
0761 status = write16(state, SCU_RAM_GPIO__A,
0762 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
0763 if (status < 0)
0764 goto error;
0765
0766 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
0767 if (status < 0)
0768 goto error;
0769 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
0770 if (status < 0)
0771 goto error;
0772 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
0773 if (status < 0)
0774 goto error;
0775 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
0776 if (status < 0)
0777 goto error;
0778 status = write16(state, SIO_TOP_COMM_KEY__A, key);
0779 error:
0780 if (status < 0)
0781 pr_err("Error %d on %s\n", status, __func__);
0782 return status;
0783 }
0784
0785 static int get_device_capabilities(struct drxk_state *state)
0786 {
0787 u16 sio_pdr_ohw_cfg = 0;
0788 u32 sio_top_jtagid_lo = 0;
0789 int status;
0790 const char *spin = "";
0791
0792 dprintk(1, "\n");
0793
0794
0795
0796 status = write16(state, SCU_RAM_GPIO__A,
0797 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
0798 if (status < 0)
0799 goto error;
0800 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
0801 if (status < 0)
0802 goto error;
0803 status = read16(state, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg);
0804 if (status < 0)
0805 goto error;
0806 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
0807 if (status < 0)
0808 goto error;
0809
0810 switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
0811 case 0:
0812
0813 break;
0814 case 1:
0815
0816 state->m_osc_clock_freq = 27000;
0817 break;
0818 case 2:
0819
0820 state->m_osc_clock_freq = 20250;
0821 break;
0822 case 3:
0823
0824 state->m_osc_clock_freq = 20250;
0825 break;
0826 default:
0827 pr_err("Clock Frequency is unknown\n");
0828 return -EINVAL;
0829 }
0830
0831
0832
0833
0834 status = read32(state, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo);
0835 if (status < 0)
0836 goto error;
0837
0838 pr_info("status = 0x%08x\n", sio_top_jtagid_lo);
0839
0840
0841 switch ((sio_top_jtagid_lo >> 29) & 0xF) {
0842 case 0:
0843 state->m_device_spin = DRXK_SPIN_A1;
0844 spin = "A1";
0845 break;
0846 case 2:
0847 state->m_device_spin = DRXK_SPIN_A2;
0848 spin = "A2";
0849 break;
0850 case 3:
0851 state->m_device_spin = DRXK_SPIN_A3;
0852 spin = "A3";
0853 break;
0854 default:
0855 state->m_device_spin = DRXK_SPIN_UNKNOWN;
0856 status = -EINVAL;
0857 pr_err("Spin %d unknown\n", (sio_top_jtagid_lo >> 29) & 0xF);
0858 goto error2;
0859 }
0860 switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
0861 case 0x13:
0862
0863 state->m_has_lna = false;
0864 state->m_has_oob = false;
0865 state->m_has_atv = false;
0866 state->m_has_audio = false;
0867 state->m_has_dvbt = true;
0868 state->m_has_dvbc = true;
0869 state->m_has_sawsw = true;
0870 state->m_has_gpio2 = false;
0871 state->m_has_gpio1 = false;
0872 state->m_has_irqn = false;
0873 break;
0874 case 0x15:
0875
0876 state->m_has_lna = false;
0877 state->m_has_oob = false;
0878 state->m_has_atv = true;
0879 state->m_has_audio = false;
0880 state->m_has_dvbt = true;
0881 state->m_has_dvbc = false;
0882 state->m_has_sawsw = true;
0883 state->m_has_gpio2 = true;
0884 state->m_has_gpio1 = true;
0885 state->m_has_irqn = false;
0886 break;
0887 case 0x16:
0888
0889 state->m_has_lna = false;
0890 state->m_has_oob = false;
0891 state->m_has_atv = true;
0892 state->m_has_audio = false;
0893 state->m_has_dvbt = true;
0894 state->m_has_dvbc = false;
0895 state->m_has_sawsw = true;
0896 state->m_has_gpio2 = true;
0897 state->m_has_gpio1 = true;
0898 state->m_has_irqn = false;
0899 break;
0900 case 0x18:
0901
0902 state->m_has_lna = false;
0903 state->m_has_oob = false;
0904 state->m_has_atv = true;
0905 state->m_has_audio = true;
0906 state->m_has_dvbt = true;
0907 state->m_has_dvbc = false;
0908 state->m_has_sawsw = true;
0909 state->m_has_gpio2 = true;
0910 state->m_has_gpio1 = true;
0911 state->m_has_irqn = false;
0912 break;
0913 case 0x21:
0914
0915 state->m_has_lna = false;
0916 state->m_has_oob = false;
0917 state->m_has_atv = true;
0918 state->m_has_audio = true;
0919 state->m_has_dvbt = true;
0920 state->m_has_dvbc = true;
0921 state->m_has_sawsw = true;
0922 state->m_has_gpio2 = true;
0923 state->m_has_gpio1 = true;
0924 state->m_has_irqn = false;
0925 break;
0926 case 0x23:
0927
0928 state->m_has_lna = false;
0929 state->m_has_oob = false;
0930 state->m_has_atv = true;
0931 state->m_has_audio = true;
0932 state->m_has_dvbt = true;
0933 state->m_has_dvbc = true;
0934 state->m_has_sawsw = true;
0935 state->m_has_gpio2 = true;
0936 state->m_has_gpio1 = true;
0937 state->m_has_irqn = false;
0938 break;
0939 case 0x25:
0940
0941 state->m_has_lna = false;
0942 state->m_has_oob = false;
0943 state->m_has_atv = true;
0944 state->m_has_audio = true;
0945 state->m_has_dvbt = true;
0946 state->m_has_dvbc = true;
0947 state->m_has_sawsw = true;
0948 state->m_has_gpio2 = true;
0949 state->m_has_gpio1 = true;
0950 state->m_has_irqn = false;
0951 break;
0952 case 0x26:
0953
0954 state->m_has_lna = false;
0955 state->m_has_oob = false;
0956 state->m_has_atv = true;
0957 state->m_has_audio = false;
0958 state->m_has_dvbt = true;
0959 state->m_has_dvbc = true;
0960 state->m_has_sawsw = true;
0961 state->m_has_gpio2 = true;
0962 state->m_has_gpio1 = true;
0963 state->m_has_irqn = false;
0964 break;
0965 default:
0966 pr_err("DeviceID 0x%02x not supported\n",
0967 ((sio_top_jtagid_lo >> 12) & 0xFF));
0968 status = -EINVAL;
0969 goto error2;
0970 }
0971
0972 pr_info("detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
0973 ((sio_top_jtagid_lo >> 12) & 0xFF), spin,
0974 state->m_osc_clock_freq / 1000,
0975 state->m_osc_clock_freq % 1000);
0976
0977 error:
0978 if (status < 0)
0979 pr_err("Error %d on %s\n", status, __func__);
0980
0981 error2:
0982 return status;
0983 }
0984
0985 static int hi_command(struct drxk_state *state, u16 cmd, u16 *p_result)
0986 {
0987 int status;
0988 bool powerdown_cmd;
0989
0990 dprintk(1, "\n");
0991
0992
0993 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
0994 if (status < 0)
0995 goto error;
0996 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
0997 usleep_range(1000, 2000);
0998
0999 powerdown_cmd =
1000 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1001 ((state->m_hi_cfg_ctrl) &
1002 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1003 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1004 if (!powerdown_cmd) {
1005
1006 u32 retry_count = 0;
1007 u16 wait_cmd;
1008
1009 do {
1010 usleep_range(1000, 2000);
1011 retry_count += 1;
1012 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1013 &wait_cmd);
1014 } while ((status < 0 || wait_cmd) && (retry_count < DRXK_MAX_RETRIES));
1015 if (status < 0)
1016 goto error;
1017 status = read16(state, SIO_HI_RA_RAM_RES__A, p_result);
1018 }
1019 error:
1020 if (status < 0)
1021 pr_err("Error %d on %s\n", status, __func__);
1022
1023 return status;
1024 }
1025
1026 static int hi_cfg_command(struct drxk_state *state)
1027 {
1028 int status;
1029
1030 dprintk(1, "\n");
1031
1032 mutex_lock(&state->mutex);
1033
1034 status = write16(state, SIO_HI_RA_RAM_PAR_6__A,
1035 state->m_hi_cfg_timeout);
1036 if (status < 0)
1037 goto error;
1038 status = write16(state, SIO_HI_RA_RAM_PAR_5__A,
1039 state->m_hi_cfg_ctrl);
1040 if (status < 0)
1041 goto error;
1042 status = write16(state, SIO_HI_RA_RAM_PAR_4__A,
1043 state->m_hi_cfg_wake_up_key);
1044 if (status < 0)
1045 goto error;
1046 status = write16(state, SIO_HI_RA_RAM_PAR_3__A,
1047 state->m_hi_cfg_bridge_delay);
1048 if (status < 0)
1049 goto error;
1050 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
1051 state->m_hi_cfg_timing_div);
1052 if (status < 0)
1053 goto error;
1054 status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
1055 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1056 if (status < 0)
1057 goto error;
1058 status = hi_command(state, SIO_HI_RA_RAM_CMD_CONFIG, NULL);
1059 if (status < 0)
1060 goto error;
1061
1062 state->m_hi_cfg_ctrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1063 error:
1064 mutex_unlock(&state->mutex);
1065 if (status < 0)
1066 pr_err("Error %d on %s\n", status, __func__);
1067 return status;
1068 }
1069
1070 static int init_hi(struct drxk_state *state)
1071 {
1072 dprintk(1, "\n");
1073
1074 state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
1075 state->m_hi_cfg_timeout = 0x96FF;
1076
1077 state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1078
1079 return hi_cfg_command(state);
1080 }
1081
1082 static int mpegts_configure_pins(struct drxk_state *state, bool mpeg_enable)
1083 {
1084 int status;
1085 u16 sio_pdr_mclk_cfg = 0;
1086 u16 sio_pdr_mdx_cfg = 0;
1087 u16 err_cfg = 0;
1088
1089 dprintk(1, ": mpeg %s, %s mode\n",
1090 mpeg_enable ? "enable" : "disable",
1091 state->m_enable_parallel ? "parallel" : "serial");
1092
1093
1094 status = write16(state, SCU_RAM_GPIO__A,
1095 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1096 if (status < 0)
1097 goto error;
1098
1099
1100 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
1101 if (status < 0)
1102 goto error;
1103
1104 if (!mpeg_enable) {
1105
1106 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1107 if (status < 0)
1108 goto error;
1109 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1110 if (status < 0)
1111 goto error;
1112 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1113 if (status < 0)
1114 goto error;
1115 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1116 if (status < 0)
1117 goto error;
1118 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1119 if (status < 0)
1120 goto error;
1121 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1122 if (status < 0)
1123 goto error;
1124 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1125 if (status < 0)
1126 goto error;
1127 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1128 if (status < 0)
1129 goto error;
1130 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1131 if (status < 0)
1132 goto error;
1133 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1134 if (status < 0)
1135 goto error;
1136 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1137 if (status < 0)
1138 goto error;
1139 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1140 if (status < 0)
1141 goto error;
1142 } else {
1143
1144 sio_pdr_mdx_cfg =
1145 ((state->m_ts_data_strength <<
1146 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1147 sio_pdr_mclk_cfg = ((state->m_ts_clockk_strength <<
1148 SIO_PDR_MCLK_CFG_DRIVE__B) |
1149 0x0003);
1150
1151 status = write16(state, SIO_PDR_MSTRT_CFG__A, sio_pdr_mdx_cfg);
1152 if (status < 0)
1153 goto error;
1154
1155 if (state->enable_merr_cfg)
1156 err_cfg = sio_pdr_mdx_cfg;
1157
1158 status = write16(state, SIO_PDR_MERR_CFG__A, err_cfg);
1159 if (status < 0)
1160 goto error;
1161 status = write16(state, SIO_PDR_MVAL_CFG__A, err_cfg);
1162 if (status < 0)
1163 goto error;
1164
1165 if (state->m_enable_parallel) {
1166
1167 status = write16(state, SIO_PDR_MD1_CFG__A,
1168 sio_pdr_mdx_cfg);
1169 if (status < 0)
1170 goto error;
1171 status = write16(state, SIO_PDR_MD2_CFG__A,
1172 sio_pdr_mdx_cfg);
1173 if (status < 0)
1174 goto error;
1175 status = write16(state, SIO_PDR_MD3_CFG__A,
1176 sio_pdr_mdx_cfg);
1177 if (status < 0)
1178 goto error;
1179 status = write16(state, SIO_PDR_MD4_CFG__A,
1180 sio_pdr_mdx_cfg);
1181 if (status < 0)
1182 goto error;
1183 status = write16(state, SIO_PDR_MD5_CFG__A,
1184 sio_pdr_mdx_cfg);
1185 if (status < 0)
1186 goto error;
1187 status = write16(state, SIO_PDR_MD6_CFG__A,
1188 sio_pdr_mdx_cfg);
1189 if (status < 0)
1190 goto error;
1191 status = write16(state, SIO_PDR_MD7_CFG__A,
1192 sio_pdr_mdx_cfg);
1193 if (status < 0)
1194 goto error;
1195 } else {
1196 sio_pdr_mdx_cfg = ((state->m_ts_data_strength <<
1197 SIO_PDR_MD0_CFG_DRIVE__B)
1198 | 0x0003);
1199
1200 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1201 if (status < 0)
1202 goto error;
1203 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1204 if (status < 0)
1205 goto error;
1206 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1207 if (status < 0)
1208 goto error;
1209 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1210 if (status < 0)
1211 goto error;
1212 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1213 if (status < 0)
1214 goto error;
1215 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1216 if (status < 0)
1217 goto error;
1218 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1219 if (status < 0)
1220 goto error;
1221 }
1222 status = write16(state, SIO_PDR_MCLK_CFG__A, sio_pdr_mclk_cfg);
1223 if (status < 0)
1224 goto error;
1225 status = write16(state, SIO_PDR_MD0_CFG__A, sio_pdr_mdx_cfg);
1226 if (status < 0)
1227 goto error;
1228 }
1229
1230 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1231 if (status < 0)
1232 goto error;
1233
1234 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1235 error:
1236 if (status < 0)
1237 pr_err("Error %d on %s\n", status, __func__);
1238 return status;
1239 }
1240
1241 static int mpegts_disable(struct drxk_state *state)
1242 {
1243 dprintk(1, "\n");
1244
1245 return mpegts_configure_pins(state, false);
1246 }
1247
1248 static int bl_chain_cmd(struct drxk_state *state,
1249 u16 rom_offset, u16 nr_of_elements, u32 time_out)
1250 {
1251 u16 bl_status = 0;
1252 int status;
1253 unsigned long end;
1254
1255 dprintk(1, "\n");
1256 mutex_lock(&state->mutex);
1257 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1258 if (status < 0)
1259 goto error;
1260 status = write16(state, SIO_BL_CHAIN_ADDR__A, rom_offset);
1261 if (status < 0)
1262 goto error;
1263 status = write16(state, SIO_BL_CHAIN_LEN__A, nr_of_elements);
1264 if (status < 0)
1265 goto error;
1266 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1267 if (status < 0)
1268 goto error;
1269
1270 end = jiffies + msecs_to_jiffies(time_out);
1271 do {
1272 usleep_range(1000, 2000);
1273 status = read16(state, SIO_BL_STATUS__A, &bl_status);
1274 if (status < 0)
1275 goto error;
1276 } while ((bl_status == 0x1) &&
1277 ((time_is_after_jiffies(end))));
1278
1279 if (bl_status == 0x1) {
1280 pr_err("SIO not ready\n");
1281 status = -EINVAL;
1282 goto error2;
1283 }
1284 error:
1285 if (status < 0)
1286 pr_err("Error %d on %s\n", status, __func__);
1287 error2:
1288 mutex_unlock(&state->mutex);
1289 return status;
1290 }
1291
1292
1293 static int download_microcode(struct drxk_state *state,
1294 const u8 p_mc_image[], u32 length)
1295 {
1296 const u8 *p_src = p_mc_image;
1297 u32 address;
1298 u16 n_blocks;
1299 u16 block_size;
1300 u32 offset = 0;
1301 u32 i;
1302 int status = 0;
1303
1304 dprintk(1, "\n");
1305
1306
1307 #if 0
1308
1309 drain = (p_src[0] << 8) | p_src[1];
1310 #endif
1311 p_src += sizeof(u16);
1312 offset += sizeof(u16);
1313 n_blocks = (p_src[0] << 8) | p_src[1];
1314 p_src += sizeof(u16);
1315 offset += sizeof(u16);
1316
1317 for (i = 0; i < n_blocks; i += 1) {
1318 address = (p_src[0] << 24) | (p_src[1] << 16) |
1319 (p_src[2] << 8) | p_src[3];
1320 p_src += sizeof(u32);
1321 offset += sizeof(u32);
1322
1323 block_size = ((p_src[0] << 8) | p_src[1]) * sizeof(u16);
1324 p_src += sizeof(u16);
1325 offset += sizeof(u16);
1326
1327 #if 0
1328
1329 flags = (p_src[0] << 8) | p_src[1];
1330 #endif
1331 p_src += sizeof(u16);
1332 offset += sizeof(u16);
1333
1334 #if 0
1335
1336 block_crc = (p_src[0] << 8) | p_src[1];
1337 #endif
1338 p_src += sizeof(u16);
1339 offset += sizeof(u16);
1340
1341 if (offset + block_size > length) {
1342 pr_err("Firmware is corrupted.\n");
1343 return -EINVAL;
1344 }
1345
1346 status = write_block(state, address, block_size, p_src);
1347 if (status < 0) {
1348 pr_err("Error %d while loading firmware\n", status);
1349 break;
1350 }
1351 p_src += block_size;
1352 offset += block_size;
1353 }
1354 return status;
1355 }
1356
1357 static int dvbt_enable_ofdm_token_ring(struct drxk_state *state, bool enable)
1358 {
1359 int status;
1360 u16 data = 0;
1361 u16 desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1362 u16 desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1363 unsigned long end;
1364
1365 dprintk(1, "\n");
1366
1367 if (!enable) {
1368 desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1369 desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1370 }
1371
1372 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1373 if (status >= 0 && data == desired_status) {
1374
1375 return status;
1376 }
1377
1378 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desired_ctrl);
1379
1380 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1381 do {
1382 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1383 if ((status >= 0 && data == desired_status)
1384 || time_is_after_jiffies(end))
1385 break;
1386 usleep_range(1000, 2000);
1387 } while (1);
1388 if (data != desired_status) {
1389 pr_err("SIO not ready\n");
1390 return -EINVAL;
1391 }
1392 return status;
1393 }
1394
1395 static int mpegts_stop(struct drxk_state *state)
1396 {
1397 int status = 0;
1398 u16 fec_oc_snc_mode = 0;
1399 u16 fec_oc_ipr_mode = 0;
1400
1401 dprintk(1, "\n");
1402
1403
1404 status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1405 if (status < 0)
1406 goto error;
1407 fec_oc_snc_mode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1408 status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1409 if (status < 0)
1410 goto error;
1411
1412
1413 status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode);
1414 if (status < 0)
1415 goto error;
1416 fec_oc_ipr_mode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1417 status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode);
1418
1419 error:
1420 if (status < 0)
1421 pr_err("Error %d on %s\n", status, __func__);
1422
1423 return status;
1424 }
1425
1426 static int scu_command(struct drxk_state *state,
1427 u16 cmd, u8 parameter_len,
1428 u16 *parameter, u8 result_len, u16 *result)
1429 {
1430 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1431 #error DRXK register mapping no longer compatible with this routine!
1432 #endif
1433 u16 cur_cmd = 0;
1434 int status = -EINVAL;
1435 unsigned long end;
1436 u8 buffer[34];
1437 int cnt = 0, ii;
1438 const char *p;
1439 char errname[30];
1440
1441 dprintk(1, "\n");
1442
1443 if ((cmd == 0) || ((parameter_len > 0) && (parameter == NULL)) ||
1444 ((result_len > 0) && (result == NULL))) {
1445 pr_err("Error %d on %s\n", status, __func__);
1446 return status;
1447 }
1448
1449 mutex_lock(&state->mutex);
1450
1451
1452
1453 if (parameter) {
1454 for (ii = parameter_len - 1; ii >= 0; ii -= 1) {
1455 buffer[cnt++] = (parameter[ii] & 0xFF);
1456 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1457 }
1458 }
1459 buffer[cnt++] = (cmd & 0xFF);
1460 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1461
1462 write_block(state, SCU_RAM_PARAM_0__A -
1463 (parameter_len - 1), cnt, buffer);
1464
1465 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1466 do {
1467 usleep_range(1000, 2000);
1468 status = read16(state, SCU_RAM_COMMAND__A, &cur_cmd);
1469 if (status < 0)
1470 goto error;
1471 } while (!(cur_cmd == DRX_SCU_READY) && (time_is_after_jiffies(end)));
1472 if (cur_cmd != DRX_SCU_READY) {
1473 pr_err("SCU not ready\n");
1474 status = -EIO;
1475 goto error2;
1476 }
1477
1478 if ((result_len > 0) && (result != NULL)) {
1479 s16 err;
1480 int ii;
1481
1482 for (ii = result_len - 1; ii >= 0; ii -= 1) {
1483 status = read16(state, SCU_RAM_PARAM_0__A - ii,
1484 &result[ii]);
1485 if (status < 0)
1486 goto error;
1487 }
1488
1489
1490 err = (s16)result[0];
1491 if (err >= 0)
1492 goto error;
1493
1494
1495 switch (err) {
1496 case SCU_RESULT_UNKCMD:
1497 p = "SCU_RESULT_UNKCMD";
1498 break;
1499 case SCU_RESULT_UNKSTD:
1500 p = "SCU_RESULT_UNKSTD";
1501 break;
1502 case SCU_RESULT_SIZE:
1503 p = "SCU_RESULT_SIZE";
1504 break;
1505 case SCU_RESULT_INVPAR:
1506 p = "SCU_RESULT_INVPAR";
1507 break;
1508 default:
1509 sprintf(errname, "ERROR: %d\n", err);
1510 p = errname;
1511 }
1512 pr_err("%s while sending cmd 0x%04x with params:", p, cmd);
1513 print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE, buffer, cnt);
1514 status = -EINVAL;
1515 goto error2;
1516 }
1517
1518 error:
1519 if (status < 0)
1520 pr_err("Error %d on %s\n", status, __func__);
1521 error2:
1522 mutex_unlock(&state->mutex);
1523 return status;
1524 }
1525
1526 static int set_iqm_af(struct drxk_state *state, bool active)
1527 {
1528 u16 data = 0;
1529 int status;
1530
1531 dprintk(1, "\n");
1532
1533
1534 status = read16(state, IQM_AF_STDBY__A, &data);
1535 if (status < 0)
1536 goto error;
1537
1538 if (!active) {
1539 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1540 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1541 | IQM_AF_STDBY_STDBY_PD_STANDBY
1542 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1543 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1544 } else {
1545 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1546 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1547 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1548 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1549 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1550 );
1551 }
1552 status = write16(state, IQM_AF_STDBY__A, data);
1553
1554 error:
1555 if (status < 0)
1556 pr_err("Error %d on %s\n", status, __func__);
1557 return status;
1558 }
1559
1560 static int ctrl_power_mode(struct drxk_state *state, enum drx_power_mode *mode)
1561 {
1562 int status = 0;
1563 u16 sio_cc_pwd_mode = 0;
1564
1565 dprintk(1, "\n");
1566
1567
1568 if (mode == NULL)
1569 return -EINVAL;
1570
1571 switch (*mode) {
1572 case DRX_POWER_UP:
1573 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
1574 break;
1575 case DRXK_POWER_DOWN_OFDM:
1576 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1577 break;
1578 case DRXK_POWER_DOWN_CORE:
1579 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1580 break;
1581 case DRXK_POWER_DOWN_PLL:
1582 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
1583 break;
1584 case DRX_POWER_DOWN:
1585 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
1586 break;
1587 default:
1588
1589 return -EINVAL;
1590 }
1591
1592
1593 if (state->m_current_power_mode == *mode)
1594 return 0;
1595
1596
1597 if (state->m_current_power_mode != DRX_POWER_UP) {
1598 status = power_up_device(state);
1599 if (status < 0)
1600 goto error;
1601 status = dvbt_enable_ofdm_token_ring(state, true);
1602 if (status < 0)
1603 goto error;
1604 }
1605
1606 if (*mode == DRX_POWER_UP) {
1607
1608 } else {
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618 switch (state->m_operation_mode) {
1619 case OM_DVBT:
1620 status = mpegts_stop(state);
1621 if (status < 0)
1622 goto error;
1623 status = power_down_dvbt(state, false);
1624 if (status < 0)
1625 goto error;
1626 break;
1627 case OM_QAM_ITU_A:
1628 case OM_QAM_ITU_C:
1629 status = mpegts_stop(state);
1630 if (status < 0)
1631 goto error;
1632 status = power_down_qam(state);
1633 if (status < 0)
1634 goto error;
1635 break;
1636 default:
1637 break;
1638 }
1639 status = dvbt_enable_ofdm_token_ring(state, false);
1640 if (status < 0)
1641 goto error;
1642 status = write16(state, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode);
1643 if (status < 0)
1644 goto error;
1645 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1646 if (status < 0)
1647 goto error;
1648
1649 if (*mode != DRXK_POWER_DOWN_OFDM) {
1650 state->m_hi_cfg_ctrl |=
1651 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1652 status = hi_cfg_command(state);
1653 if (status < 0)
1654 goto error;
1655 }
1656 }
1657 state->m_current_power_mode = *mode;
1658
1659 error:
1660 if (status < 0)
1661 pr_err("Error %d on %s\n", status, __func__);
1662
1663 return status;
1664 }
1665
1666 static int power_down_dvbt(struct drxk_state *state, bool set_power_mode)
1667 {
1668 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
1669 u16 cmd_result = 0;
1670 u16 data = 0;
1671 int status;
1672
1673 dprintk(1, "\n");
1674
1675 status = read16(state, SCU_COMM_EXEC__A, &data);
1676 if (status < 0)
1677 goto error;
1678 if (data == SCU_COMM_EXEC_ACTIVE) {
1679
1680 status = scu_command(state,
1681 SCU_RAM_COMMAND_STANDARD_OFDM
1682 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
1683 0, NULL, 1, &cmd_result);
1684 if (status < 0)
1685 goto error;
1686
1687 status = scu_command(state,
1688 SCU_RAM_COMMAND_STANDARD_OFDM
1689 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
1690 0, NULL, 1, &cmd_result);
1691 if (status < 0)
1692 goto error;
1693 }
1694
1695
1696 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1697 if (status < 0)
1698 goto error;
1699 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1700 if (status < 0)
1701 goto error;
1702 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1703 if (status < 0)
1704 goto error;
1705
1706
1707 status = set_iqm_af(state, false);
1708 if (status < 0)
1709 goto error;
1710
1711
1712 if (set_power_mode) {
1713 status = ctrl_power_mode(state, &power_mode);
1714 if (status < 0)
1715 goto error;
1716 }
1717 error:
1718 if (status < 0)
1719 pr_err("Error %d on %s\n", status, __func__);
1720 return status;
1721 }
1722
1723 static int setoperation_mode(struct drxk_state *state,
1724 enum operation_mode o_mode)
1725 {
1726 int status = 0;
1727
1728 dprintk(1, "\n");
1729
1730
1731
1732
1733
1734
1735
1736 status = write16(state, SCU_RAM_GPIO__A,
1737 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1738 if (status < 0)
1739 goto error;
1740
1741
1742 if (state->m_operation_mode == o_mode)
1743 return 0;
1744
1745 switch (state->m_operation_mode) {
1746
1747 case OM_NONE:
1748 break;
1749 case OM_DVBT:
1750 status = mpegts_stop(state);
1751 if (status < 0)
1752 goto error;
1753 status = power_down_dvbt(state, true);
1754 if (status < 0)
1755 goto error;
1756 state->m_operation_mode = OM_NONE;
1757 break;
1758 case OM_QAM_ITU_A:
1759 case OM_QAM_ITU_C:
1760 status = mpegts_stop(state);
1761 if (status < 0)
1762 goto error;
1763 status = power_down_qam(state);
1764 if (status < 0)
1765 goto error;
1766 state->m_operation_mode = OM_NONE;
1767 break;
1768 case OM_QAM_ITU_B:
1769 default:
1770 status = -EINVAL;
1771 goto error;
1772 }
1773
1774
1775
1776
1777 switch (o_mode) {
1778 case OM_DVBT:
1779 dprintk(1, ": DVB-T\n");
1780 state->m_operation_mode = o_mode;
1781 status = set_dvbt_standard(state, o_mode);
1782 if (status < 0)
1783 goto error;
1784 break;
1785 case OM_QAM_ITU_A:
1786 case OM_QAM_ITU_C:
1787 dprintk(1, ": DVB-C Annex %c\n",
1788 (state->m_operation_mode == OM_QAM_ITU_A) ? 'A' : 'C');
1789 state->m_operation_mode = o_mode;
1790 status = set_qam_standard(state, o_mode);
1791 if (status < 0)
1792 goto error;
1793 break;
1794 case OM_QAM_ITU_B:
1795 default:
1796 status = -EINVAL;
1797 }
1798 error:
1799 if (status < 0)
1800 pr_err("Error %d on %s\n", status, __func__);
1801 return status;
1802 }
1803
1804 static int start(struct drxk_state *state, s32 offset_freq,
1805 s32 intermediate_frequency)
1806 {
1807 int status = -EINVAL;
1808
1809 u16 i_freqk_hz;
1810 s32 offsetk_hz = offset_freq / 1000;
1811
1812 dprintk(1, "\n");
1813 if (state->m_drxk_state != DRXK_STOPPED &&
1814 state->m_drxk_state != DRXK_DTV_STARTED)
1815 goto error;
1816
1817 state->m_b_mirror_freq_spect = (state->props.inversion == INVERSION_ON);
1818
1819 if (intermediate_frequency < 0) {
1820 state->m_b_mirror_freq_spect = !state->m_b_mirror_freq_spect;
1821 intermediate_frequency = -intermediate_frequency;
1822 }
1823
1824 switch (state->m_operation_mode) {
1825 case OM_QAM_ITU_A:
1826 case OM_QAM_ITU_C:
1827 i_freqk_hz = (intermediate_frequency / 1000);
1828 status = set_qam(state, i_freqk_hz, offsetk_hz);
1829 if (status < 0)
1830 goto error;
1831 state->m_drxk_state = DRXK_DTV_STARTED;
1832 break;
1833 case OM_DVBT:
1834 i_freqk_hz = (intermediate_frequency / 1000);
1835 status = mpegts_stop(state);
1836 if (status < 0)
1837 goto error;
1838 status = set_dvbt(state, i_freqk_hz, offsetk_hz);
1839 if (status < 0)
1840 goto error;
1841 status = dvbt_start(state);
1842 if (status < 0)
1843 goto error;
1844 state->m_drxk_state = DRXK_DTV_STARTED;
1845 break;
1846 default:
1847 break;
1848 }
1849 error:
1850 if (status < 0)
1851 pr_err("Error %d on %s\n", status, __func__);
1852 return status;
1853 }
1854
1855 static int shut_down(struct drxk_state *state)
1856 {
1857 dprintk(1, "\n");
1858
1859 mpegts_stop(state);
1860 return 0;
1861 }
1862
1863 static int get_lock_status(struct drxk_state *state, u32 *p_lock_status)
1864 {
1865 int status = -EINVAL;
1866
1867 dprintk(1, "\n");
1868
1869 if (p_lock_status == NULL)
1870 goto error;
1871
1872 *p_lock_status = NOT_LOCKED;
1873
1874
1875 switch (state->m_operation_mode) {
1876 case OM_QAM_ITU_A:
1877 case OM_QAM_ITU_B:
1878 case OM_QAM_ITU_C:
1879 status = get_qam_lock_status(state, p_lock_status);
1880 break;
1881 case OM_DVBT:
1882 status = get_dvbt_lock_status(state, p_lock_status);
1883 break;
1884 default:
1885 pr_debug("Unsupported operation mode %d in %s\n",
1886 state->m_operation_mode, __func__);
1887 return 0;
1888 }
1889 error:
1890 if (status < 0)
1891 pr_err("Error %d on %s\n", status, __func__);
1892 return status;
1893 }
1894
1895 static int mpegts_start(struct drxk_state *state)
1896 {
1897 int status;
1898
1899 u16 fec_oc_snc_mode = 0;
1900
1901
1902 status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1903 if (status < 0)
1904 goto error;
1905 fec_oc_snc_mode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1906 status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1907 if (status < 0)
1908 goto error;
1909 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1910 error:
1911 if (status < 0)
1912 pr_err("Error %d on %s\n", status, __func__);
1913 return status;
1914 }
1915
1916 static int mpegts_dto_init(struct drxk_state *state)
1917 {
1918 int status;
1919
1920 dprintk(1, "\n");
1921
1922
1923 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1924 if (status < 0)
1925 goto error;
1926 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1927 if (status < 0)
1928 goto error;
1929 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1930 if (status < 0)
1931 goto error;
1932 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1933 if (status < 0)
1934 goto error;
1935 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1936 if (status < 0)
1937 goto error;
1938 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1939 if (status < 0)
1940 goto error;
1941 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1942 if (status < 0)
1943 goto error;
1944 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1945 if (status < 0)
1946 goto error;
1947
1948
1949 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
1950 if (status < 0)
1951 goto error;
1952 status = write16(state, FEC_OC_SNC_LWM__A, 2);
1953 if (status < 0)
1954 goto error;
1955 status = write16(state, FEC_OC_SNC_HWM__A, 12);
1956 error:
1957 if (status < 0)
1958 pr_err("Error %d on %s\n", status, __func__);
1959
1960 return status;
1961 }
1962
1963 static int mpegts_dto_setup(struct drxk_state *state,
1964 enum operation_mode o_mode)
1965 {
1966 int status;
1967
1968 u16 fec_oc_reg_mode = 0;
1969 u16 fec_oc_reg_ipr_mode = 0;
1970 u16 fec_oc_dto_mode = 0;
1971 u16 fec_oc_fct_mode = 0;
1972 u16 fec_oc_dto_period = 2;
1973 u16 fec_oc_dto_burst_len = 188;
1974 u32 fec_oc_rcn_ctl_rate = 0;
1975 u16 fec_oc_tmd_mode = 0;
1976 u16 fec_oc_tmd_int_upd_rate = 0;
1977 u32 max_bit_rate = 0;
1978 bool static_clk = false;
1979
1980 dprintk(1, "\n");
1981
1982
1983 status = read16(state, FEC_OC_MODE__A, &fec_oc_reg_mode);
1984 if (status < 0)
1985 goto error;
1986 status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode);
1987 if (status < 0)
1988 goto error;
1989 fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
1990 fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
1991 if (state->m_insert_rs_byte) {
1992
1993 fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
1994
1995 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
1996
1997 fec_oc_dto_burst_len = 204;
1998 }
1999
2000
2001 fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2002 if (!state->m_enable_parallel) {
2003
2004 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2005 }
2006
2007 switch (o_mode) {
2008 case OM_DVBT:
2009 max_bit_rate = state->m_dvbt_bitrate;
2010 fec_oc_tmd_mode = 3;
2011 fec_oc_rcn_ctl_rate = 0xC00000;
2012 static_clk = state->m_dvbt_static_clk;
2013 break;
2014 case OM_QAM_ITU_A:
2015 case OM_QAM_ITU_C:
2016 fec_oc_tmd_mode = 0x0004;
2017 fec_oc_rcn_ctl_rate = 0xD2B4EE;
2018 max_bit_rate = state->m_dvbc_bitrate;
2019 static_clk = state->m_dvbc_static_clk;
2020 break;
2021 default:
2022 status = -EINVAL;
2023 }
2024 if (status < 0)
2025 goto error;
2026
2027
2028 if (static_clk) {
2029 u32 bit_rate = 0;
2030
2031
2032
2033
2034
2035 fec_oc_dto_mode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2036 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2037 fec_oc_fct_mode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2038 FEC_OC_FCT_MODE_VIRT_ENA__M);
2039
2040
2041 bit_rate = max_bit_rate;
2042 if (bit_rate > 75900000UL) {
2043 bit_rate = 75900000UL;
2044 }
2045
2046
2047
2048
2049
2050
2051 fec_oc_dto_period = (u16) (((state->m_sys_clock_freq)
2052 * 1000) / bit_rate);
2053 if (fec_oc_dto_period <= 2)
2054 fec_oc_dto_period = 0;
2055 else
2056 fec_oc_dto_period -= 2;
2057 fec_oc_tmd_int_upd_rate = 8;
2058 } else {
2059
2060 fec_oc_dto_mode = FEC_OC_DTO_MODE_DYNAMIC__M;
2061 fec_oc_fct_mode = FEC_OC_FCT_MODE__PRE;
2062 fec_oc_tmd_int_upd_rate = 5;
2063 }
2064
2065
2066 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len);
2067 if (status < 0)
2068 goto error;
2069 status = write16(state, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period);
2070 if (status < 0)
2071 goto error;
2072 status = write16(state, FEC_OC_DTO_MODE__A, fec_oc_dto_mode);
2073 if (status < 0)
2074 goto error;
2075 status = write16(state, FEC_OC_FCT_MODE__A, fec_oc_fct_mode);
2076 if (status < 0)
2077 goto error;
2078 status = write16(state, FEC_OC_MODE__A, fec_oc_reg_mode);
2079 if (status < 0)
2080 goto error;
2081 status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode);
2082 if (status < 0)
2083 goto error;
2084
2085
2086 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fec_oc_rcn_ctl_rate);
2087 if (status < 0)
2088 goto error;
2089 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A,
2090 fec_oc_tmd_int_upd_rate);
2091 if (status < 0)
2092 goto error;
2093 status = write16(state, FEC_OC_TMD_MODE__A, fec_oc_tmd_mode);
2094 error:
2095 if (status < 0)
2096 pr_err("Error %d on %s\n", status, __func__);
2097 return status;
2098 }
2099
2100 static int mpegts_configure_polarity(struct drxk_state *state)
2101 {
2102 u16 fec_oc_reg_ipr_invert = 0;
2103
2104
2105 u16 invert_data_mask =
2106 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2107 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2108 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2109 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2110
2111 dprintk(1, "\n");
2112
2113
2114 fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2115 if (state->m_invert_data)
2116 fec_oc_reg_ipr_invert |= invert_data_mask;
2117 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2118 if (state->m_invert_err)
2119 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2120 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2121 if (state->m_invert_str)
2122 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2123 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2124 if (state->m_invert_val)
2125 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
2126 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2127 if (state->m_invert_clk)
2128 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
2129
2130 return write16(state, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert);
2131 }
2132
2133 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2134
2135 static int set_agc_rf(struct drxk_state *state,
2136 struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2137 {
2138 int status = -EINVAL;
2139 u16 data = 0;
2140 struct s_cfg_agc *p_if_agc_settings;
2141
2142 dprintk(1, "\n");
2143
2144 if (p_agc_cfg == NULL)
2145 goto error;
2146
2147 switch (p_agc_cfg->ctrl_mode) {
2148 case DRXK_AGC_CTRL_AUTO:
2149
2150 status = read16(state, IQM_AF_STDBY__A, &data);
2151 if (status < 0)
2152 goto error;
2153 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2154 status = write16(state, IQM_AF_STDBY__A, data);
2155 if (status < 0)
2156 goto error;
2157 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2158 if (status < 0)
2159 goto error;
2160
2161
2162 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2163
2164
2165 if (state->m_rf_agc_pol)
2166 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2167 else
2168 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2169 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2170 if (status < 0)
2171 goto error;
2172
2173
2174 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2175 if (status < 0)
2176 goto error;
2177
2178 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2179 data |= (~(p_agc_cfg->speed <<
2180 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2181 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2182
2183 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2184 if (status < 0)
2185 goto error;
2186
2187 if (is_dvbt(state))
2188 p_if_agc_settings = &state->m_dvbt_if_agc_cfg;
2189 else if (is_qam(state))
2190 p_if_agc_settings = &state->m_qam_if_agc_cfg;
2191 else
2192 p_if_agc_settings = &state->m_atv_if_agc_cfg;
2193 if (p_if_agc_settings == NULL) {
2194 status = -EINVAL;
2195 goto error;
2196 }
2197
2198
2199 if (p_if_agc_settings->ctrl_mode == DRXK_AGC_CTRL_AUTO) {
2200 status = write16(state,
2201 SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2202 p_agc_cfg->top);
2203 if (status < 0)
2204 goto error;
2205 }
2206
2207
2208 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A,
2209 p_agc_cfg->cut_off_current);
2210 if (status < 0)
2211 goto error;
2212
2213
2214 status = write16(state, SCU_RAM_AGC_RF_MAX__A,
2215 p_agc_cfg->max_output_level);
2216 if (status < 0)
2217 goto error;
2218
2219 break;
2220
2221 case DRXK_AGC_CTRL_USER:
2222
2223 status = read16(state, IQM_AF_STDBY__A, &data);
2224 if (status < 0)
2225 goto error;
2226 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2227 status = write16(state, IQM_AF_STDBY__A, data);
2228 if (status < 0)
2229 goto error;
2230
2231
2232 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2233 if (status < 0)
2234 goto error;
2235 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2236 if (state->m_rf_agc_pol)
2237 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2238 else
2239 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2240 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2241 if (status < 0)
2242 goto error;
2243
2244
2245 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2246 if (status < 0)
2247 goto error;
2248
2249
2250 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A,
2251 p_agc_cfg->output_level);
2252 if (status < 0)
2253 goto error;
2254 break;
2255
2256 case DRXK_AGC_CTRL_OFF:
2257
2258 status = read16(state, IQM_AF_STDBY__A, &data);
2259 if (status < 0)
2260 goto error;
2261 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2262 status = write16(state, IQM_AF_STDBY__A, data);
2263 if (status < 0)
2264 goto error;
2265
2266
2267 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2268 if (status < 0)
2269 goto error;
2270 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2271 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2272 if (status < 0)
2273 goto error;
2274 break;
2275
2276 default:
2277 status = -EINVAL;
2278
2279 }
2280 error:
2281 if (status < 0)
2282 pr_err("Error %d on %s\n", status, __func__);
2283 return status;
2284 }
2285
2286 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2287
2288 static int set_agc_if(struct drxk_state *state,
2289 struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2290 {
2291 u16 data = 0;
2292 int status = 0;
2293 struct s_cfg_agc *p_rf_agc_settings;
2294
2295 dprintk(1, "\n");
2296
2297 switch (p_agc_cfg->ctrl_mode) {
2298 case DRXK_AGC_CTRL_AUTO:
2299
2300
2301 status = read16(state, IQM_AF_STDBY__A, &data);
2302 if (status < 0)
2303 goto error;
2304 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2305 status = write16(state, IQM_AF_STDBY__A, data);
2306 if (status < 0)
2307 goto error;
2308
2309 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2310 if (status < 0)
2311 goto error;
2312
2313
2314 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2315
2316
2317 if (state->m_if_agc_pol)
2318 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2319 else
2320 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2321 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2322 if (status < 0)
2323 goto error;
2324
2325
2326 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2327 if (status < 0)
2328 goto error;
2329 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2330 data |= (~(p_agc_cfg->speed <<
2331 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2332 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2333
2334 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2335 if (status < 0)
2336 goto error;
2337
2338 if (is_qam(state))
2339 p_rf_agc_settings = &state->m_qam_rf_agc_cfg;
2340 else
2341 p_rf_agc_settings = &state->m_atv_rf_agc_cfg;
2342 if (p_rf_agc_settings == NULL)
2343 return -1;
2344
2345 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2346 p_rf_agc_settings->top);
2347 if (status < 0)
2348 goto error;
2349 break;
2350
2351 case DRXK_AGC_CTRL_USER:
2352
2353
2354 status = read16(state, IQM_AF_STDBY__A, &data);
2355 if (status < 0)
2356 goto error;
2357 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2358 status = write16(state, IQM_AF_STDBY__A, data);
2359 if (status < 0)
2360 goto error;
2361
2362 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2363 if (status < 0)
2364 goto error;
2365
2366
2367 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2368
2369
2370 if (state->m_if_agc_pol)
2371 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2372 else
2373 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2374 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2375 if (status < 0)
2376 goto error;
2377
2378
2379 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2380 p_agc_cfg->output_level);
2381 if (status < 0)
2382 goto error;
2383 break;
2384
2385 case DRXK_AGC_CTRL_OFF:
2386
2387
2388 status = read16(state, IQM_AF_STDBY__A, &data);
2389 if (status < 0)
2390 goto error;
2391 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2392 status = write16(state, IQM_AF_STDBY__A, data);
2393 if (status < 0)
2394 goto error;
2395
2396
2397 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2398 if (status < 0)
2399 goto error;
2400 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2401 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2402 if (status < 0)
2403 goto error;
2404 break;
2405 }
2406
2407
2408
2409 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_cfg->top);
2410 error:
2411 if (status < 0)
2412 pr_err("Error %d on %s\n", status, __func__);
2413 return status;
2414 }
2415
2416 static int get_qam_signal_to_noise(struct drxk_state *state,
2417 s32 *p_signal_to_noise)
2418 {
2419 int status = 0;
2420 u16 qam_sl_err_power = 0;
2421
2422 u32 qam_sl_sig_power = 0;
2423
2424 u32 qam_sl_mer = 0;
2425
2426 dprintk(1, "\n");
2427
2428
2429
2430
2431 status = read16(state, QAM_SL_ERR_POWER__A, &qam_sl_err_power);
2432 if (status < 0) {
2433 pr_err("Error %d on %s\n", status, __func__);
2434 return -EINVAL;
2435 }
2436
2437 switch (state->props.modulation) {
2438 case QAM_16:
2439 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2440 break;
2441 case QAM_32:
2442 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2443 break;
2444 case QAM_64:
2445 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2446 break;
2447 case QAM_128:
2448 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2449 break;
2450 default:
2451 case QAM_256:
2452 qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2453 break;
2454 }
2455
2456 if (qam_sl_err_power > 0) {
2457 qam_sl_mer = log10times100(qam_sl_sig_power) -
2458 log10times100((u32) qam_sl_err_power);
2459 }
2460 *p_signal_to_noise = qam_sl_mer;
2461
2462 return status;
2463 }
2464
2465 static int get_dvbt_signal_to_noise(struct drxk_state *state,
2466 s32 *p_signal_to_noise)
2467 {
2468 int status;
2469 u16 reg_data = 0;
2470 u32 eq_reg_td_sqr_err_i = 0;
2471 u32 eq_reg_td_sqr_err_q = 0;
2472 u16 eq_reg_td_sqr_err_exp = 0;
2473 u16 eq_reg_td_tps_pwr_ofs = 0;
2474 u16 eq_reg_td_req_smb_cnt = 0;
2475 u32 tps_cnt = 0;
2476 u32 sqr_err_iq = 0;
2477 u32 a = 0;
2478 u32 b = 0;
2479 u32 c = 0;
2480 u32 i_mer = 0;
2481 u16 transmission_params = 0;
2482
2483 dprintk(1, "\n");
2484
2485 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A,
2486 &eq_reg_td_tps_pwr_ofs);
2487 if (status < 0)
2488 goto error;
2489 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A,
2490 &eq_reg_td_req_smb_cnt);
2491 if (status < 0)
2492 goto error;
2493 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A,
2494 &eq_reg_td_sqr_err_exp);
2495 if (status < 0)
2496 goto error;
2497 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A,
2498 ®_data);
2499 if (status < 0)
2500 goto error;
2501
2502 eq_reg_td_sqr_err_i = (u32) reg_data;
2503 if ((eq_reg_td_sqr_err_exp > 11) &&
2504 (eq_reg_td_sqr_err_i < 0x00000FFFUL)) {
2505 eq_reg_td_sqr_err_i += 0x00010000UL;
2506 }
2507 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®_data);
2508 if (status < 0)
2509 goto error;
2510
2511 eq_reg_td_sqr_err_q = (u32) reg_data;
2512 if ((eq_reg_td_sqr_err_exp > 11) &&
2513 (eq_reg_td_sqr_err_q < 0x00000FFFUL))
2514 eq_reg_td_sqr_err_q += 0x00010000UL;
2515
2516 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A,
2517 &transmission_params);
2518 if (status < 0)
2519 goto error;
2520
2521
2522
2523
2524 if ((eq_reg_td_tps_pwr_ofs == 0) || (eq_reg_td_req_smb_cnt == 0))
2525 i_mer = 0;
2526 else if ((eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) == 0) {
2527
2528
2529
2530 i_mer = 0;
2531 } else {
2532 sqr_err_iq = (eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) <<
2533 eq_reg_td_sqr_err_exp;
2534 if ((transmission_params &
2535 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2536 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2537 tps_cnt = 17;
2538 else
2539 tps_cnt = 68;
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552 a = log10times100(eq_reg_td_tps_pwr_ofs *
2553 eq_reg_td_tps_pwr_ofs);
2554
2555 b = log10times100(eq_reg_td_req_smb_cnt * tps_cnt);
2556
2557 c = log10times100(sqr_err_iq);
2558
2559 i_mer = a + b - c;
2560 }
2561 *p_signal_to_noise = i_mer;
2562
2563 error:
2564 if (status < 0)
2565 pr_err("Error %d on %s\n", status, __func__);
2566 return status;
2567 }
2568
2569 static int get_signal_to_noise(struct drxk_state *state, s32 *p_signal_to_noise)
2570 {
2571 dprintk(1, "\n");
2572
2573 *p_signal_to_noise = 0;
2574 switch (state->m_operation_mode) {
2575 case OM_DVBT:
2576 return get_dvbt_signal_to_noise(state, p_signal_to_noise);
2577 case OM_QAM_ITU_A:
2578 case OM_QAM_ITU_C:
2579 return get_qam_signal_to_noise(state, p_signal_to_noise);
2580 default:
2581 break;
2582 }
2583 return 0;
2584 }
2585
2586 #if 0
2587 static int get_dvbt_quality(struct drxk_state *state, s32 *p_quality)
2588 {
2589
2590 int status = 0;
2591
2592 dprintk(1, "\n");
2593
2594 static s32 QE_SN[] = {
2595 51,
2596 69,
2597 79,
2598 89,
2599 97,
2600 108,
2601 131,
2602 146,
2603 156,
2604 160,
2605 165,
2606 187,
2607 202,
2608 216,
2609 225,
2610 };
2611
2612 *p_quality = 0;
2613
2614 do {
2615 s32 signal_to_noise = 0;
2616 u16 constellation = 0;
2617 u16 code_rate = 0;
2618 u32 signal_to_noise_rel;
2619 u32 ber_quality;
2620
2621 status = get_dvbt_signal_to_noise(state, &signal_to_noise);
2622 if (status < 0)
2623 break;
2624 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A,
2625 &constellation);
2626 if (status < 0)
2627 break;
2628 constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2629
2630 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A,
2631 &code_rate);
2632 if (status < 0)
2633 break;
2634 code_rate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2635
2636 if (constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2637 code_rate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2638 break;
2639 signal_to_noise_rel = signal_to_noise -
2640 QE_SN[constellation * 5 + code_rate];
2641 ber_quality = 100;
2642
2643 if (signal_to_noise_rel < -70)
2644 *p_quality = 0;
2645 else if (signal_to_noise_rel < 30)
2646 *p_quality = ((signal_to_noise_rel + 70) *
2647 ber_quality) / 100;
2648 else
2649 *p_quality = ber_quality;
2650 } while (0);
2651 return 0;
2652 };
2653
2654 static int get_dvbc_quality(struct drxk_state *state, s32 *p_quality)
2655 {
2656 int status = 0;
2657 *p_quality = 0;
2658
2659 dprintk(1, "\n");
2660
2661 do {
2662 u32 signal_to_noise = 0;
2663 u32 ber_quality = 100;
2664 u32 signal_to_noise_rel = 0;
2665
2666 status = get_qam_signal_to_noise(state, &signal_to_noise);
2667 if (status < 0)
2668 break;
2669
2670 switch (state->props.modulation) {
2671 case QAM_16:
2672 signal_to_noise_rel = signal_to_noise - 200;
2673 break;
2674 case QAM_32:
2675 signal_to_noise_rel = signal_to_noise - 230;
2676 break;
2677 case QAM_64:
2678 signal_to_noise_rel = signal_to_noise - 260;
2679 break;
2680 case QAM_128:
2681 signal_to_noise_rel = signal_to_noise - 290;
2682 break;
2683 default:
2684 case QAM_256:
2685 signal_to_noise_rel = signal_to_noise - 320;
2686 break;
2687 }
2688
2689 if (signal_to_noise_rel < -70)
2690 *p_quality = 0;
2691 else if (signal_to_noise_rel < 30)
2692 *p_quality = ((signal_to_noise_rel + 70) *
2693 ber_quality) / 100;
2694 else
2695 *p_quality = ber_quality;
2696 } while (0);
2697
2698 return status;
2699 }
2700
2701 static int get_quality(struct drxk_state *state, s32 *p_quality)
2702 {
2703 dprintk(1, "\n");
2704
2705 switch (state->m_operation_mode) {
2706 case OM_DVBT:
2707 return get_dvbt_quality(state, p_quality);
2708 case OM_QAM_ITU_A:
2709 return get_dvbc_quality(state, p_quality);
2710 default:
2711 break;
2712 }
2713
2714 return 0;
2715 }
2716 #endif
2717
2718
2719 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2720 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2721
2722 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2723 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2724 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2725 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2726
2727 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2728 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2729 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2730
2731 static int ConfigureI2CBridge(struct drxk_state *state, bool b_enable_bridge)
2732 {
2733 int status = -EINVAL;
2734
2735 dprintk(1, "\n");
2736
2737 if (state->m_drxk_state == DRXK_UNINITIALIZED)
2738 return 0;
2739 if (state->m_drxk_state == DRXK_POWERED_DOWN)
2740 goto error;
2741
2742 if (state->no_i2c_bridge)
2743 return 0;
2744
2745 status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
2746 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2747 if (status < 0)
2748 goto error;
2749 if (b_enable_bridge) {
2750 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2751 SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2752 if (status < 0)
2753 goto error;
2754 } else {
2755 status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2756 SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2757 if (status < 0)
2758 goto error;
2759 }
2760
2761 status = hi_command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, NULL);
2762
2763 error:
2764 if (status < 0)
2765 pr_err("Error %d on %s\n", status, __func__);
2766 return status;
2767 }
2768
2769 static int set_pre_saw(struct drxk_state *state,
2770 struct s_cfg_pre_saw *p_pre_saw_cfg)
2771 {
2772 int status = -EINVAL;
2773
2774 dprintk(1, "\n");
2775
2776 if ((p_pre_saw_cfg == NULL)
2777 || (p_pre_saw_cfg->reference > IQM_AF_PDREF__M))
2778 goto error;
2779
2780 status = write16(state, IQM_AF_PDREF__A, p_pre_saw_cfg->reference);
2781 error:
2782 if (status < 0)
2783 pr_err("Error %d on %s\n", status, __func__);
2784 return status;
2785 }
2786
2787 static int bl_direct_cmd(struct drxk_state *state, u32 target_addr,
2788 u16 rom_offset, u16 nr_of_elements, u32 time_out)
2789 {
2790 u16 bl_status = 0;
2791 u16 offset = (u16) ((target_addr >> 0) & 0x00FFFF);
2792 u16 blockbank = (u16) ((target_addr >> 16) & 0x000FFF);
2793 int status;
2794 unsigned long end;
2795
2796 dprintk(1, "\n");
2797
2798 mutex_lock(&state->mutex);
2799 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2800 if (status < 0)
2801 goto error;
2802 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2803 if (status < 0)
2804 goto error;
2805 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2806 if (status < 0)
2807 goto error;
2808 status = write16(state, SIO_BL_SRC_ADDR__A, rom_offset);
2809 if (status < 0)
2810 goto error;
2811 status = write16(state, SIO_BL_SRC_LEN__A, nr_of_elements);
2812 if (status < 0)
2813 goto error;
2814 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2815 if (status < 0)
2816 goto error;
2817
2818 end = jiffies + msecs_to_jiffies(time_out);
2819 do {
2820 status = read16(state, SIO_BL_STATUS__A, &bl_status);
2821 if (status < 0)
2822 goto error;
2823 } while ((bl_status == 0x1) && time_is_after_jiffies(end));
2824 if (bl_status == 0x1) {
2825 pr_err("SIO not ready\n");
2826 status = -EINVAL;
2827 goto error2;
2828 }
2829 error:
2830 if (status < 0)
2831 pr_err("Error %d on %s\n", status, __func__);
2832 error2:
2833 mutex_unlock(&state->mutex);
2834 return status;
2835
2836 }
2837
2838 static int adc_sync_measurement(struct drxk_state *state, u16 *count)
2839 {
2840 u16 data = 0;
2841 int status;
2842
2843 dprintk(1, "\n");
2844
2845
2846 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2847 if (status < 0)
2848 goto error;
2849 status = write16(state, IQM_AF_START_LOCK__A, 1);
2850 if (status < 0)
2851 goto error;
2852
2853 *count = 0;
2854 status = read16(state, IQM_AF_PHASE0__A, &data);
2855 if (status < 0)
2856 goto error;
2857 if (data == 127)
2858 *count = *count + 1;
2859 status = read16(state, IQM_AF_PHASE1__A, &data);
2860 if (status < 0)
2861 goto error;
2862 if (data == 127)
2863 *count = *count + 1;
2864 status = read16(state, IQM_AF_PHASE2__A, &data);
2865 if (status < 0)
2866 goto error;
2867 if (data == 127)
2868 *count = *count + 1;
2869
2870 error:
2871 if (status < 0)
2872 pr_err("Error %d on %s\n", status, __func__);
2873 return status;
2874 }
2875
2876 static int adc_synchronization(struct drxk_state *state)
2877 {
2878 u16 count = 0;
2879 int status;
2880
2881 dprintk(1, "\n");
2882
2883 status = adc_sync_measurement(state, &count);
2884 if (status < 0)
2885 goto error;
2886
2887 if (count == 1) {
2888
2889 u16 clk_neg = 0;
2890
2891 status = read16(state, IQM_AF_CLKNEG__A, &clk_neg);
2892 if (status < 0)
2893 goto error;
2894 if ((clk_neg & IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2895 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2896 clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2897 clk_neg |=
2898 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2899 } else {
2900 clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2901 clk_neg |=
2902 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2903 }
2904 status = write16(state, IQM_AF_CLKNEG__A, clk_neg);
2905 if (status < 0)
2906 goto error;
2907 status = adc_sync_measurement(state, &count);
2908 if (status < 0)
2909 goto error;
2910 }
2911
2912 if (count < 2)
2913 status = -EINVAL;
2914 error:
2915 if (status < 0)
2916 pr_err("Error %d on %s\n", status, __func__);
2917 return status;
2918 }
2919
2920 static int set_frequency_shifter(struct drxk_state *state,
2921 u16 intermediate_freqk_hz,
2922 s32 tuner_freq_offset, bool is_dtv)
2923 {
2924 bool select_pos_image = false;
2925 u32 rf_freq_residual = tuner_freq_offset;
2926 u32 fm_frequency_shift = 0;
2927 bool tuner_mirror = !state->m_b_mirror_freq_spect;
2928 u32 adc_freq;
2929 bool adc_flip;
2930 int status;
2931 u32 if_freq_actual;
2932 u32 sampling_frequency = (u32) (state->m_sys_clock_freq / 3);
2933 u32 frequency_shift;
2934 bool image_to_select;
2935
2936 dprintk(1, "\n");
2937
2938
2939
2940
2941
2942 if (is_dtv) {
2943 if ((state->m_operation_mode == OM_QAM_ITU_A) ||
2944 (state->m_operation_mode == OM_QAM_ITU_C) ||
2945 (state->m_operation_mode == OM_DVBT))
2946 select_pos_image = true;
2947 else
2948 select_pos_image = false;
2949 }
2950 if (tuner_mirror)
2951
2952 if_freq_actual = intermediate_freqk_hz +
2953 rf_freq_residual + fm_frequency_shift;
2954 else
2955
2956 if_freq_actual = intermediate_freqk_hz -
2957 rf_freq_residual - fm_frequency_shift;
2958 if (if_freq_actual > sampling_frequency / 2) {
2959
2960 adc_freq = sampling_frequency - if_freq_actual;
2961 adc_flip = true;
2962 } else {
2963
2964 adc_freq = if_freq_actual;
2965 adc_flip = false;
2966 }
2967
2968 frequency_shift = adc_freq;
2969 image_to_select = state->m_rfmirror ^ tuner_mirror ^
2970 adc_flip ^ select_pos_image;
2971 state->m_iqm_fs_rate_ofs =
2972 Frac28a((frequency_shift), sampling_frequency);
2973
2974 if (image_to_select)
2975 state->m_iqm_fs_rate_ofs = ~state->m_iqm_fs_rate_ofs + 1;
2976
2977
2978
2979 status = write32(state, IQM_FS_RATE_OFS_LO__A,
2980 state->m_iqm_fs_rate_ofs);
2981 if (status < 0)
2982 pr_err("Error %d on %s\n", status, __func__);
2983 return status;
2984 }
2985
2986 static int init_agc(struct drxk_state *state, bool is_dtv)
2987 {
2988 u16 ingain_tgt = 0;
2989 u16 ingain_tgt_min = 0;
2990 u16 ingain_tgt_max = 0;
2991 u16 clp_cyclen = 0;
2992 u16 clp_sum_min = 0;
2993 u16 clp_dir_to = 0;
2994 u16 sns_sum_min = 0;
2995 u16 sns_sum_max = 0;
2996 u16 clp_sum_max = 0;
2997 u16 sns_dir_to = 0;
2998 u16 ki_innergain_min = 0;
2999 u16 if_iaccu_hi_tgt = 0;
3000 u16 if_iaccu_hi_tgt_min = 0;
3001 u16 if_iaccu_hi_tgt_max = 0;
3002 u16 data = 0;
3003 u16 fast_clp_ctrl_delay = 0;
3004 u16 clp_ctrl_mode = 0;
3005 int status = 0;
3006
3007 dprintk(1, "\n");
3008
3009
3010 sns_sum_max = 1023;
3011 if_iaccu_hi_tgt_min = 2047;
3012 clp_cyclen = 500;
3013 clp_sum_max = 1023;
3014
3015
3016 if (!is_qam(state)) {
3017 pr_err("%s: mode %d is not DVB-C\n",
3018 __func__, state->m_operation_mode);
3019 return -EINVAL;
3020 }
3021
3022
3023
3024
3025 clp_sum_min = 8;
3026 clp_dir_to = (u16) -9;
3027 clp_ctrl_mode = 0;
3028 sns_sum_min = 8;
3029 sns_dir_to = (u16) -9;
3030 ki_innergain_min = (u16) -1030;
3031 if_iaccu_hi_tgt_max = 0x2380;
3032 if_iaccu_hi_tgt = 0x2380;
3033 ingain_tgt_min = 0x0511;
3034 ingain_tgt = 0x0511;
3035 ingain_tgt_max = 5119;
3036 fast_clp_ctrl_delay = state->m_qam_if_agc_cfg.fast_clip_ctrl_delay;
3037
3038 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3039 fast_clp_ctrl_delay);
3040 if (status < 0)
3041 goto error;
3042
3043 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode);
3044 if (status < 0)
3045 goto error;
3046 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingain_tgt);
3047 if (status < 0)
3048 goto error;
3049 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingain_tgt_min);
3050 if (status < 0)
3051 goto error;
3052 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max);
3053 if (status < 0)
3054 goto error;
3055 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A,
3056 if_iaccu_hi_tgt_min);
3057 if (status < 0)
3058 goto error;
3059 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
3060 if_iaccu_hi_tgt_max);
3061 if (status < 0)
3062 goto error;
3063 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3064 if (status < 0)
3065 goto error;
3066 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3067 if (status < 0)
3068 goto error;
3069 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3070 if (status < 0)
3071 goto error;
3072 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3073 if (status < 0)
3074 goto error;
3075 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max);
3076 if (status < 0)
3077 goto error;
3078 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max);
3079 if (status < 0)
3080 goto error;
3081
3082 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A,
3083 ki_innergain_min);
3084 if (status < 0)
3085 goto error;
3086 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A,
3087 if_iaccu_hi_tgt);
3088 if (status < 0)
3089 goto error;
3090 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clp_cyclen);
3091 if (status < 0)
3092 goto error;
3093
3094 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3095 if (status < 0)
3096 goto error;
3097 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3098 if (status < 0)
3099 goto error;
3100 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3101 if (status < 0)
3102 goto error;
3103
3104 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3105 if (status < 0)
3106 goto error;
3107 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clp_sum_min);
3108 if (status < 0)
3109 goto error;
3110 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, sns_sum_min);
3111 if (status < 0)
3112 goto error;
3113 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to);
3114 if (status < 0)
3115 goto error;
3116 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to);
3117 if (status < 0)
3118 goto error;
3119 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3120 if (status < 0)
3121 goto error;
3122 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3123 if (status < 0)
3124 goto error;
3125 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3126 if (status < 0)
3127 goto error;
3128 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3129 if (status < 0)
3130 goto error;
3131 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3132 if (status < 0)
3133 goto error;
3134 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3135 if (status < 0)
3136 goto error;
3137 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3138 if (status < 0)
3139 goto error;
3140 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3141 if (status < 0)
3142 goto error;
3143 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3144 if (status < 0)
3145 goto error;
3146 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3147 if (status < 0)
3148 goto error;
3149 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3150 if (status < 0)
3151 goto error;
3152 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3153 if (status < 0)
3154 goto error;
3155 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3156 if (status < 0)
3157 goto error;
3158 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3159 if (status < 0)
3160 goto error;
3161
3162
3163 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3164 if (status < 0)
3165 goto error;
3166
3167 data = 0x0657;
3168 data &= ~SCU_RAM_AGC_KI_RF__M;
3169 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3170 data &= ~SCU_RAM_AGC_KI_IF__M;
3171 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3172
3173 status = write16(state, SCU_RAM_AGC_KI__A, data);
3174 error:
3175 if (status < 0)
3176 pr_err("Error %d on %s\n", status, __func__);
3177 return status;
3178 }
3179
3180 static int dvbtqam_get_acc_pkt_err(struct drxk_state *state, u16 *packet_err)
3181 {
3182 int status;
3183
3184 dprintk(1, "\n");
3185 if (packet_err == NULL)
3186 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3187 else
3188 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A,
3189 packet_err);
3190 if (status < 0)
3191 pr_err("Error %d on %s\n", status, __func__);
3192 return status;
3193 }
3194
3195 static int dvbt_sc_command(struct drxk_state *state,
3196 u16 cmd, u16 subcmd,
3197 u16 param0, u16 param1, u16 param2,
3198 u16 param3, u16 param4)
3199 {
3200 u16 cur_cmd = 0;
3201 u16 err_code = 0;
3202 u16 retry_cnt = 0;
3203 u16 sc_exec = 0;
3204 int status;
3205
3206 dprintk(1, "\n");
3207 status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_exec);
3208 if (sc_exec != 1) {
3209
3210 status = -EINVAL;
3211 }
3212 if (status < 0)
3213 goto error;
3214
3215
3216 retry_cnt = 0;
3217 do {
3218 usleep_range(1000, 2000);
3219 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3220 retry_cnt++;
3221 } while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3222 if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3223 goto error;
3224
3225
3226 switch (cmd) {
3227
3228 case OFDM_SC_RA_RAM_CMD_PROC_START:
3229 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3230 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3231 status = write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3232 if (status < 0)
3233 goto error;
3234 break;
3235 default:
3236
3237 break;
3238 }
3239
3240
3241 status = 0;
3242 switch (cmd) {
3243
3244
3245
3246
3247 case OFDM_SC_RA_RAM_CMD_PROC_START:
3248 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3249 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3250 status |= write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3251 fallthrough;
3252 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3253 case OFDM_SC_RA_RAM_CMD_USER_IO:
3254 status |= write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3255 fallthrough;
3256 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3257 case OFDM_SC_RA_RAM_CMD_NULL:
3258
3259 status |= write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3260 break;
3261 default:
3262
3263 status = -EINVAL;
3264 }
3265 if (status < 0)
3266 goto error;
3267
3268
3269 retry_cnt = 0;
3270 do {
3271 usleep_range(1000, 2000);
3272 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3273 retry_cnt++;
3274 } while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3275 if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3276 goto error;
3277
3278
3279 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &err_code);
3280 if (err_code == 0xFFFF) {
3281
3282 status = -EINVAL;
3283 }
3284 if (status < 0)
3285 goto error;
3286
3287
3288 switch (cmd) {
3289
3290
3291
3292
3293
3294 case OFDM_SC_RA_RAM_CMD_USER_IO:
3295 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3296 status = read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3297 break;
3298
3299 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3300 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3301 case OFDM_SC_RA_RAM_CMD_PROC_START:
3302 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3303 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3304 case OFDM_SC_RA_RAM_CMD_NULL:
3305 break;
3306 default:
3307
3308 status = -EINVAL;
3309 break;
3310 }
3311 error:
3312 if (status < 0)
3313 pr_err("Error %d on %s\n", status, __func__);
3314 return status;
3315 }
3316
3317 static int power_up_dvbt(struct drxk_state *state)
3318 {
3319 enum drx_power_mode power_mode = DRX_POWER_UP;
3320 int status;
3321
3322 dprintk(1, "\n");
3323 status = ctrl_power_mode(state, &power_mode);
3324 if (status < 0)
3325 pr_err("Error %d on %s\n", status, __func__);
3326 return status;
3327 }
3328
3329 static int dvbt_ctrl_set_inc_enable(struct drxk_state *state, bool *enabled)
3330 {
3331 int status;
3332
3333 dprintk(1, "\n");
3334 if (*enabled)
3335 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3336 else
3337 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3338 if (status < 0)
3339 pr_err("Error %d on %s\n", status, __func__);
3340 return status;
3341 }
3342
3343 #define DEFAULT_FR_THRES_8K 4000
3344 static int dvbt_ctrl_set_fr_enable(struct drxk_state *state, bool *enabled)
3345 {
3346
3347 int status;
3348
3349 dprintk(1, "\n");
3350 if (*enabled) {
3351
3352 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3353 DEFAULT_FR_THRES_8K);
3354 } else {
3355
3356 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3357 }
3358 if (status < 0)
3359 pr_err("Error %d on %s\n", status, __func__);
3360
3361 return status;
3362 }
3363
3364 static int dvbt_ctrl_set_echo_threshold(struct drxk_state *state,
3365 struct drxk_cfg_dvbt_echo_thres_t *echo_thres)
3366 {
3367 u16 data = 0;
3368 int status;
3369
3370 dprintk(1, "\n");
3371 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3372 if (status < 0)
3373 goto error;
3374
3375 switch (echo_thres->fft_mode) {
3376 case DRX_FFTMODE_2K:
3377 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3378 data |= ((echo_thres->threshold <<
3379 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3380 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3381 break;
3382 case DRX_FFTMODE_8K:
3383 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3384 data |= ((echo_thres->threshold <<
3385 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3386 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3387 break;
3388 default:
3389 return -EINVAL;
3390 }
3391
3392 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3393 error:
3394 if (status < 0)
3395 pr_err("Error %d on %s\n", status, __func__);
3396 return status;
3397 }
3398
3399 static int dvbt_ctrl_set_sqi_speed(struct drxk_state *state,
3400 enum drxk_cfg_dvbt_sqi_speed *speed)
3401 {
3402 int status = -EINVAL;
3403
3404 dprintk(1, "\n");
3405
3406 switch (*speed) {
3407 case DRXK_DVBT_SQI_SPEED_FAST:
3408 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3409 case DRXK_DVBT_SQI_SPEED_SLOW:
3410 break;
3411 default:
3412 goto error;
3413 }
3414 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3415 (u16) *speed);
3416 error:
3417 if (status < 0)
3418 pr_err("Error %d on %s\n", status, __func__);
3419 return status;
3420 }
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432 static int dvbt_activate_presets(struct drxk_state *state)
3433 {
3434 int status;
3435 bool setincenable = false;
3436 bool setfrenable = true;
3437
3438 struct drxk_cfg_dvbt_echo_thres_t echo_thres2k = { 0, DRX_FFTMODE_2K };
3439 struct drxk_cfg_dvbt_echo_thres_t echo_thres8k = { 0, DRX_FFTMODE_8K };
3440
3441 dprintk(1, "\n");
3442 status = dvbt_ctrl_set_inc_enable(state, &setincenable);
3443 if (status < 0)
3444 goto error;
3445 status = dvbt_ctrl_set_fr_enable(state, &setfrenable);
3446 if (status < 0)
3447 goto error;
3448 status = dvbt_ctrl_set_echo_threshold(state, &echo_thres2k);
3449 if (status < 0)
3450 goto error;
3451 status = dvbt_ctrl_set_echo_threshold(state, &echo_thres8k);
3452 if (status < 0)
3453 goto error;
3454 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A,
3455 state->m_dvbt_if_agc_cfg.ingain_tgt_max);
3456 error:
3457 if (status < 0)
3458 pr_err("Error %d on %s\n", status, __func__);
3459 return status;
3460 }
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472 static int set_dvbt_standard(struct drxk_state *state,
3473 enum operation_mode o_mode)
3474 {
3475 u16 cmd_result = 0;
3476 u16 data = 0;
3477 int status;
3478
3479 dprintk(1, "\n");
3480
3481 power_up_dvbt(state);
3482
3483 switch_antenna_to_dvbt(state);
3484
3485 status = scu_command(state,
3486 SCU_RAM_COMMAND_STANDARD_OFDM
3487 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
3488 0, NULL, 1, &cmd_result);
3489 if (status < 0)
3490 goto error;
3491
3492
3493 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3494 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
3495 0, NULL, 1, &cmd_result);
3496 if (status < 0)
3497 goto error;
3498
3499
3500 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3501 if (status < 0)
3502 goto error;
3503 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3504 if (status < 0)
3505 goto error;
3506 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3507 if (status < 0)
3508 goto error;
3509
3510
3511
3512 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3513 if (status < 0)
3514 goto error;
3515
3516 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3517 if (status < 0)
3518 goto error;
3519
3520 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3521 if (status < 0)
3522 goto error;
3523
3524 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3525 if (status < 0)
3526 goto error;
3527 status = set_iqm_af(state, true);
3528 if (status < 0)
3529 goto error;
3530
3531 status = write16(state, IQM_AF_AGC_RF__A, 0);
3532 if (status < 0)
3533 goto error;
3534
3535
3536 status = write16(state, IQM_AF_INC_LCT__A, 0);
3537 if (status < 0)
3538 goto error;
3539 status = write16(state, IQM_CF_DET_LCT__A, 0);
3540 if (status < 0)
3541 goto error;
3542 status = write16(state, IQM_CF_WND_LEN__A, 3);
3543 if (status < 0)
3544 goto error;
3545
3546 status = write16(state, IQM_RC_STRETCH__A, 16);
3547 if (status < 0)
3548 goto error;
3549 status = write16(state, IQM_CF_OUT_ENA__A, 0x4);
3550 if (status < 0)
3551 goto error;
3552 status = write16(state, IQM_CF_DS_ENA__A, 0x4);
3553 if (status < 0)
3554 goto error;
3555 status = write16(state, IQM_CF_SCALE__A, 1600);
3556 if (status < 0)
3557 goto error;
3558 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3559 if (status < 0)
3560 goto error;
3561
3562
3563 status = write16(state, IQM_AF_CLP_TH__A, 448);
3564 if (status < 0)
3565 goto error;
3566 status = write16(state, IQM_CF_DATATH__A, 495);
3567 if (status < 0)
3568 goto error;
3569
3570 status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT,
3571 DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3572 if (status < 0)
3573 goto error;
3574
3575 status = write16(state, IQM_CF_PKDTH__A, 2);
3576 if (status < 0)
3577 goto error;
3578 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3579 if (status < 0)
3580 goto error;
3581
3582 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3583 if (status < 0)
3584 goto error;
3585 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3586 if (status < 0)
3587 goto error;
3588
3589
3590 status = adc_synchronization(state);
3591 if (status < 0)
3592 goto error;
3593 status = set_pre_saw(state, &state->m_dvbt_pre_saw_cfg);
3594 if (status < 0)
3595 goto error;
3596
3597
3598 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3599 if (status < 0)
3600 goto error;
3601
3602 status = set_agc_rf(state, &state->m_dvbt_rf_agc_cfg, true);
3603 if (status < 0)
3604 goto error;
3605 status = set_agc_if(state, &state->m_dvbt_if_agc_cfg, true);
3606 if (status < 0)
3607 goto error;
3608
3609
3610 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3611 if (status < 0)
3612 goto error;
3613 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3614 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3615 if (status < 0)
3616 goto error;
3617
3618
3619 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3620 if (status < 0)
3621 goto error;
3622
3623 if (!state->m_drxk_a3_rom_code) {
3624
3625 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3626 state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay);
3627 if (status < 0)
3628 goto error;
3629 }
3630
3631
3632 #ifdef COMPILE_FOR_NONRT
3633 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3634 if (status < 0)
3635 goto error;
3636 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3637 if (status < 0)
3638 goto error;
3639 #endif
3640
3641
3642 status = write16(state, FEC_DI_INPUT_CTL__A, 1);
3643 if (status < 0)
3644 goto error;
3645
3646
3647 #ifdef COMPILE_FOR_NONRT
3648 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3649 if (status < 0)
3650 goto error;
3651 #else
3652 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3653 if (status < 0)
3654 goto error;
3655 #endif
3656 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3657 if (status < 0)
3658 goto error;
3659
3660
3661 status = mpegts_dto_setup(state, OM_DVBT);
3662 if (status < 0)
3663 goto error;
3664
3665 status = dvbt_activate_presets(state);
3666 if (status < 0)
3667 goto error;
3668
3669 error:
3670 if (status < 0)
3671 pr_err("Error %d on %s\n", status, __func__);
3672 return status;
3673 }
3674
3675
3676
3677
3678
3679
3680
3681 static int dvbt_start(struct drxk_state *state)
3682 {
3683 u16 param1;
3684 int status;
3685
3686
3687 dprintk(1, "\n");
3688
3689
3690 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3691 status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0,
3692 OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1,
3693 0, 0, 0);
3694 if (status < 0)
3695 goto error;
3696
3697 status = mpegts_start(state);
3698 if (status < 0)
3699 goto error;
3700 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3701 if (status < 0)
3702 goto error;
3703 error:
3704 if (status < 0)
3705 pr_err("Error %d on %s\n", status, __func__);
3706 return status;
3707 }
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718 static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
3719 s32 tuner_freq_offset)
3720 {
3721 u16 cmd_result = 0;
3722 u16 transmission_params = 0;
3723 u32 iqm_rc_rate_ofs = 0;
3724 u32 bandwidth = 0;
3725 u16 param1;
3726 int status;
3727
3728 dprintk(1, "IF =%d, TFO = %d\n",
3729 intermediate_freqk_hz, tuner_freq_offset);
3730
3731 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3732 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
3733 0, NULL, 1, &cmd_result);
3734 if (status < 0)
3735 goto error;
3736
3737
3738 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3739 if (status < 0)
3740 goto error;
3741
3742
3743 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3744 if (status < 0)
3745 goto error;
3746 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3747 if (status < 0)
3748 goto error;
3749
3750
3751
3752 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3753 if (status < 0)
3754 goto error;
3755
3756
3757
3758
3759 switch (state->props.transmission_mode) {
3760 case TRANSMISSION_MODE_AUTO:
3761 case TRANSMISSION_MODE_8K:
3762 default:
3763 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3764 break;
3765 case TRANSMISSION_MODE_2K:
3766 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3767 break;
3768 }
3769
3770
3771 switch (state->props.guard_interval) {
3772 default:
3773 case GUARD_INTERVAL_AUTO:
3774 case GUARD_INTERVAL_1_4:
3775 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3776 break;
3777 case GUARD_INTERVAL_1_32:
3778 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3779 break;
3780 case GUARD_INTERVAL_1_16:
3781 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3782 break;
3783 case GUARD_INTERVAL_1_8:
3784 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3785 break;
3786 }
3787
3788
3789 switch (state->props.hierarchy) {
3790 case HIERARCHY_AUTO:
3791 case HIERARCHY_NONE:
3792 default:
3793 case HIERARCHY_1:
3794 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3795 break;
3796 case HIERARCHY_2:
3797 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3798 break;
3799 case HIERARCHY_4:
3800 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3801 break;
3802 }
3803
3804
3805
3806 switch (state->props.modulation) {
3807 case QAM_AUTO:
3808 default:
3809 case QAM_64:
3810 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3811 break;
3812 case QPSK:
3813 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3814 break;
3815 case QAM_16:
3816 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3817 break;
3818 }
3819 #if 0
3820
3821
3822 switch (channel->priority) {
3823 case DRX_PRIORITY_LOW:
3824 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3825 WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3826 OFDM_EC_SB_PRIOR_LO);
3827 break;
3828 case DRX_PRIORITY_HIGH:
3829 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3830 WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3831 OFDM_EC_SB_PRIOR_HI));
3832 break;
3833 case DRX_PRIORITY_UNKNOWN:
3834 default:
3835 status = -EINVAL;
3836 goto error;
3837 }
3838 #else
3839
3840 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3841 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3842 if (status < 0)
3843 goto error;
3844 #endif
3845
3846
3847 switch (state->props.code_rate_HP) {
3848 case FEC_AUTO:
3849 default:
3850 case FEC_2_3:
3851 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3852 break;
3853 case FEC_1_2:
3854 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3855 break;
3856 case FEC_3_4:
3857 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3858 break;
3859 case FEC_5_6:
3860 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3861 break;
3862 case FEC_7_8:
3863 transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3864 break;
3865 }
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880 switch (state->props.bandwidth_hz) {
3881 case 0:
3882 state->props.bandwidth_hz = 8000000;
3883 fallthrough;
3884 case 8000000:
3885 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3886 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3887 3052);
3888 if (status < 0)
3889 goto error;
3890
3891 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3892 7);
3893 if (status < 0)
3894 goto error;
3895 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3896 7);
3897 if (status < 0)
3898 goto error;
3899 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3900 7);
3901 if (status < 0)
3902 goto error;
3903 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3904 1);
3905 if (status < 0)
3906 goto error;
3907 break;
3908 case 7000000:
3909 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3910 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3911 3491);
3912 if (status < 0)
3913 goto error;
3914
3915 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3916 8);
3917 if (status < 0)
3918 goto error;
3919 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3920 8);
3921 if (status < 0)
3922 goto error;
3923 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3924 4);
3925 if (status < 0)
3926 goto error;
3927 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3928 1);
3929 if (status < 0)
3930 goto error;
3931 break;
3932 case 6000000:
3933 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3934 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3935 4073);
3936 if (status < 0)
3937 goto error;
3938
3939 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3940 19);
3941 if (status < 0)
3942 goto error;
3943 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3944 19);
3945 if (status < 0)
3946 goto error;
3947 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3948 14);
3949 if (status < 0)
3950 goto error;
3951 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3952 1);
3953 if (status < 0)
3954 goto error;
3955 break;
3956 default:
3957 status = -EINVAL;
3958 goto error;
3959 }
3960
3961 if (iqm_rc_rate_ofs == 0) {
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974 iqm_rc_rate_ofs = Frac28a((u32)
3975 ((state->m_sys_clock_freq *
3976 1000) / 3), bandwidth);
3977
3978 if ((iqm_rc_rate_ofs & 0x7fL) >= 0x40)
3979 iqm_rc_rate_ofs += 0x80L;
3980 iqm_rc_rate_ofs = iqm_rc_rate_ofs >> 7;
3981
3982 iqm_rc_rate_ofs = iqm_rc_rate_ofs - (1 << 23);
3983 }
3984
3985 iqm_rc_rate_ofs &=
3986 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
3987 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
3988 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate_ofs);
3989 if (status < 0)
3990 goto error;
3991
3992
3993
3994 #if 0
3995 status = dvbt_set_frequency_shift(demod, channel, tuner_offset);
3996 if (status < 0)
3997 goto error;
3998 #endif
3999 status = set_frequency_shifter(state, intermediate_freqk_hz,
4000 tuner_freq_offset, true);
4001 if (status < 0)
4002 goto error;
4003
4004
4005
4006
4007 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4008 if (status < 0)
4009 goto error;
4010
4011
4012 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4013 if (status < 0)
4014 goto error;
4015 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4016 if (status < 0)
4017 goto error;
4018
4019
4020 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
4021 | SCU_RAM_COMMAND_CMD_DEMOD_START,
4022 0, NULL, 1, &cmd_result);
4023 if (status < 0)
4024 goto error;
4025
4026
4027 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4028 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4029 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4030 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4031 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4032 status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4033 0, transmission_params, param1, 0, 0, 0);
4034 if (status < 0)
4035 goto error;
4036
4037 if (!state->m_drxk_a3_rom_code)
4038 status = dvbt_ctrl_set_sqi_speed(state, &state->m_sqi_speed);
4039 error:
4040 if (status < 0)
4041 pr_err("Error %d on %s\n", status, __func__);
4042
4043 return status;
4044 }
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056 static int get_dvbt_lock_status(struct drxk_state *state, u32 *p_lock_status)
4057 {
4058 int status;
4059 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4060 OFDM_SC_RA_RAM_LOCK_FEC__M);
4061 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4062 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4063
4064 u16 sc_ra_ram_lock = 0;
4065 u16 sc_comm_exec = 0;
4066
4067 dprintk(1, "\n");
4068
4069 *p_lock_status = NOT_LOCKED;
4070
4071
4072 status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_comm_exec);
4073 if (status < 0)
4074 goto end;
4075 if (sc_comm_exec == OFDM_SC_COMM_EXEC_STOP)
4076 goto end;
4077
4078 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &sc_ra_ram_lock);
4079 if (status < 0)
4080 goto end;
4081
4082 if ((sc_ra_ram_lock & mpeg_lock_mask) == mpeg_lock_mask)
4083 *p_lock_status = MPEG_LOCK;
4084 else if ((sc_ra_ram_lock & fec_lock_mask) == fec_lock_mask)
4085 *p_lock_status = FEC_LOCK;
4086 else if ((sc_ra_ram_lock & demod_lock_mask) == demod_lock_mask)
4087 *p_lock_status = DEMOD_LOCK;
4088 else if (sc_ra_ram_lock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4089 *p_lock_status = NEVER_LOCK;
4090 end:
4091 if (status < 0)
4092 pr_err("Error %d on %s\n", status, __func__);
4093
4094 return status;
4095 }
4096
4097 static int power_up_qam(struct drxk_state *state)
4098 {
4099 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
4100 int status;
4101
4102 dprintk(1, "\n");
4103 status = ctrl_power_mode(state, &power_mode);
4104 if (status < 0)
4105 pr_err("Error %d on %s\n", status, __func__);
4106
4107 return status;
4108 }
4109
4110
4111
4112 static int power_down_qam(struct drxk_state *state)
4113 {
4114 u16 data = 0;
4115 u16 cmd_result;
4116 int status = 0;
4117
4118 dprintk(1, "\n");
4119 status = read16(state, SCU_COMM_EXEC__A, &data);
4120 if (status < 0)
4121 goto error;
4122 if (data == SCU_COMM_EXEC_ACTIVE) {
4123
4124
4125
4126
4127
4128 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4129 if (status < 0)
4130 goto error;
4131 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
4132 | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
4133 0, NULL, 1, &cmd_result);
4134 if (status < 0)
4135 goto error;
4136 }
4137
4138 status = set_iqm_af(state, false);
4139
4140 error:
4141 if (status < 0)
4142 pr_err("Error %d on %s\n", status, __func__);
4143
4144 return status;
4145 }
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160 static int set_qam_measurement(struct drxk_state *state,
4161 enum e_drxk_constellation modulation,
4162 u32 symbol_rate)
4163 {
4164 u32 fec_bits_desired = 0;
4165 u32 fec_rs_period_total = 0;
4166 u16 fec_rs_prescale = 0;
4167 u16 fec_rs_period = 0;
4168 int status = 0;
4169
4170 dprintk(1, "\n");
4171
4172 fec_rs_prescale = 1;
4173
4174
4175
4176
4177
4178
4179 switch (modulation) {
4180 case DRX_CONSTELLATION_QAM16:
4181 fec_bits_desired = 4 * symbol_rate;
4182 break;
4183 case DRX_CONSTELLATION_QAM32:
4184 fec_bits_desired = 5 * symbol_rate;
4185 break;
4186 case DRX_CONSTELLATION_QAM64:
4187 fec_bits_desired = 6 * symbol_rate;
4188 break;
4189 case DRX_CONSTELLATION_QAM128:
4190 fec_bits_desired = 7 * symbol_rate;
4191 break;
4192 case DRX_CONSTELLATION_QAM256:
4193 fec_bits_desired = 8 * symbol_rate;
4194 break;
4195 default:
4196 status = -EINVAL;
4197 }
4198 if (status < 0)
4199 goto error;
4200
4201 fec_bits_desired /= 1000;
4202 fec_bits_desired *= 500;
4203
4204
4205
4206 fec_rs_period_total = (fec_bits_desired / 1632UL) + 1;
4207
4208
4209 fec_rs_prescale = 1 + (u16) (fec_rs_period_total >> 16);
4210 if (fec_rs_prescale == 0) {
4211
4212 status = -EINVAL;
4213 if (status < 0)
4214 goto error;
4215 }
4216 fec_rs_period =
4217 ((u16) fec_rs_period_total +
4218 (fec_rs_prescale >> 1)) / fec_rs_prescale;
4219
4220
4221 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fec_rs_period);
4222 if (status < 0)
4223 goto error;
4224 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A,
4225 fec_rs_prescale);
4226 if (status < 0)
4227 goto error;
4228 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fec_rs_period);
4229 error:
4230 if (status < 0)
4231 pr_err("Error %d on %s\n", status, __func__);
4232 return status;
4233 }
4234
4235 static int set_qam16(struct drxk_state *state)
4236 {
4237 int status = 0;
4238
4239 dprintk(1, "\n");
4240
4241
4242 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4243 if (status < 0)
4244 goto error;
4245 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4246 if (status < 0)
4247 goto error;
4248 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4249 if (status < 0)
4250 goto error;
4251 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4252 if (status < 0)
4253 goto error;
4254 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4255 if (status < 0)
4256 goto error;
4257 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4258 if (status < 0)
4259 goto error;
4260
4261 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4262 if (status < 0)
4263 goto error;
4264 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4265 if (status < 0)
4266 goto error;
4267 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4268 if (status < 0)
4269 goto error;
4270 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4271 if (status < 0)
4272 goto error;
4273 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4274 if (status < 0)
4275 goto error;
4276 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4277 if (status < 0)
4278 goto error;
4279
4280 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4281 if (status < 0)
4282 goto error;
4283 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4284 if (status < 0)
4285 goto error;
4286 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4287 if (status < 0)
4288 goto error;
4289
4290
4291 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4292 DRXK_QAM_SL_SIG_POWER_QAM16);
4293 if (status < 0)
4294 goto error;
4295
4296
4297 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4298 if (status < 0)
4299 goto error;
4300 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4301 if (status < 0)
4302 goto error;
4303 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4304 if (status < 0)
4305 goto error;
4306 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4307 if (status < 0)
4308 goto error;
4309 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4310 if (status < 0)
4311 goto error;
4312 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4313 if (status < 0)
4314 goto error;
4315 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4316 if (status < 0)
4317 goto error;
4318 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4319 if (status < 0)
4320 goto error;
4321
4322 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4323 if (status < 0)
4324 goto error;
4325 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4326 if (status < 0)
4327 goto error;
4328 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4329 if (status < 0)
4330 goto error;
4331 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4332 if (status < 0)
4333 goto error;
4334 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4335 if (status < 0)
4336 goto error;
4337 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4338 if (status < 0)
4339 goto error;
4340 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4341 if (status < 0)
4342 goto error;
4343 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4344 if (status < 0)
4345 goto error;
4346 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4347 if (status < 0)
4348 goto error;
4349 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4350 if (status < 0)
4351 goto error;
4352 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4353 if (status < 0)
4354 goto error;
4355 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4356 if (status < 0)
4357 goto error;
4358
4359
4360
4361
4362 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4363 if (status < 0)
4364 goto error;
4365 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4366 if (status < 0)
4367 goto error;
4368 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4369 if (status < 0)
4370 goto error;
4371 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4372 if (status < 0)
4373 goto error;
4374 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4375 if (status < 0)
4376 goto error;
4377 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4378 if (status < 0)
4379 goto error;
4380
4381 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4382 if (status < 0)
4383 goto error;
4384 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4385 if (status < 0)
4386 goto error;
4387 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4388 if (status < 0)
4389 goto error;
4390
4391
4392
4393
4394 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4395 if (status < 0)
4396 goto error;
4397 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4398 if (status < 0)
4399 goto error;
4400 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4401 if (status < 0)
4402 goto error;
4403 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4404 if (status < 0)
4405 goto error;
4406 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4407 if (status < 0)
4408 goto error;
4409 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4410 if (status < 0)
4411 goto error;
4412 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4413 if (status < 0)
4414 goto error;
4415
4416 error:
4417 if (status < 0)
4418 pr_err("Error %d on %s\n", status, __func__);
4419 return status;
4420 }
4421
4422
4423
4424
4425
4426
4427
4428
4429 static int set_qam32(struct drxk_state *state)
4430 {
4431 int status = 0;
4432
4433 dprintk(1, "\n");
4434
4435
4436
4437 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4438 if (status < 0)
4439 goto error;
4440 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4441 if (status < 0)
4442 goto error;
4443 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4444 if (status < 0)
4445 goto error;
4446 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4447 if (status < 0)
4448 goto error;
4449 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4450 if (status < 0)
4451 goto error;
4452 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4453 if (status < 0)
4454 goto error;
4455
4456
4457 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4458 if (status < 0)
4459 goto error;
4460 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4461 if (status < 0)
4462 goto error;
4463 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4464 if (status < 0)
4465 goto error;
4466 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4467 if (status < 0)
4468 goto error;
4469 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4470 if (status < 0)
4471 goto error;
4472 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4473 if (status < 0)
4474 goto error;
4475
4476 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4477 if (status < 0)
4478 goto error;
4479 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4480 if (status < 0)
4481 goto error;
4482 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4483 if (status < 0)
4484 goto error;
4485
4486
4487
4488 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4489 DRXK_QAM_SL_SIG_POWER_QAM32);
4490 if (status < 0)
4491 goto error;
4492
4493
4494
4495
4496 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4497 if (status < 0)
4498 goto error;
4499 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4500 if (status < 0)
4501 goto error;
4502 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4503 if (status < 0)
4504 goto error;
4505 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4506 if (status < 0)
4507 goto error;
4508 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4509 if (status < 0)
4510 goto error;
4511 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4512 if (status < 0)
4513 goto error;
4514 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4515 if (status < 0)
4516 goto error;
4517 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4518 if (status < 0)
4519 goto error;
4520
4521 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4522 if (status < 0)
4523 goto error;
4524 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4525 if (status < 0)
4526 goto error;
4527 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4528 if (status < 0)
4529 goto error;
4530 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4531 if (status < 0)
4532 goto error;
4533 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4534 if (status < 0)
4535 goto error;
4536 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4537 if (status < 0)
4538 goto error;
4539 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4540 if (status < 0)
4541 goto error;
4542 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4543 if (status < 0)
4544 goto error;
4545 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4546 if (status < 0)
4547 goto error;
4548 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4549 if (status < 0)
4550 goto error;
4551 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4552 if (status < 0)
4553 goto error;
4554 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4555 if (status < 0)
4556 goto error;
4557
4558
4559
4560
4561 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4562 if (status < 0)
4563 goto error;
4564 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4565 if (status < 0)
4566 goto error;
4567 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4568 if (status < 0)
4569 goto error;
4570 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4571 if (status < 0)
4572 goto error;
4573 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4574 if (status < 0)
4575 goto error;
4576 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4577 if (status < 0)
4578 goto error;
4579
4580 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4581 if (status < 0)
4582 goto error;
4583 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4584 if (status < 0)
4585 goto error;
4586 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4587 if (status < 0)
4588 goto error;
4589
4590
4591
4592
4593 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4594 if (status < 0)
4595 goto error;
4596 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4597 if (status < 0)
4598 goto error;
4599 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4600 if (status < 0)
4601 goto error;
4602 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4603 if (status < 0)
4604 goto error;
4605 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4606 if (status < 0)
4607 goto error;
4608 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4609 if (status < 0)
4610 goto error;
4611 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4612 error:
4613 if (status < 0)
4614 pr_err("Error %d on %s\n", status, __func__);
4615 return status;
4616 }
4617
4618
4619
4620
4621
4622
4623
4624
4625 static int set_qam64(struct drxk_state *state)
4626 {
4627 int status = 0;
4628
4629 dprintk(1, "\n");
4630
4631
4632 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4633 if (status < 0)
4634 goto error;
4635 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4636 if (status < 0)
4637 goto error;
4638 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4639 if (status < 0)
4640 goto error;
4641 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4642 if (status < 0)
4643 goto error;
4644 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4645 if (status < 0)
4646 goto error;
4647 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4648 if (status < 0)
4649 goto error;
4650
4651
4652 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4653 if (status < 0)
4654 goto error;
4655 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4656 if (status < 0)
4657 goto error;
4658 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4659 if (status < 0)
4660 goto error;
4661 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4662 if (status < 0)
4663 goto error;
4664 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4665 if (status < 0)
4666 goto error;
4667 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4668 if (status < 0)
4669 goto error;
4670
4671 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4672 if (status < 0)
4673 goto error;
4674 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4675 if (status < 0)
4676 goto error;
4677 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4678 if (status < 0)
4679 goto error;
4680
4681
4682 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4683 DRXK_QAM_SL_SIG_POWER_QAM64);
4684 if (status < 0)
4685 goto error;
4686
4687
4688
4689
4690 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4691 if (status < 0)
4692 goto error;
4693 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4694 if (status < 0)
4695 goto error;
4696 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4697 if (status < 0)
4698 goto error;
4699 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4700 if (status < 0)
4701 goto error;
4702 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4703 if (status < 0)
4704 goto error;
4705 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4706 if (status < 0)
4707 goto error;
4708 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4709 if (status < 0)
4710 goto error;
4711 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4712 if (status < 0)
4713 goto error;
4714
4715 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4716 if (status < 0)
4717 goto error;
4718 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4719 if (status < 0)
4720 goto error;
4721 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4722 if (status < 0)
4723 goto error;
4724 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4725 if (status < 0)
4726 goto error;
4727 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4728 if (status < 0)
4729 goto error;
4730 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4731 if (status < 0)
4732 goto error;
4733 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4734 if (status < 0)
4735 goto error;
4736 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4737 if (status < 0)
4738 goto error;
4739 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4740 if (status < 0)
4741 goto error;
4742 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4743 if (status < 0)
4744 goto error;
4745 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4746 if (status < 0)
4747 goto error;
4748 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4749 if (status < 0)
4750 goto error;
4751
4752
4753
4754
4755 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4756 if (status < 0)
4757 goto error;
4758 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4759 if (status < 0)
4760 goto error;
4761 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4762 if (status < 0)
4763 goto error;
4764 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4765 if (status < 0)
4766 goto error;
4767 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4768 if (status < 0)
4769 goto error;
4770 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4771 if (status < 0)
4772 goto error;
4773
4774 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4775 if (status < 0)
4776 goto error;
4777 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4778 if (status < 0)
4779 goto error;
4780 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4781 if (status < 0)
4782 goto error;
4783
4784
4785
4786
4787 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4788 if (status < 0)
4789 goto error;
4790 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4791 if (status < 0)
4792 goto error;
4793 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4794 if (status < 0)
4795 goto error;
4796 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4797 if (status < 0)
4798 goto error;
4799 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4800 if (status < 0)
4801 goto error;
4802 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4803 if (status < 0)
4804 goto error;
4805 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4806 error:
4807 if (status < 0)
4808 pr_err("Error %d on %s\n", status, __func__);
4809
4810 return status;
4811 }
4812
4813
4814
4815
4816
4817
4818
4819
4820 static int set_qam128(struct drxk_state *state)
4821 {
4822 int status = 0;
4823
4824 dprintk(1, "\n");
4825
4826
4827 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4828 if (status < 0)
4829 goto error;
4830 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4831 if (status < 0)
4832 goto error;
4833 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4834 if (status < 0)
4835 goto error;
4836 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4837 if (status < 0)
4838 goto error;
4839 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4840 if (status < 0)
4841 goto error;
4842 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4843 if (status < 0)
4844 goto error;
4845
4846
4847 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4848 if (status < 0)
4849 goto error;
4850 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4851 if (status < 0)
4852 goto error;
4853 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4854 if (status < 0)
4855 goto error;
4856 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4857 if (status < 0)
4858 goto error;
4859 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4860 if (status < 0)
4861 goto error;
4862 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4863 if (status < 0)
4864 goto error;
4865
4866 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4867 if (status < 0)
4868 goto error;
4869 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4870 if (status < 0)
4871 goto error;
4872 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4873 if (status < 0)
4874 goto error;
4875
4876
4877
4878
4879 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4880 DRXK_QAM_SL_SIG_POWER_QAM128);
4881 if (status < 0)
4882 goto error;
4883
4884
4885
4886
4887 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4888 if (status < 0)
4889 goto error;
4890 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4891 if (status < 0)
4892 goto error;
4893 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4894 if (status < 0)
4895 goto error;
4896 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4897 if (status < 0)
4898 goto error;
4899 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4900 if (status < 0)
4901 goto error;
4902 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4903 if (status < 0)
4904 goto error;
4905 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4906 if (status < 0)
4907 goto error;
4908 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4909 if (status < 0)
4910 goto error;
4911
4912 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4913 if (status < 0)
4914 goto error;
4915 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4916 if (status < 0)
4917 goto error;
4918 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4919 if (status < 0)
4920 goto error;
4921 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4922 if (status < 0)
4923 goto error;
4924 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4925 if (status < 0)
4926 goto error;
4927 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4928 if (status < 0)
4929 goto error;
4930 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4931 if (status < 0)
4932 goto error;
4933 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4934 if (status < 0)
4935 goto error;
4936 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4937 if (status < 0)
4938 goto error;
4939 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4940 if (status < 0)
4941 goto error;
4942 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4943 if (status < 0)
4944 goto error;
4945 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4946 if (status < 0)
4947 goto error;
4948
4949
4950
4951
4952 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4953 if (status < 0)
4954 goto error;
4955 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4956 if (status < 0)
4957 goto error;
4958 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4959 if (status < 0)
4960 goto error;
4961 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4962 if (status < 0)
4963 goto error;
4964 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
4965 if (status < 0)
4966 goto error;
4967 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4968 if (status < 0)
4969 goto error;
4970
4971 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4972 if (status < 0)
4973 goto error;
4974 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
4975 if (status < 0)
4976 goto error;
4977
4978 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
4979 if (status < 0)
4980 goto error;
4981
4982
4983
4984 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
4985 if (status < 0)
4986 goto error;
4987 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
4988 if (status < 0)
4989 goto error;
4990 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
4991 if (status < 0)
4992 goto error;
4993 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
4994 if (status < 0)
4995 goto error;
4996 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
4997 if (status < 0)
4998 goto error;
4999 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5000 if (status < 0)
5001 goto error;
5002 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5003 error:
5004 if (status < 0)
5005 pr_err("Error %d on %s\n", status, __func__);
5006
5007 return status;
5008 }
5009
5010
5011
5012
5013
5014
5015
5016
5017 static int set_qam256(struct drxk_state *state)
5018 {
5019 int status = 0;
5020
5021 dprintk(1, "\n");
5022
5023
5024 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5025 if (status < 0)
5026 goto error;
5027 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5028 if (status < 0)
5029 goto error;
5030 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5031 if (status < 0)
5032 goto error;
5033 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5034 if (status < 0)
5035 goto error;
5036 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5037 if (status < 0)
5038 goto error;
5039 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5040 if (status < 0)
5041 goto error;
5042
5043
5044 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5045 if (status < 0)
5046 goto error;
5047 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5048 if (status < 0)
5049 goto error;
5050 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5051 if (status < 0)
5052 goto error;
5053 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5054 if (status < 0)
5055 goto error;
5056 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5057 if (status < 0)
5058 goto error;
5059 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5060 if (status < 0)
5061 goto error;
5062
5063 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5064 if (status < 0)
5065 goto error;
5066 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5067 if (status < 0)
5068 goto error;
5069 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5070 if (status < 0)
5071 goto error;
5072
5073
5074
5075 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
5076 DRXK_QAM_SL_SIG_POWER_QAM256);
5077 if (status < 0)
5078 goto error;
5079
5080
5081
5082
5083 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5084 if (status < 0)
5085 goto error;
5086 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5087 if (status < 0)
5088 goto error;
5089 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5090 if (status < 0)
5091 goto error;
5092 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5093 if (status < 0)
5094 goto error;
5095 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5096 if (status < 0)
5097 goto error;
5098 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5099 if (status < 0)
5100 goto error;
5101 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5102 if (status < 0)
5103 goto error;
5104 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5105 if (status < 0)
5106 goto error;
5107
5108 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5109 if (status < 0)
5110 goto error;
5111 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5112 if (status < 0)
5113 goto error;
5114 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5115 if (status < 0)
5116 goto error;
5117 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5118 if (status < 0)
5119 goto error;
5120 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5121 if (status < 0)
5122 goto error;
5123 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5124 if (status < 0)
5125 goto error;
5126 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5127 if (status < 0)
5128 goto error;
5129 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5130 if (status < 0)
5131 goto error;
5132 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5133 if (status < 0)
5134 goto error;
5135 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5136 if (status < 0)
5137 goto error;
5138 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5139 if (status < 0)
5140 goto error;
5141 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5142 if (status < 0)
5143 goto error;
5144
5145
5146
5147
5148 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5149 if (status < 0)
5150 goto error;
5151 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5152 if (status < 0)
5153 goto error;
5154 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5155 if (status < 0)
5156 goto error;
5157 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5158 if (status < 0)
5159 goto error;
5160 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5161 if (status < 0)
5162 goto error;
5163 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5164 if (status < 0)
5165 goto error;
5166
5167 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5168 if (status < 0)
5169 goto error;
5170 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5171 if (status < 0)
5172 goto error;
5173 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5174 if (status < 0)
5175 goto error;
5176
5177
5178
5179
5180 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5181 if (status < 0)
5182 goto error;
5183 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5184 if (status < 0)
5185 goto error;
5186 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5187 if (status < 0)
5188 goto error;
5189 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5190 if (status < 0)
5191 goto error;
5192 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5193 if (status < 0)
5194 goto error;
5195 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5196 if (status < 0)
5197 goto error;
5198 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5199 error:
5200 if (status < 0)
5201 pr_err("Error %d on %s\n", status, __func__);
5202 return status;
5203 }
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213 static int qam_reset_qam(struct drxk_state *state)
5214 {
5215 int status;
5216 u16 cmd_result;
5217
5218 dprintk(1, "\n");
5219
5220 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5221 if (status < 0)
5222 goto error;
5223
5224 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5225 | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
5226 0, NULL, 1, &cmd_result);
5227 error:
5228 if (status < 0)
5229 pr_err("Error %d on %s\n", status, __func__);
5230 return status;
5231 }
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241 static int qam_set_symbolrate(struct drxk_state *state)
5242 {
5243 u32 adc_frequency = 0;
5244 u32 symb_freq = 0;
5245 u32 iqm_rc_rate = 0;
5246 u16 ratesel = 0;
5247 u32 lc_symb_rate = 0;
5248 int status;
5249
5250 dprintk(1, "\n");
5251
5252 adc_frequency = (state->m_sys_clock_freq * 1000) / 3;
5253 ratesel = 0;
5254 if (state->props.symbol_rate <= 1188750)
5255 ratesel = 3;
5256 else if (state->props.symbol_rate <= 2377500)
5257 ratesel = 2;
5258 else if (state->props.symbol_rate <= 4755000)
5259 ratesel = 1;
5260 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5261 if (status < 0)
5262 goto error;
5263
5264
5265
5266
5267 symb_freq = state->props.symbol_rate * (1 << ratesel);
5268 if (symb_freq == 0) {
5269
5270 status = -EINVAL;
5271 goto error;
5272 }
5273 iqm_rc_rate = (adc_frequency / symb_freq) * (1 << 21) +
5274 (Frac28a((adc_frequency % symb_freq), symb_freq) >> 7) -
5275 (1 << 23);
5276 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate);
5277 if (status < 0)
5278 goto error;
5279 state->m_iqm_rc_rate = iqm_rc_rate;
5280
5281
5282
5283 symb_freq = state->props.symbol_rate;
5284 if (adc_frequency == 0) {
5285
5286 status = -EINVAL;
5287 goto error;
5288 }
5289 lc_symb_rate = (symb_freq / adc_frequency) * (1 << 12) +
5290 (Frac28a((symb_freq % adc_frequency), adc_frequency) >>
5291 16);
5292 if (lc_symb_rate > 511)
5293 lc_symb_rate = 511;
5294 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lc_symb_rate);
5295
5296 error:
5297 if (status < 0)
5298 pr_err("Error %d on %s\n", status, __func__);
5299 return status;
5300 }
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311 static int get_qam_lock_status(struct drxk_state *state, u32 *p_lock_status)
5312 {
5313 int status;
5314 u16 result[2] = { 0, 0 };
5315
5316 dprintk(1, "\n");
5317 *p_lock_status = NOT_LOCKED;
5318 status = scu_command(state,
5319 SCU_RAM_COMMAND_STANDARD_QAM |
5320 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5321 result);
5322 if (status < 0)
5323 pr_err("Error %d on %s\n", status, __func__);
5324
5325 if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5326
5327 } else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5328
5329 *p_lock_status = DEMOD_LOCK;
5330 } else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5331
5332 *p_lock_status = MPEG_LOCK;
5333 } else {
5334
5335
5336
5337
5338
5339
5340 *p_lock_status = NEVER_LOCK;
5341 }
5342 return status;
5343 }
5344
5345 #define QAM_MIRROR__M 0x03
5346 #define QAM_MIRROR_NORMAL 0x00
5347 #define QAM_MIRRORED 0x01
5348 #define QAM_MIRROR_AUTO_ON 0x02
5349 #define QAM_LOCKRANGE__M 0x10
5350 #define QAM_LOCKRANGE_NORMAL 0x10
5351
5352 static int qam_demodulator_command(struct drxk_state *state,
5353 int number_of_parameters)
5354 {
5355 int status;
5356 u16 cmd_result;
5357 u16 set_param_parameters[4] = { 0, 0, 0, 0 };
5358
5359 set_param_parameters[0] = state->m_constellation;
5360 set_param_parameters[1] = DRXK_QAM_I12_J17;
5361
5362 if (number_of_parameters == 2) {
5363 u16 set_env_parameters[1] = { 0 };
5364
5365 if (state->m_operation_mode == OM_QAM_ITU_C)
5366 set_env_parameters[0] = QAM_TOP_ANNEX_C;
5367 else
5368 set_env_parameters[0] = QAM_TOP_ANNEX_A;
5369
5370 status = scu_command(state,
5371 SCU_RAM_COMMAND_STANDARD_QAM
5372 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
5373 1, set_env_parameters, 1, &cmd_result);
5374 if (status < 0)
5375 goto error;
5376
5377 status = scu_command(state,
5378 SCU_RAM_COMMAND_STANDARD_QAM
5379 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5380 number_of_parameters, set_param_parameters,
5381 1, &cmd_result);
5382 } else if (number_of_parameters == 4) {
5383 if (state->m_operation_mode == OM_QAM_ITU_C)
5384 set_param_parameters[2] = QAM_TOP_ANNEX_C;
5385 else
5386 set_param_parameters[2] = QAM_TOP_ANNEX_A;
5387
5388 set_param_parameters[3] |= (QAM_MIRROR_AUTO_ON);
5389
5390
5391
5392
5393 status = scu_command(state,
5394 SCU_RAM_COMMAND_STANDARD_QAM
5395 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5396 number_of_parameters, set_param_parameters,
5397 1, &cmd_result);
5398 } else {
5399 pr_warn("Unknown QAM demodulator parameter count %d\n",
5400 number_of_parameters);
5401 status = -EINVAL;
5402 }
5403
5404 error:
5405 if (status < 0)
5406 pr_warn("Warning %d on %s\n", status, __func__);
5407 return status;
5408 }
5409
5410 static int set_qam(struct drxk_state *state, u16 intermediate_freqk_hz,
5411 s32 tuner_freq_offset)
5412 {
5413 int status;
5414 u16 cmd_result;
5415 int qam_demod_param_count = state->qam_demod_parameter_count;
5416
5417 dprintk(1, "\n");
5418
5419
5420
5421
5422
5423
5424 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5425 if (status < 0)
5426 goto error;
5427 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5428 if (status < 0)
5429 goto error;
5430 status = qam_reset_qam(state);
5431 if (status < 0)
5432 goto error;
5433
5434
5435
5436
5437
5438
5439 status = qam_set_symbolrate(state);
5440 if (status < 0)
5441 goto error;
5442
5443
5444 switch (state->props.modulation) {
5445 case QAM_256:
5446 state->m_constellation = DRX_CONSTELLATION_QAM256;
5447 break;
5448 case QAM_AUTO:
5449 case QAM_64:
5450 state->m_constellation = DRX_CONSTELLATION_QAM64;
5451 break;
5452 case QAM_16:
5453 state->m_constellation = DRX_CONSTELLATION_QAM16;
5454 break;
5455 case QAM_32:
5456 state->m_constellation = DRX_CONSTELLATION_QAM32;
5457 break;
5458 case QAM_128:
5459 state->m_constellation = DRX_CONSTELLATION_QAM128;
5460 break;
5461 default:
5462 status = -EINVAL;
5463 break;
5464 }
5465 if (status < 0)
5466 goto error;
5467
5468
5469
5470 if (state->qam_demod_parameter_count == 4
5471 || !state->qam_demod_parameter_count) {
5472 qam_demod_param_count = 4;
5473 status = qam_demodulator_command(state, qam_demod_param_count);
5474 }
5475
5476
5477
5478
5479 if (state->qam_demod_parameter_count == 2
5480 || (!state->qam_demod_parameter_count && status < 0)) {
5481 qam_demod_param_count = 2;
5482 status = qam_demodulator_command(state, qam_demod_param_count);
5483 }
5484
5485 if (status < 0) {
5486 dprintk(1, "Could not set demodulator parameters.\n");
5487 dprintk(1,
5488 "Make sure qam_demod_parameter_count (%d) is correct for your firmware (%s).\n",
5489 state->qam_demod_parameter_count,
5490 state->microcode_name);
5491 goto error;
5492 } else if (!state->qam_demod_parameter_count) {
5493 dprintk(1,
5494 "Auto-probing the QAM command parameters was successful - using %d parameters.\n",
5495 qam_demod_param_count);
5496
5497
5498
5499
5500
5501 state->qam_demod_parameter_count = qam_demod_param_count;
5502 }
5503
5504
5505
5506
5507
5508 #if 0
5509 status = set_frequency(channel, tuner_freq_offset));
5510 if (status < 0)
5511 goto error;
5512 #endif
5513 status = set_frequency_shifter(state, intermediate_freqk_hz,
5514 tuner_freq_offset, true);
5515 if (status < 0)
5516 goto error;
5517
5518
5519 status = set_qam_measurement(state, state->m_constellation,
5520 state->props.symbol_rate);
5521 if (status < 0)
5522 goto error;
5523
5524
5525 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5526 if (status < 0)
5527 goto error;
5528 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5529 if (status < 0)
5530 goto error;
5531
5532
5533 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5534 if (status < 0)
5535 goto error;
5536 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5537 if (status < 0)
5538 goto error;
5539 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5540 if (status < 0)
5541 goto error;
5542 status = write16(state, QAM_LC_MODE__A, 7);
5543 if (status < 0)
5544 goto error;
5545
5546 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5547 if (status < 0)
5548 goto error;
5549 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5550 if (status < 0)
5551 goto error;
5552 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5553 if (status < 0)
5554 goto error;
5555 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5556 if (status < 0)
5557 goto error;
5558 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5559 if (status < 0)
5560 goto error;
5561 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5562 if (status < 0)
5563 goto error;
5564 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5565 if (status < 0)
5566 goto error;
5567 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5568 if (status < 0)
5569 goto error;
5570 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5571 if (status < 0)
5572 goto error;
5573 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5574 if (status < 0)
5575 goto error;
5576 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5577 if (status < 0)
5578 goto error;
5579 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5580 if (status < 0)
5581 goto error;
5582 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5583 if (status < 0)
5584 goto error;
5585 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5586 if (status < 0)
5587 goto error;
5588 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5589 if (status < 0)
5590 goto error;
5591
5592
5593 status = write16(state, QAM_SY_SP_INV__A,
5594 QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5595 if (status < 0)
5596 goto error;
5597
5598
5599 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5600 if (status < 0)
5601 goto error;
5602
5603
5604 switch (state->props.modulation) {
5605 case QAM_16:
5606 status = set_qam16(state);
5607 break;
5608 case QAM_32:
5609 status = set_qam32(state);
5610 break;
5611 case QAM_AUTO:
5612 case QAM_64:
5613 status = set_qam64(state);
5614 break;
5615 case QAM_128:
5616 status = set_qam128(state);
5617 break;
5618 case QAM_256:
5619 status = set_qam256(state);
5620 break;
5621 default:
5622 status = -EINVAL;
5623 break;
5624 }
5625 if (status < 0)
5626 goto error;
5627
5628
5629 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5630 if (status < 0)
5631 goto error;
5632
5633
5634
5635
5636 status = mpegts_dto_setup(state, state->m_operation_mode);
5637 if (status < 0)
5638 goto error;
5639
5640
5641 status = mpegts_start(state);
5642 if (status < 0)
5643 goto error;
5644 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5645 if (status < 0)
5646 goto error;
5647 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5648 if (status < 0)
5649 goto error;
5650 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5651 if (status < 0)
5652 goto error;
5653
5654
5655 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5656 | SCU_RAM_COMMAND_CMD_DEMOD_START,
5657 0, NULL, 1, &cmd_result);
5658 if (status < 0)
5659 goto error;
5660
5661
5662
5663
5664 error:
5665 if (status < 0)
5666 pr_err("Error %d on %s\n", status, __func__);
5667 return status;
5668 }
5669
5670 static int set_qam_standard(struct drxk_state *state,
5671 enum operation_mode o_mode)
5672 {
5673 int status;
5674 #ifdef DRXK_QAM_TAPS
5675 #define DRXK_QAMA_TAPS_SELECT
5676 #include "drxk_filters.h"
5677 #undef DRXK_QAMA_TAPS_SELECT
5678 #endif
5679
5680 dprintk(1, "\n");
5681
5682
5683 switch_antenna_to_qam(state);
5684
5685
5686 status = power_up_qam(state);
5687 if (status < 0)
5688 goto error;
5689
5690 status = qam_reset_qam(state);
5691 if (status < 0)
5692 goto error;
5693
5694
5695
5696 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5697 if (status < 0)
5698 goto error;
5699 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5700 if (status < 0)
5701 goto error;
5702
5703
5704
5705 switch (o_mode) {
5706 case OM_QAM_ITU_A:
5707 status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A,
5708 DRXK_BLCC_NR_ELEMENTS_TAPS,
5709 DRXK_BLC_TIMEOUT);
5710 break;
5711 case OM_QAM_ITU_C:
5712 status = bl_direct_cmd(state, IQM_CF_TAP_RE0__A,
5713 DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5714 DRXK_BLDC_NR_ELEMENTS_TAPS,
5715 DRXK_BLC_TIMEOUT);
5716 if (status < 0)
5717 goto error;
5718 status = bl_direct_cmd(state,
5719 IQM_CF_TAP_IM0__A,
5720 DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5721 DRXK_BLDC_NR_ELEMENTS_TAPS,
5722 DRXK_BLC_TIMEOUT);
5723 break;
5724 default:
5725 status = -EINVAL;
5726 }
5727 if (status < 0)
5728 goto error;
5729
5730 status = write16(state, IQM_CF_OUT_ENA__A, 1 << IQM_CF_OUT_ENA_QAM__B);
5731 if (status < 0)
5732 goto error;
5733 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5734 if (status < 0)
5735 goto error;
5736 status = write16(state, IQM_CF_MIDTAP__A,
5737 ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5738 if (status < 0)
5739 goto error;
5740
5741 status = write16(state, IQM_RC_STRETCH__A, 21);
5742 if (status < 0)
5743 goto error;
5744 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5745 if (status < 0)
5746 goto error;
5747 status = write16(state, IQM_AF_CLP_TH__A, 448);
5748 if (status < 0)
5749 goto error;
5750 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5751 if (status < 0)
5752 goto error;
5753 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5754 if (status < 0)
5755 goto error;
5756
5757 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5758 if (status < 0)
5759 goto error;
5760 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5761 if (status < 0)
5762 goto error;
5763 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5764 if (status < 0)
5765 goto error;
5766 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5767 if (status < 0)
5768 goto error;
5769
5770
5771 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5772 if (status < 0)
5773 goto error;
5774 status = write16(state, IQM_CF_DATATH__A, 1000);
5775 if (status < 0)
5776 goto error;
5777 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5778 if (status < 0)
5779 goto error;
5780 status = write16(state, IQM_CF_DET_LCT__A, 0);
5781 if (status < 0)
5782 goto error;
5783 status = write16(state, IQM_CF_WND_LEN__A, 1);
5784 if (status < 0)
5785 goto error;
5786 status = write16(state, IQM_CF_PKDTH__A, 1);
5787 if (status < 0)
5788 goto error;
5789 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5790 if (status < 0)
5791 goto error;
5792
5793
5794 status = set_iqm_af(state, true);
5795 if (status < 0)
5796 goto error;
5797 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5798 if (status < 0)
5799 goto error;
5800
5801
5802 status = adc_synchronization(state);
5803 if (status < 0)
5804 goto error;
5805
5806
5807 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5808 if (status < 0)
5809 goto error;
5810
5811
5812 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5813 if (status < 0)
5814 goto error;
5815
5816
5817
5818
5819 status = init_agc(state, true);
5820 if (status < 0)
5821 goto error;
5822 status = set_pre_saw(state, &(state->m_qam_pre_saw_cfg));
5823 if (status < 0)
5824 goto error;
5825
5826
5827 status = set_agc_rf(state, &(state->m_qam_rf_agc_cfg), true);
5828 if (status < 0)
5829 goto error;
5830 status = set_agc_if(state, &(state->m_qam_if_agc_cfg), true);
5831 if (status < 0)
5832 goto error;
5833
5834
5835 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5836 error:
5837 if (status < 0)
5838 pr_err("Error %d on %s\n", status, __func__);
5839 return status;
5840 }
5841
5842 static int write_gpio(struct drxk_state *state)
5843 {
5844 int status;
5845 u16 value = 0;
5846
5847 dprintk(1, "\n");
5848
5849 status = write16(state, SCU_RAM_GPIO__A,
5850 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5851 if (status < 0)
5852 goto error;
5853
5854
5855 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5856 if (status < 0)
5857 goto error;
5858
5859 if (state->m_has_sawsw) {
5860 if (state->uio_mask & 0x0001) {
5861
5862 status = write16(state, SIO_PDR_SMA_TX_CFG__A,
5863 state->m_gpio_cfg);
5864 if (status < 0)
5865 goto error;
5866
5867
5868 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5869 if (status < 0)
5870 goto error;
5871 if ((state->m_gpio & 0x0001) == 0)
5872 value &= 0x7FFF;
5873 else
5874 value |= 0x8000;
5875
5876 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5877 if (status < 0)
5878 goto error;
5879 }
5880 if (state->uio_mask & 0x0002) {
5881
5882 status = write16(state, SIO_PDR_SMA_RX_CFG__A,
5883 state->m_gpio_cfg);
5884 if (status < 0)
5885 goto error;
5886
5887
5888 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5889 if (status < 0)
5890 goto error;
5891 if ((state->m_gpio & 0x0002) == 0)
5892 value &= 0xBFFF;
5893 else
5894 value |= 0x4000;
5895
5896 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5897 if (status < 0)
5898 goto error;
5899 }
5900 if (state->uio_mask & 0x0004) {
5901
5902 status = write16(state, SIO_PDR_GPIO_CFG__A,
5903 state->m_gpio_cfg);
5904 if (status < 0)
5905 goto error;
5906
5907
5908 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5909 if (status < 0)
5910 goto error;
5911 if ((state->m_gpio & 0x0004) == 0)
5912 value &= 0xFFFB;
5913 else
5914 value |= 0x0004;
5915
5916 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5917 if (status < 0)
5918 goto error;
5919 }
5920 }
5921
5922 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5923 error:
5924 if (status < 0)
5925 pr_err("Error %d on %s\n", status, __func__);
5926 return status;
5927 }
5928
5929 static int switch_antenna_to_qam(struct drxk_state *state)
5930 {
5931 int status = 0;
5932 bool gpio_state;
5933
5934 dprintk(1, "\n");
5935
5936 if (!state->antenna_gpio)
5937 return 0;
5938
5939 gpio_state = state->m_gpio & state->antenna_gpio;
5940
5941 if (state->antenna_dvbt ^ gpio_state) {
5942
5943 if (state->antenna_dvbt)
5944 state->m_gpio &= ~state->antenna_gpio;
5945 else
5946 state->m_gpio |= state->antenna_gpio;
5947 status = write_gpio(state);
5948 }
5949 if (status < 0)
5950 pr_err("Error %d on %s\n", status, __func__);
5951 return status;
5952 }
5953
5954 static int switch_antenna_to_dvbt(struct drxk_state *state)
5955 {
5956 int status = 0;
5957 bool gpio_state;
5958
5959 dprintk(1, "\n");
5960
5961 if (!state->antenna_gpio)
5962 return 0;
5963
5964 gpio_state = state->m_gpio & state->antenna_gpio;
5965
5966 if (!(state->antenna_dvbt ^ gpio_state)) {
5967
5968 if (state->antenna_dvbt)
5969 state->m_gpio |= state->antenna_gpio;
5970 else
5971 state->m_gpio &= ~state->antenna_gpio;
5972 status = write_gpio(state);
5973 }
5974 if (status < 0)
5975 pr_err("Error %d on %s\n", status, __func__);
5976 return status;
5977 }
5978
5979
5980 static int power_down_device(struct drxk_state *state)
5981 {
5982
5983
5984
5985
5986
5987
5988 int status;
5989
5990 dprintk(1, "\n");
5991 if (state->m_b_p_down_open_bridge) {
5992
5993 status = ConfigureI2CBridge(state, true);
5994 if (status < 0)
5995 goto error;
5996 }
5997
5998 status = dvbt_enable_ofdm_token_ring(state, false);
5999 if (status < 0)
6000 goto error;
6001
6002 status = write16(state, SIO_CC_PWD_MODE__A,
6003 SIO_CC_PWD_MODE_LEVEL_CLOCK);
6004 if (status < 0)
6005 goto error;
6006 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6007 if (status < 0)
6008 goto error;
6009 state->m_hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
6010 status = hi_cfg_command(state);
6011 error:
6012 if (status < 0)
6013 pr_err("Error %d on %s\n", status, __func__);
6014
6015 return status;
6016 }
6017
6018 static int init_drxk(struct drxk_state *state)
6019 {
6020 int status = 0, n = 0;
6021 enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
6022 u16 driver_version;
6023
6024 dprintk(1, "\n");
6025 if (state->m_drxk_state == DRXK_UNINITIALIZED) {
6026 drxk_i2c_lock(state);
6027 status = power_up_device(state);
6028 if (status < 0)
6029 goto error;
6030 status = drxx_open(state);
6031 if (status < 0)
6032 goto error;
6033
6034 status = write16(state, SIO_CC_SOFT_RST__A,
6035 SIO_CC_SOFT_RST_OFDM__M
6036 | SIO_CC_SOFT_RST_SYS__M
6037 | SIO_CC_SOFT_RST_OSC__M);
6038 if (status < 0)
6039 goto error;
6040 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6041 if (status < 0)
6042 goto error;
6043
6044
6045
6046
6047 usleep_range(1000, 2000);
6048 state->m_drxk_a3_patch_code = true;
6049 status = get_device_capabilities(state);
6050 if (status < 0)
6051 goto error;
6052
6053
6054
6055
6056 state->m_hi_cfg_bridge_delay =
6057 (u16) ((state->m_osc_clock_freq / 1000) *
6058 HI_I2C_BRIDGE_DELAY) / 1000;
6059
6060 if (state->m_hi_cfg_bridge_delay >
6061 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
6062 state->m_hi_cfg_bridge_delay =
6063 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
6064 }
6065
6066 state->m_hi_cfg_bridge_delay +=
6067 state->m_hi_cfg_bridge_delay <<
6068 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
6069
6070 status = init_hi(state);
6071 if (status < 0)
6072 goto error;
6073
6074 #if NOA1ROM
6075 if (!(state->m_DRXK_A1_ROM_CODE)
6076 && !(state->m_DRXK_A2_ROM_CODE))
6077 #endif
6078 {
6079 status = write16(state, SCU_RAM_GPIO__A,
6080 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
6081 if (status < 0)
6082 goto error;
6083 }
6084
6085
6086 status = mpegts_disable(state);
6087 if (status < 0)
6088 goto error;
6089
6090
6091 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
6092 if (status < 0)
6093 goto error;
6094 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6095 if (status < 0)
6096 goto error;
6097
6098
6099 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6100 SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6101 if (status < 0)
6102 goto error;
6103
6104
6105 status = write16(state, SIO_BL_COMM_EXEC__A,
6106 SIO_BL_COMM_EXEC_ACTIVE);
6107 if (status < 0)
6108 goto error;
6109 status = bl_chain_cmd(state, 0, 6, 100);
6110 if (status < 0)
6111 goto error;
6112
6113 if (state->fw) {
6114 status = download_microcode(state, state->fw->data,
6115 state->fw->size);
6116 if (status < 0)
6117 goto error;
6118 }
6119
6120
6121 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6122 SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6123 if (status < 0)
6124 goto error;
6125
6126
6127 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6128 if (status < 0)
6129 goto error;
6130 status = drxx_open(state);
6131 if (status < 0)
6132 goto error;
6133
6134 msleep(30);
6135
6136 power_mode = DRXK_POWER_DOWN_OFDM;
6137 status = ctrl_power_mode(state, &power_mode);
6138 if (status < 0)
6139 goto error;
6140
6141
6142
6143
6144
6145
6146
6147 driver_version =
6148 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6149 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6150 ((DRXK_VERSION_MAJOR % 10) << 4) +
6151 (DRXK_VERSION_MINOR % 10);
6152 status = write16(state, SCU_RAM_DRIVER_VER_HI__A,
6153 driver_version);
6154 if (status < 0)
6155 goto error;
6156 driver_version =
6157 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6158 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6159 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6160 (DRXK_VERSION_PATCH % 10);
6161 status = write16(state, SCU_RAM_DRIVER_VER_LO__A,
6162 driver_version);
6163 if (status < 0)
6164 goto error;
6165
6166 pr_info("DRXK driver version %d.%d.%d\n",
6167 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6168 DRXK_VERSION_PATCH);
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6182 if (status < 0)
6183 goto error;
6184
6185
6186
6187 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6188 if (status < 0)
6189 goto error;
6190
6191 status = mpegts_dto_init(state);
6192 if (status < 0)
6193 goto error;
6194 status = mpegts_stop(state);
6195 if (status < 0)
6196 goto error;
6197 status = mpegts_configure_polarity(state);
6198 if (status < 0)
6199 goto error;
6200 status = mpegts_configure_pins(state, state->m_enable_mpeg_output);
6201 if (status < 0)
6202 goto error;
6203
6204 status = write_gpio(state);
6205 if (status < 0)
6206 goto error;
6207
6208 state->m_drxk_state = DRXK_STOPPED;
6209
6210 if (state->m_b_power_down) {
6211 status = power_down_device(state);
6212 if (status < 0)
6213 goto error;
6214 state->m_drxk_state = DRXK_POWERED_DOWN;
6215 } else
6216 state->m_drxk_state = DRXK_STOPPED;
6217
6218
6219 n = 0;
6220 if (state->m_has_dvbc) {
6221 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A;
6222 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C;
6223 strlcat(state->frontend.ops.info.name, " DVB-C",
6224 sizeof(state->frontend.ops.info.name));
6225 }
6226 if (state->m_has_dvbt) {
6227 state->frontend.ops.delsys[n++] = SYS_DVBT;
6228 strlcat(state->frontend.ops.info.name, " DVB-T",
6229 sizeof(state->frontend.ops.info.name));
6230 }
6231 drxk_i2c_unlock(state);
6232 }
6233 error:
6234 if (status < 0) {
6235 state->m_drxk_state = DRXK_NO_DEV;
6236 drxk_i2c_unlock(state);
6237 pr_err("Error %d on %s\n", status, __func__);
6238 }
6239
6240 return status;
6241 }
6242
6243 static void load_firmware_cb(const struct firmware *fw,
6244 void *context)
6245 {
6246 struct drxk_state *state = context;
6247
6248 dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded");
6249 if (!fw) {
6250 pr_err("Could not load firmware file %s.\n",
6251 state->microcode_name);
6252 pr_info("Copy %s to your hotplug directory!\n",
6253 state->microcode_name);
6254 state->microcode_name = NULL;
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266 }
6267 state->fw = fw;
6268
6269 init_drxk(state);
6270 }
6271
6272 static void drxk_release(struct dvb_frontend *fe)
6273 {
6274 struct drxk_state *state = fe->demodulator_priv;
6275
6276 dprintk(1, "\n");
6277 release_firmware(state->fw);
6278
6279 kfree(state);
6280 }
6281
6282 static int drxk_sleep(struct dvb_frontend *fe)
6283 {
6284 struct drxk_state *state = fe->demodulator_priv;
6285
6286 dprintk(1, "\n");
6287
6288 if (state->m_drxk_state == DRXK_NO_DEV)
6289 return -ENODEV;
6290 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6291 return 0;
6292
6293 shut_down(state);
6294 return 0;
6295 }
6296
6297 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6298 {
6299 struct drxk_state *state = fe->demodulator_priv;
6300
6301 dprintk(1, ": %s\n", enable ? "enable" : "disable");
6302
6303 if (state->m_drxk_state == DRXK_NO_DEV)
6304 return -ENODEV;
6305
6306 return ConfigureI2CBridge(state, enable ? true : false);
6307 }
6308
6309 static int drxk_set_parameters(struct dvb_frontend *fe)
6310 {
6311 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6312 u32 delsys = p->delivery_system, old_delsys;
6313 struct drxk_state *state = fe->demodulator_priv;
6314 u32 IF;
6315
6316 dprintk(1, "\n");
6317
6318 if (state->m_drxk_state == DRXK_NO_DEV)
6319 return -ENODEV;
6320
6321 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6322 return -EAGAIN;
6323
6324 if (!fe->ops.tuner_ops.get_if_frequency) {
6325 pr_err("Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6326 return -EINVAL;
6327 }
6328
6329 if (fe->ops.i2c_gate_ctrl)
6330 fe->ops.i2c_gate_ctrl(fe, 1);
6331 if (fe->ops.tuner_ops.set_params)
6332 fe->ops.tuner_ops.set_params(fe);
6333 if (fe->ops.i2c_gate_ctrl)
6334 fe->ops.i2c_gate_ctrl(fe, 0);
6335
6336 old_delsys = state->props.delivery_system;
6337 state->props = *p;
6338
6339 if (old_delsys != delsys) {
6340 shut_down(state);
6341 switch (delsys) {
6342 case SYS_DVBC_ANNEX_A:
6343 case SYS_DVBC_ANNEX_C:
6344 if (!state->m_has_dvbc)
6345 return -EINVAL;
6346 state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ?
6347 true : false;
6348 if (state->m_itut_annex_c)
6349 setoperation_mode(state, OM_QAM_ITU_C);
6350 else
6351 setoperation_mode(state, OM_QAM_ITU_A);
6352 break;
6353 case SYS_DVBT:
6354 if (!state->m_has_dvbt)
6355 return -EINVAL;
6356 setoperation_mode(state, OM_DVBT);
6357 break;
6358 default:
6359 return -EINVAL;
6360 }
6361 }
6362
6363 fe->ops.tuner_ops.get_if_frequency(fe, &IF);
6364 start(state, 0, IF);
6365
6366
6367 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6368 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6369 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6370 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6371 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6372 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6373 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6374 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6375
6376
6377
6378 return 0;
6379 }
6380
6381 static int get_strength(struct drxk_state *state, u64 *strength)
6382 {
6383 int status;
6384 struct s_cfg_agc rf_agc, if_agc;
6385 u32 total_gain = 0;
6386 u32 atten = 0;
6387 u32 agc_range = 0;
6388 u16 scu_lvl = 0;
6389 u16 scu_coc = 0;
6390
6391 u16 tuner_rf_gain = 50;
6392 u16 tuner_if_gain = 40;
6393
6394 *strength = 0;
6395
6396 if (is_dvbt(state)) {
6397 rf_agc = state->m_dvbt_rf_agc_cfg;
6398 if_agc = state->m_dvbt_if_agc_cfg;
6399 } else if (is_qam(state)) {
6400 rf_agc = state->m_qam_rf_agc_cfg;
6401 if_agc = state->m_qam_if_agc_cfg;
6402 } else {
6403 rf_agc = state->m_atv_rf_agc_cfg;
6404 if_agc = state->m_atv_if_agc_cfg;
6405 }
6406
6407 if (rf_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6408
6409 status = read16(state, SCU_RAM_AGC_RF_IACCU_HI__A, &scu_lvl);
6410 if (status < 0)
6411 return status;
6412
6413
6414 status = read16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, &scu_coc);
6415 if (status < 0)
6416 return status;
6417
6418 if (((u32) scu_lvl + (u32) scu_coc) < 0xffff)
6419 rf_agc.output_level = scu_lvl + scu_coc;
6420 else
6421 rf_agc.output_level = 0xffff;
6422
6423
6424 total_gain += tuner_rf_gain;
6425
6426
6427 if (rf_agc.output_level < rf_agc.min_output_level)
6428 rf_agc.output_level = rf_agc.min_output_level;
6429 if (rf_agc.output_level > rf_agc.max_output_level)
6430 rf_agc.output_level = rf_agc.max_output_level;
6431
6432 agc_range = (u32) (rf_agc.max_output_level - rf_agc.min_output_level);
6433 if (agc_range > 0) {
6434 atten += 100UL *
6435 ((u32)(tuner_rf_gain)) *
6436 ((u32)(rf_agc.output_level - rf_agc.min_output_level))
6437 / agc_range;
6438 }
6439 }
6440
6441 if (if_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6442 status = read16(state, SCU_RAM_AGC_IF_IACCU_HI__A,
6443 &if_agc.output_level);
6444 if (status < 0)
6445 return status;
6446
6447 status = read16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A,
6448 &if_agc.top);
6449 if (status < 0)
6450 return status;
6451
6452
6453 total_gain += (u32) tuner_if_gain;
6454
6455
6456 if (if_agc.output_level < if_agc.min_output_level)
6457 if_agc.output_level = if_agc.min_output_level;
6458 if (if_agc.output_level > if_agc.max_output_level)
6459 if_agc.output_level = if_agc.max_output_level;
6460
6461 agc_range = (u32)(if_agc.max_output_level - if_agc.min_output_level);
6462 if (agc_range > 0) {
6463 atten += 100UL *
6464 ((u32)(tuner_if_gain)) *
6465 ((u32)(if_agc.output_level - if_agc.min_output_level))
6466 / agc_range;
6467 }
6468 }
6469
6470
6471
6472
6473
6474 if (total_gain > 0)
6475 *strength = (65535UL * atten / total_gain / 100);
6476 else
6477 *strength = 65535;
6478
6479 return 0;
6480 }
6481
6482 static int drxk_get_stats(struct dvb_frontend *fe)
6483 {
6484 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6485 struct drxk_state *state = fe->demodulator_priv;
6486 int status;
6487 u32 stat;
6488 u16 reg16;
6489 u32 post_bit_count;
6490 u32 post_bit_err_count;
6491 u32 post_bit_error_scale;
6492 u32 pre_bit_err_count;
6493 u32 pre_bit_count;
6494 u32 pkt_count;
6495 u32 pkt_error_count;
6496 s32 cnr;
6497
6498 if (state->m_drxk_state == DRXK_NO_DEV)
6499 return -ENODEV;
6500 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6501 return -EAGAIN;
6502
6503
6504 state->fe_status = 0;
6505 get_lock_status(state, &stat);
6506 if (stat == MPEG_LOCK)
6507 state->fe_status |= 0x1f;
6508 if (stat == FEC_LOCK)
6509 state->fe_status |= 0x0f;
6510 if (stat == DEMOD_LOCK)
6511 state->fe_status |= 0x07;
6512
6513
6514
6515
6516 get_strength(state, &c->strength.stat[0].uvalue);
6517 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
6518
6519
6520 if (stat >= DEMOD_LOCK) {
6521 get_signal_to_noise(state, &cnr);
6522 c->cnr.stat[0].svalue = cnr * 100;
6523 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
6524 } else {
6525 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6526 }
6527
6528 if (stat < FEC_LOCK) {
6529 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6530 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6531 c->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6532 c->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6533 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6534 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6535 return 0;
6536 }
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549 status = read16(state, OFDM_EC_VD_ERR_BIT_CNT__A, ®16);
6550 if (status < 0)
6551 goto error;
6552 pre_bit_err_count = reg16;
6553
6554 status = read16(state, OFDM_EC_VD_IN_BIT_CNT__A , ®16);
6555 if (status < 0)
6556 goto error;
6557 pre_bit_count = reg16;
6558
6559
6560 status = read16(state, FEC_RS_NR_BIT_ERRORS__A, ®16);
6561 if (status < 0)
6562 goto error;
6563 post_bit_err_count = reg16;
6564
6565 status = read16(state, FEC_RS_MEASUREMENT_PRESCALE__A, ®16);
6566 if (status < 0)
6567 goto error;
6568 post_bit_error_scale = reg16;
6569
6570 status = read16(state, FEC_RS_MEASUREMENT_PERIOD__A, ®16);
6571 if (status < 0)
6572 goto error;
6573 pkt_count = reg16;
6574
6575 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, ®16);
6576 if (status < 0)
6577 goto error;
6578 pkt_error_count = reg16;
6579 write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
6580
6581 post_bit_err_count *= post_bit_error_scale;
6582
6583 post_bit_count = pkt_count * 204 * 8;
6584
6585
6586 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
6587 c->block_error.stat[0].uvalue += pkt_error_count;
6588 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
6589 c->block_count.stat[0].uvalue += pkt_count;
6590
6591 c->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6592 c->pre_bit_error.stat[0].uvalue += pre_bit_err_count;
6593 c->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6594 c->pre_bit_count.stat[0].uvalue += pre_bit_count;
6595
6596 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6597 c->post_bit_error.stat[0].uvalue += post_bit_err_count;
6598 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6599 c->post_bit_count.stat[0].uvalue += post_bit_count;
6600
6601 error:
6602 return status;
6603 }
6604
6605
6606 static int drxk_read_status(struct dvb_frontend *fe, enum fe_status *status)
6607 {
6608 struct drxk_state *state = fe->demodulator_priv;
6609 int rc;
6610
6611 dprintk(1, "\n");
6612
6613 rc = drxk_get_stats(fe);
6614 if (rc < 0)
6615 return rc;
6616
6617 *status = state->fe_status;
6618
6619 return 0;
6620 }
6621
6622 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6623 u16 *strength)
6624 {
6625 struct drxk_state *state = fe->demodulator_priv;
6626 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6627
6628 dprintk(1, "\n");
6629
6630 if (state->m_drxk_state == DRXK_NO_DEV)
6631 return -ENODEV;
6632 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6633 return -EAGAIN;
6634
6635 *strength = c->strength.stat[0].uvalue;
6636 return 0;
6637 }
6638
6639 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6640 {
6641 struct drxk_state *state = fe->demodulator_priv;
6642 s32 snr2;
6643
6644 dprintk(1, "\n");
6645
6646 if (state->m_drxk_state == DRXK_NO_DEV)
6647 return -ENODEV;
6648 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6649 return -EAGAIN;
6650
6651 get_signal_to_noise(state, &snr2);
6652
6653
6654 if (snr2 < 0)
6655 snr2 = 0;
6656 *snr = snr2 & 0xffff;
6657 return 0;
6658 }
6659
6660 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6661 {
6662 struct drxk_state *state = fe->demodulator_priv;
6663 u16 err;
6664
6665 dprintk(1, "\n");
6666
6667 if (state->m_drxk_state == DRXK_NO_DEV)
6668 return -ENODEV;
6669 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6670 return -EAGAIN;
6671
6672 dvbtqam_get_acc_pkt_err(state, &err);
6673 *ucblocks = (u32) err;
6674 return 0;
6675 }
6676
6677 static int drxk_get_tune_settings(struct dvb_frontend *fe,
6678 struct dvb_frontend_tune_settings *sets)
6679 {
6680 struct drxk_state *state = fe->demodulator_priv;
6681 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6682
6683 dprintk(1, "\n");
6684
6685 if (state->m_drxk_state == DRXK_NO_DEV)
6686 return -ENODEV;
6687 if (state->m_drxk_state == DRXK_UNINITIALIZED)
6688 return -EAGAIN;
6689
6690 switch (p->delivery_system) {
6691 case SYS_DVBC_ANNEX_A:
6692 case SYS_DVBC_ANNEX_C:
6693 case SYS_DVBT:
6694 sets->min_delay_ms = 3000;
6695 sets->max_drift = 0;
6696 sets->step_size = 0;
6697 return 0;
6698 default:
6699 return -EINVAL;
6700 }
6701 }
6702
6703 static const struct dvb_frontend_ops drxk_ops = {
6704
6705 .info = {
6706 .name = "DRXK",
6707 .frequency_min_hz = 47 * MHz,
6708 .frequency_max_hz = 865 * MHz,
6709
6710 .symbol_rate_min = 870000,
6711 .symbol_rate_max = 11700000,
6712
6713 .frequency_stepsize_hz = 166667,
6714
6715 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6716 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO |
6717 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
6718 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS |
6719 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
6720 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO
6721 },
6722
6723 .release = drxk_release,
6724 .sleep = drxk_sleep,
6725 .i2c_gate_ctrl = drxk_gate_ctrl,
6726
6727 .set_frontend = drxk_set_parameters,
6728 .get_tune_settings = drxk_get_tune_settings,
6729
6730 .read_status = drxk_read_status,
6731 .read_signal_strength = drxk_read_signal_strength,
6732 .read_snr = drxk_read_snr,
6733 .read_ucblocks = drxk_read_ucblocks,
6734 };
6735
6736 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6737 struct i2c_adapter *i2c)
6738 {
6739 struct dtv_frontend_properties *p;
6740 struct drxk_state *state = NULL;
6741 u8 adr = config->adr;
6742 int status;
6743
6744 dprintk(1, "\n");
6745 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6746 if (!state)
6747 return NULL;
6748
6749 state->i2c = i2c;
6750 state->demod_address = adr;
6751 state->single_master = config->single_master;
6752 state->microcode_name = config->microcode_name;
6753 state->qam_demod_parameter_count = config->qam_demod_parameter_count;
6754 state->no_i2c_bridge = config->no_i2c_bridge;
6755 state->antenna_gpio = config->antenna_gpio;
6756 state->antenna_dvbt = config->antenna_dvbt;
6757 state->m_chunk_size = config->chunk_size;
6758 state->enable_merr_cfg = config->enable_merr_cfg;
6759
6760 if (config->dynamic_clk) {
6761 state->m_dvbt_static_clk = false;
6762 state->m_dvbc_static_clk = false;
6763 } else {
6764 state->m_dvbt_static_clk = true;
6765 state->m_dvbc_static_clk = true;
6766 }
6767
6768
6769 if (config->mpeg_out_clk_strength)
6770 state->m_ts_clockk_strength = config->mpeg_out_clk_strength & 0x07;
6771 else
6772 state->m_ts_clockk_strength = 0x06;
6773
6774 if (config->parallel_ts)
6775 state->m_enable_parallel = true;
6776 else
6777 state->m_enable_parallel = false;
6778
6779
6780 state->uio_mask = config->antenna_gpio;
6781
6782
6783 if (!state->antenna_dvbt && state->antenna_gpio)
6784 state->m_gpio |= state->antenna_gpio;
6785 else
6786 state->m_gpio &= ~state->antenna_gpio;
6787
6788 mutex_init(&state->mutex);
6789
6790 memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
6791 state->frontend.demodulator_priv = state;
6792
6793 init_state(state);
6794
6795
6796 if (state->microcode_name) {
6797 const struct firmware *fw = NULL;
6798
6799 status = request_firmware(&fw, state->microcode_name,
6800 state->i2c->dev.parent);
6801 if (status < 0)
6802 fw = NULL;
6803 load_firmware_cb(fw, state);
6804 } else if (init_drxk(state) < 0)
6805 goto error;
6806
6807
6808
6809 p = &state->frontend.dtv_property_cache;
6810 p->strength.len = 1;
6811 p->cnr.len = 1;
6812 p->block_error.len = 1;
6813 p->block_count.len = 1;
6814 p->pre_bit_error.len = 1;
6815 p->pre_bit_count.len = 1;
6816 p->post_bit_error.len = 1;
6817 p->post_bit_count.len = 1;
6818
6819 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6820 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6821 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6822 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6823 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6824 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6825 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6826 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6827
6828 pr_info("frontend initialized.\n");
6829 return &state->frontend;
6830
6831 error:
6832 pr_err("not found\n");
6833 kfree(state);
6834 return NULL;
6835 }
6836 EXPORT_SYMBOL(drxk_attach);
6837
6838 MODULE_DESCRIPTION("DRX-K driver");
6839 MODULE_AUTHOR("Ralph Metzler");
6840 MODULE_LICENSE("GPL");