[media] tda665x: split set_frequency from set_state
On tda665x, set_state only sets frequency. As the kABI for set_state is meant to be used only on special cases, split the function into two, in order to allow it to be latter used by a DVBv5 cache params logic. Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
parent
cffdbfe7cf
commit
8e6c4be3f8
|
@ -111,9 +111,8 @@ exit:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tda665x_set_state(struct dvb_frontend *fe,
|
static int tda665x_set_frequency(struct dvb_frontend *fe,
|
||||||
enum tuner_param param,
|
u32 new_frequency)
|
||||||
struct tuner_state *tstate)
|
|
||||||
{
|
{
|
||||||
struct tda665x_state *state = fe->tuner_priv;
|
struct tda665x_state *state = fe->tuner_priv;
|
||||||
const struct tda665x_config *config = state->config;
|
const struct tda665x_config *config = state->config;
|
||||||
|
@ -121,88 +120,98 @@ static int tda665x_set_state(struct dvb_frontend *fe,
|
||||||
u8 buf[4];
|
u8 buf[4];
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (param & DVBFE_TUNER_FREQUENCY) {
|
if ((new_frequency < config->frequency_max)
|
||||||
|
|| (new_frequency > config->frequency_min)) {
|
||||||
frequency = tstate->frequency;
|
printk(KERN_ERR "%s: Frequency beyond limits, frequency=%d\n",
|
||||||
if ((frequency < config->frequency_max) || (frequency > config->frequency_min)) {
|
__func__, new_frequency);
|
||||||
printk(KERN_ERR "%s: Frequency beyond limits, frequency=%d\n", __func__, frequency);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
frequency += config->frequency_offst;
|
|
||||||
frequency *= config->ref_multiplier;
|
|
||||||
frequency += config->ref_divider >> 1;
|
|
||||||
frequency /= config->ref_divider;
|
|
||||||
|
|
||||||
buf[0] = (u8) ((frequency & 0x7f00) >> 8);
|
|
||||||
buf[1] = (u8) (frequency & 0x00ff) >> 0;
|
|
||||||
buf[2] = 0x80 | 0x40 | 0x02;
|
|
||||||
buf[3] = 0x00;
|
|
||||||
|
|
||||||
/* restore frequency */
|
|
||||||
frequency = tstate->frequency;
|
|
||||||
|
|
||||||
if (frequency < 153000000) {
|
|
||||||
/* VHF-L */
|
|
||||||
buf[3] |= 0x01; /* fc, Low Band, 47 - 153 MHz */
|
|
||||||
if (frequency < 68000000)
|
|
||||||
buf[3] |= 0x40; /* 83uA */
|
|
||||||
if (frequency < 1040000000)
|
|
||||||
buf[3] |= 0x60; /* 122uA */
|
|
||||||
if (frequency < 1250000000)
|
|
||||||
buf[3] |= 0x80; /* 163uA */
|
|
||||||
else
|
|
||||||
buf[3] |= 0xa0; /* 254uA */
|
|
||||||
} else if (frequency < 438000000) {
|
|
||||||
/* VHF-H */
|
|
||||||
buf[3] |= 0x02; /* fc, Mid Band, 153 - 438 MHz */
|
|
||||||
if (frequency < 230000000)
|
|
||||||
buf[3] |= 0x40;
|
|
||||||
if (frequency < 300000000)
|
|
||||||
buf[3] |= 0x60;
|
|
||||||
else
|
|
||||||
buf[3] |= 0x80;
|
|
||||||
} else {
|
|
||||||
/* UHF */
|
|
||||||
buf[3] |= 0x04; /* fc, High Band, 438 - 862 MHz */
|
|
||||||
if (frequency < 470000000)
|
|
||||||
buf[3] |= 0x60;
|
|
||||||
if (frequency < 526000000)
|
|
||||||
buf[3] |= 0x80;
|
|
||||||
else
|
|
||||||
buf[3] |= 0xa0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set params */
|
|
||||||
err = tda665x_write(state, buf, 5);
|
|
||||||
if (err < 0)
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
/* sleep for some time */
|
|
||||||
printk(KERN_DEBUG "%s: Waiting to Phase LOCK\n", __func__);
|
|
||||||
msleep(20);
|
|
||||||
/* check status */
|
|
||||||
err = tda665x_get_status(fe, &status);
|
|
||||||
if (err < 0)
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
if (status == 1) {
|
|
||||||
printk(KERN_DEBUG "%s: Tuner Phase locked: status=%d\n", __func__, status);
|
|
||||||
state->frequency = frequency; /* cache successful state */
|
|
||||||
} else {
|
|
||||||
printk(KERN_ERR "%s: No Phase lock: status=%d\n", __func__, status);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frequency = new_frequency;
|
||||||
|
|
||||||
|
frequency += config->frequency_offst;
|
||||||
|
frequency *= config->ref_multiplier;
|
||||||
|
frequency += config->ref_divider >> 1;
|
||||||
|
frequency /= config->ref_divider;
|
||||||
|
|
||||||
|
buf[0] = (u8) ((frequency & 0x7f00) >> 8);
|
||||||
|
buf[1] = (u8) (frequency & 0x00ff) >> 0;
|
||||||
|
buf[2] = 0x80 | 0x40 | 0x02;
|
||||||
|
buf[3] = 0x00;
|
||||||
|
|
||||||
|
/* restore frequency */
|
||||||
|
frequency = new_frequency;
|
||||||
|
|
||||||
|
if (frequency < 153000000) {
|
||||||
|
/* VHF-L */
|
||||||
|
buf[3] |= 0x01; /* fc, Low Band, 47 - 153 MHz */
|
||||||
|
if (frequency < 68000000)
|
||||||
|
buf[3] |= 0x40; /* 83uA */
|
||||||
|
if (frequency < 1040000000)
|
||||||
|
buf[3] |= 0x60; /* 122uA */
|
||||||
|
if (frequency < 1250000000)
|
||||||
|
buf[3] |= 0x80; /* 163uA */
|
||||||
|
else
|
||||||
|
buf[3] |= 0xa0; /* 254uA */
|
||||||
|
} else if (frequency < 438000000) {
|
||||||
|
/* VHF-H */
|
||||||
|
buf[3] |= 0x02; /* fc, Mid Band, 153 - 438 MHz */
|
||||||
|
if (frequency < 230000000)
|
||||||
|
buf[3] |= 0x40;
|
||||||
|
if (frequency < 300000000)
|
||||||
|
buf[3] |= 0x60;
|
||||||
|
else
|
||||||
|
buf[3] |= 0x80;
|
||||||
|
} else {
|
||||||
|
/* UHF */
|
||||||
|
buf[3] |= 0x04; /* fc, High Band, 438 - 862 MHz */
|
||||||
|
if (frequency < 470000000)
|
||||||
|
buf[3] |= 0x60;
|
||||||
|
if (frequency < 526000000)
|
||||||
|
buf[3] |= 0x80;
|
||||||
|
else
|
||||||
|
buf[3] |= 0xa0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set params */
|
||||||
|
err = tda665x_write(state, buf, 5);
|
||||||
|
if (err < 0)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
/* sleep for some time */
|
||||||
|
printk(KERN_DEBUG "%s: Waiting to Phase LOCK\n", __func__);
|
||||||
|
msleep(20);
|
||||||
|
/* check status */
|
||||||
|
err = tda665x_get_status(fe, &status);
|
||||||
|
if (err < 0)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
if (status == 1) {
|
||||||
|
printk(KERN_DEBUG "%s: Tuner Phase locked: status=%d\n",
|
||||||
|
__func__, status);
|
||||||
|
state->frequency = frequency; /* cache successful state */
|
||||||
|
} else {
|
||||||
|
printk(KERN_ERR "%s: No Phase lock: status=%d\n",
|
||||||
|
__func__, status);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
exit:
|
exit:
|
||||||
printk(KERN_ERR "%s: I/O Error\n", __func__);
|
printk(KERN_ERR "%s: I/O Error\n", __func__);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int tda665x_set_state(struct dvb_frontend *fe,
|
||||||
|
enum tuner_param param,
|
||||||
|
struct tuner_state *tstate)
|
||||||
|
{
|
||||||
|
if (param & DVBFE_TUNER_FREQUENCY)
|
||||||
|
return tda665x_set_frequency(fe, tstate->frequency);
|
||||||
|
|
||||||
|
printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static int tda665x_release(struct dvb_frontend *fe)
|
static int tda665x_release(struct dvb_frontend *fe)
|
||||||
{
|
{
|
||||||
struct tda665x_state *state = fe->tuner_priv;
|
struct tda665x_state *state = fe->tuner_priv;
|
||||||
|
|
Loading…
Reference in New Issue