aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends/cxd2841er.c
diff options
context:
space:
mode:
authorDaniel Scheller <d.scheller@gmx.net>2017-04-09 15:38:17 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2017-06-20 08:46:22 -0400
commit4b866c4e656956d060cb1c46eb1b8b711c6e7ad7 (patch)
tree1d65163ab0bab187c1a5ece4d8023503f16cf073 /drivers/media/dvb-frontends/cxd2841er.c
parentc7518d13f70e62e2af3a30858a977365811783df (diff)
[media] dvb-frontends/cxd2841er: support IF speed calc from tuner values
Add a AUTO_IFHZ flag and a function that will read IF speed values from any attached tuner if the tuner supports this and if AUTO_IFHZ is enabled, and else the passed default value (which probably matches Sony ASCOT tuners) will be passed back. The returned value is then used to calculate the iffeq which the demod will be programmed with. Signed-off-by: Daniel Scheller <d.scheller@gmx.net> Acked-by: Abylay Ospan <aospan@netup.ru> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/dvb-frontends/cxd2841er.c')
-rw-r--r--drivers/media/dvb-frontends/cxd2841er.c64
1 files changed, 46 insertions, 18 deletions
diff --git a/drivers/media/dvb-frontends/cxd2841er.c b/drivers/media/dvb-frontends/cxd2841er.c
index d0035d2bf88d..31240cc73937 100644
--- a/drivers/media/dvb-frontends/cxd2841er.c
+++ b/drivers/media/dvb-frontends/cxd2841er.c
@@ -327,6 +327,20 @@ static u32 cxd2841er_calc_iffreq(u32 ifhz)
327 return cxd2841er_calc_iffreq_xtal(SONY_XTAL_20500, ifhz); 327 return cxd2841er_calc_iffreq_xtal(SONY_XTAL_20500, ifhz);
328} 328}
329 329
330static int cxd2841er_get_if_hz(struct cxd2841er_priv *priv, u32 def_hz)
331{
332 u32 hz;
333
334 if (priv->frontend.ops.tuner_ops.get_if_frequency
335 && (priv->flags & CXD2841ER_AUTO_IFHZ))
336 priv->frontend.ops.tuner_ops.get_if_frequency(
337 &priv->frontend, &hz);
338 else
339 hz = def_hz;
340
341 return hz;
342}
343
330static int cxd2841er_tuner_set(struct dvb_frontend *fe) 344static int cxd2841er_tuner_set(struct dvb_frontend *fe)
331{ 345{
332 struct cxd2841er_priv *priv = fe->demodulator_priv; 346 struct cxd2841er_priv *priv = fe->demodulator_priv;
@@ -2147,7 +2161,7 @@ static int cxd2841er_dvbt2_set_plp_config(struct cxd2841er_priv *priv,
2147static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv, 2161static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
2148 u32 bandwidth) 2162 u32 bandwidth)
2149{ 2163{
2150 u32 iffreq; 2164 u32 iffreq, ifhz;
2151 u8 data[MAX_WRITE_REGSIZE]; 2165 u8 data[MAX_WRITE_REGSIZE];
2152 2166
2153 const uint8_t nominalRate8bw[3][5] = { 2167 const uint8_t nominalRate8bw[3][5] = {
@@ -2253,7 +2267,8 @@ static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
2253 cxd2841er_write_regs(priv, I2C_SLVT, 2267 cxd2841er_write_regs(priv, I2C_SLVT,
2254 0xA6, itbCoef8bw[priv->xtal], 14); 2268 0xA6, itbCoef8bw[priv->xtal], 14);
2255 /* <IF freq setting> */ 2269 /* <IF freq setting> */
2256 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 4800000); 2270 ifhz = cxd2841er_get_if_hz(priv, 4800000);
2271 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2257 data[0] = (u8) ((iffreq >> 16) & 0xff); 2272 data[0] = (u8) ((iffreq >> 16) & 0xff);
2258 data[1] = (u8)((iffreq >> 8) & 0xff); 2273 data[1] = (u8)((iffreq >> 8) & 0xff);
2259 data[2] = (u8)(iffreq & 0xff); 2274 data[2] = (u8)(iffreq & 0xff);
@@ -2281,7 +2296,8 @@ static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
2281 cxd2841er_write_regs(priv, I2C_SLVT, 2296 cxd2841er_write_regs(priv, I2C_SLVT,
2282 0xA6, itbCoef7bw[priv->xtal], 14); 2297 0xA6, itbCoef7bw[priv->xtal], 14);
2283 /* <IF freq setting> */ 2298 /* <IF freq setting> */
2284 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 4200000); 2299 ifhz = cxd2841er_get_if_hz(priv, 4200000);
2300 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2285 data[0] = (u8) ((iffreq >> 16) & 0xff); 2301 data[0] = (u8) ((iffreq >> 16) & 0xff);
2286 data[1] = (u8)((iffreq >> 8) & 0xff); 2302 data[1] = (u8)((iffreq >> 8) & 0xff);
2287 data[2] = (u8)(iffreq & 0xff); 2303 data[2] = (u8)(iffreq & 0xff);
@@ -2309,7 +2325,8 @@ static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
2309 cxd2841er_write_regs(priv, I2C_SLVT, 2325 cxd2841er_write_regs(priv, I2C_SLVT,
2310 0xA6, itbCoef6bw[priv->xtal], 14); 2326 0xA6, itbCoef6bw[priv->xtal], 14);
2311 /* <IF freq setting> */ 2327 /* <IF freq setting> */
2312 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 3600000); 2328 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2329 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2313 data[0] = (u8) ((iffreq >> 16) & 0xff); 2330 data[0] = (u8) ((iffreq >> 16) & 0xff);
2314 data[1] = (u8)((iffreq >> 8) & 0xff); 2331 data[1] = (u8)((iffreq >> 8) & 0xff);
2315 data[2] = (u8)(iffreq & 0xff); 2332 data[2] = (u8)(iffreq & 0xff);
@@ -2337,7 +2354,8 @@ static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
2337 cxd2841er_write_regs(priv, I2C_SLVT, 2354 cxd2841er_write_regs(priv, I2C_SLVT,
2338 0xA6, itbCoef5bw[priv->xtal], 14); 2355 0xA6, itbCoef5bw[priv->xtal], 14);
2339 /* <IF freq setting> */ 2356 /* <IF freq setting> */
2340 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 3600000); 2357 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2358 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2341 data[0] = (u8) ((iffreq >> 16) & 0xff); 2359 data[0] = (u8) ((iffreq >> 16) & 0xff);
2342 data[1] = (u8)((iffreq >> 8) & 0xff); 2360 data[1] = (u8)((iffreq >> 8) & 0xff);
2343 data[2] = (u8)(iffreq & 0xff); 2361 data[2] = (u8)(iffreq & 0xff);
@@ -2365,7 +2383,8 @@ static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
2365 cxd2841er_write_regs(priv, I2C_SLVT, 2383 cxd2841er_write_regs(priv, I2C_SLVT,
2366 0xA6, itbCoef17bw[priv->xtal], 14); 2384 0xA6, itbCoef17bw[priv->xtal], 14);
2367 /* <IF freq setting> */ 2385 /* <IF freq setting> */
2368 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 3500000); 2386 ifhz = cxd2841er_get_if_hz(priv, 3500000);
2387 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2369 data[0] = (u8) ((iffreq >> 16) & 0xff); 2388 data[0] = (u8) ((iffreq >> 16) & 0xff);
2370 data[1] = (u8)((iffreq >> 8) & 0xff); 2389 data[1] = (u8)((iffreq >> 8) & 0xff);
2371 data[2] = (u8)(iffreq & 0xff); 2390 data[2] = (u8)(iffreq & 0xff);
@@ -2384,7 +2403,7 @@ static int cxd2841er_sleep_tc_to_active_t_band(
2384 struct cxd2841er_priv *priv, u32 bandwidth) 2403 struct cxd2841er_priv *priv, u32 bandwidth)
2385{ 2404{
2386 u8 data[MAX_WRITE_REGSIZE]; 2405 u8 data[MAX_WRITE_REGSIZE];
2387 u32 iffreq; 2406 u32 iffreq, ifhz;
2388 u8 nominalRate8bw[3][5] = { 2407 u8 nominalRate8bw[3][5] = {
2389 /* TRCG Nominal Rate [37:0] */ 2408 /* TRCG Nominal Rate [37:0] */
2390 {0x11, 0xF0, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */ 2409 {0x11, 0xF0, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
@@ -2464,7 +2483,8 @@ static int cxd2841er_sleep_tc_to_active_t_band(
2464 cxd2841er_write_regs(priv, I2C_SLVT, 2483 cxd2841er_write_regs(priv, I2C_SLVT,
2465 0xA6, itbCoef8bw[priv->xtal], 14); 2484 0xA6, itbCoef8bw[priv->xtal], 14);
2466 /* <IF freq setting> */ 2485 /* <IF freq setting> */
2467 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 4800000); 2486 ifhz = cxd2841er_get_if_hz(priv, 4800000);
2487 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2468 data[0] = (u8) ((iffreq >> 16) & 0xff); 2488 data[0] = (u8) ((iffreq >> 16) & 0xff);
2469 data[1] = (u8)((iffreq >> 8) & 0xff); 2489 data[1] = (u8)((iffreq >> 8) & 0xff);
2470 data[2] = (u8)(iffreq & 0xff); 2490 data[2] = (u8)(iffreq & 0xff);
@@ -2499,7 +2519,8 @@ static int cxd2841er_sleep_tc_to_active_t_band(
2499 cxd2841er_write_regs(priv, I2C_SLVT, 2519 cxd2841er_write_regs(priv, I2C_SLVT,
2500 0xA6, itbCoef7bw[priv->xtal], 14); 2520 0xA6, itbCoef7bw[priv->xtal], 14);
2501 /* <IF freq setting> */ 2521 /* <IF freq setting> */
2502 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 4200000); 2522 ifhz = cxd2841er_get_if_hz(priv, 4200000);
2523 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2503 data[0] = (u8) ((iffreq >> 16) & 0xff); 2524 data[0] = (u8) ((iffreq >> 16) & 0xff);
2504 data[1] = (u8)((iffreq >> 8) & 0xff); 2525 data[1] = (u8)((iffreq >> 8) & 0xff);
2505 data[2] = (u8)(iffreq & 0xff); 2526 data[2] = (u8)(iffreq & 0xff);
@@ -2534,7 +2555,8 @@ static int cxd2841er_sleep_tc_to_active_t_band(
2534 cxd2841er_write_regs(priv, I2C_SLVT, 2555 cxd2841er_write_regs(priv, I2C_SLVT,
2535 0xA6, itbCoef6bw[priv->xtal], 14); 2556 0xA6, itbCoef6bw[priv->xtal], 14);
2536 /* <IF freq setting> */ 2557 /* <IF freq setting> */
2537 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 3600000); 2558 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2559 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2538 data[0] = (u8) ((iffreq >> 16) & 0xff); 2560 data[0] = (u8) ((iffreq >> 16) & 0xff);
2539 data[1] = (u8)((iffreq >> 8) & 0xff); 2561 data[1] = (u8)((iffreq >> 8) & 0xff);
2540 data[2] = (u8)(iffreq & 0xff); 2562 data[2] = (u8)(iffreq & 0xff);
@@ -2569,7 +2591,8 @@ static int cxd2841er_sleep_tc_to_active_t_band(
2569 cxd2841er_write_regs(priv, I2C_SLVT, 2591 cxd2841er_write_regs(priv, I2C_SLVT,
2570 0xA6, itbCoef5bw[priv->xtal], 14); 2592 0xA6, itbCoef5bw[priv->xtal], 14);
2571 /* <IF freq setting> */ 2593 /* <IF freq setting> */
2572 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 3600000); 2594 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2595 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2573 data[0] = (u8) ((iffreq >> 16) & 0xff); 2596 data[0] = (u8) ((iffreq >> 16) & 0xff);
2574 data[1] = (u8)((iffreq >> 8) & 0xff); 2597 data[1] = (u8)((iffreq >> 8) & 0xff);
2575 data[2] = (u8)(iffreq & 0xff); 2598 data[2] = (u8)(iffreq & 0xff);
@@ -2602,7 +2625,7 @@ static int cxd2841er_sleep_tc_to_active_t_band(
2602static int cxd2841er_sleep_tc_to_active_i_band( 2625static int cxd2841er_sleep_tc_to_active_i_band(
2603 struct cxd2841er_priv *priv, u32 bandwidth) 2626 struct cxd2841er_priv *priv, u32 bandwidth)
2604{ 2627{
2605 u32 iffreq; 2628 u32 iffreq, ifhz;
2606 u8 data[3]; 2629 u8 data[3];
2607 2630
2608 /* TRCG Nominal Rate */ 2631 /* TRCG Nominal Rate */
@@ -2671,7 +2694,8 @@ static int cxd2841er_sleep_tc_to_active_i_band(
2671 0xA6, itbCoef8bw[priv->xtal], 14); 2694 0xA6, itbCoef8bw[priv->xtal], 14);
2672 2695
2673 /* IF freq setting */ 2696 /* IF freq setting */
2674 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 4750000); 2697 ifhz = cxd2841er_get_if_hz(priv, 4750000);
2698 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2675 data[0] = (u8) ((iffreq >> 16) & 0xff); 2699 data[0] = (u8) ((iffreq >> 16) & 0xff);
2676 data[1] = (u8)((iffreq >> 8) & 0xff); 2700 data[1] = (u8)((iffreq >> 8) & 0xff);
2677 data[2] = (u8)(iffreq & 0xff); 2701 data[2] = (u8)(iffreq & 0xff);
@@ -2700,7 +2724,8 @@ static int cxd2841er_sleep_tc_to_active_i_band(
2700 0xA6, itbCoef7bw[priv->xtal], 14); 2724 0xA6, itbCoef7bw[priv->xtal], 14);
2701 2725
2702 /* IF freq setting */ 2726 /* IF freq setting */
2703 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 4150000); 2727 ifhz = cxd2841er_get_if_hz(priv, 4150000);
2728 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2704 data[0] = (u8) ((iffreq >> 16) & 0xff); 2729 data[0] = (u8) ((iffreq >> 16) & 0xff);
2705 data[1] = (u8)((iffreq >> 8) & 0xff); 2730 data[1] = (u8)((iffreq >> 8) & 0xff);
2706 data[2] = (u8)(iffreq & 0xff); 2731 data[2] = (u8)(iffreq & 0xff);
@@ -2729,7 +2754,8 @@ static int cxd2841er_sleep_tc_to_active_i_band(
2729 0xA6, itbCoef6bw[priv->xtal], 14); 2754 0xA6, itbCoef6bw[priv->xtal], 14);
2730 2755
2731 /* IF freq setting */ 2756 /* IF freq setting */
2732 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, 3550000); 2757 ifhz = cxd2841er_get_if_hz(priv, 3550000);
2758 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2733 data[0] = (u8) ((iffreq >> 16) & 0xff); 2759 data[0] = (u8) ((iffreq >> 16) & 0xff);
2734 data[1] = (u8)((iffreq >> 8) & 0xff); 2760 data[1] = (u8)((iffreq >> 8) & 0xff);
2735 data[2] = (u8)(iffreq & 0xff); 2761 data[2] = (u8)(iffreq & 0xff);
@@ -2772,7 +2798,7 @@ static int cxd2841er_sleep_tc_to_active_c_band(struct cxd2841er_priv *priv,
2772 0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8, 2798 0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8,
2773 0x00, 0xCF, 0x00, 0xE6, 0x23, 0xA4 }; 2799 0x00, 0xCF, 0x00, 0xE6, 0x23, 0xA4 };
2774 u8 b10_b6[3]; 2800 u8 b10_b6[3];
2775 u32 iffreq; 2801 u32 iffreq, ifhz;
2776 2802
2777 if (bandwidth != 6000000 && 2803 if (bandwidth != 6000000 &&
2778 bandwidth != 7000000 && 2804 bandwidth != 7000000 &&
@@ -2790,13 +2816,15 @@ static int cxd2841er_sleep_tc_to_active_c_band(struct cxd2841er_priv *priv,
2790 cxd2841er_write_regs( 2816 cxd2841er_write_regs(
2791 priv, I2C_SLVT, 0xa6, 2817 priv, I2C_SLVT, 0xa6,
2792 bw7_8mhz_b10_a6, sizeof(bw7_8mhz_b10_a6)); 2818 bw7_8mhz_b10_a6, sizeof(bw7_8mhz_b10_a6));
2793 iffreq = cxd2841er_calc_iffreq(4900000); 2819 ifhz = cxd2841er_get_if_hz(priv, 4900000);
2820 iffreq = cxd2841er_calc_iffreq(ifhz);
2794 break; 2821 break;
2795 case 6000000: 2822 case 6000000:
2796 cxd2841er_write_regs( 2823 cxd2841er_write_regs(
2797 priv, I2C_SLVT, 0xa6, 2824 priv, I2C_SLVT, 0xa6,
2798 bw6mhz_b10_a6, sizeof(bw6mhz_b10_a6)); 2825 bw6mhz_b10_a6, sizeof(bw6mhz_b10_a6));
2799 iffreq = cxd2841er_calc_iffreq(3700000); 2826 ifhz = cxd2841er_get_if_hz(priv, 3700000);
2827 iffreq = cxd2841er_calc_iffreq(ifhz);
2800 break; 2828 break;
2801 default: 2829 default:
2802 dev_err(&priv->i2c->dev, "%s(): unsupported bandwidth %d\n", 2830 dev_err(&priv->i2c->dev, "%s(): unsupported bandwidth %d\n",