aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/frontends')
-rw-r--r--drivers/media/dvb/frontends/or51132.c81
1 files changed, 49 insertions, 32 deletions
diff --git a/drivers/media/dvb/frontends/or51132.c b/drivers/media/dvb/frontends/or51132.c
index a2a19aeb3b58..56d1109b90a2 100644
--- a/drivers/media/dvb/frontends/or51132.c
+++ b/drivers/media/dvb/frontends/or51132.c
@@ -310,6 +310,25 @@ static int or51132_setmode(struct dvb_frontend* fe)
310 return 0; 310 return 0;
311} 311}
312 312
313/* Some modulations use the same firmware. This classifies modulations
314 by the firmware they use. */
315#define MOD_FWCLASS_UNKNOWN 0
316#define MOD_FWCLASS_VSB 1
317#define MOD_FWCLASS_QAM 2
318static int modulation_fw_class(fe_modulation_t modulation)
319{
320 switch(modulation) {
321 case VSB_8:
322 return MOD_FWCLASS_VSB;
323 case QAM_AUTO:
324 case QAM_64:
325 case QAM_256:
326 return MOD_FWCLASS_QAM;
327 default:
328 return MOD_FWCLASS_UNKNOWN;
329 }
330}
331
313static int or51132_set_parameters(struct dvb_frontend* fe, 332static int or51132_set_parameters(struct dvb_frontend* fe,
314 struct dvb_frontend_parameters *param) 333 struct dvb_frontend_parameters *param)
315{ 334{
@@ -317,45 +336,40 @@ static int or51132_set_parameters(struct dvb_frontend* fe,
317 u8 buf[4]; 336 u8 buf[4];
318 struct or51132_state* state = fe->demodulator_priv; 337 struct or51132_state* state = fe->demodulator_priv;
319 const struct firmware *fw; 338 const struct firmware *fw;
320 339 const char *fwname;
321 /* Change only if we are actually changing the modulation */ 340 int clock_mode;
322 if (state->current_modulation != param->u.vsb.modulation) { 341
323 switch(param->u.vsb.modulation) { 342 /* Upload new firmware only if we need a different one */
324 case VSB_8: 343 if (modulation_fw_class(state->current_modulation) !=
344 modulation_fw_class(param->u.vsb.modulation)) {
345 switch(modulation_fw_class(param->u.vsb.modulation)) {
346 case MOD_FWCLASS_VSB:
325 dprintk("set_parameters VSB MODE\n"); 347 dprintk("set_parameters VSB MODE\n");
326 printk("or51132: Waiting for firmware upload(%s)...\n", 348 fwname = OR51132_VSB_FIRMWARE;
327 OR51132_VSB_FIRMWARE); 349
328 ret = request_firmware(&fw, OR51132_VSB_FIRMWARE,
329 &state->i2c->dev);
330 if (ret){
331 printk(KERN_WARNING "or51132: No firmware up"
332 "loaded(timeout or file not found?)\n");
333 return ret;
334 }
335 /* Set non-punctured clock for VSB */ 350 /* Set non-punctured clock for VSB */
336 state->config->set_ts_params(fe, 0); 351 clock_mode = 0;
337 break; 352 break;
338 case QAM_AUTO: 353 case MOD_FWCLASS_QAM:
339 case QAM_64:
340 case QAM_256:
341 dprintk("set_parameters QAM MODE\n"); 354 dprintk("set_parameters QAM MODE\n");
342 printk("or51132: Waiting for firmware upload(%s)...\n", 355 fwname = OR51132_QAM_FIRMWARE;
343 OR51132_QAM_FIRMWARE); 356
344 ret = request_firmware(&fw, OR51132_QAM_FIRMWARE,
345 &state->i2c->dev);
346 if (ret){
347 printk(KERN_WARNING "or51132: No firmware up"
348 "loaded(timeout or file not found?)\n");
349 return ret;
350 }
351 /* Set punctured clock for QAM */ 357 /* Set punctured clock for QAM */
352 state->config->set_ts_params(fe, 1); 358 clock_mode = 1;
353 break; 359 break;
354 default: 360 default:
355 printk("or51132:Modulation type(%d) UNSUPPORTED\n", 361 printk("or51132: Modulation type(%d) UNSUPPORTED\n",
356 param->u.vsb.modulation); 362 param->u.vsb.modulation);
357 return -1; 363 return -1;
358 }; 364 }
365 printk("or51132: Waiting for firmware upload(%s)...\n",
366 fwname);
367 ret = request_firmware(&fw, fwname, &state->i2c->dev);
368 if (ret) {
369 printk(KERN_WARNING "or51132: No firmware up"
370 "loaded(timeout or file not found?)\n");
371 return ret;
372 }
359 ret = or51132_load_firmware(fe, fw); 373 ret = or51132_load_firmware(fe, fw);
360 release_firmware(fw); 374 release_firmware(fw);
361 if (ret) { 375 if (ret) {
@@ -364,7 +378,10 @@ static int or51132_set_parameters(struct dvb_frontend* fe,
364 return ret; 378 return ret;
365 } 379 }
366 printk("or51132: Firmware upload complete.\n"); 380 printk("or51132: Firmware upload complete.\n");
367 381 state->config->set_ts_params(fe, clock_mode);
382 }
383 /* Change only if we are actually changing the modulation */
384 if (state->current_modulation != param->u.vsb.modulation) {
368 state->current_modulation = param->u.vsb.modulation; 385 state->current_modulation = param->u.vsb.modulation;
369 or51132_setmode(fe); 386 or51132_setmode(fe);
370 } 387 }
@@ -373,7 +390,7 @@ static int or51132_set_parameters(struct dvb_frontend* fe,
373 param->frequency, 0); 390 param->frequency, 0);
374 dprintk("set_parameters tuner bytes: 0x%02x 0x%02x " 391 dprintk("set_parameters tuner bytes: 0x%02x 0x%02x "
375 "0x%02x 0x%02x\n",buf[0],buf[1],buf[2],buf[3]); 392 "0x%02x 0x%02x\n",buf[0],buf[1],buf[2],buf[3]);
376 if (i2c_writebytes(state, state->config->pll_address ,buf, 4)) 393 if (i2c_writebytes(state, state->config->pll_address, buf, 4))
377 printk(KERN_WARNING "or51132: set_parameters error " 394 printk(KERN_WARNING "or51132: set_parameters error "
378 "writing to tuner\n"); 395 "writing to tuner\n");
379 396