[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:
parent
95f22c5aae
commit
c28aebe178
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue