static u16 dib8000_set_layer(struct dib8000_state *state, u8 layer_index, u16 max_constellation)
 {
        u8  cr, constellation, time_intlv;
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
 
-       switch (state->fe[0]->dtv_property_cache.layer[layer_index].modulation) {
+       switch (c->layer[layer_index].modulation) {
        case DQPSK:
                        constellation = 0;
                        break;
                        break;
        }
 
-       switch (state->fe[0]->dtv_property_cache.layer[layer_index].fec) {
+       switch (c->layer[layer_index].fec) {
        case FEC_1_2:
                        cr = 1;
                        break;
                        break;
        }
 
-       if ((state->fe[0]->dtv_property_cache.layer[layer_index].interleaving > 0) && ((state->fe[0]->dtv_property_cache.layer[layer_index].interleaving <= 3) || (state->fe[0]->dtv_property_cache.layer[layer_index].interleaving == 4 && state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1)))
-               time_intlv = state->fe[0]->dtv_property_cache.layer[layer_index].interleaving;
+       if ((c->layer[layer_index].interleaving > 0) && ((c->layer[layer_index].interleaving <= 3) || (c->layer[layer_index].interleaving == 4 && c->isdbt_sb_mode == 1)))
+               time_intlv = c->layer[layer_index].interleaving;
        else
                time_intlv = 0;
 
-       dib8000_write_word(state, 2 + layer_index, (constellation << 10) | ((state->fe[0]->dtv_property_cache.layer[layer_index].segment_count & 0xf) << 6) | (cr << 3) | time_intlv);
-       if (state->fe[0]->dtv_property_cache.layer[layer_index].segment_count > 0) {
+       dib8000_write_word(state, 2 + layer_index, (constellation << 10) | ((c->layer[layer_index].segment_count & 0xf) << 6) | (cr << 3) | time_intlv);
+       if (c->layer[layer_index].segment_count > 0) {
                switch (max_constellation) {
                case DQPSK:
                case QPSK:
-                               if (state->fe[0]->dtv_property_cache.layer[layer_index].modulation == QAM_16 || state->fe[0]->dtv_property_cache.layer[layer_index].modulation == QAM_64)
-                                       max_constellation = state->fe[0]->dtv_property_cache.layer[layer_index].modulation;
+                               if (c->layer[layer_index].modulation == QAM_16 || c->layer[layer_index].modulation == QAM_64)
+                                       max_constellation = c->layer[layer_index].modulation;
                                break;
                case QAM_16:
-                               if (state->fe[0]->dtv_property_cache.layer[layer_index].modulation == QAM_64)
-                                       max_constellation = state->fe[0]->dtv_property_cache.layer[layer_index].modulation;
+                               if (c->layer[layer_index].modulation == QAM_64)
+                                       max_constellation = c->layer[layer_index].modulation;
                                break;
                }
        }
 {
        u16 i;
        const s16 *ncoeff;
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
 
        dib8000_write_word(state, 352, state->seg_diff_mask);
        dib8000_write_word(state, 353, state->seg_mask);
 
        /* P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5 */
-       dib8000_write_word(state, 351, (state->fe[0]->dtv_property_cache.isdbt_sb_mode << 9) | (state->fe[0]->dtv_property_cache.isdbt_sb_mode << 8) | (13 << 4) | 5);
+       dib8000_write_word(state, 351, (c->isdbt_sb_mode << 9) | (c->isdbt_sb_mode << 8) | (13 << 4) | 5);
 
-       if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
+       if (c->isdbt_sb_mode) {
                /* ---- SMALL ---- */
-               switch (state->fe[0]->dtv_property_cache.transmission_mode) {
+               switch (c->transmission_mode) {
                case TRANSMISSION_MODE_2K:
-                               if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) { /* 1-seg */
-                                       if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) /* DQPSK */
+                               if (c->isdbt_partial_reception == 0) { /* 1-seg */
+                                       if (c->layer[0].modulation == DQPSK) /* DQPSK */
                                                ncoeff = coeff_2k_sb_1seg_dqpsk;
                                        else /* QPSK or QAM */
                                                ncoeff = coeff_2k_sb_1seg;
                                } else { /* 3-segments */
-                                       if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) { /* DQPSK on central segment */
-                                               if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) /* DQPSK on external segments */
+                                       if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
+                                               if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
                                                        ncoeff = coeff_2k_sb_3seg_0dqpsk_1dqpsk;
                                                else /* QPSK or QAM on external segments */
                                                        ncoeff = coeff_2k_sb_3seg_0dqpsk;
                                        } else { /* QPSK or QAM on central segment */
-                                               if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) /* DQPSK on external segments */
+                                               if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
                                                        ncoeff = coeff_2k_sb_3seg_1dqpsk;
                                                else /* QPSK or QAM on external segments */
                                                        ncoeff = coeff_2k_sb_3seg;
                                }
                                break;
                case TRANSMISSION_MODE_4K:
-                               if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) { /* 1-seg */
-                                       if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) /* DQPSK */
+                               if (c->isdbt_partial_reception == 0) { /* 1-seg */
+                                       if (c->layer[0].modulation == DQPSK) /* DQPSK */
                                                ncoeff = coeff_4k_sb_1seg_dqpsk;
                                        else /* QPSK or QAM */
                                                ncoeff = coeff_4k_sb_1seg;
                                } else { /* 3-segments */
-                                       if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) { /* DQPSK on central segment */
-                                               if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) /* DQPSK on external segments */
+                                       if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
+                                               if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
                                                        ncoeff = coeff_4k_sb_3seg_0dqpsk_1dqpsk;
                                                else /* QPSK or QAM on external segments */
                                                        ncoeff = coeff_4k_sb_3seg_0dqpsk;
                                        } else { /* QPSK or QAM on central segment */
-                                               if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) /* DQPSK on external segments */
+                                               if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
                                                        ncoeff = coeff_4k_sb_3seg_1dqpsk;
                                                else /* QPSK or QAM on external segments */
                                                        ncoeff = coeff_4k_sb_3seg;
                case TRANSMISSION_MODE_AUTO:
                case TRANSMISSION_MODE_8K:
                default:
-                               if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) { /* 1-seg */
-                                       if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) /* DQPSK */
+                               if (c->isdbt_partial_reception == 0) { /* 1-seg */
+                                       if (c->layer[0].modulation == DQPSK) /* DQPSK */
                                                ncoeff = coeff_8k_sb_1seg_dqpsk;
                                        else /* QPSK or QAM */
                                                ncoeff = coeff_8k_sb_1seg;
                                } else { /* 3-segments */
-                                       if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) { /* DQPSK on central segment */
-                                               if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) /* DQPSK on external segments */
+                                       if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
+                                               if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
                                                        ncoeff = coeff_8k_sb_3seg_0dqpsk_1dqpsk;
                                                else /* QPSK or QAM on external segments */
                                                        ncoeff = coeff_8k_sb_3seg_0dqpsk;
                                        } else { /* QPSK or QAM on central segment */
-                                               if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) /* DQPSK on external segments */
+                                               if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
                                                        ncoeff = coeff_8k_sb_3seg_1dqpsk;
                                                else /* QPSK or QAM on external segments */
                                                        ncoeff = coeff_8k_sb_3seg;
 static const u16 coff_thres_3seg[3] = {350, 300, 250};
 static void dib8000_set_sb_channel(struct dib8000_state *state)
 {
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        const u16 *coff;
        u16 i;
 
-       if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_2K || state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_4K) {
+       if (c->transmission_mode == TRANSMISSION_MODE_2K || c->transmission_mode == TRANSMISSION_MODE_4K) {
                dib8000_write_word(state, 219, dib8000_read_word(state, 219) | 0x1); /* adp_pass =1 */
                dib8000_write_word(state, 190, dib8000_read_word(state, 190) | (0x1 << 14)); /* pha3_force_pha_shift = 1 */
        } else {
                dib8000_write_word(state, 190, dib8000_read_word(state, 190) & 0xbfff); /* pha3_force_pha_shift = 0 */
        }
 
-       if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 1) /* 3-segments */
+       if (c->isdbt_partial_reception == 1) /* 3-segments */
                state->seg_mask = 0x00E0;
        else /* 1-segment */
                state->seg_mask = 0x0040;
 
        /* ---- COFF ---- Carloff, the most robust --- */
        /* P_coff_cpil_alpha=4, P_coff_inh=0, P_coff_cpil_winlen=64, P_coff_narrow_band=1, P_coff_square_val=1, P_coff_one_seg=~partial_rcpt, P_coff_use_tmcc=1, P_coff_use_ac=1 */
-       dib8000_write_word(state, 187, (4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~state->fe[0]->dtv_property_cache.isdbt_partial_reception & 1) << 2) | 0x3);
+       dib8000_write_word(state, 187, (4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~c->isdbt_partial_reception & 1) << 2) | 0x3);
 
        dib8000_write_word(state, 340, (16 << 6) | (8 << 0)); /* P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8 */
        dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));/* P_ctrl_pre_freq_thres_lockout=6, P_small_use_tmcc/ac/cp=1 */
 
        /* Sound Broadcasting mode 1 seg */
