diff options
author | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-21 13:21:18 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-22 20:43:39 -0400 |
commit | a3eec916cbc17dc1aaa3ddf120836cd5200eb4ef (patch) | |
tree | d3821edc22568e98577c2c5eb64e86ea59eeb22e | |
parent | 612ae142ac02e8b187f23b8c9f1cc9cd8c6a078d (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.c | 22 |
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 | ||