[media] si2157: IF frequency for ATSC and QAM

For supporting ATSC and QAM modes the driver should use a smaller IF frequency than 5 MHz.

Signed-off-by: Olli Salonen <olli.salonen@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
Olli Salonen 2015-02-28 12:25:23 -03:00 committed by Mauro Carvalho Chehab
parent 95f22c5aae
commit c28aebe178
2 changed files with 23 additions and 1 deletions

View File

@ -244,6 +244,7 @@ static int si2157_set_params(struct dvb_frontend *fe)
int ret; int ret;
struct si2157_cmd cmd; struct si2157_cmd cmd;
u8 bandwidth, delivery_system; u8 bandwidth, delivery_system;
u32 if_frequency = 5000000;
dev_dbg(&client->dev, dev_dbg(&client->dev,
"delivery_system=%d frequency=%u bandwidth_hz=%u\n", "delivery_system=%d frequency=%u bandwidth_hz=%u\n",
@ -266,9 +267,11 @@ static int si2157_set_params(struct dvb_frontend *fe)
switch (c->delivery_system) { switch (c->delivery_system) {
case SYS_ATSC: case SYS_ATSC:
delivery_system = 0x00; delivery_system = 0x00;
if_frequency = 3250000;
break; break;
case SYS_DVBC_ANNEX_B: case SYS_DVBC_ANNEX_B:
delivery_system = 0x10; delivery_system = 0x10;
if_frequency = 4000000;
break; break;
case SYS_DVBT: case SYS_DVBT:
case SYS_DVBT2: /* it seems DVB-T and DVB-T2 both are 0x20 here */ case SYS_DVBT2: /* it seems DVB-T and DVB-T2 both are 0x20 here */
@ -302,6 +305,20 @@ static int si2157_set_params(struct dvb_frontend *fe)
if (ret) if (ret)
goto err; goto err;
/* set if frequency if needed */
if (if_frequency != dev->if_frequency) {
memcpy(cmd.args, "\x14\x00\x06\x07", 4);
cmd.args[4] = (if_frequency / 1000) & 0xff;
cmd.args[5] = ((if_frequency / 1000) >> 8) & 0xff;
cmd.wlen = 6;
cmd.rlen = 4;
ret = si2157_cmd_execute(client, &cmd);
if (ret)
goto err;
dev->if_frequency = if_frequency;
}
/* set frequency */ /* set frequency */
memcpy(cmd.args, "\x41\x00\x00\x00\x00\x00\x00\x00", 8); memcpy(cmd.args, "\x41\x00\x00\x00\x00\x00\x00\x00", 8);
cmd.args[4] = (c->frequency >> 0) & 0xff; cmd.args[4] = (c->frequency >> 0) & 0xff;
@ -322,7 +339,10 @@ err:
static int si2157_get_if_frequency(struct dvb_frontend *fe, u32 *frequency) static int si2157_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
{ {
*frequency = 5000000; /* default value of property 0x0706 */ struct i2c_client *client = fe->tuner_priv;
struct si2157_dev *dev = i2c_get_clientdata(client);
*frequency = dev->if_frequency;
return 0; return 0;
} }
@ -360,6 +380,7 @@ static int si2157_probe(struct i2c_client *client,
dev->inversion = cfg->inversion; dev->inversion = cfg->inversion;
dev->fw_loaded = false; dev->fw_loaded = false;
dev->chiptype = (u8)id->driver_data; dev->chiptype = (u8)id->driver_data;
dev->if_frequency = 5000000; /* default value of property 0x0706 */
mutex_init(&dev->i2c_mutex); mutex_init(&dev->i2c_mutex);
/* check if the tuner is there */ /* check if the tuner is there */

View File

@ -28,6 +28,7 @@ struct si2157_dev {
bool fw_loaded; bool fw_loaded;
bool inversion; bool inversion;
u8 chiptype; u8 chiptype;
u32 if_frequency;
}; };
#define SI2157_CHIPTYPE_SI2157 0 #define SI2157_CHIPTYPE_SI2157 0