-       if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
+       if (c->isdbt_partial_reception == 0) {
                /* P_coff_winlen=63, P_coff_thres_lock=15, P_coff_one_seg_width = (P_mode == 3) , P_coff_one_seg_sym = (P_mode-1) */
                if (state->mode == 3)
                        dib8000_write_word(state, 180, 0x1fcf | ((state->mode - 1) << 14));
        dib8000_write_word(state, 228, 1); /* P_2d_mode_byp=1 */
        dib8000_write_word(state, 205, dib8000_read_word(state, 205) & 0xfff0); /* P_cspu_win_cut = 0 */
 
-       if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0 && state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_2K)
+       if (c->isdbt_partial_reception == 0 && c->transmission_mode == TRANSMISSION_MODE_2K)
                dib8000_write_word(state, 265, 15); /* P_equal_noise_sel = 15 */
 
        /* Write COFF thres */
 
        dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask); /* P_equal_noise_seg_inh */
 
-       if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
+       if (c->isdbt_partial_reception == 0)
                dib8000_write_word(state, 178, 64); /* P_fft_powrange = 64 */
        else
                dib8000_write_word(state, 178, 32); /* P_fft_powrange = 32 */
        u16 tmcc_pow = 0, ana_gain = 0, tmp = 0, i = 0, nbseg_diff = 0 ;
        u16 max_constellation = DQPSK;
        int init_prbs;
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
 
        /* P_mode */
        dib8000_write_word(state, 10, (seq << 4));
 
        /* set guard */
        tmp = dib8000_read_word(state, 1);
