aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-21 13:21:18 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-22 20:43:39 -0400
commita3eec916cbc17dc1aaa3ddf120836cd5200eb4ef (patch)
treed3821edc22568e98577c2c5eb64e86ea59eeb22e
parent612ae142ac02e8b187f23b8c9f1cc9cd8c6a078d (diff)
[media] xc5000: Fix get_frequency()
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>
-rw-r--r--drivers/media/tuners/xc5000.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c
index f059ba2f5656..ab7d444bcdcc 100644
--- a/drivers/media/tuners/xc5000.c
+++ b/drivers/media/tuners/xc5000.c
@@ -56,7 +56,7 @@ struct xc5000_priv {
56 56
57 u32 if_khz; 57 u32 if_khz;
58 u16 xtal_khz; 58 u16 xtal_khz;
59 u32 freq_hz; 59 u32 freq_hz, freq_offset;
60 u32 bandwidth; 60 u32 bandwidth;
61 u8 video_standard; 61 u8 video_standard;
62 u8 rf_mode; 62 u8 rf_mode;
@@ -749,13 +749,13 @@ static int xc5000_set_params(struct dvb_frontend *fe)
749 case SYS_ATSC: 749 case SYS_ATSC:
750 dprintk(1, "%s() VSB modulation\n", __func__); 750 dprintk(1, "%s() VSB modulation\n", __func__);
751 priv->rf_mode = XC_RF_MODE_AIR; 751 priv->rf_mode = XC_RF_MODE_AIR;
752 priv->freq_hz = freq - 1750000; 752 priv->freq_offset = 1750000;
753 priv->video_standard = DTV6; 753 priv->video_standard = DTV6;
754 break; 754 break;
755 case SYS_DVBC_ANNEX_B: 755 case SYS_DVBC_ANNEX_B:
756 dprintk(1, "%s() QAM modulation\n", __func__); 756 dprintk(1, "%s() QAM modulation\n", __func__);
757 priv->rf_mode = XC_RF_MODE_CABLE; 757 priv->rf_mode = XC_RF_MODE_CABLE;
758 priv->freq_hz = freq - 1750000; 758 priv->freq_offset = 1750000;
759 priv->video_standard = DTV6; 759 priv->video_standard = DTV6;
760 break; 760 break;
761 case SYS_ISDBT: 761 case SYS_ISDBT:
@@ -770,15 +770,15 @@ static int xc5000_set_params(struct dvb_frontend *fe)
770 switch (bw) { 770 switch (bw) {
771 case 6000000: 771 case 6000000:
772 priv->video_standard = DTV6; 772 priv->video_standard = DTV6;
773 priv->freq_hz = freq - 1750000; 773 priv->freq_offset = 1750000;
774 break; 774 break;
775 case 7000000: 775 case 7000000:
776 priv->video_standard = DTV7; 776 priv->video_standard = DTV7;
777 priv->freq_hz = freq - 2250000; 777 priv->freq_offset = 2250000;
778 break; 778 break;
779 case 8000000: 779 case 8000000:
780 priv->video_standard = DTV8; 780 priv->video_standard = DTV8;
781 priv->freq_hz = freq - 2750000; 781 priv->freq_offset = 2750000;
782 break; 782 break;
783 default: 783 default:
784 printk(KERN_ERR "xc5000 bandwidth not set!\n"); 784 printk(KERN_ERR "xc5000 bandwidth not set!\n");
@@ -792,15 +792,15 @@ static int xc5000_set_params(struct dvb_frontend *fe)
792 priv->rf_mode = XC_RF_MODE_CABLE; 792 priv->rf_mode = XC_RF_MODE_CABLE;
793 if (bw <= 6000000) { 793 if (bw <= 6000000) {
794 priv->video_standard = DTV6; 794 priv->video_standard = DTV6;
795 priv->freq_hz = freq - 1750000; 795 priv->freq_offset = 1750000;
796 b = 6; 796 b = 6;
797 } else if (bw <= 7000000) { 797 } else if (bw <= 7000000) {
798 priv->video_standard = DTV7; 798 priv->video_standard = DTV7;
799 priv->freq_hz = freq - 2250000; 799 priv->freq_offset = 2250000;
800 b = 7; 800 b = 7;
801 } else { 801 } else {
802 priv->video_standard = DTV7_8; 802 priv->video_standard = DTV7_8;
803 priv->freq_hz = freq - 2750000; 803 priv->freq_offset = 2750000;
804 b = 8; 804 b = 8;
805 } 805 }
806 dprintk(1, "%s() Bandwidth %dMHz (%d)\n", __func__, 806 dprintk(1, "%s() Bandwidth %dMHz (%d)\n", __func__,
@@ -811,6 +811,8 @@ static int xc5000_set_params(struct dvb_frontend *fe)
811 return -EINVAL; 811 return -EINVAL;
812 } 812 }
813 813
814 priv->freq_hz = freq - priv->freq_offset;
815
814 dprintk(1, "%s() frequency=%d (compensated to %d)\n", 816 dprintk(1, "%s() frequency=%d (compensated to %d)\n",
815 __func__, freq, priv->freq_hz); 817 __func__, freq, priv->freq_hz);
816 818
@@ -1061,7 +1063,7 @@ static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
1061{ 1063{
1062 struct xc5000_priv *priv = fe->tuner_priv; 1064 struct xc5000_priv *priv = fe->tuner_priv;
1063 dprintk(1, "%s()\n", __func__); 1065 dprintk(1, "%s()\n", __func__);
1064 *freq = priv->freq_hz; 1066 *freq = priv->freq_hz + priv->freq_offset;
1065 return 0; 1067 return 0;
1066} 1068}
1067 1069