diff options
Diffstat (limited to 'drivers/media/dvb/frontends/sp887x.c')
-rw-r--r-- | drivers/media/dvb/frontends/sp887x.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/drivers/media/dvb/frontends/sp887x.c b/drivers/media/dvb/frontends/sp887x.c index 4a7c3d842608..f4096ccb226e 100644 --- a/drivers/media/dvb/frontends/sp887x.c +++ b/drivers/media/dvb/frontends/sp887x.c | |||
@@ -209,13 +209,13 @@ static int sp887x_initial_setup (struct dvb_frontend* fe, const struct firmware | |||
209 | return 0; | 209 | return 0; |
210 | }; | 210 | }; |
211 | 211 | ||
212 | static int configure_reg0xc05 (struct dvb_frontend_parameters *p, u16 *reg0xc05) | 212 | static int configure_reg0xc05(struct dtv_frontend_properties *p, u16 *reg0xc05) |
213 | { | 213 | { |
214 | int known_parameters = 1; | 214 | int known_parameters = 1; |
215 | 215 | ||
216 | *reg0xc05 = 0x000; | 216 | *reg0xc05 = 0x000; |
217 | 217 | ||
218 | switch (p->u.ofdm.constellation) { | 218 | switch (p->modulation) { |
219 | case QPSK: | 219 | case QPSK: |
220 | break; | 220 | break; |
221 | case QAM_16: | 221 | case QAM_16: |
@@ -231,7 +231,7 @@ static int configure_reg0xc05 (struct dvb_frontend_parameters *p, u16 *reg0xc05) | |||
231 | return -EINVAL; | 231 | return -EINVAL; |
232 | }; | 232 | }; |
233 | 233 | ||
234 | switch (p->u.ofdm.hierarchy_information) { | 234 | switch (p->hierarchy) { |
235 | case HIERARCHY_NONE: | 235 | case HIERARCHY_NONE: |
236 | break; | 236 | break; |
237 | case HIERARCHY_1: | 237 | case HIERARCHY_1: |
@@ -250,7 +250,7 @@ static int configure_reg0xc05 (struct dvb_frontend_parameters *p, u16 *reg0xc05) | |||
250 | return -EINVAL; | 250 | return -EINVAL; |
251 | }; | 251 | }; |
252 | 252 | ||
253 | switch (p->u.ofdm.code_rate_HP) { | 253 | switch (p->code_rate_HP) { |
254 | case FEC_1_2: | 254 | case FEC_1_2: |
255 | break; | 255 | break; |
256 | case FEC_2_3: | 256 | case FEC_2_3: |
@@ -303,17 +303,30 @@ static void divide (int n, int d, int *quotient_i, int *quotient_f) | |||
303 | } | 303 | } |
304 | 304 | ||
305 | static void sp887x_correct_offsets (struct sp887x_state* state, | 305 | static void sp887x_correct_offsets (struct sp887x_state* state, |
306 | struct dvb_frontend_parameters *p, | 306 | struct dtv_frontend_properties *p, |
307 | int actual_freq) | 307 | int actual_freq) |
308 | { | 308 | { |
309 | static const u32 srate_correction [] = { 1879617, 4544878, 8098561 }; | 309 | static const u32 srate_correction [] = { 1879617, 4544878, 8098561 }; |
310 | int bw_index = p->u.ofdm.bandwidth - BANDWIDTH_8_MHZ; | 310 | int bw_index; |
311 | int freq_offset = actual_freq - p->frequency; | 311 | int freq_offset = actual_freq - p->frequency; |
312 | int sysclock = 61003; //[kHz] | 312 | int sysclock = 61003; //[kHz] |
313 | int ifreq = 36000000; | 313 | int ifreq = 36000000; |
314 | int freq; | 314 | int freq; |
315 | int frequency_shift; | 315 | int frequency_shift; |
316 | 316 | ||
317 | switch (p->bandwidth_hz) { | ||
318 | default: | ||
319 | case 8000000: | ||
320 | bw_index = 0; | ||
321 | break; | ||
322 | case 7000000: | ||
323 | bw_index = 1; | ||
324 | break; | ||
325 | case 6000000: | ||
326 | bw_index = 2; | ||
327 | break; | ||
328 | } | ||
329 | |||
317 | if (p->inversion == INVERSION_ON) | 330 | if (p->inversion == INVERSION_ON) |
318 | freq = ifreq - freq_offset; | 331 | freq = ifreq - freq_offset; |
319 | else | 332 | else |
@@ -333,17 +346,17 @@ static void sp887x_correct_offsets (struct sp887x_state* state, | |||
333 | sp887x_writereg(state, 0x30a, frequency_shift & 0xfff); | 346 | sp887x_writereg(state, 0x30a, frequency_shift & 0xfff); |
334 | } | 347 | } |
335 | 348 | ||
336 | static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe, | 349 | static int sp887x_setup_frontend_parameters(struct dvb_frontend *fe) |
337 | struct dvb_frontend_parameters *p) | ||
338 | { | 350 | { |
351 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
339 | struct sp887x_state* state = fe->demodulator_priv; | 352 | struct sp887x_state* state = fe->demodulator_priv; |
340 | unsigned actual_freq; | 353 | unsigned actual_freq; |
341 | int err; | 354 | int err; |
342 | u16 val, reg0xc05; | 355 | u16 val, reg0xc05; |
343 | 356 | ||
344 | if (p->u.ofdm.bandwidth != BANDWIDTH_8_MHZ && | 357 | if (p->bandwidth_hz != 8000000 && |
345 | p->u.ofdm.bandwidth != BANDWIDTH_7_MHZ && | 358 | p->bandwidth_hz != 7000000 && |
346 | p->u.ofdm.bandwidth != BANDWIDTH_6_MHZ) | 359 | p->bandwidth_hz != 6000000) |
347 | return -EINVAL; | 360 | return -EINVAL; |
348 | 361 | ||
349 | if ((err = configure_reg0xc05(p, ®0xc05))) | 362 | if ((err = configure_reg0xc05(p, ®0xc05))) |
@@ -353,7 +366,7 @@ static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe, | |||
353 | 366 | ||
354 | /* setup the PLL */ | 367 | /* setup the PLL */ |
355 | if (fe->ops.tuner_ops.set_params) { | 368 | if (fe->ops.tuner_ops.set_params) { |
356 | fe->ops.tuner_ops.set_params(fe, p); | 369 | fe->ops.tuner_ops.set_params(fe); |
357 | if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); | 370 | if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); |
358 | } | 371 | } |
359 | if (fe->ops.tuner_ops.get_frequency) { | 372 | if (fe->ops.tuner_ops.get_frequency) { |
@@ -369,9 +382,9 @@ static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe, | |||
369 | sp887x_correct_offsets(state, p, actual_freq); | 382 | sp887x_correct_offsets(state, p, actual_freq); |
370 | 383 | ||
371 | /* filter for 6/7/8 Mhz channel */ | 384 | /* filter for 6/7/8 Mhz channel */ |
372 | if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ) | 385 | if (p->bandwidth_hz == 6000000) |
373 | val = 2; | 386 | val = 2; |
374 | else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ) | 387 | else if (p->bandwidth_hz == 7000000) |
375 | val = 1; | 388 | val = 1; |
376 | else | 389 | else |
377 | val = 0; | 390 | val = 0; |
@@ -379,16 +392,16 @@ static int sp887x_setup_frontend_parameters (struct dvb_frontend* fe, | |||
379 | sp887x_writereg(state, 0x311, val); | 392 | sp887x_writereg(state, 0x311, val); |
380 | 393 | ||
381 | /* scan order: 2k first = 0, 8k first = 1 */ | 394 | /* scan order: 2k first = 0, 8k first = 1 */ |
382 | if (p->u.ofdm.transmission_mode == TRANSMISSION_MODE_2K) | 395 | if (p->transmission_mode == TRANSMISSION_MODE_2K) |
383 | sp887x_writereg(state, 0x338, 0x000); | 396 | sp887x_writereg(state, 0x338, 0x000); |
384 | else | 397 | else |
385 | sp887x_writereg(state, 0x338, 0x001); | 398 | sp887x_writereg(state, 0x338, 0x001); |
386 | 399 | ||
387 | sp887x_writereg(state, 0xc05, reg0xc05); | 400 | sp887x_writereg(state, 0xc05, reg0xc05); |
388 | 401 | ||
389 | if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ) | 402 | if (p->bandwidth_hz == 6000000) |
390 | val = 2 << 3; | 403 | val = 2 << 3; |
391 | else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ) | 404 | else if (p->bandwidth_hz == 7000000) |
392 | val = 3 << 3; | 405 | val = 3 << 3; |
393 | else | 406 | else |
394 | val = 0 << 3; | 407 | val = 0 << 3; |
@@ -579,10 +592,9 @@ error: | |||
579 | } | 592 | } |
580 | 593 | ||
581 | static struct dvb_frontend_ops sp887x_ops = { | 594 | static struct dvb_frontend_ops sp887x_ops = { |
582 | 595 | .delsys = { SYS_DVBT }, | |
583 | .info = { | 596 | .info = { |
584 | .name = "Spase SP887x DVB-T", | 597 | .name = "Spase SP887x DVB-T", |
585 | .type = FE_OFDM, | ||
586 | .frequency_min = 50500000, | 598 | .frequency_min = 50500000, |
587 | .frequency_max = 858000000, | 599 | .frequency_max = 858000000, |
588 | .frequency_stepsize = 166666, | 600 | .frequency_stepsize = 166666, |