Commit d519dcf6 authored by Trent Piepho's avatar Trent Piepho Committed by Mauro Carvalho Chehab

V4L/DVB (5457): Dvb-pll: Replace sleep function with a more capable one

The dvb-pll sleep function could only send a 2-byte sequence to the PLL.
This isn't enough in some cases, for example fmd1216me will need to send
a 4-byte command to set both BB and AB to the correct values.

Instead of using a fake band with a frequency of 0 to store the sleep
data (which has room for only two bytes), the new sleep function works
like the init function.  A new pointer is added to the pll description,
and when non-NULL points to a buffer with the length and data to send.
Signed-off-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent df78cb0a
...@@ -43,9 +43,9 @@ struct dvb_pll_desc dvb_pll_thomson_dtt7579 = { ...@@ -43,9 +43,9 @@ struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
.min = 177000000, .min = 177000000,
.max = 858000000, .max = 858000000,
.iffreq= 36166667, .iffreq= 36166667,
.count = 5, .sleepdata = (u8[]){ 2, 0xb4, 0x03 },
.count = 4,
.entries = { .entries = {
{ 0, 166667, 0xb4, 0x03 }, /* go sleep */
{ 443250000, 166667, 0xb4, 0x02 }, { 443250000, 166667, 0xb4, 0x02 },
{ 542000000, 166667, 0xb4, 0x08 }, { 542000000, 166667, 0xb4, 0x08 },
{ 771000000, 166667, 0xbc, 0x08 }, { 771000000, 166667, 0xbc, 0x08 },
...@@ -80,9 +80,9 @@ struct dvb_pll_desc dvb_pll_thomson_dtt759x = { ...@@ -80,9 +80,9 @@ struct dvb_pll_desc dvb_pll_thomson_dtt759x = {
.max = 896000000, .max = 896000000,
.setbw = thomson_dtt759x_bw, .setbw = thomson_dtt759x_bw,
.iffreq= 36166667, .iffreq= 36166667,
.count = 6, .sleepdata = (u8[]){ 2, 0x84, 0x03 },
.count = 5,
.entries = { .entries = {
{ 0, 166667, 0x84, 0x03 },
{ 264000000, 166667, 0xb4, 0x02 }, { 264000000, 166667, 0xb4, 0x02 },
{ 470000000, 166667, 0xbc, 0x02 }, { 470000000, 166667, 0xbc, 0x02 },
{ 735000000, 166667, 0xbc, 0x08 }, { 735000000, 166667, 0xbc, 0x08 },
...@@ -97,9 +97,9 @@ struct dvb_pll_desc dvb_pll_lg_z201 = { ...@@ -97,9 +97,9 @@ struct dvb_pll_desc dvb_pll_lg_z201 = {
.min = 174000000, .min = 174000000,
.max = 862000000, .max = 862000000,
.iffreq= 36166667, .iffreq= 36166667,
.count = 6, .sleepdata = (u8[]){ 2, 0xbc, 0x03 },
.count = 5,
.entries = { .entries = {
{ 0, 166667, 0xbc, 0x03 },
{ 157500000, 166667, 0xbc, 0x01 }, { 157500000, 166667, 0xbc, 0x01 },
{ 443250000, 166667, 0xbc, 0x02 }, { 443250000, 166667, 0xbc, 0x02 },
{ 542000000, 166667, 0xbc, 0x04 }, { 542000000, 166667, 0xbc, 0x04 },
...@@ -521,35 +521,27 @@ static int dvb_pll_release(struct dvb_frontend *fe) ...@@ -521,35 +521,27 @@ static int dvb_pll_release(struct dvb_frontend *fe)
static int dvb_pll_sleep(struct dvb_frontend *fe) static int dvb_pll_sleep(struct dvb_frontend *fe)
{ {
struct dvb_pll_priv *priv = fe->tuner_priv; struct dvb_pll_priv *priv = fe->tuner_priv;
u8 buf[4];
struct i2c_msg msg =
{ .addr = priv->pll_i2c_address, .flags = 0,
.buf = buf, .len = sizeof(buf) };
int i;
int result;
if (priv->i2c == NULL) if (priv->i2c == NULL)
return -EINVAL; return -EINVAL;
for (i = 0; i < priv->pll_desc->count; i++) { if (priv->pll_desc->sleepdata) {
if (priv->pll_desc->entries[i].limit == 0) struct i2c_msg msg = { .flags = 0,
break; .addr = priv->pll_i2c_address,
} .buf = priv->pll_desc->sleepdata + 1,
if (i == priv->pll_desc->count) .len = priv->pll_desc->sleepdata[0] };
return 0;
buf[0] = 0; int result;
buf[1] = 0;
buf[2] = priv->pll_desc->entries[i].config;
buf[3] = priv->pll_desc->entries[i].cb;
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); fe->ops.i2c_gate_ctrl(fe, 1);
if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) { if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
return result; return result;
}
return 0;
} }
/* Shouldn't be called when initdata is NULL, maybe BUG()? */
return 0; return -EINVAL;
} }
static int dvb_pll_set_params(struct dvb_frontend *fe, static int dvb_pll_set_params(struct dvb_frontend *fe,
...@@ -661,6 +653,7 @@ static int dvb_pll_init(struct dvb_frontend *fe) ...@@ -661,6 +653,7 @@ static int dvb_pll_init(struct dvb_frontend *fe)
static struct dvb_tuner_ops dvb_pll_tuner_ops = { static struct dvb_tuner_ops dvb_pll_tuner_ops = {
.release = dvb_pll_release, .release = dvb_pll_release,
.sleep = dvb_pll_sleep, .sleep = dvb_pll_sleep,
.init = dvb_pll_init,
.set_params = dvb_pll_set_params, .set_params = dvb_pll_set_params,
.calc_regs = dvb_pll_calc_regs, .calc_regs = dvb_pll_calc_regs,
.get_frequency = dvb_pll_get_frequency, .get_frequency = dvb_pll_get_frequency,
...@@ -703,8 +696,10 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, ...@@ -703,8 +696,10 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,
sizeof(fe->ops.tuner_ops.info.name)); sizeof(fe->ops.tuner_ops.info.name));
fe->ops.tuner_ops.info.frequency_min = desc->min; fe->ops.tuner_ops.info.frequency_min = desc->min;
fe->ops.tuner_ops.info.frequency_min = desc->max; fe->ops.tuner_ops.info.frequency_min = desc->max;
if (desc->initdata) if (!desc->initdata)
fe->ops.tuner_ops.init = dvb_pll_init; fe->ops.tuner_ops.init = NULL;
if (!desc->sleepdata)
fe->ops.tuner_ops.sleep = NULL;
fe->tuner_priv = priv; fe->tuner_priv = priv;
return fe; return fe;
......
...@@ -15,6 +15,7 @@ struct dvb_pll_desc { ...@@ -15,6 +15,7 @@ struct dvb_pll_desc {
u32 iffreq; u32 iffreq;
void (*setbw)(u8 *buf, u32 freq, int bandwidth); void (*setbw)(u8 *buf, u32 freq, int bandwidth);
u8 *initdata; u8 *initdata;
u8 *sleepdata;
int count; int count;
struct { struct {
u32 limit; u32 limit;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment