.buf = data, .len = len};
if (i2c_transfer(adap, &msg, 1) != 1) {
- printk(KERN_ERR "i2c_write error\n");
+ printk(KERN_ERR "tda18271c2dd: i2c write error at addr %i\n", adr);
return -1;
}
return 0;
#include "tda18271c2dd_maps.h"
-#undef CHK_ERROR
-#define CHK_ERROR(s) if ((status = s) < 0) break
-
static void reset(struct tda_state *state)
{
u32 ulIFLevelAnalog = 0;
do {
u8 Regs[16];
state->m_Regs[TM] |= 0x10;
- CHK_ERROR(UpdateReg(state, TM));
- CHK_ERROR(Read(state, Regs));
+ status = UpdateReg(state, TM);
+ if (status < 0)
+ break;
+ status = Read(state, Regs);
+ if (status < 0)
+ break;
if (((Regs[TM] & 0x0F) == 0 && (Regs[TM] & 0x20) == 0x20) ||
((Regs[TM] & 0x0F) == 8 && (Regs[TM] & 0x20) == 0x00)) {
state->m_Regs[TM] ^= 0x20;
- CHK_ERROR(UpdateReg(state, TM));
+ status = UpdateReg(state, TM);
+ if (status < 0)
+ break;
msleep(10);
- CHK_ERROR(Read(state, Regs));
+ status = Read(state, Regs);
+ if (status < 0)
+ break;
}
*pTM_Value = (Regs[TM] & 0x20)
? m_Thermometer_Map_2[Regs[TM] & 0x0F]
: m_Thermometer_Map_1[Regs[TM] & 0x0F] ;
state->m_Regs[TM] &= ~0x10; /* Thermometer off */
- CHK_ERROR(UpdateReg(state, TM));
+ status = UpdateReg(state, TM);
+ if (status < 0)
+ break;
state->m_Regs[EP4] &= ~0x03; /* CAL_mode = 0 ????????? */
- CHK_ERROR(UpdateReg(state, EP4));
+ status = UpdateReg(state, EP4);
+ if (status < 0)
+ break;
} while (0);
return status;
int status = 0;
do {
state->m_Regs[EB12] &= ~0x20; /* PD_AGC1_Det = 0 */
- CHK_ERROR(UpdateReg(state, EB12));
+ status = UpdateReg(state, EB12);
+ if (status < 0)
+ break;
state->m_Regs[EB18] &= ~0x83; /* AGC1_loop_off = 0, AGC1_Gain = 6 dB */
- CHK_ERROR(UpdateReg(state, EB18));
+ status = UpdateReg(state, EB18);
+ if (status < 0)
+ break;
state->m_Regs[EB21] |= 0x03; /* AGC2_Gain = -6 dB */
state->m_Regs[EP3] = state->m_EP3_Standby;
- CHK_ERROR(UpdateReg(state, EP3));
+ status = UpdateReg(state, EP3);
+ if (status < 0)
+ break;
state->m_Regs[EB23] &= ~0x06; /* ForceLP_Fc2_En = 0, LP_Fc[2] = 0 */
- CHK_ERROR(UpdateRegs(state, EB21, EB23));
+ status = UpdateRegs(state, EB21, EB23);
+ if (status < 0)
+ break;
} while (0);
return status;
}
u8 RFC_M = 0;
state->m_Regs[EP4] &= ~0x03; /* CAL_mode = 0 */
- CHK_ERROR(UpdateReg(state, EP4));
+ status = UpdateReg(state, EP4);
+ if (status < 0)
+ break;
state->m_Regs[EB18] |= 0x03; /* AGC1_Gain = 3 */
- CHK_ERROR(UpdateReg(state, EB18));
+ status = UpdateReg(state, EB18);
+ if (status < 0)
+ break;
/* Switching off LT (as datasheet says) causes calibration on C1 to fail */
/* (Readout of Cprog is allways 255) */
state->m_Regs[EB13] = (state->m_Regs[EB13] & ~0x7C) | (RFC_K << 4) | (RFC_M << 2);
- CHK_ERROR(UpdateRegs(state, EP1, EP3));
- CHK_ERROR(UpdateReg(state, EB13));
+ status = UpdateRegs(state, EP1, EP3);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EB13);
+ if (status < 0)
+ break;
state->m_Regs[EB4] |= 0x20; /* LO_ForceSrce = 1 */
- CHK_ERROR(UpdateReg(state, EB4));
+ status = UpdateReg(state, EB4);
+ if (status < 0)
+ break;
state->m_Regs[EB7] |= 0x20; /* CAL_ForceSrce = 1 */
- CHK_ERROR(UpdateReg(state, EB7));
+ status = UpdateReg(state, EB7);
+ if (status < 0)
+ break;
state->m_Regs[EB14] = 0; /* RFC_Cprog = 0 */
- CHK_ERROR(UpdateReg(state, EB14));
+ status = UpdateReg(state, EB14);
+ if (status < 0)
+ break;
state->m_Regs[EB20] &= ~0x20; /* ForceLock = 0; */
- CHK_ERROR(UpdateReg(state, EB20));
+ status = UpdateReg(state, EB20);
+ if (status < 0)
+ break;
state->m_Regs[EP4] |= 0x03; /* CAL_Mode = 3 */
- CHK_ERROR(UpdateRegs(state, EP4, EP5));
+ status = UpdateRegs(state, EP4, EP5);
+ if (status < 0)
+ break;
- CHK_ERROR(CalcCalPLL(state, freq));
- CHK_ERROR(CalcMainPLL(state, freq + 1000000));
+ status = CalcCalPLL(state, freq);
+ if (status < 0)
+ break;
+ status = CalcMainPLL(state, freq + 1000000);
+ if (status < 0)
+ break;
msleep(5);
- CHK_ERROR(UpdateReg(state, EP2));
- CHK_ERROR(UpdateReg(state, EP1));
- CHK_ERROR(UpdateReg(state, EP2));
- CHK_ERROR(UpdateReg(state, EP1));
+ status = UpdateReg(state, EP2);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EP1);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EP2);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EP1);
+ if (status < 0)
+ break;
state->m_Regs[EB4] &= ~0x20; /* LO_ForceSrce = 0 */
- CHK_ERROR(UpdateReg(state, EB4));
+ status = UpdateReg(state, EB4);
+ if (status < 0)
+ break;
state->m_Regs[EB7] &= ~0x20; /* CAL_ForceSrce = 0 */
- CHK_ERROR(UpdateReg(state, EB7));
+ status = UpdateReg(state, EB7);
+ if (status < 0)
+ break;
msleep(10);
state->m_Regs[EB20] |= 0x20; /* ForceLock = 1; */
- CHK_ERROR(UpdateReg(state, EB20));
+ status = UpdateReg(state, EB20);
+ if (status < 0)
+ break;
msleep(60);
state->m_Regs[EP4] &= ~0x03; /* CAL_Mode = 0 */
state->m_Regs[EP3] &= ~0x40; /* SM_LT = 0 */
state->m_Regs[EB18] &= ~0x03; /* AGC1_Gain = 0 */
- CHK_ERROR(UpdateReg(state, EB18));
- CHK_ERROR(UpdateRegs(state, EP3, EP4));
- CHK_ERROR(UpdateReg(state, EP1));
+ status = UpdateReg(state, EB18);
+ if (status < 0)
+ break;
+ status = UpdateRegs(state, EP3, EP4);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EP1);
+ if (status < 0)
+ break;
- CHK_ERROR(ReadExtented(state, Regs));
+ status = ReadExtented(state, Regs);
+ if (status < 0)
+ break;
*pCprog = Regs[EB14];
state->m_RF_B2[RFBand] = 0;
do {
- CHK_ERROR(PowerScan(state, RFBand, RF1, &RF1, &bcal));
+ status = PowerScan(state, RFBand, RF1, &RF1, &bcal);
+ if (status < 0)
+ break;
if (bcal) {
- CHK_ERROR(CalibrateRF(state, RFBand, RF1, &Cprog_cal1));
+ status = CalibrateRF(state, RFBand, RF1, &Cprog_cal1);
+ if (status < 0)
+ break;
}
SearchMap2(m_RF_Cal_Map, RF1, &Cprog_table1);
if (!bcal)
if (RF2 == 0)
break;
- CHK_ERROR(PowerScan(state, RFBand, RF2, &RF2, &bcal));
+ status = PowerScan(state, RFBand, RF2, &RF2, &bcal);
+ if (status < 0)
+ break;
if (bcal) {
- CHK_ERROR(CalibrateRF(state, RFBand, RF2, &Cprog_cal2));
+ status = CalibrateRF(state, RFBand, RF2, &Cprog_cal2);
+ if (status < 0)
+ break;
}
SearchMap2(m_RF_Cal_Map, RF2, &Cprog_table2);
if (!bcal)
if (RF3 == 0)
break;
- CHK_ERROR(PowerScan(state, RFBand, RF3, &RF3, &bcal));
+ status = PowerScan(state, RFBand, RF3, &RF3, &bcal);
+ if (status < 0)
+ break;
if (bcal) {
- CHK_ERROR(CalibrateRF(state, RFBand, RF3, &Cprog_cal3));
+ status = CalibrateRF(state, RFBand, RF3, &Cprog_cal3);
+ if (status < 0)
+ break;
}
SearchMap2(m_RF_Cal_Map, RF3, &Cprog_table3);
if (!bcal)
state->m_RF3[RFBand] = RF3;
#if 0
- printk(KERN_ERR "%s %d RF1 = %d A1 = %d B1 = %d RF2 = %d A2 = %d B2 = %d RF3 = %d\n", __func__,
+ printk(KERN_ERR "tda18271c2dd: %s %d RF1 = %d A1 = %d B1 = %d RF2 = %d A2 = %d B2 = %d RF3 = %d\n", __func__,
RFBand, RF1, state->m_RF_A1[RFBand], state->m_RF_B1[RFBand], RF2,
state->m_RF_A2[RFBand], state->m_RF_B2[RFBand], RF3);
#endif
SearchMap1(m_GainTaper_Map, RF_in, &Gain_Taper) &&
SearchMap3(m_CID_Target_Map, RF_in, &CID_Target, &CountLimit))) {
- printk(KERN_ERR "%s Search map failed\n", __func__);
+ printk(KERN_ERR "tda18271c2dd: %s Search map failed\n", __func__);
return -EINVAL;
}
state->m_Regs[EP2] = (RFBand << 5) | Gain_Taper;
state->m_Regs[EB14] = (RFC_Cprog);
- CHK_ERROR(UpdateReg(state, EP2));
- CHK_ERROR(UpdateReg(state, EB14));
+ status = UpdateReg(state, EP2);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EB14);
+ if (status < 0)
+ break;
freq_MainPLL = RF_in + 1000000;
- CHK_ERROR(CalcMainPLL(state, freq_MainPLL));
+ status = CalcMainPLL(state, freq_MainPLL);
+ if (status < 0)
+ break;
msleep(5);
state->m_Regs[EP4] = (state->m_Regs[EP4] & ~0x03) | 1; /* CAL_mode = 1 */
- CHK_ERROR(UpdateReg(state, EP4));
- CHK_ERROR(UpdateReg(state, EP2)); /* Launch power measurement */
- CHK_ERROR(ReadExtented(state, Regs));
+ status = UpdateReg(state, EP4);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EP2); /* Launch power measurement */
+ if (status < 0)
+ break;
+ status = ReadExtented(state, Regs);
+ if (status < 0)
+ break;
CID_Gain = Regs[EB10] & 0x3F;
state->m_Regs[ID] = Regs[ID]; /* Chip version, (needed for C1 workarround in CalibrateRF) */
while (CID_Gain < CID_Target) {
freq_MainPLL = RF_in + sign * Count + 1000000;
- CHK_ERROR(CalcMainPLL(state, freq_MainPLL));
+ status = CalcMainPLL(state, freq_MainPLL);
+ if (status < 0)
+ break;
msleep(wait ? 5 : 1);
wait = false;
- CHK_ERROR(UpdateReg(state, EP2)); /* Launch power measurement */
- CHK_ERROR(ReadExtented(state, Regs));
+ status = UpdateReg(state, EP2); /* Launch power measurement */
+ if (status < 0)
+ break;
+ status = ReadExtented(state, Regs);
+ if (status < 0)
+ break;
CID_Gain = Regs[EB10] & 0x3F;
Count += 200000;
Count = 200000;
wait = true;
}
- CHK_ERROR(status);
+ status = status;
+ if (status < 0)
+ break;
if (CID_Gain >= CID_Target) {
*pbcal = true;
*pRF_Out = freq_MainPLL - 1000000;
do {
state->m_Regs[EP3] = (state->m_Regs[EP3] & ~0x1F) | 0x12;
state->m_Regs[EP4] = (state->m_Regs[EP4] & ~0x1F); /* If level = 0, Cal mode = 0 */
- CHK_ERROR(UpdateRegs(state, EP3, EP4));
+ status = UpdateRegs(state, EP3, EP4);
+ if (status < 0)
+ break;
state->m_Regs[EB18] = (state->m_Regs[EB18] & ~0x03); /* AGC 1 Gain = 0 */
- CHK_ERROR(UpdateReg(state, EB18));
+ status = UpdateReg(state, EB18);
+ if (status < 0)
+ break;
state->m_Regs[EB21] = (state->m_Regs[EB21] & ~0x03); /* AGC 2 Gain = 0 (Datasheet = 3) */
state->m_Regs[EB23] = (state->m_Regs[EB23] | 0x06); /* ForceLP_Fc2_En = 1, LPFc[2] = 1 */
- CHK_ERROR(UpdateRegs(state, EB21, EB23));
+ status = UpdateRegs(state, EB21, EB23);
+ if (status < 0)
+ break;
} while (0);
return status;
}
int status = 0;
do {
msleep(200); /* Temperature stabilisation */
- CHK_ERROR(PowerScanInit(state));
- CHK_ERROR(RFTrackingFiltersInit(state, 0));
- CHK_ERROR(RFTrackingFiltersInit(state, 1));
- CHK_ERROR(RFTrackingFiltersInit(state, 2));
- CHK_ERROR(RFTrackingFiltersInit(state, 3));
- CHK_ERROR(RFTrackingFiltersInit(state, 4));
- CHK_ERROR(RFTrackingFiltersInit(state, 5));
- CHK_ERROR(RFTrackingFiltersInit(state, 6));
- CHK_ERROR(ThermometerRead(state, &state->m_TMValue_RFCal)); /* also switches off Cal mode !!! */
+ status = PowerScanInit(state);
+ if (status < 0)
+ break;
+ status = RFTrackingFiltersInit(state, 0);
+ if (status < 0)
+ break;
+ status = RFTrackingFiltersInit(state, 1);
+ if (status < 0)
+ break;
+ status = RFTrackingFiltersInit(state, 2);
+ if (status < 0)
+ break;
+ status = RFTrackingFiltersInit(state, 3);
+ if (status < 0)
+ break;
+ status = RFTrackingFiltersInit(state, 4);
+ if (status < 0)
+ break;
+ status = RFTrackingFiltersInit(state, 5);
+ if (status < 0)
+ break;
+ status = RFTrackingFiltersInit(state, 6);
+ if (status < 0)
+ break;
+ status = ThermometerRead(state, &state->m_TMValue_RFCal); /* also switches off Cal mode !!! */
+ if (status < 0)
+ break;
} while (0);
return status;
int status = 0;
memcpy(&state->m_Regs[TM], InitRegs, EB23 - TM + 1);
do {
- CHK_ERROR(UpdateRegs(state, TM, EB23));
+ status = UpdateRegs(state, TM, EB23);
+ if (status < 0)
+ break;
/* AGC1 gain setup */
state->m_Regs[EB17] = 0x00;
- CHK_ERROR(UpdateReg(state, EB17));
+ status = UpdateReg(state, EB17);
+ if (status < 0)
+ break;
state->m_Regs[EB17] = 0x03;
- CHK_ERROR(UpdateReg(state, EB17));
+ status = UpdateReg(state, EB17);
+ if (status < 0)
+ break;
state->m_Regs[EB17] = 0x43;
- CHK_ERROR(UpdateReg(state, EB17));
+ status = UpdateReg(state, EB17);
+ if (status < 0)
+ break;
state->m_Regs[EB17] = 0x4C;
- CHK_ERROR(UpdateReg(state, EB17));
+ status = UpdateReg(state, EB17);
+ if (status < 0)
+ break;
/* IRC Cal Low band */
state->m_Regs[EP3] = 0x1F;
state->m_Regs[MD1] = 0x77;
state->m_Regs[MD2] = 0x08;
state->m_Regs[MD3] = 0x00;
- CHK_ERROR(UpdateRegs(state, EP2, MD3)); /* diff between sw and datasheet (ep3-md3) */
+ status = UpdateRegs(state, EP2, MD3); /* diff between sw and datasheet (ep3-md3) */
+ if (status < 0)
+ break;
#if 0
state->m_Regs[EB4] = 0x61; /* missing in sw */
- CHK_ERROR(UpdateReg(state, EB4));
+ status = UpdateReg(state, EB4);
+ if (status < 0)
+ break;
msleep(1);
state->m_Regs[EB4] = 0x41;
- CHK_ERROR(UpdateReg(state, EB4));
+ status = UpdateReg(state, EB4);
+ if (status < 0)
+ break;
#endif
msleep(5);
- CHK_ERROR(UpdateReg(state, EP1));
+ status = UpdateReg(state, EP1);
+ if (status < 0)
+ break;
msleep(5);
state->m_Regs[EP5] = 0x85;
state->m_Regs[CPD] = 0xCB;
state->m_Regs[CD1] = 0x66;
state->m_Regs[CD2] = 0x70;
- CHK_ERROR(UpdateRegs(state, EP3, CD3));
+ status = UpdateRegs(state, EP3, CD3);
+ if (status < 0)
+ break;
msleep(5);
- CHK_ERROR(UpdateReg(state, EP2));
+ status = UpdateReg(state, EP2);
+ if (status < 0)
+ break;
msleep(30);
/* IRC Cal mid band */
state->m_Regs[MPD] = 0xA1; /* Datasheet = 0xA9 */
state->m_Regs[MD1] = 0x73;
state->m_Regs[MD2] = 0x1A;
- CHK_ERROR(UpdateRegs(state, EP3, MD3));
+ status = UpdateRegs(state, EP3, MD3);
+ if (status < 0)
+ break;
msleep(5);
- CHK_ERROR(UpdateReg(state, EP1));
+ status = UpdateReg(state, EP1);
+ if (status < 0)
+ break;
msleep(5);
state->m_Regs[EP5] = 0x86;
state->m_Regs[CPD] = 0xA8;
state->m_Regs[CD1] = 0x66;
state->m_Regs[CD2] = 0xA0;
- CHK_ERROR(UpdateRegs(state, EP3, CD3));
+ status = UpdateRegs(state, EP3, CD3);
+ if (status < 0)
+ break;
msleep(5);
- CHK_ERROR(UpdateReg(state, EP2));
+ status = UpdateReg(state, EP2);
+ if (status < 0)
+ break;
msleep(30);
/* IRC Cal high band */
state->m_Regs[MPD] = 0x91; /* Datasheet = 0x91 */
state->m_Regs[MD1] = 0x71;
state->m_Regs[MD2] = 0xCD;
- CHK_ERROR(UpdateRegs(state, EP3, MD3));
+ status = UpdateRegs(state, EP3, MD3);
+ if (status < 0)
+ break;
msleep(5);
- CHK_ERROR(UpdateReg(state, EP1));
+ status = UpdateReg(state, EP1);
+ if (status < 0)
+ break;
msleep(5);
state->m_Regs[EP5] = 0x87;
state->m_Regs[CD1] = 0x65;
state->m_Regs[CD2] = 0x50;
- CHK_ERROR(UpdateRegs(state, EP3, CD3));
+ status = UpdateRegs(state, EP3, CD3);
+ if (status < 0)
+ break;
msleep(5);
- CHK_ERROR(UpdateReg(state, EP2));
+ status = UpdateReg(state, EP2);
+ if (status < 0)
+ break;
msleep(30);
/* Back to normal */
state->m_Regs[EP4] = 0x64;
- CHK_ERROR(UpdateReg(state, EP4));
- CHK_ERROR(UpdateReg(state, EP1));
+ status = UpdateReg(state, EP4);
+ if (status < 0)
+ break;
+ status = UpdateReg(state, EP1);
+ if (status < 0)
+ break;
} while (0);
return status;
int status = 0;
do {
- CHK_ERROR(FixedContentsI2CUpdate(state));
- CHK_ERROR(CalcRFFilterCurve(state));
- CHK_ERROR(StandBy(state));
+ status = FixedContentsI2CUpdate(state);
+ if (status < 0)
+ break;
+ status = CalcRFFilterCurve(state);
+ if (status < 0)
+ break;
+ status = StandBy(state);
+ if (status < 0)
+ break;
/* m_bInitDone = true; */
} while (0);
return status;
int TComp;
state->m_Regs[EP3] &= ~0xE0; /* Power up */
- CHK_ERROR(UpdateReg(state, EP3));
+ status = UpdateReg(state, EP3);
+ if (status < 0)
+ break;
- CHK_ERROR(ThermometerRead(state, &TMValue_Current));
+ status = ThermometerRead(state, &TMValue_Current);
+ if (status < 0)
+ break;
if (RF3 == 0 || Frequency < RF2)
Capprox = RF_A1 * ((s32)(Frequency) - (s32)(RF1)) + RF_B1 + Cprog_table;
/* missing in the datasheet, so leave it out for now. */
state->m_Regs[EB14] = Capprox;
- CHK_ERROR(UpdateReg(state, EB14));
+ status = UpdateReg(state, EB14);
+ if (status < 0)
+ break;
} while (0);
return status;
u8 IR_Meas = 0;
state->IF = IntermediateFrequency;
- /* printk("%s Freq = %d Standard = %d IF = %d\n", __func__, Frequency, Standard, IntermediateFrequency); */
+ /* printk("tda18271c2dd: %s Freq = %d Standard = %d IF = %d\n", __func__, Frequency, Standard, IntermediateFrequency); */
/* get values from tables */
if (!(SearchMap1(m_BP_Filter_Map, Frequency, &BP_Filter) &&
SearchMap1(m_IR_Meas_Map, Frequency, &IR_Meas) &&
SearchMap4(m_RF_Band_Map, Frequency, &RF_Band))) {
- printk(KERN_ERR "%s SearchMap failed\n", __func__);
+ printk(KERN_ERR "tda18271c2dd: %s SearchMap failed\n", __func__);
return -EINVAL;
}
else
state->m_Regs[EB23] &= ~0x06; /* ForceLP_Fc2_En = 0, LPFc[2] = 0 */
- CHK_ERROR(UpdateRegs(state, EB22, EB23));
+ status = UpdateRegs(state, EB22, EB23);
+ if (status < 0)
+ break;
state->m_Regs[EP1] = (state->m_Regs[EP1] & ~0x07) | 0x40 | BP_Filter; /* Dis_Power_level = 1, Filter */
state->m_Regs[EP5] = (state->m_Regs[EP5] & ~0x07) | IR_Meas;
(state->m_bMaster ? 0x04 : 0x00); /* CALVCO_FortLOn = MS */
/* AGC1_always_master = 0 */
/* AGC_firstn = 0 */
- CHK_ERROR(UpdateReg(state, EB1));
+ status = UpdateReg(state, EB1);
+ if (status < 0)
+ break;
if (state->m_bMaster) {
- CHK_ERROR(CalcMainPLL(state, Frequency + IntermediateFrequency));
- CHK_ERROR(UpdateRegs(state, TM, EP5));
+ status = CalcMainPLL(state, Frequency + IntermediateFrequency);
+ if (status < 0)
+ break;
+ status = UpdateRegs(state, TM, EP5);
+ if (status < 0)
+ break;
state->m_Regs[EB4] |= 0x20; /* LO_forceSrce = 1 */
- CHK_ERROR(UpdateReg(state, EB4));
+ status = UpdateReg(state, EB4);
+ if (status < 0)
+ break;
msleep(1);
state->m_Regs[EB4] &= ~0x20; /* LO_forceSrce = 0 */
- CHK_ERROR(UpdateReg(state, EB4));
+ status = UpdateReg(state, EB4);
+ if (status < 0)
+ break;
} else {
u8 PostDiv = 0;
u8 Div;
- CHK_ERROR(CalcCalPLL(state, Frequency + IntermediateFrequency));
+ status = CalcCalPLL(state, Frequency + IntermediateFrequency);
+ if (status < 0)
+ break;
SearchMap3(m_Cal_PLL_Map, Frequency + IntermediateFrequency, &PostDiv, &Div);
state->m_Regs[MPD] = (state->m_Regs[MPD] & ~0x7F) | (PostDiv & 0x77);
- CHK_ERROR(UpdateReg(state, MPD));
- CHK_ERROR(UpdateRegs(state, TM, EP5));
+ status = UpdateReg(state, MPD);
+ if (status < 0)
+ break;
+ status = UpdateRegs(state, TM, EP5);
+ if (status < 0)
+ break;
state->m_Regs[EB7] |= 0x20; /* CAL_forceSrce = 1 */
- CHK_ERROR(UpdateReg(state, EB7));
+ status = UpdateReg(state, EB7);
+ if (status < 0)
+ break;
msleep(1);
state->m_Regs[EB7] &= ~0x20; /* CAL_forceSrce = 0 */
- CHK_ERROR(UpdateReg(state, EB7));
+ status = UpdateReg(state, EB7);
+ if (status < 0)
+ break;
}
msleep(20);
if (Standard != HF_FM_Radio)
state->m_Regs[EP3] |= 0x04; /* RFAGC to normal mode */
- CHK_ERROR(UpdateReg(state, EP3));
+ status = UpdateReg(state, EP3);
+ if (status < 0)
+ break;
} while (0);
return status;
return 0;
}
+/*
+ * As defined on EN 300 429 Annex A and on ITU-T J.83 annex A, the DVB-C
+ * roll-off factor is 0.15.
+ * According with the specs, the amount of the needed bandwith is given by:
+ * Bw = Symbol_rate * (1 + 0.15)
+ * As such, the maximum symbol rate supported by 6 MHz is
+ * max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
+ *NOTE: For ITU-T J.83 Annex C, the roll-off factor is 0.13. So:
+ * max_symbol_rate = 6 MHz / 1.13 = 5309735 Baud
+ * That means that an adjustment is needed for Japan,
+ * but, as currently DRX-K is hardcoded to Annex A, let's stick
+ * with 0.15 roll-off factor.
+ */
+#define MAX_SYMBOL_RATE_6MHz 5217391
+
static int set_params(struct dvb_frontend *fe,
struct dvb_frontend_parameters *params)
{
break;
}
else if (fe->ops.info.type == FE_QAM) {
- Standard = HF_DVBC_8MHZ;
+ if (params->u.qam.symbol_rate <= MAX_SYMBOL_RATE_6MHz)
+ Standard = HF_DVBC_6MHZ;
+ else
+ Standard = HF_DVBC_8MHZ;
} else
return -EINVAL;
do {
- CHK_ERROR(RFTrackingFiltersCorrection(state, params->frequency));
- CHK_ERROR(ChannelConfiguration(state, params->frequency, Standard));
+ status = RFTrackingFiltersCorrection(state, params->frequency);
+ if (status < 0)
+ break;
+ status = ChannelConfiguration(state, params->frequency, Standard);
+ if (status < 0)
+ break;
msleep(state->m_SettlingTime); /* Allow AGC's to settle down */
} while (0);
}
#endif
-static int get_frequency(struct dvb_frontend *fe, u32 *frequency)
+static int get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
{
struct tda_state *state = fe->tuner_priv;
.sleep = sleep,
.set_params = set_params,
.release = release,
- .get_frequency = get_frequency,
+ .get_if_frequency = get_if_frequency,
.get_bandwidth = get_bandwidth,
};