-       dib8000_write_word(state, 1, (tmp&0xfffc) | (state->fe[0]->dtv_property_cache.guard_interval & 0x3));
+       dib8000_write_word(state, 1, (tmp&0xfffc) | (c->guard_interval & 0x3));
 
-       dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) | ((state->fe[0]->dtv_property_cache.isdbt_partial_reception & 1) << 5) | ((state->fe[0]->dtv_property_cache.isdbt_sb_mode & 1) << 4));
+       dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) | ((c->isdbt_partial_reception & 1) << 5) | ((c->isdbt_sb_mode & 1) << 4));
 
        /* signal optimization parameter */
-       if (state->fe[0]->dtv_property_cache.isdbt_partial_reception) {
-               state->seg_diff_mask = (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) << permu_seg[0];
+       if (c->isdbt_partial_reception) {
+               state->seg_diff_mask = (c->layer[0].modulation == DQPSK) << permu_seg[0];
                for (i = 1; i < 3; i++)
-                       nbseg_diff += (state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * state->fe[0]->dtv_property_cache.layer[i].segment_count;
+                       nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
                for (i = 0; i < nbseg_diff; i++)
                        state->seg_diff_mask |= 1 << permu_seg[i+1];
        } else {
                for (i = 0; i < 3; i++)
-                       nbseg_diff += (state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * state->fe[0]->dtv_property_cache.layer[i].segment_count;
+                       nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
                for (i = 0; i < nbseg_diff; i++)
                        state->seg_diff_mask |= 1 << permu_seg[i];
        }
        for (i = 0; i < 3; i++)
                max_constellation = dib8000_set_layer(state, i, max_constellation);
        if (autosearching == 0) {
-               state->layer_b_nb_seg = state->fe[0]->dtv_property_cache.layer[1].segment_count;
-               state->layer_c_nb_seg = state->fe[0]->dtv_property_cache.layer[2].segment_count;
+               state->layer_b_nb_seg = c->layer[1].segment_count;
+               state->layer_c_nb_seg = c->layer[2].segment_count;
        }
 
        /* WRITE: Mode & Diff mask */
        dib8000_update_ana_gain(state, ana_gain);
 
        /* ---- ANA_FE ---- */
-       if (state->fe[0]->dtv_property_cache.isdbt_partial_reception) /* 3-segments */
+       if (c->isdbt_partial_reception) /* 3-segments */
                dib8000_load_ana_fe_coefs(state, ana_fe_coeff_3seg);
        else
                dib8000_load_ana_fe_coefs(state, ana_fe_coeff_1seg); /* 1-segment */
 
        /* TSB or ISDBT ? apply it now */
-       if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
+       if (c->isdbt_sb_mode) {
                dib8000_set_sb_channel(state);
-               if (state->fe[0]->dtv_property_cache.isdbt_sb_subchannel != -1)
-                       init_prbs = dib8000_get_init_prbs(state, state->fe[0]->dtv_property_cache.isdbt_sb_subchannel);
+               if (c->isdbt_sb_subchannel != -1)
+                       init_prbs = dib8000_get_init_prbs(state, c->isdbt_sb_subchannel);
                else
                        init_prbs = 0;
        } else {
 
        /* ---- TMCC ---- */
        for (i = 0; i < 3; i++)
-               tmcc_pow += (((state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * 4 + 1) * state->fe[0]->dtv_property_cache.layer[i].segment_count) ;
+               tmcc_pow += (((c->layer[i].modulation == DQPSK) * 4 + 1) * c->layer[i].segment_count) ;
 
        /* Quantif of "P_tmcc_dec_thres_?k" is (0, 5+mode, 9); */
        /* Threshold is set at 1/4 of max power. */
 static int dib8000_autosearch_start(struct dvb_frontend *fe)
 {
        struct dib8000_state *state = fe->demodulator_priv;
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        u8 slist = 0;
        u32 value, internal = state->cfg.pll->internal;
 
                dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (0 << 13)); /* P_restart_ccg = 0 */
                dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x7ff) | (0 << 15) | (1 << 13)); /* P_restart_search = 0; */
        } else if (state->autosearch_state == AS_SEARCHING_GUARD) {
-               state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
-               state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
-               state->fe[0]->dtv_property_cache.inversion = 0;
-               state->fe[0]->dtv_property_cache.layer[0].modulation = QAM_64;
-               state->fe[0]->dtv_property_cache.layer[0].fec = FEC_2_3;
-               state->fe[0]->dtv_property_cache.layer[0].interleaving = 0;
-               state->fe[0]->dtv_property_cache.layer[0].segment_count = 13;
+               c->transmission_mode = TRANSMISSION_MODE_8K;
+               c->guard_interval = GUARD_INTERVAL_1_8;
+               c->inversion = 0;
+               c->layer[0].modulation = QAM_64;
+               c->layer[0].fec = FEC_2_3;
+               c->layer[0].interleaving = 0;
+               c->layer[0].segment_count = 13;
 
                slist = 16;
-               state->fe[0]->dtv_property_cache.transmission_mode = state->found_nfft;
+               c->transmission_mode = state->found_nfft;
 
                dib8000_set_isdbt_common_channel(state, slist, 1);
 
                dib8000_read_word(state, 1284);  /* reset the INT. n_irq_pending */
                dib8000_write_word(state, 0, (u16)value);
        } else {
-               state->fe[0]->dtv_property_cache.inversion = 0;
-               state->fe[0]->dtv_property_cache.layer[0].modulation = QAM_64;
-               state->fe[0]->dtv_property_cache.layer[0].fec = FEC_2_3;
-               state->fe[0]->dtv_property_cache.layer[0].interleaving = 0;
-               state->fe[0]->dtv_property_cache.layer[0].segment_count = 13;
-               if (!state->fe[0]->dtv_property_cache.isdbt_sb_mode)
-                       state->fe[0]->dtv_property_cache.layer[0].segment_count = 13;
+               c->inversion = 0;
+               c->layer[0].modulation = QAM_64;
+               c->layer[0].fec = FEC_2_3;
+               c->layer[0].interleaving = 0;
+               c->layer[0].segment_count = 13;
+               if (!c->isdbt_sb_mode)
+                       c->layer[0].segment_count = 13;
 
                /* choose the right list, in sb, always do everything */
-               if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
+               if (c->isdbt_sb_mode) {
                        slist = 7;
                        dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
                } else {
-                       if (state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO) {
-                               if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) {
-                                       state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
-                                       state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
+                       if (c->guard_interval == GUARD_INTERVAL_AUTO) {
+                               if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
+                                       c->transmission_mode = TRANSMISSION_MODE_8K;
+                                       c->guard_interval = GUARD_INTERVAL_1_8;
                                        slist = 7;
                                        dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 to have autosearch start ok with mode2 */
                                } else {
-                                       state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
+                                       c->guard_interval = GUARD_INTERVAL_1_8;
                                        slist = 3;
                                }
                        } else {
-                               if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) {
-                                       state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
+                               if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
+                                       c->transmission_mode = TRANSMISSION_MODE_8K;
                                        slist = 2;
                                        dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 */
                                } else
 
 static void dib8000_set_frequency_offset(struct dib8000_state *state)
 {
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        int i;
        u32 current_rf;
        int total_dds_offset_khz;
        if (state->fe[0]->ops.tuner_ops.get_frequency)
                state->fe[0]->ops.tuner_ops.get_frequency(state->fe[0], ¤t_rf);
        else
-               current_rf = state->fe[0]->dtv_property_cache.frequency;
+               current_rf = c->frequency;
        current_rf /= 1000;
-       total_dds_offset_khz = (int)current_rf - (int)state->fe[0]->dtv_property_cache.frequency / 1000;
+       total_dds_offset_khz = (int)current_rf - (int)c->frequency / 1000;
 
-       if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
-               state->subchannel = state->fe[0]->dtv_property_cache.isdbt_sb_subchannel;
+       if (c->isdbt_sb_mode) {
+               state->subchannel = c->isdbt_sb_subchannel;
 
                i = dib8000_read_word(state, 26) & 1; /* P_dds_invspec */
-               dib8000_write_word(state, 26, state->fe[0]->dtv_property_cache.inversion ^ i);
+               dib8000_write_word(state, 26, c->inversion ^ i);
 
                if (state->cfg.pll->ifreq == 0) { /* low if tuner */
-                       if ((state->fe[0]->dtv_property_cache.inversion ^ i) == 0)
+                       if ((c->inversion ^ i) == 0)
                                dib8000_write_word(state, 26, dib8000_read_word(state, 26) | 1);
                } else {
-                       if ((state->fe[0]->dtv_property_cache.inversion ^ i) == 0)
+                       if ((c->inversion ^ i) == 0)
                                total_dds_offset_khz *= -1;
                }
        }
 
-       dprintk("%dkhz tuner offset (frequency = %dHz & current_rf = %dHz) total_dds_offset_hz = %d", state->fe[0]->dtv_property_cache.frequency - current_rf, state->fe[0]->dtv_property_cache.frequency, current_rf, total_dds_offset_khz);
+       dprintk("%dkhz tuner offset (frequency = %dHz & current_rf = %dHz) total_dds_offset_hz = %d", c->frequency - current_rf, c->frequency, current_rf, total_dds_offset_khz);
 
        /* apply dds offset now */
        dib8000_set_dds(state, total_dds_offset_khz);
 
 static u32 dib8000_get_symbol_duration(struct dib8000_state *state)
 {
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        u16 i;
 
-       switch (state->fe[0]->dtv_property_cache.transmission_mode) {
+       switch (c->transmission_mode) {
        case TRANSMISSION_MODE_2K:
                        i = 0;
                        break;
                        break;
        }
 
-       return (LUT_isdbt_symbol_duration[i] / (state->fe[0]->dtv_property_cache.bandwidth_hz / 1000)) + 1;
+       return (LUT_isdbt_symbol_duration[i] / (c->bandwidth_hz / 1000)) + 1;
 }
 
 static void dib8000_set_isdbt_loop_params(struct dib8000_state *state, enum param_loop_step loop_step)
 {
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        u16 reg_32 = 0, reg_37 = 0;
 
        switch (loop_step) {
        case LOOP_TUNE_1:
-                       if (state->fe[0]->dtv_property_cache.isdbt_sb_mode)  {
-                               if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
+                       if (c->isdbt_sb_mode)  {
+                               if (c->isdbt_partial_reception == 0) {
                                        reg_32 = ((11 - state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (11-P_mode), P_corm_alpha=6, P_corm_thres=0x40 */
                                        reg_37 = (3 << 5) | (0 << 4) | (10 - state->mode); /* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = (10-P_mode)  */
                                } else { /* Sound Broadcasting mode 3 seg */
                        }
                        break;
        case LOOP_TUNE_2:
-                       if (state->fe[0]->dtv_property_cache.isdbt_sb_mode)  {
-                               if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {  /* Sound Broadcasting mode 1 seg */
+                       if (c->isdbt_sb_mode)  {
+                               if (c->isdbt_partial_reception == 0) {  /* Sound Broadcasting mode 1 seg */
                                        reg_32 = ((13-state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (13-P_mode) , P_corm_alpha=6, P_corm_thres=0x40*/
                                        reg_37 = (12-state->mode) | ((5 + state->mode) << 5);
                                } else {  /* Sound Broadcasting mode 3 seg */
 
 static void dib8000_set_sync_wait(struct dib8000_state *state)
 {
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        u16 sync_wait = 64;
 
        /* P_dvsy_sync_wait - reuse mode */
-       switch (state->fe[0]->dtv_property_cache.transmission_mode) {
+       switch (c->transmission_mode) {
        case TRANSMISSION_MODE_8K:
                        sync_wait = 256;
                        break;
        }
 
        if (state->cfg.diversity_delay == 0)
-               sync_wait = (sync_wait * (1 << (state->fe[0]->dtv_property_cache.guard_interval)) * 3) / 2 + 48; /* add 50% SFN margin + compensate for one DVSY-fifo */
+               sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + 48; /* add 50% SFN margin + compensate for one DVSY-fifo */
        else
-               sync_wait = (sync_wait * (1 << (state->fe[0]->dtv_property_cache.guard_interval)) * 3) / 2 + state->cfg.diversity_delay; /* add 50% SFN margin + compensate for DVSY-fifo */
+               sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + state->cfg.diversity_delay; /* add 50% SFN margin + compensate for DVSY-fifo */
 
        dib8000_write_word(state, 273, (dib8000_read_word(state, 273) & 0x000f) | (sync_wait << 4));
 }
 static int dib8000_tune(struct dvb_frontend *fe)
 {
        struct dib8000_state *state = fe->demodulator_priv;
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        enum frontend_tune_state *tune_state = &state->tune_state;
 
        u16 locks, deeper_interleaver = 0, i;
                        if (state->revision == 0x8090)
                                dib8090p_init_sdram(state);
                        state->status = FE_STATUS_TUNE_PENDING;
-                       if ((state->fe[0]->dtv_property_cache.delivery_system != SYS_ISDBT) ||
-                                       (state->fe[0]->dtv_property_cache.inversion == INVERSION_AUTO) ||
-                                       (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) ||
-                                       (state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO) ||
-                                       (((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 0)) != 0) &&
-                                        (state->fe[0]->dtv_property_cache.layer[0].segment_count != 0xff) &&
-                                        (state->fe[0]->dtv_property_cache.layer[0].segment_count != 0) &&
-                                        ((state->fe[0]->dtv_property_cache.layer[0].modulation == QAM_AUTO) ||
-                                         (state->fe[0]->dtv_property_cache.layer[0].fec == FEC_AUTO))) ||
-                                       (((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 1)) != 0) &&
-                                        (state->fe[0]->dtv_property_cache.layer[1].segment_count != 0xff) &&
-                                        (state->fe[0]->dtv_property_cache.layer[1].segment_count != 0) &&
-                                        ((state->fe[0]->dtv_property_cache.layer[1].modulation == QAM_AUTO) ||
-                                         (state->fe[0]->dtv_property_cache.layer[1].fec == FEC_AUTO))) ||
-                                       (((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 2)) != 0) &&
-                                        (state->fe[0]->dtv_property_cache.layer[2].segment_count != 0xff) &&
-                                        (state->fe[0]->dtv_property_cache.layer[2].segment_count != 0) &&
-                                        ((state->fe[0]->dtv_property_cache.layer[2].modulation == QAM_AUTO) ||
-                                         (state->fe[0]->dtv_property_cache.layer[2].fec == FEC_AUTO))) ||
-                                       (((state->fe[0]->dtv_property_cache.layer[0].segment_count == 0) ||
-                                         ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 0)) == 0)) &&
-                                        ((state->fe[0]->dtv_property_cache.layer[1].segment_count == 0) ||
-                                         ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (2 << 0)) == 0)) &&
-                                        ((state->fe[0]->dtv_property_cache.layer[2].segment_count == 0) || ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (3 << 0)) == 0))))
+                       if ((c->delivery_system != SYS_ISDBT) ||
+                                       (c->inversion == INVERSION_AUTO) ||
+                                       (c->transmission_mode == TRANSMISSION_MODE_AUTO) ||
+                                       (c->guard_interval == GUARD_INTERVAL_AUTO) ||
+                                       (((c->isdbt_layer_enabled & (1 << 0)) != 0) &&
+                                        (c->layer[0].segment_count != 0xff) &&
+                                        (c->layer[0].segment_count != 0) &&
+                                        ((c->layer[0].modulation == QAM_AUTO) ||
+                                         (c->layer[0].fec == FEC_AUTO))) ||
+                                       (((c->isdbt_layer_enabled & (1 << 1)) != 0) &&
+                                        (c->layer[1].segment_count != 0xff) &&
+                                        (c->layer[1].segment_count != 0) &&
+                                        ((c->layer[1].modulation == QAM_AUTO) ||
+                                         (c->layer[1].fec == FEC_AUTO))) ||
+                                       (((c->isdbt_layer_enabled & (1 << 2)) != 0) &&
+                                        (c->layer[2].segment_count != 0xff) &&
+                                        (c->layer[2].segment_count != 0) &&
+                                        ((c->layer[2].modulation == QAM_AUTO) ||
+                                         (c->layer[2].fec == FEC_AUTO))) ||
+                                       (((c->layer[0].segment_count == 0) ||
+                                         ((c->isdbt_layer_enabled & (1 << 0)) == 0)) &&
+                                        ((c->layer[1].segment_count == 0) ||
+                                         ((c->isdbt_layer_enabled & (2 << 0)) == 0)) &&
+                                        ((c->layer[2].segment_count == 0) || ((c->isdbt_layer_enabled & (3 << 0)) == 0))))
                                state->channel_parameters_set = 0; /* auto search */
                        else
                                state->channel_parameters_set = 1; /* channel parameters are known */
                        dib8000_write_word(state, 285, dib8000_read_word(state, 285) & 0x60);
 
                        dib8000_set_frequency_offset(state);
-                       dib8000_set_bandwidth(fe, state->fe[0]->dtv_property_cache.bandwidth_hz / 1000);
+                       dib8000_set_bandwidth(fe, c->bandwidth_hz / 1000);
 
                        if (state->channel_parameters_set == 0) { /* The channel struct is unknown, search it ! */
 #ifdef DIB8000_AGC_FREEZE
                        dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
 
                        /* mpeg will never lock on this condition because init_prbs is not set : search for it !*/
-                       if (state->fe[0]->dtv_property_cache.isdbt_sb_mode && state->fe[0]->dtv_property_cache.isdbt_sb_subchannel == -1 && !state->differential_constellation) {
+                       if (c->isdbt_sb_mode && c->isdbt_sb_subchannel == -1 && !state->differential_constellation) {
                                state->subchannel = 0;
                                *tune_state = CT_DEMOD_STEP_11;
                        } else {
                        if ((state->revision == 0x8090) || ((dib8000_read_word(state, 1291) >> 9) & 0x1)) { /* fe capable of deinterleaving : esram */
                                /* defines timeout for mpeg lock depending on interleaver lenght of longest layer */
                                for (i = 0; i < 3; i++) {
-                                       if (state->fe[0]->dtv_property_cache.layer[i].interleaving >= deeper_interleaver) {
-                                               dprintk("layer%i: time interleaver = %d ", i, state->fe[0]->dtv_property_cache.layer[i].interleaving);
-                                               if (state->fe[0]->dtv_property_cache.layer[i].segment_count > 0) { /* valid layer */
-                                                       deeper_interleaver = state->fe[0]->dtv_property_cache.layer[0].interleaving;
+                                       if (c->layer[i].interleaving >= deeper_interleaver) {
+                                               dprintk("layer%i: time interleaver = %d ", i, c->layer[i].interleaving);
+                                               if (c->layer[i].segment_count > 0) { /* valid layer */
+                                                       deeper_interleaver = c->layer[0].interleaving;
                                                        state->longest_intlv_layer = i;
                                                }
                                        }
                        locks = dib8000_read_lock(fe);
                        if (locks&(1<<(7-state->longest_intlv_layer))) { /* mpeg lock : check the longest one */
                                dprintk("Mpeg locks [ L0 : %d | L1 : %d | L2 : %d ]", (locks>>7)&0x1, (locks>>6)&0x1, (locks>>5)&0x1);
-                               if (state->fe[0]->dtv_property_cache.isdbt_sb_mode && state->fe[0]->dtv_property_cache.isdbt_sb_subchannel == -1 && !state->differential_constellation)
+                               if (c->isdbt_sb_mode && c->isdbt_sb_subchannel == -1 && !state->differential_constellation)
                                        /* signal to the upper layer, that there was a channel found and the parameters can be read */
                                        state->status = FE_STATUS_DEMOD_SUCCESS;
                                else
                                        state->status = FE_STATUS_DATA_LOCKED;
                                *tune_state = CT_DEMOD_STOP;
                        } else if (now > *timeout) {
-                               if (state->fe[0]->dtv_property_cache.isdbt_sb_mode && state->fe[0]->dtv_property_cache.isdbt_sb_subchannel == -1 && !state->differential_constellation) { /* continue to try init prbs autosearch */
+                               if (c->isdbt_sb_mode && c->isdbt_sb_subchannel == -1 && !state->differential_constellation) { /* continue to try init prbs autosearch */
                                        state->subchannel += 3;
                                        *tune_state = CT_DEMOD_STEP_11;
                                } else { /* we are done mpeg of the longest interleaver xas not locking but let's try if an other layer has locked in the same time */
 static int dib8000_set_frontend(struct dvb_frontend *fe)
 {
        struct dib8000_state *state = fe->demodulator_priv;
+       struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
        int l, i, active, time, ret, time_slave = FE_CALLBACK_TIME_NEVER;
        u8 exit_condition, index_frontend;
        u32 delay, callback_time;
 
-       if (state->fe[0]->dtv_property_cache.frequency == 0) {
+       if (c->frequency == 0) {
                dprintk("dib8000: must at least specify frequency ");
                return 0;
        }
 
-       if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
+       if (c->bandwidth_hz == 0) {
                dprintk("dib8000: no bandwidth specified, set to default ");
-               state->fe[0]->dtv_property_cache.bandwidth_hz = 6000000;
+               c->bandwidth_hz = 6000000;
        }
 
        for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {