Skip to content

Commit

Permalink
[media] xc5000: Fix get_frequency()
Browse files Browse the repository at this point in the history
The programmed frequency on xc5000 is not the middle
frequency, but the initial frequency on the bandwidth range.
However, the DVB API works with the middle frequency.

Cc: stable@vger.kernel.org
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
  • Loading branch information
Mauro Carvalho Chehab committed Jul 23, 2014
1 parent 612ae14 commit a3eec91
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions drivers/media/tuners/xc5000.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ struct xc5000_priv {

u32 if_khz;
u16 xtal_khz;
u32 freq_hz;
u32 freq_hz, freq_offset;
u32 bandwidth;
u8 video_standard;
u8 rf_mode;
Expand Down Expand Up @@ -749,13 +749,13 @@ static int xc5000_set_params(struct dvb_frontend *fe)
case SYS_ATSC:
dprintk(1, "%s() VSB modulation\n", __func__);
priv->rf_mode = XC_RF_MODE_AIR;
priv->freq_hz = freq - 1750000;
priv->freq_offset = 1750000;
priv->video_standard = DTV6;
break;
case SYS_DVBC_ANNEX_B:
dprintk(1, "%s() QAM modulation\n", __func__);
priv->rf_mode = XC_RF_MODE_CABLE;
priv->freq_hz = freq - 1750000;
priv->freq_offset = 1750000;
priv->video_standard = DTV6;
break;
case SYS_ISDBT:
Expand All @@ -770,15 +770,15 @@ static int xc5000_set_params(struct dvb_frontend *fe)
switch (bw) {
case 6000000:
priv->video_standard = DTV6;
priv->freq_hz = freq - 1750000;
priv->freq_offset = 1750000;
break;
case 7000000:
priv->video_standard = DTV7;
priv->freq_hz = freq - 2250000;
priv->freq_offset = 2250000;
break;
case 8000000:
priv->video_standard = DTV8;
priv->freq_hz = freq - 2750000;
priv->freq_offset = 2750000;
break;
default:
printk(KERN_ERR "xc5000 bandwidth not set!\n");
Expand All @@ -792,15 +792,15 @@ static int xc5000_set_params(struct dvb_frontend *fe)
priv->rf_mode = XC_RF_MODE_CABLE;
if (bw <= 6000000) {
priv->video_standard = DTV6;
priv->freq_hz = freq - 1750000;
priv->freq_offset = 1750000;
b = 6;
} else if (bw <= 7000000) {
priv->video_standard = DTV7;
priv->freq_hz = freq - 2250000;
priv->freq_offset = 2250000;
b = 7;
} else {
priv->video_standard = DTV7_8;
priv->freq_hz = freq - 2750000;
priv->freq_offset = 2750000;
b = 8;
}
dprintk(1, "%s() Bandwidth %dMHz (%d)\n", __func__,
Expand All @@ -811,6 +811,8 @@ static int xc5000_set_params(struct dvb_frontend *fe)
return -EINVAL;
}

priv->freq_hz = freq - priv->freq_offset;

dprintk(1, "%s() frequency=%d (compensated to %d)\n",
__func__, freq, priv->freq_hz);

Expand Down Expand Up @@ -1061,7 +1063,7 @@ static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
{
struct xc5000_priv *priv = fe->tuner_priv;
dprintk(1, "%s()\n", __func__);
*freq = priv->freq_hz;
*freq = priv->freq_hz + priv->freq_offset;
return 0;
}

Expand Down

0 comments on commit a3eec91

Please sign in to comment.