root/drivers/media/dvb-frontends/cxd2841er.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cxd2841er_i2c_debug
  2. cxd2841er_write_regs
  3. cxd2841er_write_reg
  4. cxd2841er_read_regs
  5. cxd2841er_read_reg
  6. cxd2841er_set_reg_bits
  7. cxd2841er_calc_iffreq_xtal
  8. cxd2841er_calc_iffreq
  9. cxd2841er_get_if_hz
  10. cxd2841er_tuner_set
  11. cxd2841er_dvbs2_set_symbol_rate
  12. cxd2841er_sleep_s_to_active_s
  13. cxd2841er_retune_active
  14. cxd2841er_active_s_to_sleep_s
  15. cxd2841er_sleep_s_to_shutdown
  16. cxd2841er_sleep_tc_to_shutdown
  17. cxd2841er_active_t_to_sleep_tc
  18. cxd2841er_active_t2_to_sleep_tc
  19. cxd2841er_active_c_to_sleep_tc
  20. cxd2841er_active_i_to_sleep_tc
  21. cxd2841er_shutdown_to_sleep_s
  22. cxd2841er_shutdown_to_sleep_tc
  23. cxd2841er_tune_done
  24. cxd2841er_set_ts_clock_mode
  25. cxd2841er_chip_id
  26. cxd2841er_read_status_s
  27. cxd2841er_read_status_t_t2
  28. cxd2841er_read_status_c
  29. cxd2841er_read_status_i
  30. cxd2841er_read_status_tc
  31. cxd2841er_get_carrier_offset_s_s2
  32. cxd2841er_get_carrier_offset_i
  33. cxd2841er_get_carrier_offset_t
  34. cxd2841er_get_carrier_offset_t2
  35. cxd2841er_get_carrier_offset_c
  36. cxd2841er_read_packet_errors_c
  37. cxd2841er_read_packet_errors_t
  38. cxd2841er_read_packet_errors_t2
  39. cxd2841er_read_packet_errors_i
  40. cxd2841er_read_ber_c
  41. cxd2841er_read_ber_i
  42. cxd2841er_mon_read_ber_s
  43. cxd2841er_mon_read_ber_s2
  44. cxd2841er_read_ber_t2
  45. cxd2841er_read_ber_t
  46. cxd2841er_freeze_regs
  47. cxd2841er_unfreeze_regs
  48. cxd2841er_dvbs_read_snr
  49. sony_log
  50. cxd2841er_read_snr_c
  51. cxd2841er_read_snr_t
  52. cxd2841er_read_snr_t2
  53. cxd2841er_read_snr_i
  54. cxd2841er_read_agc_gain_c
  55. cxd2841er_read_agc_gain_t_t2
  56. cxd2841er_read_agc_gain_i
  57. cxd2841er_read_agc_gain_s
  58. cxd2841er_read_ber
  59. cxd2841er_read_signal_strength
  60. cxd2841er_read_snr
  61. cxd2841er_read_ucblocks
  62. cxd2841er_dvbt2_set_profile
  63. cxd2841er_dvbt2_set_plp_config
  64. cxd2841er_sleep_tc_to_active_t2_band
  65. cxd2841er_sleep_tc_to_active_t_band
  66. cxd2841er_sleep_tc_to_active_i_band
  67. cxd2841er_sleep_tc_to_active_c_band
  68. cxd2841er_sleep_tc_to_active_t
  69. cxd2841er_sleep_tc_to_active_t2
  70. cxd2841er_sleep_tc_to_active_i
  71. cxd2841er_sleep_tc_to_active_c
  72. cxd2841er_get_frontend
  73. cxd2841er_set_frontend_s
  74. cxd2841er_set_frontend_tc
  75. cxd2841er_tune_s
  76. cxd2841er_tune_tc
  77. cxd2841er_sleep_s
  78. cxd2841er_sleep_tc
  79. cxd2841er_shutdown_tc
  80. cxd2841er_send_burst
  81. cxd2841er_set_tone
  82. cxd2841er_send_diseqc_msg
  83. cxd2841er_release
  84. cxd2841er_i2c_gate_ctrl
  85. cxd2841er_get_algo
  86. cxd2841er_init_stats
  87. cxd2841er_init_s
  88. cxd2841er_init_tc
  89. cxd2841er_attach
  90. cxd2841er_attach_s
  91. cxd2841er_attach_t_c

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * cxd2841er.c
   4  *
   5  * Sony digital demodulator driver for
   6  *      CXD2841ER - DVB-S/S2/T/T2/C/C2
   7  *      CXD2854ER - DVB-S/S2/T/T2/C/C2, ISDB-T/S
   8  *
   9  * Copyright 2012 Sony Corporation
  10  * Copyright (C) 2014 NetUP Inc.
  11  * Copyright (C) 2014 Sergey Kozlov <serjk@netup.ru>
  12  * Copyright (C) 2014 Abylay Ospan <aospan@netup.ru>
  13   */
  14 
  15 #include <linux/module.h>
  16 #include <linux/init.h>
  17 #include <linux/string.h>
  18 #include <linux/slab.h>
  19 #include <linux/bitops.h>
  20 #include <linux/math64.h>
  21 #include <linux/log2.h>
  22 #include <linux/dynamic_debug.h>
  23 #include <linux/kernel.h>
  24 
  25 #include <media/dvb_math.h>
  26 #include <media/dvb_frontend.h>
  27 #include "cxd2841er.h"
  28 #include "cxd2841er_priv.h"
  29 
  30 #define MAX_WRITE_REGSIZE       16
  31 #define LOG2_E_100X 144
  32 
  33 #define INTLOG10X100(x) ((u32) (((u64) intlog10(x) * 100) >> 24))
  34 
  35 /* DVB-C constellation */
  36 enum sony_dvbc_constellation_t {
  37         SONY_DVBC_CONSTELLATION_16QAM,
  38         SONY_DVBC_CONSTELLATION_32QAM,
  39         SONY_DVBC_CONSTELLATION_64QAM,
  40         SONY_DVBC_CONSTELLATION_128QAM,
  41         SONY_DVBC_CONSTELLATION_256QAM
  42 };
  43 
  44 enum cxd2841er_state {
  45         STATE_SHUTDOWN = 0,
  46         STATE_SLEEP_S,
  47         STATE_ACTIVE_S,
  48         STATE_SLEEP_TC,
  49         STATE_ACTIVE_TC
  50 };
  51 
  52 struct cxd2841er_priv {
  53         struct dvb_frontend             frontend;
  54         struct i2c_adapter              *i2c;
  55         u8                              i2c_addr_slvx;
  56         u8                              i2c_addr_slvt;
  57         const struct cxd2841er_config   *config;
  58         enum cxd2841er_state            state;
  59         u8                              system;
  60         enum cxd2841er_xtal             xtal;
  61         enum fe_caps caps;
  62         u32                             flags;
  63 };
  64 
  65 static const struct cxd2841er_cnr_data s_cn_data[] = {
  66         { 0x033e, 0 }, { 0x0339, 100 }, { 0x0333, 200 },
  67         { 0x032e, 300 }, { 0x0329, 400 }, { 0x0324, 500 },
  68         { 0x031e, 600 }, { 0x0319, 700 }, { 0x0314, 800 },
  69         { 0x030f, 900 }, { 0x030a, 1000 }, { 0x02ff, 1100 },
  70         { 0x02f4, 1200 }, { 0x02e9, 1300 }, { 0x02de, 1400 },
  71         { 0x02d4, 1500 }, { 0x02c9, 1600 }, { 0x02bf, 1700 },
  72         { 0x02b5, 1800 }, { 0x02ab, 1900 }, { 0x02a1, 2000 },
  73         { 0x029b, 2100 }, { 0x0295, 2200 }, { 0x0290, 2300 },
  74         { 0x028a, 2400 }, { 0x0284, 2500 }, { 0x027f, 2600 },
  75         { 0x0279, 2700 }, { 0x0274, 2800 }, { 0x026e, 2900 },
  76         { 0x0269, 3000 }, { 0x0262, 3100 }, { 0x025c, 3200 },
  77         { 0x0255, 3300 }, { 0x024f, 3400 }, { 0x0249, 3500 },
  78         { 0x0242, 3600 }, { 0x023c, 3700 }, { 0x0236, 3800 },
  79         { 0x0230, 3900 }, { 0x022a, 4000 }, { 0x0223, 4100 },
  80         { 0x021c, 4200 }, { 0x0215, 4300 }, { 0x020e, 4400 },
  81         { 0x0207, 4500 }, { 0x0201, 4600 }, { 0x01fa, 4700 },
  82         { 0x01f4, 4800 }, { 0x01ed, 4900 }, { 0x01e7, 5000 },
  83         { 0x01e0, 5100 }, { 0x01d9, 5200 }, { 0x01d2, 5300 },
  84         { 0x01cb, 5400 }, { 0x01c4, 5500 }, { 0x01be, 5600 },
  85         { 0x01b7, 5700 }, { 0x01b1, 5800 }, { 0x01aa, 5900 },
  86         { 0x01a4, 6000 }, { 0x019d, 6100 }, { 0x0196, 6200 },
  87         { 0x018f, 6300 }, { 0x0189, 6400 }, { 0x0182, 6500 },
  88         { 0x017c, 6600 }, { 0x0175, 6700 }, { 0x016f, 6800 },
  89         { 0x0169, 6900 }, { 0x0163, 7000 }, { 0x015c, 7100 },
  90         { 0x0156, 7200 }, { 0x0150, 7300 }, { 0x014a, 7400 },
  91         { 0x0144, 7500 }, { 0x013e, 7600 }, { 0x0138, 7700 },
  92         { 0x0132, 7800 }, { 0x012d, 7900 }, { 0x0127, 8000 },
  93         { 0x0121, 8100 }, { 0x011c, 8200 }, { 0x0116, 8300 },
  94         { 0x0111, 8400 }, { 0x010b, 8500 }, { 0x0106, 8600 },
  95         { 0x0101, 8700 }, { 0x00fc, 8800 }, { 0x00f7, 8900 },
  96         { 0x00f2, 9000 }, { 0x00ee, 9100 }, { 0x00ea, 9200 },
  97         { 0x00e6, 9300 }, { 0x00e2, 9400 }, { 0x00de, 9500 },
  98         { 0x00da, 9600 }, { 0x00d7, 9700 }, { 0x00d3, 9800 },
  99         { 0x00d0, 9900 }, { 0x00cc, 10000 }, { 0x00c7, 10100 },
 100         { 0x00c3, 10200 }, { 0x00bf, 10300 }, { 0x00ba, 10400 },
 101         { 0x00b6, 10500 }, { 0x00b2, 10600 }, { 0x00ae, 10700 },
 102         { 0x00aa, 10800 }, { 0x00a7, 10900 }, { 0x00a3, 11000 },
 103         { 0x009f, 11100 }, { 0x009c, 11200 }, { 0x0098, 11300 },
 104         { 0x0094, 11400 }, { 0x0091, 11500 }, { 0x008e, 11600 },
 105         { 0x008a, 11700 }, { 0x0087, 11800 }, { 0x0084, 11900 },
 106         { 0x0081, 12000 }, { 0x007e, 12100 }, { 0x007b, 12200 },
 107         { 0x0079, 12300 }, { 0x0076, 12400 }, { 0x0073, 12500 },
 108         { 0x0071, 12600 }, { 0x006e, 12700 }, { 0x006c, 12800 },
 109         { 0x0069, 12900 }, { 0x0067, 13000 }, { 0x0065, 13100 },
 110         { 0x0062, 13200 }, { 0x0060, 13300 }, { 0x005e, 13400 },
 111         { 0x005c, 13500 }, { 0x005a, 13600 }, { 0x0058, 13700 },
 112         { 0x0056, 13800 }, { 0x0054, 13900 }, { 0x0052, 14000 },
 113         { 0x0050, 14100 }, { 0x004e, 14200 }, { 0x004c, 14300 },
 114         { 0x004b, 14400 }, { 0x0049, 14500 }, { 0x0047, 14600 },
 115         { 0x0046, 14700 }, { 0x0044, 14800 }, { 0x0043, 14900 },
 116         { 0x0041, 15000 }, { 0x003f, 15100 }, { 0x003e, 15200 },
 117         { 0x003c, 15300 }, { 0x003b, 15400 }, { 0x003a, 15500 },
 118         { 0x0037, 15700 }, { 0x0036, 15800 }, { 0x0034, 15900 },
 119         { 0x0033, 16000 }, { 0x0032, 16100 }, { 0x0031, 16200 },
 120         { 0x0030, 16300 }, { 0x002f, 16400 }, { 0x002e, 16500 },
 121         { 0x002d, 16600 }, { 0x002c, 16700 }, { 0x002b, 16800 },
 122         { 0x002a, 16900 }, { 0x0029, 17000 }, { 0x0028, 17100 },
 123         { 0x0027, 17200 }, { 0x0026, 17300 }, { 0x0025, 17400 },
 124         { 0x0024, 17500 }, { 0x0023, 17600 }, { 0x0022, 17800 },
 125         { 0x0021, 17900 }, { 0x0020, 18000 }, { 0x001f, 18200 },
 126         { 0x001e, 18300 }, { 0x001d, 18500 }, { 0x001c, 18700 },
 127         { 0x001b, 18900 }, { 0x001a, 19000 }, { 0x0019, 19200 },
 128         { 0x0018, 19300 }, { 0x0017, 19500 }, { 0x0016, 19700 },
 129         { 0x0015, 19900 }, { 0x0014, 20000 },
 130 };
 131 
 132 static const struct cxd2841er_cnr_data s2_cn_data[] = {
 133         { 0x05af, 0 }, { 0x0597, 100 }, { 0x057e, 200 },
 134         { 0x0567, 300 }, { 0x0550, 400 }, { 0x0539, 500 },
 135         { 0x0522, 600 }, { 0x050c, 700 }, { 0x04f6, 800 },
 136         { 0x04e1, 900 }, { 0x04cc, 1000 }, { 0x04b6, 1100 },
 137         { 0x04a1, 1200 }, { 0x048c, 1300 }, { 0x0477, 1400 },
 138         { 0x0463, 1500 }, { 0x044f, 1600 }, { 0x043c, 1700 },
 139         { 0x0428, 1800 }, { 0x0416, 1900 }, { 0x0403, 2000 },
 140         { 0x03ef, 2100 }, { 0x03dc, 2200 }, { 0x03c9, 2300 },
 141         { 0x03b6, 2400 }, { 0x03a4, 2500 }, { 0x0392, 2600 },
 142         { 0x0381, 2700 }, { 0x036f, 2800 }, { 0x035f, 2900 },
 143         { 0x034e, 3000 }, { 0x033d, 3100 }, { 0x032d, 3200 },
 144         { 0x031d, 3300 }, { 0x030d, 3400 }, { 0x02fd, 3500 },
 145         { 0x02ee, 3600 }, { 0x02df, 3700 }, { 0x02d0, 3800 },
 146         { 0x02c2, 3900 }, { 0x02b4, 4000 }, { 0x02a6, 4100 },
 147         { 0x0299, 4200 }, { 0x028c, 4300 }, { 0x027f, 4400 },
 148         { 0x0272, 4500 }, { 0x0265, 4600 }, { 0x0259, 4700 },
 149         { 0x024d, 4800 }, { 0x0241, 4900 }, { 0x0236, 5000 },
 150         { 0x022b, 5100 }, { 0x0220, 5200 }, { 0x0215, 5300 },
 151         { 0x020a, 5400 }, { 0x0200, 5500 }, { 0x01f6, 5600 },
 152         { 0x01ec, 5700 }, { 0x01e2, 5800 }, { 0x01d8, 5900 },
 153         { 0x01cf, 6000 }, { 0x01c6, 6100 }, { 0x01bc, 6200 },
 154         { 0x01b3, 6300 }, { 0x01aa, 6400 }, { 0x01a2, 6500 },
 155         { 0x0199, 6600 }, { 0x0191, 6700 }, { 0x0189, 6800 },
 156         { 0x0181, 6900 }, { 0x0179, 7000 }, { 0x0171, 7100 },
 157         { 0x0169, 7200 }, { 0x0161, 7300 }, { 0x015a, 7400 },
 158         { 0x0153, 7500 }, { 0x014b, 7600 }, { 0x0144, 7700 },
 159         { 0x013d, 7800 }, { 0x0137, 7900 }, { 0x0130, 8000 },
 160         { 0x012a, 8100 }, { 0x0124, 8200 }, { 0x011e, 8300 },
 161         { 0x0118, 8400 }, { 0x0112, 8500 }, { 0x010c, 8600 },
 162         { 0x0107, 8700 }, { 0x0101, 8800 }, { 0x00fc, 8900 },
 163         { 0x00f7, 9000 }, { 0x00f2, 9100 }, { 0x00ec, 9200 },
 164         { 0x00e7, 9300 }, { 0x00e2, 9400 }, { 0x00dd, 9500 },
 165         { 0x00d8, 9600 }, { 0x00d4, 9700 }, { 0x00cf, 9800 },
 166         { 0x00ca, 9900 }, { 0x00c6, 10000 }, { 0x00c2, 10100 },
 167         { 0x00be, 10200 }, { 0x00b9, 10300 }, { 0x00b5, 10400 },
 168         { 0x00b1, 10500 }, { 0x00ae, 10600 }, { 0x00aa, 10700 },
 169         { 0x00a6, 10800 }, { 0x00a3, 10900 }, { 0x009f, 11000 },
 170         { 0x009b, 11100 }, { 0x0098, 11200 }, { 0x0095, 11300 },
 171         { 0x0091, 11400 }, { 0x008e, 11500 }, { 0x008b, 11600 },
 172         { 0x0088, 11700 }, { 0x0085, 11800 }, { 0x0082, 11900 },
 173         { 0x007f, 12000 }, { 0x007c, 12100 }, { 0x007a, 12200 },
 174         { 0x0077, 12300 }, { 0x0074, 12400 }, { 0x0072, 12500 },
 175         { 0x006f, 12600 }, { 0x006d, 12700 }, { 0x006b, 12800 },
 176         { 0x0068, 12900 }, { 0x0066, 13000 }, { 0x0064, 13100 },
 177         { 0x0061, 13200 }, { 0x005f, 13300 }, { 0x005d, 13400 },
 178         { 0x005b, 13500 }, { 0x0059, 13600 }, { 0x0057, 13700 },
 179         { 0x0055, 13800 }, { 0x0053, 13900 }, { 0x0051, 14000 },
 180         { 0x004f, 14100 }, { 0x004e, 14200 }, { 0x004c, 14300 },
 181         { 0x004a, 14400 }, { 0x0049, 14500 }, { 0x0047, 14600 },
 182         { 0x0045, 14700 }, { 0x0044, 14800 }, { 0x0042, 14900 },
 183         { 0x0041, 15000 }, { 0x003f, 15100 }, { 0x003e, 15200 },
 184         { 0x003c, 15300 }, { 0x003b, 15400 }, { 0x003a, 15500 },
 185         { 0x0038, 15600 }, { 0x0037, 15700 }, { 0x0036, 15800 },
 186         { 0x0034, 15900 }, { 0x0033, 16000 }, { 0x0032, 16100 },
 187         { 0x0031, 16200 }, { 0x0030, 16300 }, { 0x002f, 16400 },
 188         { 0x002e, 16500 }, { 0x002d, 16600 }, { 0x002c, 16700 },
 189         { 0x002b, 16800 }, { 0x002a, 16900 }, { 0x0029, 17000 },
 190         { 0x0028, 17100 }, { 0x0027, 17200 }, { 0x0026, 17300 },
 191         { 0x0025, 17400 }, { 0x0024, 17500 }, { 0x0023, 17600 },
 192         { 0x0022, 17800 }, { 0x0021, 17900 }, { 0x0020, 18000 },
 193         { 0x001f, 18200 }, { 0x001e, 18300 }, { 0x001d, 18500 },
 194         { 0x001c, 18700 }, { 0x001b, 18900 }, { 0x001a, 19000 },
 195         { 0x0019, 19200 }, { 0x0018, 19300 }, { 0x0017, 19500 },
 196         { 0x0016, 19700 }, { 0x0015, 19900 }, { 0x0014, 20000 },
 197 };
 198 
 199 static int cxd2841er_freeze_regs(struct cxd2841er_priv *priv);
 200 static int cxd2841er_unfreeze_regs(struct cxd2841er_priv *priv);
 201 
 202 static void cxd2841er_i2c_debug(struct cxd2841er_priv *priv,
 203                                 u8 addr, u8 reg, u8 write,
 204                                 const u8 *data, u32 len)
 205 {
 206         dev_dbg(&priv->i2c->dev,
 207                 "cxd2841er: I2C %s addr %02x reg 0x%02x size %d data %*ph\n",
 208                 (write == 0 ? "read" : "write"), addr, reg, len, len, data);
 209 }
 210 
 211 static int cxd2841er_write_regs(struct cxd2841er_priv *priv,
 212                                 u8 addr, u8 reg, const u8 *data, u32 len)
 213 {
 214         int ret;
 215         u8 buf[MAX_WRITE_REGSIZE + 1];
 216         u8 i2c_addr = (addr == I2C_SLVX ?
 217                 priv->i2c_addr_slvx : priv->i2c_addr_slvt);
 218         struct i2c_msg msg[1] = {
 219                 {
 220                         .addr = i2c_addr,
 221                         .flags = 0,
 222                         .len = len + 1,
 223                         .buf = buf,
 224                 }
 225         };
 226 
 227         if (len + 1 >= sizeof(buf)) {
 228                 dev_warn(&priv->i2c->dev, "wr reg=%04x: len=%d is too big!\n",
 229                          reg, len + 1);
 230                 return -E2BIG;
 231         }
 232 
 233         cxd2841er_i2c_debug(priv, i2c_addr, reg, 1, data, len);
 234         buf[0] = reg;
 235         memcpy(&buf[1], data, len);
 236 
 237         ret = i2c_transfer(priv->i2c, msg, 1);
 238         if (ret >= 0 && ret != 1)
 239                 ret = -EIO;
 240         if (ret < 0) {
 241                 dev_warn(&priv->i2c->dev,
 242                         "%s: i2c wr failed=%d addr=%02x reg=%02x len=%d\n",
 243                         KBUILD_MODNAME, ret, i2c_addr, reg, len);
 244                 return ret;
 245         }
 246         return 0;
 247 }
 248 
 249 static int cxd2841er_write_reg(struct cxd2841er_priv *priv,
 250                                u8 addr, u8 reg, u8 val)
 251 {
 252         u8 tmp = val; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */
 253 
 254         return cxd2841er_write_regs(priv, addr, reg, &tmp, 1);
 255 }
 256 
 257 static int cxd2841er_read_regs(struct cxd2841er_priv *priv,
 258                                u8 addr, u8 reg, u8 *val, u32 len)
 259 {
 260         int ret;
 261         u8 i2c_addr = (addr == I2C_SLVX ?
 262                 priv->i2c_addr_slvx : priv->i2c_addr_slvt);
 263         struct i2c_msg msg[2] = {
 264                 {
 265                         .addr = i2c_addr,
 266                         .flags = 0,
 267                         .len = 1,
 268                         .buf = &reg,
 269                 }, {
 270                         .addr = i2c_addr,
 271                         .flags = I2C_M_RD,
 272                         .len = len,
 273                         .buf = val,
 274                 }
 275         };
 276 
 277         ret = i2c_transfer(priv->i2c, msg, 2);
 278         if (ret >= 0 && ret != 2)
 279                 ret = -EIO;
 280         if (ret < 0) {
 281                 dev_warn(&priv->i2c->dev,
 282                         "%s: i2c rd failed=%d addr=%02x reg=%02x\n",
 283                         KBUILD_MODNAME, ret, i2c_addr, reg);
 284                 return ret;
 285         }
 286         cxd2841er_i2c_debug(priv, i2c_addr, reg, 0, val, len);
 287         return 0;
 288 }
 289 
 290 static int cxd2841er_read_reg(struct cxd2841er_priv *priv,
 291                               u8 addr, u8 reg, u8 *val)
 292 {
 293         return cxd2841er_read_regs(priv, addr, reg, val, 1);
 294 }
 295 
 296 static int cxd2841er_set_reg_bits(struct cxd2841er_priv *priv,
 297                                   u8 addr, u8 reg, u8 data, u8 mask)
 298 {
 299         int res;
 300         u8 rdata;
 301 
 302         if (mask != 0xff) {
 303                 res = cxd2841er_read_reg(priv, addr, reg, &rdata);
 304                 if (res)
 305                         return res;
 306                 data = ((data & mask) | (rdata & (mask ^ 0xFF)));
 307         }
 308         return cxd2841er_write_reg(priv, addr, reg, data);
 309 }
 310 
 311 static u32 cxd2841er_calc_iffreq_xtal(enum cxd2841er_xtal xtal, u32 ifhz)
 312 {
 313         u64 tmp;
 314 
 315         tmp = (u64) ifhz * 16777216;
 316         do_div(tmp, ((xtal == SONY_XTAL_24000) ? 48000000 : 41000000));
 317 
 318         return (u32) tmp;
 319 }
 320 
 321 static u32 cxd2841er_calc_iffreq(u32 ifhz)
 322 {
 323         return cxd2841er_calc_iffreq_xtal(SONY_XTAL_20500, ifhz);
 324 }
 325 
 326 static int cxd2841er_get_if_hz(struct cxd2841er_priv *priv, u32 def_hz)
 327 {
 328         u32 hz;
 329 
 330         if (priv->frontend.ops.tuner_ops.get_if_frequency
 331                         && (priv->flags & CXD2841ER_AUTO_IFHZ))
 332                 priv->frontend.ops.tuner_ops.get_if_frequency(
 333                         &priv->frontend, &hz);
 334         else
 335                 hz = def_hz;
 336 
 337         return hz;
 338 }
 339 
 340 static int cxd2841er_tuner_set(struct dvb_frontend *fe)
 341 {
 342         struct cxd2841er_priv *priv = fe->demodulator_priv;
 343 
 344         if ((priv->flags & CXD2841ER_USE_GATECTRL) && fe->ops.i2c_gate_ctrl)
 345                 fe->ops.i2c_gate_ctrl(fe, 1);
 346         if (fe->ops.tuner_ops.set_params)
 347                 fe->ops.tuner_ops.set_params(fe);
 348         if ((priv->flags & CXD2841ER_USE_GATECTRL) && fe->ops.i2c_gate_ctrl)
 349                 fe->ops.i2c_gate_ctrl(fe, 0);
 350 
 351         return 0;
 352 }
 353 
 354 static int cxd2841er_dvbs2_set_symbol_rate(struct cxd2841er_priv *priv,
 355                                            u32 symbol_rate)
 356 {
 357         u32 reg_value = 0;
 358         u8 data[3] = {0, 0, 0};
 359 
 360         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 361         /*
 362          * regValue = (symbolRateKSps * 2^14 / 1000) + 0.5
 363          *          = ((symbolRateKSps * 2^14) + 500) / 1000
 364          *          = ((symbolRateKSps * 16384) + 500) / 1000
 365          */
 366         reg_value = DIV_ROUND_CLOSEST(symbol_rate * 16384, 1000);
 367         if ((reg_value == 0) || (reg_value > 0xFFFFF)) {
 368                 dev_err(&priv->i2c->dev,
 369                         "%s(): reg_value is out of range\n", __func__);
 370                 return -EINVAL;
 371         }
 372         data[0] = (u8)((reg_value >> 16) & 0x0F);
 373         data[1] = (u8)((reg_value >>  8) & 0xFF);
 374         data[2] = (u8)(reg_value & 0xFF);
 375         /* Set SLV-T Bank : 0xAE */
 376         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xae);
 377         cxd2841er_write_regs(priv, I2C_SLVT, 0x20, data, 3);
 378         return 0;
 379 }
 380 
 381 static void cxd2841er_set_ts_clock_mode(struct cxd2841er_priv *priv,
 382                                         u8 system);
 383 
 384 static int cxd2841er_sleep_s_to_active_s(struct cxd2841er_priv *priv,
 385                                          u8 system, u32 symbol_rate)
 386 {
 387         int ret;
 388         u8 data[4] = { 0, 0, 0, 0 };
 389 
 390         if (priv->state != STATE_SLEEP_S) {
 391                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
 392                         __func__, (int)priv->state);
 393                 return -EINVAL;
 394         }
 395         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 396         cxd2841er_set_ts_clock_mode(priv, SYS_DVBS);
 397         /* Set demod mode */
 398         if (system == SYS_DVBS) {
 399                 data[0] = 0x0A;
 400         } else if (system == SYS_DVBS2) {
 401                 data[0] = 0x0B;
 402         } else {
 403                 dev_err(&priv->i2c->dev, "%s(): invalid delsys %d\n",
 404                         __func__, system);
 405                 return -EINVAL;
 406         }
 407         /* Set SLV-X Bank : 0x00 */
 408         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 409         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, data[0]);
 410         /* DVB-S/S2 */
 411         data[0] = 0x00;
 412         /* Set SLV-T Bank : 0x00 */
 413         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 414         /* Enable S/S2 auto detection 1 */
 415         cxd2841er_write_reg(priv, I2C_SLVT, 0x2d, data[0]);
 416         /* Set SLV-T Bank : 0xAE */
 417         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xae);
 418         /* Enable S/S2 auto detection 2 */
 419         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, data[0]);
 420         /* Set SLV-T Bank : 0x00 */
 421         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 422         /* Enable demod clock */
 423         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x01);
 424         /* Enable ADC clock */
 425         cxd2841er_write_reg(priv, I2C_SLVT, 0x31, 0x01);
 426         /* Enable ADC 1 */
 427         cxd2841er_write_reg(priv, I2C_SLVT, 0x63, 0x16);
 428         /* Enable ADC 2 */
 429         cxd2841er_write_reg(priv, I2C_SLVT, 0x65, 0x3f);
 430         /* Set SLV-X Bank : 0x00 */
 431         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 432         /* Enable ADC 3 */
 433         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x00);
 434         /* Set SLV-T Bank : 0xA3 */
 435         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa3);
 436         cxd2841er_write_reg(priv, I2C_SLVT, 0xac, 0x00);
 437         data[0] = 0x07;
 438         data[1] = 0x3B;
 439         data[2] = 0x08;
 440         data[3] = 0xC5;
 441         /* Set SLV-T Bank : 0xAB */
 442         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xab);
 443         cxd2841er_write_regs(priv, I2C_SLVT, 0x98, data, 4);
 444         data[0] = 0x05;
 445         data[1] = 0x80;
 446         data[2] = 0x0A;
 447         data[3] = 0x80;
 448         cxd2841er_write_regs(priv, I2C_SLVT, 0xa8, data, 4);
 449         data[0] = 0x0C;
 450         data[1] = 0xCC;
 451         cxd2841er_write_regs(priv, I2C_SLVT, 0xc3, data, 2);
 452         /* Set demod parameter */
 453         ret = cxd2841er_dvbs2_set_symbol_rate(priv, symbol_rate);
 454         if (ret != 0)
 455                 return ret;
 456         /* Set SLV-T Bank : 0x00 */
 457         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 458         /* disable Hi-Z setting 1 */
 459         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x10);
 460         /* disable Hi-Z setting 2 */
 461         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0x00);
 462         priv->state = STATE_ACTIVE_S;
 463         return 0;
 464 }
 465 
 466 static int cxd2841er_sleep_tc_to_active_t_band(struct cxd2841er_priv *priv,
 467                                                u32 bandwidth);
 468 
 469 static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
 470                                                 u32 bandwidth);
 471 
 472 static int cxd2841er_sleep_tc_to_active_c_band(struct cxd2841er_priv *priv,
 473                                                u32 bandwidth);
 474 
 475 static int cxd2841er_sleep_tc_to_active_i(struct cxd2841er_priv *priv,
 476                 u32 bandwidth);
 477 
 478 static int cxd2841er_active_i_to_sleep_tc(struct cxd2841er_priv *priv);
 479 
 480 static int cxd2841er_sleep_tc_to_shutdown(struct cxd2841er_priv *priv);
 481 
 482 static int cxd2841er_shutdown_to_sleep_tc(struct cxd2841er_priv *priv);
 483 
 484 static int cxd2841er_sleep_tc(struct dvb_frontend *fe);
 485 
 486 static int cxd2841er_retune_active(struct cxd2841er_priv *priv,
 487                                    struct dtv_frontend_properties *p)
 488 {
 489         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 490         if (priv->state != STATE_ACTIVE_S &&
 491                         priv->state != STATE_ACTIVE_TC) {
 492                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
 493                         __func__, priv->state);
 494                 return -EINVAL;
 495         }
 496         /* Set SLV-T Bank : 0x00 */
 497         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 498         /* disable TS output */
 499         cxd2841er_write_reg(priv, I2C_SLVT, 0xc3, 0x01);
 500         if (priv->state == STATE_ACTIVE_S)
 501                 return cxd2841er_dvbs2_set_symbol_rate(
 502                                 priv, p->symbol_rate / 1000);
 503         else if (priv->state == STATE_ACTIVE_TC) {
 504                 switch (priv->system) {
 505                 case SYS_DVBT:
 506                         return cxd2841er_sleep_tc_to_active_t_band(
 507                                         priv, p->bandwidth_hz);
 508                 case SYS_DVBT2:
 509                         return cxd2841er_sleep_tc_to_active_t2_band(
 510                                         priv, p->bandwidth_hz);
 511                 case SYS_DVBC_ANNEX_A:
 512                         return cxd2841er_sleep_tc_to_active_c_band(
 513                                         priv, p->bandwidth_hz);
 514                 case SYS_ISDBT:
 515                         cxd2841er_active_i_to_sleep_tc(priv);
 516                         cxd2841er_sleep_tc_to_shutdown(priv);
 517                         cxd2841er_shutdown_to_sleep_tc(priv);
 518                         return cxd2841er_sleep_tc_to_active_i(
 519                                         priv, p->bandwidth_hz);
 520                 }
 521         }
 522         dev_dbg(&priv->i2c->dev, "%s(): invalid delivery system %d\n",
 523                 __func__, priv->system);
 524         return -EINVAL;
 525 }
 526 
 527 static int cxd2841er_active_s_to_sleep_s(struct cxd2841er_priv *priv)
 528 {
 529         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 530         if (priv->state != STATE_ACTIVE_S) {
 531                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
 532                         __func__, priv->state);
 533                 return -EINVAL;
 534         }
 535         /* Set SLV-T Bank : 0x00 */
 536         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 537         /* disable TS output */
 538         cxd2841er_write_reg(priv, I2C_SLVT, 0xc3, 0x01);
 539         /* enable Hi-Z setting 1 */
 540         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x1f);
 541         /* enable Hi-Z setting 2 */
 542         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0xff);
 543         /* Set SLV-X Bank : 0x00 */
 544         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 545         /* disable ADC 1 */
 546         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x01);
 547         /* Set SLV-T Bank : 0x00 */
 548         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 549         /* disable ADC clock */
 550         cxd2841er_write_reg(priv, I2C_SLVT, 0x31, 0x00);
 551         /* disable ADC 2 */
 552         cxd2841er_write_reg(priv, I2C_SLVT, 0x63, 0x16);
 553         /* disable ADC 3 */
 554         cxd2841er_write_reg(priv, I2C_SLVT, 0x65, 0x27);
 555         /* SADC Bias ON */
 556         cxd2841er_write_reg(priv, I2C_SLVT, 0x69, 0x06);
 557         /* disable demod clock */
 558         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x00);
 559         /* Set SLV-T Bank : 0xAE */
 560         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xae);
 561         /* disable S/S2 auto detection1 */
 562         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
 563         /* Set SLV-T Bank : 0x00 */
 564         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 565         /* disable S/S2 auto detection2 */
 566         cxd2841er_write_reg(priv, I2C_SLVT, 0x2d, 0x00);
 567         priv->state = STATE_SLEEP_S;
 568         return 0;
 569 }
 570 
 571 static int cxd2841er_sleep_s_to_shutdown(struct cxd2841er_priv *priv)
 572 {
 573         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 574         if (priv->state != STATE_SLEEP_S) {
 575                 dev_dbg(&priv->i2c->dev, "%s(): invalid demod state %d\n",
 576                         __func__, priv->state);
 577                 return -EINVAL;
 578         }
 579         /* Set SLV-T Bank : 0x00 */
 580         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 581         /* Disable DSQOUT */
 582         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x3f);
 583         /* Disable DSQIN */
 584         cxd2841er_write_reg(priv, I2C_SLVT, 0x9c, 0x00);
 585         /* Set SLV-X Bank : 0x00 */
 586         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 587         /* Disable oscillator */
 588         cxd2841er_write_reg(priv, I2C_SLVX, 0x15, 0x01);
 589         /* Set demod mode */
 590         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, 0x01);
 591         priv->state = STATE_SHUTDOWN;
 592         return 0;
 593 }
 594 
 595 static int cxd2841er_sleep_tc_to_shutdown(struct cxd2841er_priv *priv)
 596 {
 597         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 598         if (priv->state != STATE_SLEEP_TC) {
 599                 dev_dbg(&priv->i2c->dev, "%s(): invalid demod state %d\n",
 600                         __func__, priv->state);
 601                 return -EINVAL;
 602         }
 603         /* Set SLV-X Bank : 0x00 */
 604         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 605         /* Disable oscillator */
 606         cxd2841er_write_reg(priv, I2C_SLVX, 0x15, 0x01);
 607         /* Set demod mode */
 608         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, 0x01);
 609         priv->state = STATE_SHUTDOWN;
 610         return 0;
 611 }
 612 
 613 static int cxd2841er_active_t_to_sleep_tc(struct cxd2841er_priv *priv)
 614 {
 615         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 616         if (priv->state != STATE_ACTIVE_TC) {
 617                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
 618                         __func__, priv->state);
 619                 return -EINVAL;
 620         }
 621         /* Set SLV-T Bank : 0x00 */
 622         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 623         /* disable TS output */
 624         cxd2841er_write_reg(priv, I2C_SLVT, 0xc3, 0x01);
 625         /* enable Hi-Z setting 1 */
 626         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x3f);
 627         /* enable Hi-Z setting 2 */
 628         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0xff);
 629         /* Set SLV-X Bank : 0x00 */
 630         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 631         /* disable ADC 1 */
 632         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x01);
 633         /* Set SLV-T Bank : 0x00 */
 634         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 635         /* Disable ADC 2 */
 636         cxd2841er_write_reg(priv, I2C_SLVT, 0x43, 0x0a);
 637         /* Disable ADC 3 */
 638         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x0a);
 639         /* Disable ADC clock */
 640         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
 641         /* Disable RF level monitor */
 642         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x00);
 643         /* Disable demod clock */
 644         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x00);
 645         priv->state = STATE_SLEEP_TC;
 646         return 0;
 647 }
 648 
 649 static int cxd2841er_active_t2_to_sleep_tc(struct cxd2841er_priv *priv)
 650 {
 651         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 652         if (priv->state != STATE_ACTIVE_TC) {
 653                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
 654                         __func__, priv->state);
 655                 return -EINVAL;
 656         }
 657         /* Set SLV-T Bank : 0x00 */
 658         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 659         /* disable TS output */
 660         cxd2841er_write_reg(priv, I2C_SLVT, 0xc3, 0x01);
 661         /* enable Hi-Z setting 1 */
 662         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x3f);
 663         /* enable Hi-Z setting 2 */
 664         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0xff);
 665         /* Cancel DVB-T2 setting */
 666         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x13);
 667         cxd2841er_write_reg(priv, I2C_SLVT, 0x83, 0x40);
 668         cxd2841er_write_reg(priv, I2C_SLVT, 0x86, 0x21);
 669         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x9e, 0x09, 0x0f);
 670         cxd2841er_write_reg(priv, I2C_SLVT, 0x9f, 0xfb);
 671         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2a);
 672         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x38, 0x00, 0x0f);
 673         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2b);
 674         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x11, 0x00, 0x3f);
 675         /* Set SLV-X Bank : 0x00 */
 676         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 677         /* disable ADC 1 */
 678         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x01);
 679         /* Set SLV-T Bank : 0x00 */
 680         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 681         /* Disable ADC 2 */
 682         cxd2841er_write_reg(priv, I2C_SLVT, 0x43, 0x0a);
 683         /* Disable ADC 3 */
 684         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x0a);
 685         /* Disable ADC clock */
 686         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
 687         /* Disable RF level monitor */
 688         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x00);
 689         /* Disable demod clock */
 690         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x00);
 691         priv->state = STATE_SLEEP_TC;
 692         return 0;
 693 }
 694 
 695 static int cxd2841er_active_c_to_sleep_tc(struct cxd2841er_priv *priv)
 696 {
 697         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 698         if (priv->state != STATE_ACTIVE_TC) {
 699                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
 700                         __func__, priv->state);
 701                 return -EINVAL;
 702         }
 703         /* Set SLV-T Bank : 0x00 */
 704         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 705         /* disable TS output */
 706         cxd2841er_write_reg(priv, I2C_SLVT, 0xc3, 0x01);
 707         /* enable Hi-Z setting 1 */
 708         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x3f);
 709         /* enable Hi-Z setting 2 */
 710         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0xff);
 711         /* Cancel DVB-C setting */
 712         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x11);
 713         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xa3, 0x00, 0x1f);
 714         /* Set SLV-X Bank : 0x00 */
 715         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 716         /* disable ADC 1 */
 717         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x01);
 718         /* Set SLV-T Bank : 0x00 */
 719         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 720         /* Disable ADC 2 */
 721         cxd2841er_write_reg(priv, I2C_SLVT, 0x43, 0x0a);
 722         /* Disable ADC 3 */
 723         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x0a);
 724         /* Disable ADC clock */
 725         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
 726         /* Disable RF level monitor */
 727         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x00);
 728         /* Disable demod clock */
 729         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x00);
 730         priv->state = STATE_SLEEP_TC;
 731         return 0;
 732 }
 733 
 734 static int cxd2841er_active_i_to_sleep_tc(struct cxd2841er_priv *priv)
 735 {
 736         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 737         if (priv->state != STATE_ACTIVE_TC) {
 738                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
 739                                 __func__, priv->state);
 740                 return -EINVAL;
 741         }
 742         /* Set SLV-T Bank : 0x00 */
 743         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 744         /* disable TS output */
 745         cxd2841er_write_reg(priv, I2C_SLVT, 0xc3, 0x01);
 746         /* enable Hi-Z setting 1 */
 747         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x3f);
 748         /* enable Hi-Z setting 2 */
 749         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0xff);
 750 
 751         /* TODO: Cancel demod parameter */
 752 
 753         /* Set SLV-X Bank : 0x00 */
 754         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 755         /* disable ADC 1 */
 756         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x01);
 757         /* Set SLV-T Bank : 0x00 */
 758         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 759         /* Disable ADC 2 */
 760         cxd2841er_write_reg(priv, I2C_SLVT, 0x43, 0x0a);
 761         /* Disable ADC 3 */
 762         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x0a);
 763         /* Disable ADC clock */
 764         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
 765         /* Disable RF level monitor */
 766         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x00);
 767         /* Disable demod clock */
 768         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x00);
 769         priv->state = STATE_SLEEP_TC;
 770         return 0;
 771 }
 772 
 773 static int cxd2841er_shutdown_to_sleep_s(struct cxd2841er_priv *priv)
 774 {
 775         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 776         if (priv->state != STATE_SHUTDOWN) {
 777                 dev_dbg(&priv->i2c->dev, "%s(): invalid demod state %d\n",
 778                         __func__, priv->state);
 779                 return -EINVAL;
 780         }
 781         /* Set SLV-X Bank : 0x00 */
 782         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 783         /* Clear all demodulator registers */
 784         cxd2841er_write_reg(priv, I2C_SLVX, 0x02, 0x00);
 785         usleep_range(3000, 5000);
 786         /* Set SLV-X Bank : 0x00 */
 787         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 788         /* Set demod SW reset */
 789         cxd2841er_write_reg(priv, I2C_SLVX, 0x10, 0x01);
 790 
 791         switch (priv->xtal) {
 792         case SONY_XTAL_20500:
 793                 cxd2841er_write_reg(priv, I2C_SLVX, 0x14, 0x00);
 794                 break;
 795         case SONY_XTAL_24000:
 796                 /* Select demod frequency */
 797                 cxd2841er_write_reg(priv, I2C_SLVX, 0x12, 0x00);
 798                 cxd2841er_write_reg(priv, I2C_SLVX, 0x14, 0x03);
 799                 break;
 800         case SONY_XTAL_41000:
 801                 cxd2841er_write_reg(priv, I2C_SLVX, 0x14, 0x01);
 802                 break;
 803         default:
 804                 dev_dbg(&priv->i2c->dev, "%s(): invalid demod xtal %d\n",
 805                                 __func__, priv->xtal);
 806                 return -EINVAL;
 807         }
 808 
 809         /* Set demod mode */
 810         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, 0x0a);
 811         /* Clear demod SW reset */
 812         cxd2841er_write_reg(priv, I2C_SLVX, 0x10, 0x00);
 813         usleep_range(1000, 2000);
 814         /* Set SLV-T Bank : 0x00 */
 815         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 816         /* enable DSQOUT */
 817         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x1F);
 818         /* enable DSQIN */
 819         cxd2841er_write_reg(priv, I2C_SLVT, 0x9C, 0x40);
 820         /* TADC Bias On */
 821         cxd2841er_write_reg(priv, I2C_SLVT, 0x43, 0x0a);
 822         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x0a);
 823         /* SADC Bias On */
 824         cxd2841er_write_reg(priv, I2C_SLVT, 0x63, 0x16);
 825         cxd2841er_write_reg(priv, I2C_SLVT, 0x65, 0x27);
 826         cxd2841er_write_reg(priv, I2C_SLVT, 0x69, 0x06);
 827         priv->state = STATE_SLEEP_S;
 828         return 0;
 829 }
 830 
 831 static int cxd2841er_shutdown_to_sleep_tc(struct cxd2841er_priv *priv)
 832 {
 833         u8 data = 0;
 834 
 835         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 836         if (priv->state != STATE_SHUTDOWN) {
 837                 dev_dbg(&priv->i2c->dev, "%s(): invalid demod state %d\n",
 838                         __func__, priv->state);
 839                 return -EINVAL;
 840         }
 841         /* Set SLV-X Bank : 0x00 */
 842         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 843         /* Clear all demodulator registers */
 844         cxd2841er_write_reg(priv, I2C_SLVX, 0x02, 0x00);
 845         usleep_range(3000, 5000);
 846         /* Set SLV-X Bank : 0x00 */
 847         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
 848         /* Set demod SW reset */
 849         cxd2841er_write_reg(priv, I2C_SLVX, 0x10, 0x01);
 850   /* Select ADC clock mode */
 851         cxd2841er_write_reg(priv, I2C_SLVX, 0x13, 0x00);
 852 
 853         switch (priv->xtal) {
 854         case SONY_XTAL_20500:
 855                 data = 0x0;
 856                 break;
 857         case SONY_XTAL_24000:
 858                 /* Select demod frequency */
 859                 cxd2841er_write_reg(priv, I2C_SLVX, 0x12, 0x00);
 860                 data = 0x3;
 861                 break;
 862         case SONY_XTAL_41000:
 863                 cxd2841er_write_reg(priv, I2C_SLVX, 0x12, 0x00);
 864                 data = 0x1;
 865                 break;
 866         }
 867         cxd2841er_write_reg(priv, I2C_SLVX, 0x14, data);
 868         /* Clear demod SW reset */
 869         cxd2841er_write_reg(priv, I2C_SLVX, 0x10, 0x00);
 870         usleep_range(1000, 2000);
 871         /* Set SLV-T Bank : 0x00 */
 872         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 873         /* TADC Bias On */
 874         cxd2841er_write_reg(priv, I2C_SLVT, 0x43, 0x0a);
 875         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x0a);
 876         /* SADC Bias On */
 877         cxd2841er_write_reg(priv, I2C_SLVT, 0x63, 0x16);
 878         cxd2841er_write_reg(priv, I2C_SLVT, 0x65, 0x27);
 879         cxd2841er_write_reg(priv, I2C_SLVT, 0x69, 0x06);
 880         priv->state = STATE_SLEEP_TC;
 881         return 0;
 882 }
 883 
 884 static int cxd2841er_tune_done(struct cxd2841er_priv *priv)
 885 {
 886         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 887         /* Set SLV-T Bank : 0x00 */
 888         cxd2841er_write_reg(priv, I2C_SLVT, 0, 0);
 889         /* SW Reset */
 890         cxd2841er_write_reg(priv, I2C_SLVT, 0xfe, 0x01);
 891         /* Enable TS output */
 892         cxd2841er_write_reg(priv, I2C_SLVT, 0xc3, 0x00);
 893         return 0;
 894 }
 895 
 896 /* Set TS parallel mode */
 897 static void cxd2841er_set_ts_clock_mode(struct cxd2841er_priv *priv,
 898                                         u8 system)
 899 {
 900         u8 serial_ts, ts_rate_ctrl_off, ts_in_off;
 901 
 902         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 903         /* Set SLV-T Bank : 0x00 */
 904         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
 905         cxd2841er_read_reg(priv, I2C_SLVT, 0xc4, &serial_ts);
 906         cxd2841er_read_reg(priv, I2C_SLVT, 0xd3, &ts_rate_ctrl_off);
 907         cxd2841er_read_reg(priv, I2C_SLVT, 0xde, &ts_in_off);
 908         dev_dbg(&priv->i2c->dev, "%s(): ser_ts=0x%02x rate_ctrl_off=0x%02x in_off=0x%02x\n",
 909                 __func__, serial_ts, ts_rate_ctrl_off, ts_in_off);
 910 
 911         /*
 912          * slave    Bank    Addr    Bit    default    Name
 913          * <SLV-T>  00h     C4h     [1:0]  2'b??      OSERCKMODE
 914          */
 915         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4,
 916                 ((priv->flags & CXD2841ER_TS_SERIAL) ? 0x01 : 0x00), 0x03);
 917         /*
 918          * slave    Bank    Addr    Bit    default    Name
 919          * <SLV-T>  00h     D1h     [1:0]  2'b??      OSERDUTYMODE
 920          */
 921         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xd1,
 922                 ((priv->flags & CXD2841ER_TS_SERIAL) ? 0x01 : 0x00), 0x03);
 923         /*
 924          * slave    Bank    Addr    Bit    default    Name
 925          * <SLV-T>  00h     D9h     [7:0]  8'h08      OTSCKPERIOD
 926          */
 927         cxd2841er_write_reg(priv, I2C_SLVT, 0xd9, 0x08);
 928         /*
 929          * Disable TS IF Clock
 930          * slave    Bank    Addr    Bit    default    Name
 931          * <SLV-T>  00h     32h     [0]    1'b1       OREG_CK_TSIF_EN
 932          */
 933         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x32, 0x00, 0x01);
 934         /*
 935          * slave    Bank    Addr    Bit    default    Name
 936          * <SLV-T>  00h     33h     [1:0]  2'b01      OREG_CKSEL_TSIF
 937          */
 938         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x33,
 939                 ((priv->flags & CXD2841ER_TS_SERIAL) ? 0x01 : 0x00), 0x03);
 940         /*
 941          * Enable TS IF Clock
 942          * slave    Bank    Addr    Bit    default    Name
 943          * <SLV-T>  00h     32h     [0]    1'b1       OREG_CK_TSIF_EN
 944          */
 945         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x32, 0x01, 0x01);
 946 
 947         if (system == SYS_DVBT) {
 948                 /* Enable parity period for DVB-T */
 949                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
 950                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x66, 0x01, 0x01);
 951         } else if (system == SYS_DVBC_ANNEX_A) {
 952                 /* Enable parity period for DVB-C */
 953                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
 954                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x66, 0x01, 0x01);
 955         }
 956 }
 957 
 958 static u8 cxd2841er_chip_id(struct cxd2841er_priv *priv)
 959 {
 960         u8 chip_id = 0;
 961 
 962         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 963         if (cxd2841er_write_reg(priv, I2C_SLVT, 0, 0) == 0)
 964                 cxd2841er_read_reg(priv, I2C_SLVT, 0xfd, &chip_id);
 965         else if (cxd2841er_write_reg(priv, I2C_SLVX, 0, 0) == 0)
 966                 cxd2841er_read_reg(priv, I2C_SLVX, 0xfd, &chip_id);
 967 
 968         return chip_id;
 969 }
 970 
 971 static int cxd2841er_read_status_s(struct dvb_frontend *fe,
 972                                    enum fe_status *status)
 973 {
 974         u8 reg = 0;
 975         struct cxd2841er_priv *priv = fe->demodulator_priv;
 976 
 977         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
 978         *status = 0;
 979         if (priv->state != STATE_ACTIVE_S) {
 980                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
 981                         __func__, priv->state);
 982                 return -EINVAL;
 983         }
 984         /* Set SLV-T Bank : 0xA0 */
 985         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
 986         /*
 987          *  slave     Bank      Addr      Bit      Signal name
 988          * <SLV-T>    A0h       11h       [2]      ITSLOCK
 989          */
 990         cxd2841er_read_reg(priv, I2C_SLVT, 0x11, &reg);
 991         if (reg & 0x04) {
 992                 *status = FE_HAS_SIGNAL
 993                         | FE_HAS_CARRIER
 994                         | FE_HAS_VITERBI
 995                         | FE_HAS_SYNC
 996                         | FE_HAS_LOCK;
 997         }
 998         dev_dbg(&priv->i2c->dev, "%s(): result 0x%x\n", __func__, *status);
 999         return 0;
1000 }
1001 
1002 static int cxd2841er_read_status_t_t2(struct cxd2841er_priv *priv,
1003                                       u8 *sync, u8 *tslock, u8 *unlock)
1004 {
1005         u8 data = 0;
1006 
1007         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1008         if (priv->state != STATE_ACTIVE_TC)
1009                 return -EINVAL;
1010         if (priv->system == SYS_DVBT) {
1011                 /* Set SLV-T Bank : 0x10 */
1012                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
1013         } else {
1014                 /* Set SLV-T Bank : 0x20 */
1015                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x20);
1016         }
1017         cxd2841er_read_reg(priv, I2C_SLVT, 0x10, &data);
1018         if ((data & 0x07) == 0x07) {
1019                 dev_dbg(&priv->i2c->dev,
1020                         "%s(): invalid hardware state detected\n", __func__);
1021                 *sync = 0;
1022                 *tslock = 0;
1023                 *unlock = 0;
1024         } else {
1025                 *sync = ((data & 0x07) == 0x6 ? 1 : 0);
1026                 *tslock = ((data & 0x20) ? 1 : 0);
1027                 *unlock = ((data & 0x10) ? 1 : 0);
1028         }
1029         return 0;
1030 }
1031 
1032 static int cxd2841er_read_status_c(struct cxd2841er_priv *priv, u8 *tslock)
1033 {
1034         u8 data;
1035 
1036         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1037         if (priv->state != STATE_ACTIVE_TC)
1038                 return -EINVAL;
1039         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
1040         cxd2841er_read_reg(priv, I2C_SLVT, 0x88, &data);
1041         if ((data & 0x01) == 0) {
1042                 *tslock = 0;
1043         } else {
1044                 cxd2841er_read_reg(priv, I2C_SLVT, 0x10, &data);
1045                 *tslock = ((data & 0x20) ? 1 : 0);
1046         }
1047         return 0;
1048 }
1049 
1050 static int cxd2841er_read_status_i(struct cxd2841er_priv *priv,
1051                 u8 *sync, u8 *tslock, u8 *unlock)
1052 {
1053         u8 data = 0;
1054 
1055         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1056         if (priv->state != STATE_ACTIVE_TC)
1057                 return -EINVAL;
1058         /* Set SLV-T Bank : 0x60 */
1059         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x60);
1060         cxd2841er_read_reg(priv, I2C_SLVT, 0x10, &data);
1061         dev_dbg(&priv->i2c->dev,
1062                         "%s(): lock=0x%x\n", __func__, data);
1063         *sync = ((data & 0x02) ? 1 : 0);
1064         *tslock = ((data & 0x01) ? 1 : 0);
1065         *unlock = ((data & 0x10) ? 1 : 0);
1066         return 0;
1067 }
1068 
1069 static int cxd2841er_read_status_tc(struct dvb_frontend *fe,
1070                                     enum fe_status *status)
1071 {
1072         int ret = 0;
1073         u8 sync = 0;
1074         u8 tslock = 0;
1075         u8 unlock = 0;
1076         struct cxd2841er_priv *priv = fe->demodulator_priv;
1077 
1078         *status = 0;
1079         if (priv->state == STATE_ACTIVE_TC) {
1080                 if (priv->system == SYS_DVBT || priv->system == SYS_DVBT2) {
1081                         ret = cxd2841er_read_status_t_t2(
1082                                 priv, &sync, &tslock, &unlock);
1083                         if (ret)
1084                                 goto done;
1085                         if (unlock)
1086                                 goto done;
1087                         if (sync)
1088                                 *status = FE_HAS_SIGNAL |
1089                                         FE_HAS_CARRIER |
1090                                         FE_HAS_VITERBI |
1091                                         FE_HAS_SYNC;
1092                         if (tslock)
1093                                 *status |= FE_HAS_LOCK;
1094                 } else if (priv->system == SYS_ISDBT) {
1095                         ret = cxd2841er_read_status_i(
1096                                         priv, &sync, &tslock, &unlock);
1097                         if (ret)
1098                                 goto done;
1099                         if (unlock)
1100                                 goto done;
1101                         if (sync)
1102                                 *status = FE_HAS_SIGNAL |
1103                                         FE_HAS_CARRIER |
1104                                         FE_HAS_VITERBI |
1105                                         FE_HAS_SYNC;
1106                         if (tslock)
1107                                 *status |= FE_HAS_LOCK;
1108                 } else if (priv->system == SYS_DVBC_ANNEX_A) {
1109                         ret = cxd2841er_read_status_c(priv, &tslock);
1110                         if (ret)
1111                                 goto done;
1112                         if (tslock)
1113                                 *status = FE_HAS_SIGNAL |
1114                                         FE_HAS_CARRIER |
1115                                         FE_HAS_VITERBI |
1116                                         FE_HAS_SYNC |
1117                                         FE_HAS_LOCK;
1118                 }
1119         }
1120 done:
1121         dev_dbg(&priv->i2c->dev, "%s(): status 0x%x\n", __func__, *status);
1122         return ret;
1123 }
1124 
1125 static int cxd2841er_get_carrier_offset_s_s2(struct cxd2841er_priv *priv,
1126                                              int *offset)
1127 {
1128         u8 data[3];
1129         u8 is_hs_mode;
1130         s32 cfrl_ctrlval;
1131         s32 temp_div, temp_q, temp_r;
1132 
1133         if (priv->state != STATE_ACTIVE_S) {
1134                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1135                         __func__, priv->state);
1136                 return -EINVAL;
1137         }
1138         /*
1139          * Get High Sampling Rate mode
1140          *  slave     Bank      Addr      Bit      Signal name
1141          * <SLV-T>    A0h       10h       [0]      ITRL_LOCK
1142          */
1143         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
1144         cxd2841er_read_reg(priv, I2C_SLVT, 0x10, &data[0]);
1145         if (data[0] & 0x01) {
1146                 /*
1147                  *  slave     Bank      Addr      Bit      Signal name
1148                  * <SLV-T>    A0h       50h       [4]      IHSMODE
1149                  */
1150                 cxd2841er_read_reg(priv, I2C_SLVT, 0x50, &data[0]);
1151                 is_hs_mode = (data[0] & 0x10 ? 1 : 0);
1152         } else {
1153                 dev_dbg(&priv->i2c->dev,
1154                         "%s(): unable to detect sampling rate mode\n",
1155                         __func__);
1156                 return -EINVAL;
1157         }
1158         /*
1159          *  slave     Bank      Addr      Bit      Signal name
1160          * <SLV-T>    A0h       45h       [4:0]    ICFRL_CTRLVAL[20:16]
1161          * <SLV-T>    A0h       46h       [7:0]    ICFRL_CTRLVAL[15:8]
1162          * <SLV-T>    A0h       47h       [7:0]    ICFRL_CTRLVAL[7:0]
1163          */
1164         cxd2841er_read_regs(priv, I2C_SLVT, 0x45, data, 3);
1165         cfrl_ctrlval = sign_extend32((((u32)data[0] & 0x1F) << 16) |
1166                                 (((u32)data[1] & 0xFF) <<  8) |
1167                                 ((u32)data[2] & 0xFF), 20);
1168         temp_div = (is_hs_mode ? 1048576 : 1572864);
1169         if (cfrl_ctrlval > 0) {
1170                 temp_q = div_s64_rem(97375LL * cfrl_ctrlval,
1171                         temp_div, &temp_r);
1172         } else {
1173                 temp_q = div_s64_rem(-97375LL * cfrl_ctrlval,
1174                         temp_div, &temp_r);
1175         }
1176         if (temp_r >= temp_div / 2)
1177                 temp_q++;
1178         if (cfrl_ctrlval > 0)
1179                 temp_q *= -1;
1180         *offset = temp_q;
1181         return 0;
1182 }
1183 
1184 static int cxd2841er_get_carrier_offset_i(struct cxd2841er_priv *priv,
1185                                            u32 bandwidth, int *offset)
1186 {
1187         u8 data[4];
1188 
1189         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1190         if (priv->state != STATE_ACTIVE_TC) {
1191                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1192                         __func__, priv->state);
1193                 return -EINVAL;
1194         }
1195         if (priv->system != SYS_ISDBT) {
1196                 dev_dbg(&priv->i2c->dev, "%s(): invalid delivery system %d\n",
1197                         __func__, priv->system);
1198                 return -EINVAL;
1199         }
1200         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x60);
1201         cxd2841er_read_regs(priv, I2C_SLVT, 0x4c, data, sizeof(data));
1202         *offset = -1 * sign_extend32(
1203                 ((u32)(data[0] & 0x1F) << 24) | ((u32)data[1] << 16) |
1204                 ((u32)data[2] << 8) | (u32)data[3], 29);
1205 
1206         switch (bandwidth) {
1207         case 6000000:
1208                 *offset = -1 * ((*offset) * 8/264);
1209                 break;
1210         case 7000000:
1211                 *offset = -1 * ((*offset) * 8/231);
1212                 break;
1213         case 8000000:
1214                 *offset = -1 * ((*offset) * 8/198);
1215                 break;
1216         default:
1217                 dev_dbg(&priv->i2c->dev, "%s(): invalid bandwidth %d\n",
1218                                 __func__, bandwidth);
1219                 return -EINVAL;
1220         }
1221 
1222         dev_dbg(&priv->i2c->dev, "%s(): bandwidth %d offset %d\n",
1223                         __func__, bandwidth, *offset);
1224 
1225         return 0;
1226 }
1227 
1228 static int cxd2841er_get_carrier_offset_t(struct cxd2841er_priv *priv,
1229                                            u32 bandwidth, int *offset)
1230 {
1231         u8 data[4];
1232 
1233         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1234         if (priv->state != STATE_ACTIVE_TC) {
1235                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1236                         __func__, priv->state);
1237                 return -EINVAL;
1238         }
1239         if (priv->system != SYS_DVBT) {
1240                 dev_dbg(&priv->i2c->dev, "%s(): invalid delivery system %d\n",
1241                         __func__, priv->system);
1242                 return -EINVAL;
1243         }
1244         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
1245         cxd2841er_read_regs(priv, I2C_SLVT, 0x4c, data, sizeof(data));
1246         *offset = -1 * sign_extend32(
1247                 ((u32)(data[0] & 0x1F) << 24) | ((u32)data[1] << 16) |
1248                 ((u32)data[2] << 8) | (u32)data[3], 29);
1249         *offset *= (bandwidth / 1000000);
1250         *offset /= 235;
1251         return 0;
1252 }
1253 
1254 static int cxd2841er_get_carrier_offset_t2(struct cxd2841er_priv *priv,
1255                                            u32 bandwidth, int *offset)
1256 {
1257         u8 data[4];
1258 
1259         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1260         if (priv->state != STATE_ACTIVE_TC) {
1261                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1262                         __func__, priv->state);
1263                 return -EINVAL;
1264         }
1265         if (priv->system != SYS_DVBT2) {
1266                 dev_dbg(&priv->i2c->dev, "%s(): invalid delivery system %d\n",
1267                         __func__, priv->system);
1268                 return -EINVAL;
1269         }
1270         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x20);
1271         cxd2841er_read_regs(priv, I2C_SLVT, 0x4c, data, sizeof(data));
1272         *offset = -1 * sign_extend32(
1273                 ((u32)(data[0] & 0x0F) << 24) | ((u32)data[1] << 16) |
1274                 ((u32)data[2] << 8) | (u32)data[3], 27);
1275         switch (bandwidth) {
1276         case 1712000:
1277                 *offset /= 582;
1278                 break;
1279         case 5000000:
1280         case 6000000:
1281         case 7000000:
1282         case 8000000:
1283                 *offset *= (bandwidth / 1000000);
1284                 *offset /= 940;
1285                 break;
1286         default:
1287                 dev_dbg(&priv->i2c->dev, "%s(): invalid bandwidth %d\n",
1288                         __func__, bandwidth);
1289                 return -EINVAL;
1290         }
1291         return 0;
1292 }
1293 
1294 static int cxd2841er_get_carrier_offset_c(struct cxd2841er_priv *priv,
1295                                           int *offset)
1296 {
1297         u8 data[2];
1298 
1299         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1300         if (priv->state != STATE_ACTIVE_TC) {
1301                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1302                         __func__, priv->state);
1303                 return -EINVAL;
1304         }
1305         if (priv->system != SYS_DVBC_ANNEX_A) {
1306                 dev_dbg(&priv->i2c->dev, "%s(): invalid delivery system %d\n",
1307                         __func__, priv->system);
1308                 return -EINVAL;
1309         }
1310         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
1311         cxd2841er_read_regs(priv, I2C_SLVT, 0x15, data, sizeof(data));
1312         *offset = div_s64(41000LL * sign_extend32((((u32)data[0] & 0x3f) << 8)
1313                                                 | (u32)data[1], 13), 16384);
1314         return 0;
1315 }
1316 
1317 static int cxd2841er_read_packet_errors_c(
1318                 struct cxd2841er_priv *priv, u32 *penum)
1319 {
1320         u8 data[3];
1321 
1322         *penum = 0;
1323         if (priv->state != STATE_ACTIVE_TC) {
1324                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1325                                 __func__, priv->state);
1326                 return -EINVAL;
1327         }
1328         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
1329         cxd2841er_read_regs(priv, I2C_SLVT, 0xea, data, sizeof(data));
1330         if (data[2] & 0x01)
1331                 *penum = ((u32)data[0] << 8) | (u32)data[1];
1332         return 0;
1333 }
1334 
1335 static int cxd2841er_read_packet_errors_t(
1336                 struct cxd2841er_priv *priv, u32 *penum)
1337 {
1338         u8 data[3];
1339 
1340         *penum = 0;
1341         if (priv->state != STATE_ACTIVE_TC) {
1342                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1343                         __func__, priv->state);
1344                 return -EINVAL;
1345         }
1346         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
1347         cxd2841er_read_regs(priv, I2C_SLVT, 0xea, data, sizeof(data));
1348         if (data[2] & 0x01)
1349                 *penum = ((u32)data[0] << 8) | (u32)data[1];
1350         return 0;
1351 }
1352 
1353 static int cxd2841er_read_packet_errors_t2(
1354                 struct cxd2841er_priv *priv, u32 *penum)
1355 {
1356         u8 data[3];
1357 
1358         *penum = 0;
1359         if (priv->state != STATE_ACTIVE_TC) {
1360                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1361                         __func__, priv->state);
1362                 return -EINVAL;
1363         }
1364         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x24);
1365         cxd2841er_read_regs(priv, I2C_SLVT, 0xfd, data, sizeof(data));
1366         if (data[0] & 0x01)
1367                 *penum = ((u32)data[1] << 8) | (u32)data[2];
1368         return 0;
1369 }
1370 
1371 static int cxd2841er_read_packet_errors_i(
1372                 struct cxd2841er_priv *priv, u32 *penum)
1373 {
1374         u8 data[2];
1375 
1376         *penum = 0;
1377         if (priv->state != STATE_ACTIVE_TC) {
1378                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1379                                 __func__, priv->state);
1380                 return -EINVAL;
1381         }
1382         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x60);
1383         cxd2841er_read_regs(priv, I2C_SLVT, 0xA1, data, 1);
1384 
1385         if (!(data[0] & 0x01))
1386                 return 0;
1387 
1388         /* Layer A */
1389         cxd2841er_read_regs(priv, I2C_SLVT, 0xA2, data, sizeof(data));
1390         *penum = ((u32)data[0] << 8) | (u32)data[1];
1391 
1392         /* Layer B */
1393         cxd2841er_read_regs(priv, I2C_SLVT, 0xA4, data, sizeof(data));
1394         *penum += ((u32)data[0] << 8) | (u32)data[1];
1395 
1396         /* Layer C */
1397         cxd2841er_read_regs(priv, I2C_SLVT, 0xA6, data, sizeof(data));
1398         *penum += ((u32)data[0] << 8) | (u32)data[1];
1399 
1400         return 0;
1401 }
1402 
1403 static int cxd2841er_read_ber_c(struct cxd2841er_priv *priv,
1404                 u32 *bit_error, u32 *bit_count)
1405 {
1406         u8 data[3];
1407         u32 bit_err, period_exp;
1408 
1409         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1410         if (priv->state != STATE_ACTIVE_TC) {
1411                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1412                                 __func__, priv->state);
1413                 return -EINVAL;
1414         }
1415         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
1416         cxd2841er_read_regs(priv, I2C_SLVT, 0x62, data, sizeof(data));
1417         if (!(data[0] & 0x80)) {
1418                 dev_dbg(&priv->i2c->dev,
1419                                 "%s(): no valid BER data\n", __func__);
1420                 return -EINVAL;
1421         }
1422         bit_err = ((u32)(data[0] & 0x3f) << 16) |
1423                 ((u32)data[1] << 8) |
1424                 (u32)data[2];
1425         cxd2841er_read_reg(priv, I2C_SLVT, 0x60, data);
1426         period_exp = data[0] & 0x1f;
1427 
1428         if ((period_exp <= 11) && (bit_err > (1 << period_exp) * 204 * 8)) {
1429                 dev_dbg(&priv->i2c->dev,
1430                                 "%s(): period_exp(%u) or bit_err(%u)  not in range. no valid BER data\n",
1431                                 __func__, period_exp, bit_err);
1432                 return -EINVAL;
1433         }
1434 
1435         dev_dbg(&priv->i2c->dev,
1436                         "%s(): period_exp(%u) or bit_err(%u) count=%d\n",
1437                         __func__, period_exp, bit_err,
1438                         ((1 << period_exp) * 204 * 8));
1439 
1440         *bit_error = bit_err;
1441         *bit_count = ((1 << period_exp) * 204 * 8);
1442 
1443         return 0;
1444 }
1445 
1446 static int cxd2841er_read_ber_i(struct cxd2841er_priv *priv,
1447                 u32 *bit_error, u32 *bit_count)
1448 {
1449         u8 data[3];
1450         u8 pktnum[2];
1451 
1452         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1453         if (priv->state != STATE_ACTIVE_TC) {
1454                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
1455                                 __func__, priv->state);
1456                 return -EINVAL;
1457         }
1458 
1459         cxd2841er_freeze_regs(priv);
1460         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x60);
1461         cxd2841er_read_regs(priv, I2C_SLVT, 0x5B, pktnum, sizeof(pktnum));
1462         cxd2841er_read_regs(priv, I2C_SLVT, 0x16, data, sizeof(data));
1463         cxd2841er_unfreeze_regs(priv);
1464 
1465         if (!pktnum[0] && !pktnum[1]) {
1466                 dev_dbg(&priv->i2c->dev,
1467                                 "%s(): no valid BER data\n", __func__);
1468                 return -EINVAL;
1469         }
1470 
1471         *bit_error = ((u32)(data[0] & 0x7F) << 16) |
1472                 ((u32)data[1] << 8) | data[2];
1473         *bit_count = ((((u32)pktnum[0] << 8) | pktnum[1]) * 204 * 8);
1474         dev_dbg(&priv->i2c->dev, "%s(): bit_error=%u bit_count=%u\n",
1475                         __func__, *bit_error, *bit_count);
1476 
1477         return 0;
1478 }
1479 
1480 static int cxd2841er_mon_read_ber_s(struct cxd2841er_priv *priv,
1481                                     u32 *bit_error, u32 *bit_count)
1482 {
1483         u8 data[11];
1484 
1485         /* Set SLV-T Bank : 0xA0 */
1486         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
1487         /*
1488          *  slave     Bank      Addr      Bit      Signal name
1489          * <SLV-T>    A0h       35h       [0]      IFVBER_VALID
1490          * <SLV-T>    A0h       36h       [5:0]    IFVBER_BITERR[21:16]
1491          * <SLV-T>    A0h       37h       [7:0]    IFVBER_BITERR[15:8]
1492          * <SLV-T>    A0h       38h       [7:0]    IFVBER_BITERR[7:0]
1493          * <SLV-T>    A0h       3Dh       [5:0]    IFVBER_BITNUM[21:16]
1494          * <SLV-T>    A0h       3Eh       [7:0]    IFVBER_BITNUM[15:8]
1495          * <SLV-T>    A0h       3Fh       [7:0]    IFVBER_BITNUM[7:0]
1496          */
1497         cxd2841er_read_regs(priv, I2C_SLVT, 0x35, data, 11);
1498         if (data[0] & 0x01) {
1499                 *bit_error = ((u32)(data[1]  & 0x3F) << 16) |
1500                              ((u32)(data[2]  & 0xFF) <<  8) |
1501                              (u32)(data[3]  & 0xFF);
1502                 *bit_count = ((u32)(data[8]  & 0x3F) << 16) |
1503                              ((u32)(data[9]  & 0xFF) <<  8) |
1504                              (u32)(data[10] & 0xFF);
1505                 if ((*bit_count == 0) || (*bit_error > *bit_count)) {
1506                         dev_dbg(&priv->i2c->dev,
1507                                 "%s(): invalid bit_error %d, bit_count %d\n",
1508                                 __func__, *bit_error, *bit_count);
1509                         return -EINVAL;
1510                 }
1511                 return 0;
1512         }
1513         dev_dbg(&priv->i2c->dev, "%s(): no data available\n", __func__);
1514         return -EINVAL;
1515 }
1516 
1517 
1518 static int cxd2841er_mon_read_ber_s2(struct cxd2841er_priv *priv,
1519                                      u32 *bit_error, u32 *bit_count)
1520 {
1521         u8 data[5];
1522         u32 period;
1523 
1524         /* Set SLV-T Bank : 0xB2 */
1525         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xb2);
1526         /*
1527          *  slave     Bank      Addr      Bit      Signal name
1528          * <SLV-T>    B2h       30h       [0]      IFLBER_VALID
1529          * <SLV-T>    B2h       31h       [3:0]    IFLBER_BITERR[27:24]
1530          * <SLV-T>    B2h       32h       [7:0]    IFLBER_BITERR[23:16]
1531          * <SLV-T>    B2h       33h       [7:0]    IFLBER_BITERR[15:8]
1532          * <SLV-T>    B2h       34h       [7:0]    IFLBER_BITERR[7:0]
1533          */
1534         cxd2841er_read_regs(priv, I2C_SLVT, 0x30, data, 5);
1535         if (data[0] & 0x01) {
1536                 /* Bit error count */
1537                 *bit_error = ((u32)(data[1] & 0x0F) << 24) |
1538                              ((u32)(data[2] & 0xFF) << 16) |
1539                              ((u32)(data[3] & 0xFF) <<  8) |
1540                              (u32)(data[4] & 0xFF);
1541 
1542                 /* Set SLV-T Bank : 0xA0 */
1543                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
1544                 cxd2841er_read_reg(priv, I2C_SLVT, 0x7a, data);
1545                 /* Measurement period */
1546                 period = (u32)(1 << (data[0] & 0x0F));
1547                 if (period == 0) {
1548                         dev_dbg(&priv->i2c->dev,
1549                                 "%s(): period is 0\n", __func__);
1550                         return -EINVAL;
1551                 }
1552                 if (*bit_error > (period * 64800)) {
1553                         dev_dbg(&priv->i2c->dev,
1554                                 "%s(): invalid bit_err 0x%x period 0x%x\n",
1555                                 __func__, *bit_error, period);
1556                         return -EINVAL;
1557                 }
1558                 *bit_count = period * 64800;
1559 
1560                 return 0;
1561         } else {
1562                 dev_dbg(&priv->i2c->dev,
1563                         "%s(): no data available\n", __func__);
1564         }
1565         return -EINVAL;
1566 }
1567 
1568 static int cxd2841er_read_ber_t2(struct cxd2841er_priv *priv,
1569                                  u32 *bit_error, u32 *bit_count)
1570 {
1571         u8 data[4];
1572         u32 period_exp, n_ldpc;
1573 
1574         if (priv->state != STATE_ACTIVE_TC) {
1575                 dev_dbg(&priv->i2c->dev,
1576                         "%s(): invalid state %d\n", __func__, priv->state);
1577                 return -EINVAL;
1578         }
1579         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x20);
1580         cxd2841er_read_regs(priv, I2C_SLVT, 0x39, data, sizeof(data));
1581         if (!(data[0] & 0x10)) {
1582                 dev_dbg(&priv->i2c->dev,
1583                         "%s(): no valid BER data\n", __func__);
1584                 return -EINVAL;
1585         }
1586         *bit_error = ((u32)(data[0] & 0x0f) << 24) |
1587                      ((u32)data[1] << 16) |
1588                      ((u32)data[2] << 8) |
1589                      (u32)data[3];
1590         cxd2841er_read_reg(priv, I2C_SLVT, 0x6f, data);
1591         period_exp = data[0] & 0x0f;
1592         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x22);
1593         cxd2841er_read_reg(priv, I2C_SLVT, 0x5e, data);
1594         n_ldpc = ((data[0] & 0x03) == 0 ? 16200 : 64800);
1595         if (*bit_error > ((1U << period_exp) * n_ldpc)) {
1596                 dev_dbg(&priv->i2c->dev,
1597                         "%s(): invalid BER value\n", __func__);
1598                 return -EINVAL;
1599         }
1600 
1601         /*
1602          * FIXME: the right thing would be to return bit_error untouched,
1603          * but, as we don't know the scale returned by the counters, let's
1604          * at least preserver BER = bit_error/bit_count.
1605          */
1606         if (period_exp >= 4) {
1607                 *bit_count = (1U << (period_exp - 4)) * (n_ldpc / 200);
1608                 *bit_error *= 3125ULL;
1609         } else {
1610                 *bit_count = (1U << period_exp) * (n_ldpc / 200);
1611                 *bit_error *= 50000ULL;
1612         }
1613         return 0;
1614 }
1615 
1616 static int cxd2841er_read_ber_t(struct cxd2841er_priv *priv,
1617                                 u32 *bit_error, u32 *bit_count)
1618 {
1619         u8 data[2];
1620         u32 period;
1621 
1622         if (priv->state != STATE_ACTIVE_TC) {
1623                 dev_dbg(&priv->i2c->dev,
1624                         "%s(): invalid state %d\n", __func__, priv->state);
1625                 return -EINVAL;
1626         }
1627         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
1628         cxd2841er_read_reg(priv, I2C_SLVT, 0x39, data);
1629         if (!(data[0] & 0x01)) {
1630                 dev_dbg(&priv->i2c->dev,
1631                         "%s(): no valid BER data\n", __func__);
1632                 return 0;
1633         }
1634         cxd2841er_read_regs(priv, I2C_SLVT, 0x22, data, sizeof(data));
1635         *bit_error = ((u32)data[0] << 8) | (u32)data[1];
1636         cxd2841er_read_reg(priv, I2C_SLVT, 0x6f, data);
1637         period = ((data[0] & 0x07) == 0) ? 256 : (4096 << (data[0] & 0x07));
1638 
1639         /*
1640          * FIXME: the right thing would be to return bit_error untouched,
1641          * but, as we don't know the scale returned by the counters, let's
1642          * at least preserver BER = bit_error/bit_count.
1643          */
1644         *bit_count = period / 128;
1645         *bit_error *= 78125ULL;
1646         return 0;
1647 }
1648 
1649 static int cxd2841er_freeze_regs(struct cxd2841er_priv *priv)
1650 {
1651         /*
1652          * Freeze registers: ensure multiple separate register reads
1653          * are from the same snapshot
1654          */
1655         cxd2841er_write_reg(priv, I2C_SLVT, 0x01, 0x01);
1656         return 0;
1657 }
1658 
1659 static int cxd2841er_unfreeze_regs(struct cxd2841er_priv *priv)
1660 {
1661         /*
1662          * un-freeze registers
1663          */
1664         cxd2841er_write_reg(priv, I2C_SLVT, 0x01, 0x00);
1665         return 0;
1666 }
1667 
1668 static u32 cxd2841er_dvbs_read_snr(struct cxd2841er_priv *priv,
1669                 u8 delsys, u32 *snr)
1670 {
1671         u8 data[3];
1672         u32 res = 0, value;
1673         int min_index, max_index, index;
1674         static const struct cxd2841er_cnr_data *cn_data;
1675 
1676         cxd2841er_freeze_regs(priv);
1677         /* Set SLV-T Bank : 0xA1 */
1678         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa1);
1679         /*
1680          *  slave     Bank      Addr      Bit     Signal name
1681          * <SLV-T>    A1h       10h       [0]     ICPM_QUICKRDY
1682          * <SLV-T>    A1h       11h       [4:0]   ICPM_QUICKCNDT[12:8]
1683          * <SLV-T>    A1h       12h       [7:0]   ICPM_QUICKCNDT[7:0]
1684          */
1685         cxd2841er_read_regs(priv, I2C_SLVT, 0x10, data, 3);
1686         cxd2841er_unfreeze_regs(priv);
1687 
1688         if (data[0] & 0x01) {
1689                 value = ((u32)(data[1] & 0x1F) << 8) | (u32)(data[2] & 0xFF);
1690                 min_index = 0;
1691                 if (delsys == SYS_DVBS) {
1692                         cn_data = s_cn_data;
1693                         max_index = ARRAY_SIZE(s_cn_data) - 1;
1694                 } else {
1695                         cn_data = s2_cn_data;
1696                         max_index = ARRAY_SIZE(s2_cn_data) - 1;
1697                 }
1698                 if (value >= cn_data[min_index].value) {
1699                         res = cn_data[min_index].cnr_x1000;
1700                         goto done;
1701                 }
1702                 if (value <= cn_data[max_index].value) {
1703                         res = cn_data[max_index].cnr_x1000;
1704                         goto done;
1705                 }
1706                 while ((max_index - min_index) > 1) {
1707                         index = (max_index + min_index) / 2;
1708                         if (value == cn_data[index].value) {
1709                                 res = cn_data[index].cnr_x1000;
1710                                 goto done;
1711                         } else if (value > cn_data[index].value)
1712                                 max_index = index;
1713                         else
1714                                 min_index = index;
1715                         if ((max_index - min_index) <= 1) {
1716                                 if (value == cn_data[max_index].value) {
1717                                         res = cn_data[max_index].cnr_x1000;
1718                                         goto done;
1719                                 } else {
1720                                         res = cn_data[min_index].cnr_x1000;
1721                                         goto done;
1722                                 }
1723                         }
1724                 }
1725         } else {
1726                 dev_dbg(&priv->i2c->dev,
1727                         "%s(): no data available\n", __func__);
1728                 return -EINVAL;
1729         }
1730 done:
1731         *snr = res;
1732         return 0;
1733 }
1734 
1735 static uint32_t sony_log(uint32_t x)
1736 {
1737         return (((10000>>8)*(intlog2(x)>>16) + LOG2_E_100X/2)/LOG2_E_100X);
1738 }
1739 
1740 static int cxd2841er_read_snr_c(struct cxd2841er_priv *priv, u32 *snr)
1741 {
1742         u32 reg;
1743         u8 data[2];
1744         enum sony_dvbc_constellation_t qam = SONY_DVBC_CONSTELLATION_16QAM;
1745 
1746         *snr = 0;
1747         if (priv->state != STATE_ACTIVE_TC) {
1748                 dev_dbg(&priv->i2c->dev,
1749                                 "%s(): invalid state %d\n",
1750                                 __func__, priv->state);
1751                 return -EINVAL;
1752         }
1753 
1754         cxd2841er_freeze_regs(priv);
1755         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
1756         cxd2841er_read_regs(priv, I2C_SLVT, 0x19, data, 1);
1757         qam = (enum sony_dvbc_constellation_t) (data[0] & 0x07);
1758         cxd2841er_read_regs(priv, I2C_SLVT, 0x4C, data, 2);
1759         cxd2841er_unfreeze_regs(priv);
1760 
1761         reg = ((u32)(data[0]&0x1f) << 8) | (u32)data[1];
1762         if (reg == 0) {
1763                 dev_dbg(&priv->i2c->dev,
1764                                 "%s(): reg value out of range\n", __func__);
1765                 return 0;
1766         }
1767 
1768         switch (qam) {
1769         case SONY_DVBC_CONSTELLATION_16QAM:
1770         case SONY_DVBC_CONSTELLATION_64QAM:
1771         case SONY_DVBC_CONSTELLATION_256QAM:
1772                 /* SNR(dB) = -9.50 * ln(IREG_SNR_ESTIMATE / (24320)) */
1773                 if (reg < 126)
1774                         reg = 126;
1775                 *snr = -95 * (int32_t)sony_log(reg) + 95941;
1776                 break;
1777         case SONY_DVBC_CONSTELLATION_32QAM:
1778         case SONY_DVBC_CONSTELLATION_128QAM:
1779                 /* SNR(dB) = -8.75 * ln(IREG_SNR_ESTIMATE / (20800)) */
1780                 if (reg < 69)
1781                         reg = 69;
1782                 *snr = -88 * (int32_t)sony_log(reg) + 86999;
1783                 break;
1784         default:
1785                 return -EINVAL;
1786         }
1787 
1788         return 0;
1789 }
1790 
1791 static int cxd2841er_read_snr_t(struct cxd2841er_priv *priv, u32 *snr)
1792 {
1793         u32 reg;
1794         u8 data[2];
1795 
1796         *snr = 0;
1797         if (priv->state != STATE_ACTIVE_TC) {
1798                 dev_dbg(&priv->i2c->dev,
1799                         "%s(): invalid state %d\n", __func__, priv->state);
1800                 return -EINVAL;
1801         }
1802 
1803         cxd2841er_freeze_regs(priv);
1804         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
1805         cxd2841er_read_regs(priv, I2C_SLVT, 0x28, data, sizeof(data));
1806         cxd2841er_unfreeze_regs(priv);
1807 
1808         reg = ((u32)data[0] << 8) | (u32)data[1];
1809         if (reg == 0) {
1810                 dev_dbg(&priv->i2c->dev,
1811                         "%s(): reg value out of range\n", __func__);
1812                 return 0;
1813         }
1814         if (reg > 4996)
1815                 reg = 4996;
1816         *snr = 100 * ((INTLOG10X100(reg) - INTLOG10X100(5350 - reg)) + 285);
1817         return 0;
1818 }
1819 
1820 static int cxd2841er_read_snr_t2(struct cxd2841er_priv *priv, u32 *snr)
1821 {
1822         u32 reg;
1823         u8 data[2];
1824 
1825         *snr = 0;
1826         if (priv->state != STATE_ACTIVE_TC) {
1827                 dev_dbg(&priv->i2c->dev,
1828                         "%s(): invalid state %d\n", __func__, priv->state);
1829                 return -EINVAL;
1830         }
1831 
1832         cxd2841er_freeze_regs(priv);
1833         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x20);
1834         cxd2841er_read_regs(priv, I2C_SLVT, 0x28, data, sizeof(data));
1835         cxd2841er_unfreeze_regs(priv);
1836 
1837         reg = ((u32)data[0] << 8) | (u32)data[1];
1838         if (reg == 0) {
1839                 dev_dbg(&priv->i2c->dev,
1840                         "%s(): reg value out of range\n", __func__);
1841                 return 0;
1842         }
1843         if (reg > 10876)
1844                 reg = 10876;
1845         *snr = 100 * ((INTLOG10X100(reg) - INTLOG10X100(12600 - reg)) + 320);
1846         return 0;
1847 }
1848 
1849 static int cxd2841er_read_snr_i(struct cxd2841er_priv *priv, u32 *snr)
1850 {
1851         u32 reg;
1852         u8 data[2];
1853 
1854         *snr = 0;
1855         if (priv->state != STATE_ACTIVE_TC) {
1856                 dev_dbg(&priv->i2c->dev,
1857                                 "%s(): invalid state %d\n", __func__,
1858                                 priv->state);
1859                 return -EINVAL;
1860         }
1861 
1862         cxd2841er_freeze_regs(priv);
1863         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x60);
1864         cxd2841er_read_regs(priv, I2C_SLVT, 0x28, data, sizeof(data));
1865         cxd2841er_unfreeze_regs(priv);
1866 
1867         reg = ((u32)data[0] << 8) | (u32)data[1];
1868         if (reg == 0) {
1869                 dev_dbg(&priv->i2c->dev,
1870                                 "%s(): reg value out of range\n", __func__);
1871                 return 0;
1872         }
1873         *snr = 10000 * (intlog10(reg) >> 24) - 9031;
1874         return 0;
1875 }
1876 
1877 static u16 cxd2841er_read_agc_gain_c(struct cxd2841er_priv *priv,
1878                                         u8 delsys)
1879 {
1880         u8 data[2];
1881 
1882         cxd2841er_write_reg(
1883                 priv, I2C_SLVT, 0x00, 0x40);
1884         cxd2841er_read_regs(priv, I2C_SLVT, 0x49, data, 2);
1885         dev_dbg(&priv->i2c->dev,
1886                         "%s(): AGC value=%u\n",
1887                         __func__, (((u16)data[0] & 0x0F) << 8) |
1888                         (u16)(data[1] & 0xFF));
1889         return ((((u16)data[0] & 0x0F) << 8) | (u16)(data[1] & 0xFF)) << 4;
1890 }
1891 
1892 static u16 cxd2841er_read_agc_gain_t_t2(struct cxd2841er_priv *priv,
1893                                         u8 delsys)
1894 {
1895         u8 data[2];
1896 
1897         cxd2841er_write_reg(
1898                 priv, I2C_SLVT, 0x00, (delsys == SYS_DVBT ? 0x10 : 0x20));
1899         cxd2841er_read_regs(priv, I2C_SLVT, 0x26, data, 2);
1900         dev_dbg(&priv->i2c->dev,
1901                         "%s(): AGC value=%u\n",
1902                         __func__, (((u16)data[0] & 0x0F) << 8) |
1903                         (u16)(data[1] & 0xFF));
1904         return ((((u16)data[0] & 0x0F) << 8) | (u16)(data[1] & 0xFF)) << 4;
1905 }
1906 
1907 static u16 cxd2841er_read_agc_gain_i(struct cxd2841er_priv *priv,
1908                 u8 delsys)
1909 {
1910         u8 data[2];
1911 
1912         cxd2841er_write_reg(
1913                         priv, I2C_SLVT, 0x00, 0x60);
1914         cxd2841er_read_regs(priv, I2C_SLVT, 0x26, data, 2);
1915 
1916         dev_dbg(&priv->i2c->dev,
1917                         "%s(): AGC value=%u\n",
1918                         __func__, (((u16)data[0] & 0x0F) << 8) |
1919                         (u16)(data[1] & 0xFF));
1920         return ((((u16)data[0] & 0x0F) << 8) | (u16)(data[1] & 0xFF)) << 4;
1921 }
1922 
1923 static u16 cxd2841er_read_agc_gain_s(struct cxd2841er_priv *priv)
1924 {
1925         u8 data[2];
1926 
1927         /* Set SLV-T Bank : 0xA0 */
1928         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
1929         /*
1930          *  slave     Bank      Addr      Bit       Signal name
1931          * <SLV-T>    A0h       1Fh       [4:0]     IRFAGC_GAIN[12:8]
1932          * <SLV-T>    A0h       20h       [7:0]     IRFAGC_GAIN[7:0]
1933          */
1934         cxd2841er_read_regs(priv, I2C_SLVT, 0x1f, data, 2);
1935         return ((((u16)data[0] & 0x1F) << 8) | (u16)(data[1] & 0xFF)) << 3;
1936 }
1937 
1938 static void cxd2841er_read_ber(struct dvb_frontend *fe)
1939 {
1940         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1941         struct cxd2841er_priv *priv = fe->demodulator_priv;
1942         u32 ret, bit_error = 0, bit_count = 0;
1943 
1944         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1945         switch (p->delivery_system) {
1946         case SYS_DVBC_ANNEX_A:
1947         case SYS_DVBC_ANNEX_B:
1948         case SYS_DVBC_ANNEX_C:
1949                 ret = cxd2841er_read_ber_c(priv, &bit_error, &bit_count);
1950                 break;
1951         case SYS_ISDBT:
1952                 ret = cxd2841er_read_ber_i(priv, &bit_error, &bit_count);
1953                 break;
1954         case SYS_DVBS:
1955                 ret = cxd2841er_mon_read_ber_s(priv, &bit_error, &bit_count);
1956                 break;
1957         case SYS_DVBS2:
1958                 ret = cxd2841er_mon_read_ber_s2(priv, &bit_error, &bit_count);
1959                 break;
1960         case SYS_DVBT:
1961                 ret = cxd2841er_read_ber_t(priv, &bit_error, &bit_count);
1962                 break;
1963         case SYS_DVBT2:
1964                 ret = cxd2841er_read_ber_t2(priv, &bit_error, &bit_count);
1965                 break;
1966         default:
1967                 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1968                 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1969                 return;
1970         }
1971 
1972         if (!ret) {
1973                 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
1974                 p->post_bit_error.stat[0].uvalue += bit_error;
1975                 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
1976                 p->post_bit_count.stat[0].uvalue += bit_count;
1977         } else {
1978                 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1979                 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1980         }
1981 }
1982 
1983 static void cxd2841er_read_signal_strength(struct dvb_frontend *fe)
1984 {
1985         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1986         struct cxd2841er_priv *priv = fe->demodulator_priv;
1987         s32 strength;
1988 
1989         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
1990         switch (p->delivery_system) {
1991         case SYS_DVBT:
1992         case SYS_DVBT2:
1993                 strength = cxd2841er_read_agc_gain_t_t2(priv,
1994                                                         p->delivery_system);
1995                 p->strength.stat[0].scale = FE_SCALE_DECIBEL;
1996                 /* Formula was empirically determinated @ 410 MHz */
1997                 p->strength.stat[0].uvalue = strength * 366 / 100 - 89520;
1998                 break;  /* Code moved out of the function */
1999         case SYS_DVBC_ANNEX_A:
2000         case SYS_DVBC_ANNEX_B:
2001         case SYS_DVBC_ANNEX_C:
2002                 strength = cxd2841er_read_agc_gain_c(priv,
2003                                                         p->delivery_system);
2004                 p->strength.stat[0].scale = FE_SCALE_DECIBEL;
2005                 /*
2006                  * Formula was empirically determinated via linear regression,
2007                  * using frequencies: 175 MHz, 410 MHz and 800 MHz, and a
2008                  * stream modulated with QAM64
2009                  */
2010                 p->strength.stat[0].uvalue = strength * 4045 / 1000 - 85224;
2011                 break;
2012         case SYS_ISDBT:
2013                 strength = cxd2841er_read_agc_gain_i(priv, p->delivery_system);
2014                 p->strength.stat[0].scale = FE_SCALE_DECIBEL;
2015                 /*
2016                  * Formula was empirically determinated via linear regression,
2017                  * using frequencies: 175 MHz, 410 MHz and 800 MHz.
2018                  */
2019                 p->strength.stat[0].uvalue = strength * 3775 / 1000 - 90185;
2020                 break;
2021         case SYS_DVBS:
2022         case SYS_DVBS2:
2023                 strength = 65535 - cxd2841er_read_agc_gain_s(priv);
2024                 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
2025                 p->strength.stat[0].uvalue = strength;
2026                 break;
2027         default:
2028                 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2029                 break;
2030         }
2031 }
2032 
2033 static void cxd2841er_read_snr(struct dvb_frontend *fe)
2034 {
2035         u32 tmp = 0;
2036         int ret = 0;
2037         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
2038         struct cxd2841er_priv *priv = fe->demodulator_priv;
2039 
2040         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
2041         switch (p->delivery_system) {
2042         case SYS_DVBC_ANNEX_A:
2043         case SYS_DVBC_ANNEX_B:
2044         case SYS_DVBC_ANNEX_C:
2045                 ret = cxd2841er_read_snr_c(priv, &tmp);
2046                 break;
2047         case SYS_DVBT:
2048                 ret = cxd2841er_read_snr_t(priv, &tmp);
2049                 break;
2050         case SYS_DVBT2:
2051                 ret = cxd2841er_read_snr_t2(priv, &tmp);
2052                 break;
2053         case SYS_ISDBT:
2054                 ret = cxd2841er_read_snr_i(priv, &tmp);
2055                 break;
2056         case SYS_DVBS:
2057         case SYS_DVBS2:
2058                 ret = cxd2841er_dvbs_read_snr(priv, p->delivery_system, &tmp);
2059                 break;
2060         default:
2061                 dev_dbg(&priv->i2c->dev, "%s(): unknown delivery system %d\n",
2062                         __func__, p->delivery_system);
2063                 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2064                 return;
2065         }
2066 
2067         dev_dbg(&priv->i2c->dev, "%s(): snr=%d\n",
2068                         __func__, (int32_t)tmp);
2069 
2070         if (!ret) {
2071                 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
2072                 p->cnr.stat[0].svalue = tmp;
2073         } else {
2074                 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2075         }
2076 }
2077 
2078 static void cxd2841er_read_ucblocks(struct dvb_frontend *fe)
2079 {
2080         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
2081         struct cxd2841er_priv *priv = fe->demodulator_priv;
2082         u32 ucblocks = 0;
2083 
2084         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
2085         switch (p->delivery_system) {
2086         case SYS_DVBC_ANNEX_A:
2087         case SYS_DVBC_ANNEX_B:
2088         case SYS_DVBC_ANNEX_C:
2089                 cxd2841er_read_packet_errors_c(priv, &ucblocks);
2090                 break;
2091         case SYS_DVBT:
2092                 cxd2841er_read_packet_errors_t(priv, &ucblocks);
2093                 break;
2094         case SYS_DVBT2:
2095                 cxd2841er_read_packet_errors_t2(priv, &ucblocks);
2096                 break;
2097         case SYS_ISDBT:
2098                 cxd2841er_read_packet_errors_i(priv, &ucblocks);
2099                 break;
2100         default:
2101                 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
2102                 return;
2103         }
2104         dev_dbg(&priv->i2c->dev, "%s() ucblocks=%u\n", __func__, ucblocks);
2105 
2106         p->block_error.stat[0].scale = FE_SCALE_COUNTER;
2107         p->block_error.stat[0].uvalue = ucblocks;
2108 }
2109 
2110 static int cxd2841er_dvbt2_set_profile(
2111         struct cxd2841er_priv *priv, enum cxd2841er_dvbt2_profile_t profile)
2112 {
2113         u8 tune_mode;
2114         u8 seq_not2d_time;
2115 
2116         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
2117         switch (profile) {
2118         case DVBT2_PROFILE_BASE:
2119                 tune_mode = 0x01;
2120                 /* Set early unlock time */
2121                 seq_not2d_time = (priv->xtal == SONY_XTAL_24000)?0x0E:0x0C;
2122                 break;
2123         case DVBT2_PROFILE_LITE:
2124                 tune_mode = 0x05;
2125                 /* Set early unlock time */
2126                 seq_not2d_time = (priv->xtal == SONY_XTAL_24000)?0x2E:0x28;
2127                 break;
2128         case DVBT2_PROFILE_ANY:
2129                 tune_mode = 0x00;
2130                 /* Set early unlock time */
2131                 seq_not2d_time = (priv->xtal == SONY_XTAL_24000)?0x2E:0x28;
2132                 break;
2133         default:
2134                 return -EINVAL;
2135         }
2136         /* Set SLV-T Bank : 0x2E */
2137         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2e);
2138         /* Set profile and tune mode */
2139         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x10, tune_mode, 0x07);
2140         /* Set SLV-T Bank : 0x2B */
2141         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2b);
2142         /* Set early unlock detection time */
2143         cxd2841er_write_reg(priv, I2C_SLVT, 0x9d, seq_not2d_time);
2144         return 0;
2145 }
2146 
2147 static int cxd2841er_dvbt2_set_plp_config(struct cxd2841er_priv *priv,
2148                                           u8 is_auto, u8 plp_id)
2149 {
2150         if (is_auto) {
2151                 dev_dbg(&priv->i2c->dev,
2152                         "%s() using auto PLP selection\n", __func__);
2153         } else {
2154                 dev_dbg(&priv->i2c->dev,
2155                         "%s() using manual PLP selection, ID %d\n",
2156                         __func__, plp_id);
2157         }
2158         /* Set SLV-T Bank : 0x23 */
2159         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x23);
2160         if (!is_auto) {
2161                 /* Manual PLP selection mode. Set the data PLP Id. */
2162                 cxd2841er_write_reg(priv, I2C_SLVT, 0xaf, plp_id);
2163         }
2164         /* Auto PLP select (Scanning mode = 0x00). Data PLP select = 0x01. */
2165         cxd2841er_write_reg(priv, I2C_SLVT, 0xad, (is_auto ? 0x00 : 0x01));
2166         return 0;
2167 }
2168 
2169 static int cxd2841er_sleep_tc_to_active_t2_band(struct cxd2841er_priv *priv,
2170                                                 u32 bandwidth)
2171 {
2172         u32 iffreq, ifhz;
2173         u8 data[MAX_WRITE_REGSIZE];
2174 
2175         static const uint8_t nominalRate8bw[3][5] = {
2176                 /* TRCG Nominal Rate [37:0] */
2177                 {0x11, 0xF0, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
2178                 {0x15, 0x00, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2179                 {0x11, 0xF0, 0x00, 0x00, 0x00}  /* 41MHz XTal */
2180         };
2181 
2182         static const uint8_t nominalRate7bw[3][5] = {
2183                 /* TRCG Nominal Rate [37:0] */
2184                 {0x14, 0x80, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
2185                 {0x18, 0x00, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2186                 {0x14, 0x80, 0x00, 0x00, 0x00}  /* 41MHz XTal */
2187         };
2188 
2189         static const uint8_t nominalRate6bw[3][5] = {
2190                 /* TRCG Nominal Rate [37:0] */
2191                 {0x17, 0xEA, 0xAA, 0xAA, 0xAA}, /* 20.5MHz XTal */
2192                 {0x1C, 0x00, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2193                 {0x17, 0xEA, 0xAA, 0xAA, 0xAA}  /* 41MHz XTal */
2194         };
2195 
2196         static const uint8_t nominalRate5bw[3][5] = {
2197                 /* TRCG Nominal Rate [37:0] */
2198                 {0x1C, 0xB3, 0x33, 0x33, 0x33}, /* 20.5MHz XTal */
2199                 {0x21, 0x99, 0x99, 0x99, 0x99}, /* 24MHz XTal */
2200                 {0x1C, 0xB3, 0x33, 0x33, 0x33}  /* 41MHz XTal */
2201         };
2202 
2203         static const uint8_t nominalRate17bw[3][5] = {
2204                 /* TRCG Nominal Rate [37:0] */
2205                 {0x58, 0xE2, 0xAF, 0xE0, 0xBC}, /* 20.5MHz XTal */
2206                 {0x68, 0x0F, 0xA2, 0x32, 0xD0}, /* 24MHz XTal */
2207                 {0x58, 0xE2, 0xAF, 0xE0, 0xBC}  /* 41MHz XTal */
2208         };
2209 
2210         static const uint8_t itbCoef8bw[3][14] = {
2211                 {0x26, 0xAF, 0x06, 0xCD, 0x13, 0xBB, 0x28, 0xBA,
2212                         0x23, 0xA9, 0x1F, 0xA8, 0x2C, 0xC8}, /* 20.5MHz XTal */
2213                 {0x2F, 0xBA, 0x28, 0x9B, 0x28, 0x9D, 0x28, 0xA1,
2214                         0x29, 0xA5, 0x2A, 0xAC, 0x29, 0xB5}, /* 24MHz XTal   */
2215                 {0x26, 0xAF, 0x06, 0xCD, 0x13, 0xBB, 0x28, 0xBA,
2216                         0x23, 0xA9, 0x1F, 0xA8, 0x2C, 0xC8}  /* 41MHz XTal   */
2217         };
2218 
2219         static const uint8_t itbCoef7bw[3][14] = {
2220                 {0x2C, 0xBD, 0x02, 0xCF, 0x04, 0xF8, 0x23, 0xA6,
2221                         0x29, 0xB0, 0x26, 0xA9, 0x21, 0xA5}, /* 20.5MHz XTal */
2222                 {0x30, 0xB1, 0x29, 0x9A, 0x28, 0x9C, 0x28, 0xA0,
2223                         0x29, 0xA2, 0x2B, 0xA6, 0x2B, 0xAD}, /* 24MHz XTal   */
2224                 {0x2C, 0xBD, 0x02, 0xCF, 0x04, 0xF8, 0x23, 0xA6,
2225                         0x29, 0xB0, 0x26, 0xA9, 0x21, 0xA5}  /* 41MHz XTal   */
2226         };
2227 
2228         static const uint8_t itbCoef6bw[3][14] = {
2229                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8,
2230                         0x00, 0xCF, 0x00, 0xE6, 0x23, 0xA4}, /* 20.5MHz XTal */
2231                 {0x31, 0xA8, 0x29, 0x9B, 0x27, 0x9C, 0x28, 0x9E,
2232                         0x29, 0xA4, 0x29, 0xA2, 0x29, 0xA8}, /* 24MHz XTal   */
2233                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8,
2234                         0x00, 0xCF, 0x00, 0xE6, 0x23, 0xA4}  /* 41MHz XTal   */
2235         };
2236 
2237         static const uint8_t itbCoef5bw[3][14] = {
2238                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8,
2239                         0x00, 0xCF, 0x00, 0xE6, 0x23, 0xA4}, /* 20.5MHz XTal */
2240                 {0x31, 0xA8, 0x29, 0x9B, 0x27, 0x9C, 0x28, 0x9E,
2241                         0x29, 0xA4, 0x29, 0xA2, 0x29, 0xA8}, /* 24MHz XTal   */
2242                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8,
2243                         0x00, 0xCF, 0x00, 0xE6, 0x23, 0xA4}  /* 41MHz XTal   */
2244         };
2245 
2246         static const uint8_t itbCoef17bw[3][14] = {
2247                 {0x25, 0xA0, 0x36, 0x8D, 0x2E, 0x94, 0x28, 0x9B,
2248                         0x32, 0x90, 0x2C, 0x9D, 0x29, 0x99}, /* 20.5MHz XTal */
2249                 {0x33, 0x8E, 0x2B, 0x97, 0x2D, 0x95, 0x37, 0x8B,
2250                         0x30, 0x97, 0x2D, 0x9A, 0x21, 0xA4}, /* 24MHz XTal   */
2251                 {0x25, 0xA0, 0x36, 0x8D, 0x2E, 0x94, 0x28, 0x9B,
2252                         0x32, 0x90, 0x2C, 0x9D, 0x29, 0x99}  /* 41MHz XTal   */
2253         };
2254 
2255         /* Set SLV-T Bank : 0x20 */
2256         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x20);
2257 
2258         switch (bandwidth) {
2259         case 8000000:
2260                 /* <Timing Recovery setting> */
2261                 cxd2841er_write_regs(priv, I2C_SLVT,
2262                                 0x9F, nominalRate8bw[priv->xtal], 5);
2263 
2264                 /* Set SLV-T Bank : 0x27 */
2265                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x27);
2266                 cxd2841er_set_reg_bits(priv, I2C_SLVT,
2267                                 0x7a, 0x00, 0x0f);
2268 
2269                 /* Set SLV-T Bank : 0x10 */
2270                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2271 
2272                 /* Group delay equaliser settings for
2273                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2274                  */
2275                 if (priv->flags & CXD2841ER_ASCOT)
2276                         cxd2841er_write_regs(priv, I2C_SLVT,
2277                                 0xA6, itbCoef8bw[priv->xtal], 14);
2278                 /* <IF freq setting> */
2279                 ifhz = cxd2841er_get_if_hz(priv, 4800000);
2280                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2281                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2282                 data[1] = (u8)((iffreq >> 8) & 0xff);
2283                 data[2] = (u8)(iffreq & 0xff);
2284                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2285                 /* System bandwidth setting */
2286                 cxd2841er_set_reg_bits(
2287                                 priv, I2C_SLVT, 0xD7, 0x00, 0x07);
2288                 break;
2289         case 7000000:
2290                 /* <Timing Recovery setting> */
2291                 cxd2841er_write_regs(priv, I2C_SLVT,
2292                                 0x9F, nominalRate7bw[priv->xtal], 5);
2293 
2294                 /* Set SLV-T Bank : 0x27 */
2295                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x27);
2296                 cxd2841er_set_reg_bits(priv, I2C_SLVT,
2297                                 0x7a, 0x00, 0x0f);
2298 
2299                 /* Set SLV-T Bank : 0x10 */
2300                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2301 
2302                 /* Group delay equaliser settings for
2303                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2304                  */
2305                 if (priv->flags & CXD2841ER_ASCOT)
2306                         cxd2841er_write_regs(priv, I2C_SLVT,
2307                                 0xA6, itbCoef7bw[priv->xtal], 14);
2308                 /* <IF freq setting> */
2309                 ifhz = cxd2841er_get_if_hz(priv, 4200000);
2310                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2311                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2312                 data[1] = (u8)((iffreq >> 8) & 0xff);
2313                 data[2] = (u8)(iffreq & 0xff);
2314                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2315                 /* System bandwidth setting */
2316                 cxd2841er_set_reg_bits(
2317                                 priv, I2C_SLVT, 0xD7, 0x02, 0x07);
2318                 break;
2319         case 6000000:
2320                 /* <Timing Recovery setting> */
2321                 cxd2841er_write_regs(priv, I2C_SLVT,
2322                                 0x9F, nominalRate6bw[priv->xtal], 5);
2323 
2324                 /* Set SLV-T Bank : 0x27 */
2325                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x27);
2326                 cxd2841er_set_reg_bits(priv, I2C_SLVT,
2327                                 0x7a, 0x00, 0x0f);
2328 
2329                 /* Set SLV-T Bank : 0x10 */
2330                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2331 
2332                 /* Group delay equaliser settings for
2333                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2334                  */
2335                 if (priv->flags & CXD2841ER_ASCOT)
2336                         cxd2841er_write_regs(priv, I2C_SLVT,
2337                                 0xA6, itbCoef6bw[priv->xtal], 14);
2338                 /* <IF freq setting> */
2339                 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2340                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2341                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2342                 data[1] = (u8)((iffreq >> 8) & 0xff);
2343                 data[2] = (u8)(iffreq & 0xff);
2344                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2345                 /* System bandwidth setting */
2346                 cxd2841er_set_reg_bits(
2347                                 priv, I2C_SLVT, 0xD7, 0x04, 0x07);
2348                 break;
2349         case 5000000:
2350                 /* <Timing Recovery setting> */
2351                 cxd2841er_write_regs(priv, I2C_SLVT,
2352                                 0x9F, nominalRate5bw[priv->xtal], 5);
2353 
2354                 /* Set SLV-T Bank : 0x27 */
2355                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x27);
2356                 cxd2841er_set_reg_bits(priv, I2C_SLVT,
2357                                 0x7a, 0x00, 0x0f);
2358 
2359                 /* Set SLV-T Bank : 0x10 */
2360                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2361 
2362                 /* Group delay equaliser settings for
2363                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2364                  */
2365                 if (priv->flags & CXD2841ER_ASCOT)
2366                         cxd2841er_write_regs(priv, I2C_SLVT,
2367                                 0xA6, itbCoef5bw[priv->xtal], 14);
2368                 /* <IF freq setting> */
2369                 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2370                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2371                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2372                 data[1] = (u8)((iffreq >> 8) & 0xff);
2373                 data[2] = (u8)(iffreq & 0xff);
2374                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2375                 /* System bandwidth setting */
2376                 cxd2841er_set_reg_bits(
2377                                 priv, I2C_SLVT, 0xD7, 0x06, 0x07);
2378                 break;
2379         case 1712000:
2380                 /* <Timing Recovery setting> */
2381                 cxd2841er_write_regs(priv, I2C_SLVT,
2382                                 0x9F, nominalRate17bw[priv->xtal], 5);
2383 
2384                 /* Set SLV-T Bank : 0x27 */
2385                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x27);
2386                 cxd2841er_set_reg_bits(priv, I2C_SLVT,
2387                                 0x7a, 0x03, 0x0f);
2388 
2389                 /* Set SLV-T Bank : 0x10 */
2390                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2391 
2392                 /* Group delay equaliser settings for
2393                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2394                  */
2395                 if (priv->flags & CXD2841ER_ASCOT)
2396                         cxd2841er_write_regs(priv, I2C_SLVT,
2397                                 0xA6, itbCoef17bw[priv->xtal], 14);
2398                 /* <IF freq setting> */
2399                 ifhz = cxd2841er_get_if_hz(priv, 3500000);
2400                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2401                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2402                 data[1] = (u8)((iffreq >> 8) & 0xff);
2403                 data[2] = (u8)(iffreq & 0xff);
2404                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2405                 /* System bandwidth setting */
2406                 cxd2841er_set_reg_bits(
2407                                 priv, I2C_SLVT, 0xD7, 0x03, 0x07);
2408                 break;
2409         default:
2410                 return -EINVAL;
2411         }
2412         return 0;
2413 }
2414 
2415 static int cxd2841er_sleep_tc_to_active_t_band(
2416                 struct cxd2841er_priv *priv, u32 bandwidth)
2417 {
2418         u8 data[MAX_WRITE_REGSIZE];
2419         u32 iffreq, ifhz;
2420         static const u8 nominalRate8bw[3][5] = {
2421                 /* TRCG Nominal Rate [37:0] */
2422                 {0x11, 0xF0, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
2423                 {0x15, 0x00, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2424                 {0x11, 0xF0, 0x00, 0x00, 0x00}  /* 41MHz XTal */
2425         };
2426         static const u8 nominalRate7bw[3][5] = {
2427                 /* TRCG Nominal Rate [37:0] */
2428                 {0x14, 0x80, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
2429                 {0x18, 0x00, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2430                 {0x14, 0x80, 0x00, 0x00, 0x00}  /* 41MHz XTal */
2431         };
2432         static const u8 nominalRate6bw[3][5] = {
2433                 /* TRCG Nominal Rate [37:0] */
2434                 {0x17, 0xEA, 0xAA, 0xAA, 0xAA}, /* 20.5MHz XTal */
2435                 {0x1C, 0x00, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2436                 {0x17, 0xEA, 0xAA, 0xAA, 0xAA}  /* 41MHz XTal */
2437         };
2438         static const u8 nominalRate5bw[3][5] = {
2439                 /* TRCG Nominal Rate [37:0] */
2440                 {0x1C, 0xB3, 0x33, 0x33, 0x33}, /* 20.5MHz XTal */
2441                 {0x21, 0x99, 0x99, 0x99, 0x99}, /* 24MHz XTal */
2442                 {0x1C, 0xB3, 0x33, 0x33, 0x33}  /* 41MHz XTal */
2443         };
2444 
2445         static const u8 itbCoef8bw[3][14] = {
2446                 {0x26, 0xAF, 0x06, 0xCD, 0x13, 0xBB, 0x28, 0xBA, 0x23, 0xA9,
2447                         0x1F, 0xA8, 0x2C, 0xC8}, /* 20.5MHz XTal */
2448                 {0x2F, 0xBA, 0x28, 0x9B, 0x28, 0x9D, 0x28, 0xA1, 0x29, 0xA5,
2449                         0x2A, 0xAC, 0x29, 0xB5}, /* 24MHz XTal   */
2450                 {0x26, 0xAF, 0x06, 0xCD, 0x13, 0xBB, 0x28, 0xBA, 0x23, 0xA9,
2451                         0x1F, 0xA8, 0x2C, 0xC8}  /* 41MHz XTal   */
2452         };
2453         static const u8 itbCoef7bw[3][14] = {
2454                 {0x2C, 0xBD, 0x02, 0xCF, 0x04, 0xF8, 0x23, 0xA6, 0x29, 0xB0,
2455                         0x26, 0xA9, 0x21, 0xA5}, /* 20.5MHz XTal */
2456                 {0x30, 0xB1, 0x29, 0x9A, 0x28, 0x9C, 0x28, 0xA0, 0x29, 0xA2,
2457                         0x2B, 0xA6, 0x2B, 0xAD}, /* 24MHz XTal   */
2458                 {0x2C, 0xBD, 0x02, 0xCF, 0x04, 0xF8, 0x23, 0xA6, 0x29, 0xB0,
2459                         0x26, 0xA9, 0x21, 0xA5}  /* 41MHz XTal   */
2460         };
2461         static const u8 itbCoef6bw[3][14] = {
2462                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8, 0x00, 0xCF,
2463                         0x00, 0xE6, 0x23, 0xA4}, /* 20.5MHz XTal */
2464                 {0x31, 0xA8, 0x29, 0x9B, 0x27, 0x9C, 0x28, 0x9E, 0x29, 0xA4,
2465                         0x29, 0xA2, 0x29, 0xA8}, /* 24MHz XTal   */
2466                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8, 0x00, 0xCF,
2467                         0x00, 0xE6, 0x23, 0xA4}  /* 41MHz XTal   */
2468         };
2469         static const u8 itbCoef5bw[3][14] = {
2470                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8, 0x00, 0xCF,
2471                         0x00, 0xE6, 0x23, 0xA4}, /* 20.5MHz XTal */
2472                 {0x31, 0xA8, 0x29, 0x9B, 0x27, 0x9C, 0x28, 0x9E, 0x29, 0xA4,
2473                         0x29, 0xA2, 0x29, 0xA8}, /* 24MHz XTal   */
2474                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8, 0x00, 0xCF,
2475                         0x00, 0xE6, 0x23, 0xA4}  /* 41MHz XTal   */
2476         };
2477 
2478         /* Set SLV-T Bank : 0x13 */
2479         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x13);
2480         /* Echo performance optimization setting */
2481         data[0] = 0x01;
2482         data[1] = 0x14;
2483         cxd2841er_write_regs(priv, I2C_SLVT, 0x9C, data, 2);
2484 
2485         /* Set SLV-T Bank : 0x10 */
2486         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2487 
2488         switch (bandwidth) {
2489         case 8000000:
2490                 /* <Timing Recovery setting> */
2491                 cxd2841er_write_regs(priv, I2C_SLVT,
2492                                 0x9F, nominalRate8bw[priv->xtal], 5);
2493                 /* Group delay equaliser settings for
2494                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2495                 */
2496                 if (priv->flags & CXD2841ER_ASCOT)
2497                         cxd2841er_write_regs(priv, I2C_SLVT,
2498                                 0xA6, itbCoef8bw[priv->xtal], 14);
2499                 /* <IF freq setting> */
2500                 ifhz = cxd2841er_get_if_hz(priv, 4800000);
2501                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2502                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2503                 data[1] = (u8)((iffreq >> 8) & 0xff);
2504                 data[2] = (u8)(iffreq & 0xff);
2505                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2506                 /* System bandwidth setting */
2507                 cxd2841er_set_reg_bits(
2508                         priv, I2C_SLVT, 0xD7, 0x00, 0x07);
2509 
2510                 /* Demod core latency setting */
2511                 if (priv->xtal == SONY_XTAL_24000) {
2512                         data[0] = 0x15;
2513                         data[1] = 0x28;
2514                 } else {
2515                         data[0] = 0x01;
2516                         data[1] = 0xE0;
2517                 }
2518                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
2519 
2520                 /* Notch filter setting */
2521                 data[0] = 0x01;
2522                 data[1] = 0x02;
2523                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x17);
2524                 cxd2841er_write_regs(priv, I2C_SLVT, 0x38, data, 2);
2525                 break;
2526         case 7000000:
2527                 /* <Timing Recovery setting> */
2528                 cxd2841er_write_regs(priv, I2C_SLVT,
2529                                 0x9F, nominalRate7bw[priv->xtal], 5);
2530                 /* Group delay equaliser settings for
2531                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2532                 */
2533                 if (priv->flags & CXD2841ER_ASCOT)
2534                         cxd2841er_write_regs(priv, I2C_SLVT,
2535                                 0xA6, itbCoef7bw[priv->xtal], 14);
2536                 /* <IF freq setting> */
2537                 ifhz = cxd2841er_get_if_hz(priv, 4200000);
2538                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2539                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2540                 data[1] = (u8)((iffreq >> 8) & 0xff);
2541                 data[2] = (u8)(iffreq & 0xff);
2542                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2543                 /* System bandwidth setting */
2544                 cxd2841er_set_reg_bits(
2545                         priv, I2C_SLVT, 0xD7, 0x02, 0x07);
2546 
2547                 /* Demod core latency setting */
2548                 if (priv->xtal == SONY_XTAL_24000) {
2549                         data[0] = 0x1F;
2550                         data[1] = 0xF8;
2551                 } else {
2552                         data[0] = 0x12;
2553                         data[1] = 0xF8;
2554                 }
2555                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
2556 
2557                 /* Notch filter setting */
2558                 data[0] = 0x00;
2559                 data[1] = 0x03;
2560                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x17);
2561                 cxd2841er_write_regs(priv, I2C_SLVT, 0x38, data, 2);
2562                 break;
2563         case 6000000:
2564                 /* <Timing Recovery setting> */
2565                 cxd2841er_write_regs(priv, I2C_SLVT,
2566                                 0x9F, nominalRate6bw[priv->xtal], 5);
2567                 /* Group delay equaliser settings for
2568                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2569                 */
2570                 if (priv->flags & CXD2841ER_ASCOT)
2571                         cxd2841er_write_regs(priv, I2C_SLVT,
2572                                 0xA6, itbCoef6bw[priv->xtal], 14);
2573                 /* <IF freq setting> */
2574                 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2575                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2576                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2577                 data[1] = (u8)((iffreq >> 8) & 0xff);
2578                 data[2] = (u8)(iffreq & 0xff);
2579                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2580                 /* System bandwidth setting */
2581                 cxd2841er_set_reg_bits(
2582                         priv, I2C_SLVT, 0xD7, 0x04, 0x07);
2583 
2584                 /* Demod core latency setting */
2585                 if (priv->xtal == SONY_XTAL_24000) {
2586                         data[0] = 0x25;
2587                         data[1] = 0x4C;
2588                 } else {
2589                         data[0] = 0x1F;
2590                         data[1] = 0xDC;
2591                 }
2592                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
2593 
2594                 /* Notch filter setting */
2595                 data[0] = 0x00;
2596                 data[1] = 0x03;
2597                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x17);
2598                 cxd2841er_write_regs(priv, I2C_SLVT, 0x38, data, 2);
2599                 break;
2600         case 5000000:
2601                 /* <Timing Recovery setting> */
2602                 cxd2841er_write_regs(priv, I2C_SLVT,
2603                                 0x9F, nominalRate5bw[priv->xtal], 5);
2604                 /* Group delay equaliser settings for
2605                  * ASCOT2D, ASCOT2E and ASCOT3 tuners
2606                 */
2607                 if (priv->flags & CXD2841ER_ASCOT)
2608                         cxd2841er_write_regs(priv, I2C_SLVT,
2609                                 0xA6, itbCoef5bw[priv->xtal], 14);
2610                 /* <IF freq setting> */
2611                 ifhz = cxd2841er_get_if_hz(priv, 3600000);
2612                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2613                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2614                 data[1] = (u8)((iffreq >> 8) & 0xff);
2615                 data[2] = (u8)(iffreq & 0xff);
2616                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2617                 /* System bandwidth setting */
2618                 cxd2841er_set_reg_bits(
2619                         priv, I2C_SLVT, 0xD7, 0x06, 0x07);
2620 
2621                 /* Demod core latency setting */
2622                 if (priv->xtal == SONY_XTAL_24000) {
2623                         data[0] = 0x2C;
2624                         data[1] = 0xC2;
2625                 } else {
2626                         data[0] = 0x26;
2627                         data[1] = 0x3C;
2628                 }
2629                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
2630 
2631                 /* Notch filter setting */
2632                 data[0] = 0x00;
2633                 data[1] = 0x03;
2634                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x17);
2635                 cxd2841er_write_regs(priv, I2C_SLVT, 0x38, data, 2);
2636                 break;
2637         }
2638 
2639         return 0;
2640 }
2641 
2642 static int cxd2841er_sleep_tc_to_active_i_band(
2643                 struct cxd2841er_priv *priv, u32 bandwidth)
2644 {
2645         u32 iffreq, ifhz;
2646         u8 data[3];
2647 
2648         /* TRCG Nominal Rate */
2649         static const u8 nominalRate8bw[3][5] = {
2650                 {0x00, 0x00, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
2651                 {0x11, 0xB8, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2652                 {0x00, 0x00, 0x00, 0x00, 0x00}  /* 41MHz XTal */
2653         };
2654 
2655         static const u8 nominalRate7bw[3][5] = {
2656                 {0x00, 0x00, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
2657                 {0x14, 0x40, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2658                 {0x00, 0x00, 0x00, 0x00, 0x00}  /* 41MHz XTal */
2659         };
2660 
2661         static const u8 nominalRate6bw[3][5] = {
2662                 {0x14, 0x2E, 0x00, 0x00, 0x00}, /* 20.5MHz XTal */
2663                 {0x17, 0xA0, 0x00, 0x00, 0x00}, /* 24MHz XTal */
2664                 {0x14, 0x2E, 0x00, 0x00, 0x00}  /* 41MHz XTal */
2665         };
2666 
2667         static const u8 itbCoef8bw[3][14] = {
2668                 {0x00}, /* 20.5MHz XTal */
2669                 {0x2F, 0xBA, 0x28, 0x9B, 0x28, 0x9D, 0x28, 0xA1, 0x29,
2670                         0xA5, 0x2A, 0xAC, 0x29, 0xB5}, /* 24MHz Xtal */
2671                 {0x0}, /* 41MHz XTal   */
2672         };
2673 
2674         static const u8 itbCoef7bw[3][14] = {
2675                 {0x00}, /* 20.5MHz XTal */
2676                 {0x30, 0xB1, 0x29, 0x9A, 0x28, 0x9C, 0x28, 0xA0, 0x29,
2677                         0xA2, 0x2B, 0xA6, 0x2B, 0xAD}, /* 24MHz Xtal */
2678                 {0x00}, /* 41MHz XTal   */
2679         };
2680 
2681         static const u8 itbCoef6bw[3][14] = {
2682                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8, 0x00,
2683                         0xCF, 0x00, 0xE6, 0x23, 0xA4}, /* 20.5MHz XTal */
2684                 {0x31, 0xA8, 0x29, 0x9B, 0x27, 0x9C, 0x28, 0x9E, 0x29,
2685                         0xA4, 0x29, 0xA2, 0x29, 0xA8}, /* 24MHz Xtal   */
2686                 {0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8, 0x00,
2687                         0xCF, 0x00, 0xE6, 0x23, 0xA4}, /* 41MHz XTal   */
2688         };
2689 
2690         dev_dbg(&priv->i2c->dev, "%s() bandwidth=%u\n", __func__, bandwidth);
2691         /* Set SLV-T Bank : 0x10 */
2692         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2693 
2694         /*  20.5/41MHz Xtal support is not available
2695          *  on ISDB-T 7MHzBW and 8MHzBW
2696         */
2697         if (priv->xtal != SONY_XTAL_24000 && bandwidth > 6000000) {
2698                 dev_err(&priv->i2c->dev,
2699                         "%s(): bandwidth %d supported only for 24MHz xtal\n",
2700                         __func__, bandwidth);
2701                 return -EINVAL;
2702         }
2703 
2704         switch (bandwidth) {
2705         case 8000000:
2706                 /* TRCG Nominal Rate */
2707                 cxd2841er_write_regs(priv, I2C_SLVT,
2708                                 0x9F, nominalRate8bw[priv->xtal], 5);
2709                 /*  Group delay equaliser settings for ASCOT tuners optimized */
2710                 if (priv->flags & CXD2841ER_ASCOT)
2711                         cxd2841er_write_regs(priv, I2C_SLVT,
2712                                 0xA6, itbCoef8bw[priv->xtal], 14);
2713 
2714                 /* IF freq setting */
2715                 ifhz = cxd2841er_get_if_hz(priv, 4750000);
2716                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2717                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2718                 data[1] = (u8)((iffreq >> 8) & 0xff);
2719                 data[2] = (u8)(iffreq & 0xff);
2720                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2721 
2722                 /* System bandwidth setting */
2723                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xd7, 0x0, 0x7);
2724 
2725                 /* Demod core latency setting */
2726                 data[0] = 0x13;
2727                 data[1] = 0xFC;
2728                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
2729 
2730                 /* Acquisition optimization setting */
2731                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x12);
2732                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x71, 0x03, 0x07);
2733                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x15);
2734                 cxd2841er_write_reg(priv, I2C_SLVT, 0xBE, 0x03);
2735                 break;
2736         case 7000000:
2737                 /* TRCG Nominal Rate */
2738                 cxd2841er_write_regs(priv, I2C_SLVT,
2739                                 0x9F, nominalRate7bw[priv->xtal], 5);
2740                 /*  Group delay equaliser settings for ASCOT tuners optimized */
2741                 if (priv->flags & CXD2841ER_ASCOT)
2742                         cxd2841er_write_regs(priv, I2C_SLVT,
2743                                 0xA6, itbCoef7bw[priv->xtal], 14);
2744 
2745                 /* IF freq setting */
2746                 ifhz = cxd2841er_get_if_hz(priv, 4150000);
2747                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2748                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2749                 data[1] = (u8)((iffreq >> 8) & 0xff);
2750                 data[2] = (u8)(iffreq & 0xff);
2751                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2752 
2753                 /* System bandwidth setting */
2754                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xd7, 0x02, 0x7);
2755 
2756                 /* Demod core latency setting */
2757                 data[0] = 0x1A;
2758                 data[1] = 0xFA;
2759                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
2760 
2761                 /* Acquisition optimization setting */
2762                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x12);
2763                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x71, 0x03, 0x07);
2764                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x15);
2765                 cxd2841er_write_reg(priv, I2C_SLVT, 0xBE, 0x02);
2766                 break;
2767         case 6000000:
2768                 /* TRCG Nominal Rate */
2769                 cxd2841er_write_regs(priv, I2C_SLVT,
2770                                 0x9F, nominalRate6bw[priv->xtal], 5);
2771                 /*  Group delay equaliser settings for ASCOT tuners optimized */
2772                 if (priv->flags & CXD2841ER_ASCOT)
2773                         cxd2841er_write_regs(priv, I2C_SLVT,
2774                                 0xA6, itbCoef6bw[priv->xtal], 14);
2775 
2776                 /* IF freq setting */
2777                 ifhz = cxd2841er_get_if_hz(priv, 3550000);
2778                 iffreq = cxd2841er_calc_iffreq_xtal(priv->xtal, ifhz);
2779                 data[0] = (u8) ((iffreq >> 16) & 0xff);
2780                 data[1] = (u8)((iffreq >> 8) & 0xff);
2781                 data[2] = (u8)(iffreq & 0xff);
2782                 cxd2841er_write_regs(priv, I2C_SLVT, 0xB6, data, 3);
2783 
2784                 /* System bandwidth setting */
2785                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xd7, 0x04, 0x7);
2786 
2787                 /* Demod core latency setting */
2788                 if (priv->xtal == SONY_XTAL_24000) {
2789                         data[0] = 0x1F;
2790                         data[1] = 0x79;
2791                 } else {
2792                         data[0] = 0x1A;
2793                         data[1] = 0xE2;
2794                 }
2795                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
2796 
2797                 /* Acquisition optimization setting */
2798                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x12);
2799                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x71, 0x07, 0x07);
2800                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x15);
2801                 cxd2841er_write_reg(priv, I2C_SLVT, 0xBE, 0x02);
2802                 break;
2803         default:
2804                 dev_dbg(&priv->i2c->dev, "%s(): invalid bandwidth %d\n",
2805                                 __func__, bandwidth);
2806                 return -EINVAL;
2807         }
2808         return 0;
2809 }
2810 
2811 static int cxd2841er_sleep_tc_to_active_c_band(struct cxd2841er_priv *priv,
2812                                                u32 bandwidth)
2813 {
2814         u8 bw7_8mhz_b10_a6[] = {
2815                 0x2D, 0xC7, 0x04, 0xF4, 0x07, 0xC5, 0x2A, 0xB8,
2816                 0x27, 0x9E, 0x27, 0xA4, 0x29, 0xAB };
2817         u8 bw6mhz_b10_a6[] = {
2818                 0x27, 0xA7, 0x28, 0xB3, 0x02, 0xF0, 0x01, 0xE8,
2819                 0x00, 0xCF, 0x00, 0xE6, 0x23, 0xA4 };
2820         u8 b10_b6[3];
2821         u32 iffreq, ifhz;
2822 
2823         if (bandwidth != 6000000 &&
2824                         bandwidth != 7000000 &&
2825                         bandwidth != 8000000) {
2826                 dev_info(&priv->i2c->dev, "%s(): unsupported bandwidth %d. Forcing 8Mhz!\n",
2827                                 __func__, bandwidth);
2828                 bandwidth = 8000000;
2829         }
2830 
2831         dev_dbg(&priv->i2c->dev, "%s() bw=%d\n", __func__, bandwidth);
2832         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2833         switch (bandwidth) {
2834         case 8000000:
2835         case 7000000:
2836                 if (priv->flags & CXD2841ER_ASCOT)
2837                         cxd2841er_write_regs(
2838                                 priv, I2C_SLVT, 0xa6,
2839                                 bw7_8mhz_b10_a6, sizeof(bw7_8mhz_b10_a6));
2840                 ifhz = cxd2841er_get_if_hz(priv, 4900000);
2841                 iffreq = cxd2841er_calc_iffreq(ifhz);
2842                 break;
2843         case 6000000:
2844                 if (priv->flags & CXD2841ER_ASCOT)
2845                         cxd2841er_write_regs(
2846                                 priv, I2C_SLVT, 0xa6,
2847                                 bw6mhz_b10_a6, sizeof(bw6mhz_b10_a6));
2848                 ifhz = cxd2841er_get_if_hz(priv, 3700000);
2849                 iffreq = cxd2841er_calc_iffreq(ifhz);
2850                 break;
2851         default:
2852                 dev_err(&priv->i2c->dev, "%s(): unsupported bandwidth %d\n",
2853                         __func__, bandwidth);
2854                 return -EINVAL;
2855         }
2856         /* <IF freq setting> */
2857         b10_b6[0] = (u8) ((iffreq >> 16) & 0xff);
2858         b10_b6[1] = (u8)((iffreq >> 8) & 0xff);
2859         b10_b6[2] = (u8)(iffreq & 0xff);
2860         cxd2841er_write_regs(priv, I2C_SLVT, 0xb6, b10_b6, sizeof(b10_b6));
2861         /* Set SLV-T Bank : 0x11 */
2862         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x11);
2863         switch (bandwidth) {
2864         case 8000000:
2865         case 7000000:
2866                 cxd2841er_set_reg_bits(
2867                         priv, I2C_SLVT, 0xa3, 0x00, 0x1f);
2868                 break;
2869         case 6000000:
2870                 cxd2841er_set_reg_bits(
2871                         priv, I2C_SLVT, 0xa3, 0x14, 0x1f);
2872                 break;
2873         }
2874         /* Set SLV-T Bank : 0x40 */
2875         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
2876         switch (bandwidth) {
2877         case 8000000:
2878                 cxd2841er_set_reg_bits(
2879                         priv, I2C_SLVT, 0x26, 0x0b, 0x0f);
2880                 cxd2841er_write_reg(priv, I2C_SLVT,  0x27, 0x3e);
2881                 break;
2882         case 7000000:
2883                 cxd2841er_set_reg_bits(
2884                         priv, I2C_SLVT, 0x26, 0x09, 0x0f);
2885                 cxd2841er_write_reg(priv, I2C_SLVT,  0x27, 0xd6);
2886                 break;
2887         case 6000000:
2888                 cxd2841er_set_reg_bits(
2889                         priv, I2C_SLVT, 0x26, 0x08, 0x0f);
2890                 cxd2841er_write_reg(priv, I2C_SLVT,  0x27, 0x6e);
2891                 break;
2892         }
2893         return 0;
2894 }
2895 
2896 static int cxd2841er_sleep_tc_to_active_t(struct cxd2841er_priv *priv,
2897                                           u32 bandwidth)
2898 {
2899         u8 data[2] = { 0x09, 0x54 };
2900         u8 data24m[3] = {0xDC, 0x6C, 0x00};
2901 
2902         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
2903         cxd2841er_set_ts_clock_mode(priv, SYS_DVBT);
2904         /* Set SLV-X Bank : 0x00 */
2905         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
2906         /* Set demod mode */
2907         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, 0x01);
2908         /* Set SLV-T Bank : 0x00 */
2909         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
2910         /* Enable demod clock */
2911         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x01);
2912         /* Disable RF level monitor */
2913         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x00);
2914         /* Enable ADC clock */
2915         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
2916         /* Enable ADC 1 */
2917         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x1a);
2918         /* Enable ADC 2 & 3 */
2919         if (priv->xtal == SONY_XTAL_41000) {
2920                 data[0] = 0x0A;
2921                 data[1] = 0xD4;
2922         }
2923         cxd2841er_write_regs(priv, I2C_SLVT, 0x43, data, 2);
2924         /* Enable ADC 4 */
2925         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x00);
2926         /* Set SLV-T Bank : 0x10 */
2927         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2928         /* IFAGC gain settings */
2929         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xd2, 0x0c, 0x1f);
2930         /* Set SLV-T Bank : 0x11 */
2931         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x11);
2932         /* BBAGC TARGET level setting */
2933         cxd2841er_write_reg(priv, I2C_SLVT, 0x6a, 0x50);
2934         /* Set SLV-T Bank : 0x10 */
2935         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2936         /* ASCOT setting */
2937         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xa5,
2938                 ((priv->flags & CXD2841ER_ASCOT) ? 0x01 : 0x00), 0x01);
2939         /* Set SLV-T Bank : 0x18 */
2940         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x18);
2941         /* Pre-RS BER monitor setting */
2942         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x36, 0x40, 0x07);
2943         /* FEC Auto Recovery setting */
2944         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x30, 0x01, 0x01);
2945         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x31, 0x01, 0x01);
2946         /* Set SLV-T Bank : 0x00 */
2947         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
2948         /* TSIF setting */
2949         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xce, 0x01, 0x01);
2950         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xcf, 0x01, 0x01);
2951 
2952         if (priv->xtal == SONY_XTAL_24000) {
2953                 /* Set SLV-T Bank : 0x10 */
2954                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
2955                 cxd2841er_write_reg(priv, I2C_SLVT, 0xBF, 0x60);
2956                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x18);
2957                 cxd2841er_write_regs(priv, I2C_SLVT, 0x24, data24m, 3);
2958         }
2959 
2960         cxd2841er_sleep_tc_to_active_t_band(priv, bandwidth);
2961         /* Set SLV-T Bank : 0x00 */
2962         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
2963         /* Disable HiZ Setting 1 */
2964         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x28);
2965         /* Disable HiZ Setting 2 */
2966         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0x00);
2967         priv->state = STATE_ACTIVE_TC;
2968         return 0;
2969 }
2970 
2971 static int cxd2841er_sleep_tc_to_active_t2(struct cxd2841er_priv *priv,
2972                                            u32 bandwidth)
2973 {
2974         u8 data[MAX_WRITE_REGSIZE];
2975 
2976         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
2977         cxd2841er_set_ts_clock_mode(priv, SYS_DVBT2);
2978         /* Set SLV-X Bank : 0x00 */
2979         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
2980         /* Set demod mode */
2981         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, 0x02);
2982         /* Set SLV-T Bank : 0x00 */
2983         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
2984         /* Enable demod clock */
2985         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x01);
2986         /* Disable RF level monitor */
2987         cxd2841er_write_reg(priv, I2C_SLVT, 0x59, 0x00);
2988         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x00);
2989         /* Enable ADC clock */
2990         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
2991         /* Enable ADC 1 */
2992         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x1a);
2993 
2994         if (priv->xtal == SONY_XTAL_41000) {
2995                 data[0] = 0x0A;
2996                 data[1] = 0xD4;
2997         } else {
2998                 data[0] = 0x09;
2999                 data[1] = 0x54;
3000         }
3001 
3002         cxd2841er_write_regs(priv, I2C_SLVT, 0x43, data, 2);
3003         /* Enable ADC 4 */
3004         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x00);
3005         /* Set SLV-T Bank : 0x10 */
3006         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
3007         /* IFAGC gain settings */
3008         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xd2, 0x0c, 0x1f);
3009         /* Set SLV-T Bank : 0x11 */
3010         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x11);
3011         /* BBAGC TARGET level setting */
3012         cxd2841er_write_reg(priv, I2C_SLVT, 0x6a, 0x50);
3013         /* Set SLV-T Bank : 0x10 */
3014         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
3015         /* ASCOT setting */
3016         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xa5,
3017                 ((priv->flags & CXD2841ER_ASCOT) ? 0x01 : 0x00), 0x01);
3018         /* Set SLV-T Bank : 0x20 */
3019         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x20);
3020         /* Acquisition optimization setting */
3021         cxd2841er_write_reg(priv, I2C_SLVT, 0x8b, 0x3c);
3022         /* Set SLV-T Bank : 0x2b */
3023         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2b);
3024         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x76, 0x20, 0x70);
3025         /* Set SLV-T Bank : 0x23 */
3026         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x23);
3027         /* L1 Control setting */
3028         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xE6, 0x00, 0x03);
3029         /* Set SLV-T Bank : 0x00 */
3030         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3031         /* TSIF setting */
3032         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xce, 0x01, 0x01);
3033         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xcf, 0x01, 0x01);
3034         /* DVB-T2 initial setting */
3035         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x13);
3036         cxd2841er_write_reg(priv, I2C_SLVT, 0x83, 0x10);
3037         cxd2841er_write_reg(priv, I2C_SLVT, 0x86, 0x34);
3038         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x9e, 0x09, 0x0f);
3039         cxd2841er_write_reg(priv, I2C_SLVT, 0x9f, 0xd8);
3040         /* Set SLV-T Bank : 0x2a */
3041         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2a);
3042         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x38, 0x04, 0x0f);
3043         /* Set SLV-T Bank : 0x2b */
3044         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2b);
3045         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x11, 0x20, 0x3f);
3046 
3047         /* 24MHz Xtal setting */
3048         if (priv->xtal == SONY_XTAL_24000) {
3049                 /* Set SLV-T Bank : 0x11 */
3050                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x11);
3051                 data[0] = 0xEB;
3052                 data[1] = 0x03;
3053                 data[2] = 0x3B;
3054                 cxd2841er_write_regs(priv, I2C_SLVT, 0x33, data, 3);
3055 
3056                 /* Set SLV-T Bank : 0x20 */
3057                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x20);
3058                 data[0] = 0x5E;
3059                 data[1] = 0x5E;
3060                 data[2] = 0x47;
3061                 cxd2841er_write_regs(priv, I2C_SLVT, 0x95, data, 3);
3062 
3063                 cxd2841er_write_reg(priv, I2C_SLVT, 0x99, 0x18);
3064 
3065                 data[0] = 0x3F;
3066                 data[1] = 0xFF;
3067                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD9, data, 2);
3068 
3069                 /* Set SLV-T Bank : 0x24 */
3070                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x24);
3071                 data[0] = 0x0B;
3072                 data[1] = 0x72;
3073                 cxd2841er_write_regs(priv, I2C_SLVT, 0x34, data, 2);
3074 
3075                 data[0] = 0x93;
3076                 data[1] = 0xF3;
3077                 data[2] = 0x00;
3078                 cxd2841er_write_regs(priv, I2C_SLVT, 0xD2, data, 3);
3079 
3080                 data[0] = 0x05;
3081                 data[1] = 0xB8;
3082                 data[2] = 0xD8;
3083                 cxd2841er_write_regs(priv, I2C_SLVT, 0xDD, data, 3);
3084 
3085                 cxd2841er_write_reg(priv, I2C_SLVT, 0xE0, 0x00);
3086 
3087                 /* Set SLV-T Bank : 0x25 */
3088                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x25);
3089                 cxd2841er_write_reg(priv, I2C_SLVT, 0xED, 0x60);
3090 
3091                 /* Set SLV-T Bank : 0x27 */
3092                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x27);
3093                 cxd2841er_write_reg(priv, I2C_SLVT, 0xFA, 0x34);
3094 
3095                 /* Set SLV-T Bank : 0x2B */
3096                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2B);
3097                 cxd2841er_write_reg(priv, I2C_SLVT, 0x4B, 0x2F);
3098                 cxd2841er_write_reg(priv, I2C_SLVT, 0x9E, 0x0E);
3099 
3100                 /* Set SLV-T Bank : 0x2D */
3101                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x2D);
3102                 data[0] = 0x89;
3103                 data[1] = 0x89;
3104                 cxd2841er_write_regs(priv, I2C_SLVT, 0x24, data, 2);
3105 
3106                 /* Set SLV-T Bank : 0x5E */
3107                 cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x5E);
3108                 data[0] = 0x24;
3109                 data[1] = 0x95;
3110                 cxd2841er_write_regs(priv, I2C_SLVT, 0x8C, data, 2);
3111         }
3112 
3113         cxd2841er_sleep_tc_to_active_t2_band(priv, bandwidth);
3114 
3115         /* Set SLV-T Bank : 0x00 */
3116         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3117         /* Disable HiZ Setting 1 */
3118         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x28);
3119         /* Disable HiZ Setting 2 */
3120         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0x00);
3121         priv->state = STATE_ACTIVE_TC;
3122         return 0;
3123 }
3124 
3125 /* ISDB-Tb part */
3126 static int cxd2841er_sleep_tc_to_active_i(struct cxd2841er_priv *priv,
3127                 u32 bandwidth)
3128 {
3129         u8 data[2] = { 0x09, 0x54 };
3130         u8 data24m[2] = {0x60, 0x00};
3131         u8 data24m2[3] = {0xB7, 0x1B, 0x00};
3132 
3133         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3134         cxd2841er_set_ts_clock_mode(priv, SYS_DVBT);
3135         /* Set SLV-X Bank : 0x00 */
3136         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
3137         /* Set demod mode */
3138         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, 0x06);
3139         /* Set SLV-T Bank : 0x00 */
3140         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3141         /* Enable demod clock */
3142         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x01);
3143         /* Enable RF level monitor */
3144         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x01);
3145         cxd2841er_write_reg(priv, I2C_SLVT, 0x59, 0x01);
3146         /* Enable ADC clock */
3147         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
3148         /* Enable ADC 1 */
3149         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x1a);
3150         /* xtal freq 20.5MHz or 24M */
3151         cxd2841er_write_regs(priv, I2C_SLVT, 0x43, data, 2);
3152         /* Enable ADC 4 */
3153         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x00);
3154         /* ASCOT setting */
3155         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xa5,
3156                 ((priv->flags & CXD2841ER_ASCOT) ? 0x01 : 0x00), 0x01);
3157         /* FEC Auto Recovery setting */
3158         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x30, 0x01, 0x01);
3159         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x31, 0x00, 0x01);
3160         /* ISDB-T initial setting */
3161         /* Set SLV-T Bank : 0x00 */
3162         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3163         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xce, 0x00, 0x01);
3164         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xcf, 0x00, 0x01);
3165         /* Set SLV-T Bank : 0x10 */
3166         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
3167         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x69, 0x04, 0x07);
3168         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x6B, 0x03, 0x07);
3169         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x9D, 0x50, 0xFF);
3170         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xD3, 0x06, 0x1F);
3171         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xED, 0x00, 0x01);
3172         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xE2, 0xCE, 0x80);
3173         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xF2, 0x13, 0x10);
3174         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xDE, 0x2E, 0x3F);
3175         /* Set SLV-T Bank : 0x15 */
3176         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x15);
3177         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xDE, 0x02, 0x03);
3178         /* Set SLV-T Bank : 0x1E */
3179         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x1E);
3180         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x73, 0x68, 0xFF);
3181         /* Set SLV-T Bank : 0x63 */
3182         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x63);
3183         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0x81, 0x00, 0x01);
3184 
3185         /* for xtal 24MHz */
3186         /* Set SLV-T Bank : 0x10 */
3187         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
3188         cxd2841er_write_regs(priv, I2C_SLVT, 0xBF, data24m, 2);
3189         /* Set SLV-T Bank : 0x60 */
3190         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x60);
3191         cxd2841er_write_regs(priv, I2C_SLVT, 0xA8, data24m2, 3);
3192 
3193         cxd2841er_sleep_tc_to_active_i_band(priv, bandwidth);
3194         /* Set SLV-T Bank : 0x00 */
3195         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3196         /* Disable HiZ Setting 1 */
3197         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x28);
3198         /* Disable HiZ Setting 2 */
3199         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0x00);
3200         priv->state = STATE_ACTIVE_TC;
3201         return 0;
3202 }
3203 
3204 static int cxd2841er_sleep_tc_to_active_c(struct cxd2841er_priv *priv,
3205                                           u32 bandwidth)
3206 {
3207         u8 data[2] = { 0x09, 0x54 };
3208 
3209         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3210         cxd2841er_set_ts_clock_mode(priv, SYS_DVBC_ANNEX_A);
3211         /* Set SLV-X Bank : 0x00 */
3212         cxd2841er_write_reg(priv, I2C_SLVX, 0x00, 0x00);
3213         /* Set demod mode */
3214         cxd2841er_write_reg(priv, I2C_SLVX, 0x17, 0x04);
3215         /* Set SLV-T Bank : 0x00 */
3216         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3217         /* Enable demod clock */
3218         cxd2841er_write_reg(priv, I2C_SLVT, 0x2c, 0x01);
3219         /* Disable RF level monitor */
3220         cxd2841er_write_reg(priv, I2C_SLVT, 0x59, 0x00);
3221         cxd2841er_write_reg(priv, I2C_SLVT, 0x2f, 0x00);
3222         /* Enable ADC clock */
3223         cxd2841er_write_reg(priv, I2C_SLVT, 0x30, 0x00);
3224         /* Enable ADC 1 */
3225         cxd2841er_write_reg(priv, I2C_SLVT, 0x41, 0x1a);
3226         /* xtal freq 20.5MHz */
3227         cxd2841er_write_regs(priv, I2C_SLVT, 0x43, data, 2);
3228         /* Enable ADC 4 */
3229         cxd2841er_write_reg(priv, I2C_SLVX, 0x18, 0x00);
3230         /* Set SLV-T Bank : 0x10 */
3231         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
3232         /* IFAGC gain settings */
3233         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xd2, 0x09, 0x1f);
3234         /* Set SLV-T Bank : 0x11 */
3235         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x11);
3236         /* BBAGC TARGET level setting */
3237         cxd2841er_write_reg(priv, I2C_SLVT, 0x6a, 0x48);
3238         /* Set SLV-T Bank : 0x10 */
3239         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
3240         /* ASCOT setting */
3241         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xa5,
3242                 ((priv->flags & CXD2841ER_ASCOT) ? 0x01 : 0x00), 0x01);
3243         /* Set SLV-T Bank : 0x40 */
3244         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x40);
3245         /* Demod setting */
3246         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc3, 0x00, 0x04);
3247         /* Set SLV-T Bank : 0x00 */
3248         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3249         /* TSIF setting */
3250         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xce, 0x01, 0x01);
3251         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xcf, 0x01, 0x01);
3252 
3253         cxd2841er_sleep_tc_to_active_c_band(priv, bandwidth);
3254         /* Set SLV-T Bank : 0x00 */
3255         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3256         /* Disable HiZ Setting 1 */
3257         cxd2841er_write_reg(priv, I2C_SLVT, 0x80, 0x28);
3258         /* Disable HiZ Setting 2 */
3259         cxd2841er_write_reg(priv, I2C_SLVT, 0x81, 0x00);
3260         priv->state = STATE_ACTIVE_TC;
3261         return 0;
3262 }
3263 
3264 static int cxd2841er_get_frontend(struct dvb_frontend *fe,
3265                                   struct dtv_frontend_properties *p)
3266 {
3267         enum fe_status status = 0;
3268         struct cxd2841er_priv *priv = fe->demodulator_priv;
3269 
3270         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3271         if (priv->state == STATE_ACTIVE_S)
3272                 cxd2841er_read_status_s(fe, &status);
3273         else if (priv->state == STATE_ACTIVE_TC)
3274                 cxd2841er_read_status_tc(fe, &status);
3275 
3276         if (priv->state == STATE_ACTIVE_TC || priv->state == STATE_ACTIVE_S)
3277                 cxd2841er_read_signal_strength(fe);
3278         else
3279                 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3280 
3281         if (status & FE_HAS_LOCK) {
3282                 cxd2841er_read_snr(fe);
3283                 cxd2841er_read_ucblocks(fe);
3284 
3285                 cxd2841er_read_ber(fe);
3286         } else {
3287                 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3288                 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3289                 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3290                 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3291         }
3292         return 0;
3293 }
3294 
3295 static int cxd2841er_set_frontend_s(struct dvb_frontend *fe)
3296 {
3297         int ret = 0, i, timeout, carr_offset;
3298         enum fe_status status;
3299         struct cxd2841er_priv *priv = fe->demodulator_priv;
3300         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3301         u32 symbol_rate = p->symbol_rate/1000;
3302 
3303         dev_dbg(&priv->i2c->dev, "%s(): %s frequency=%d symbol_rate=%d xtal=%d\n",
3304                 __func__,
3305                 (p->delivery_system == SYS_DVBS ? "DVB-S" : "DVB-S2"),
3306                  p->frequency, symbol_rate, priv->xtal);
3307 
3308         if (priv->flags & CXD2841ER_EARLY_TUNE)
3309                 cxd2841er_tuner_set(fe);
3310 
3311         switch (priv->state) {
3312         case STATE_SLEEP_S:
3313                 ret = cxd2841er_sleep_s_to_active_s(
3314                         priv, p->delivery_system, symbol_rate);
3315                 break;
3316         case STATE_ACTIVE_S:
3317                 ret = cxd2841er_retune_active(priv, p);
3318                 break;
3319         default:
3320                 dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
3321                         __func__, priv->state);
3322                 ret = -EINVAL;
3323                 goto done;
3324         }
3325         if (ret) {
3326                 dev_dbg(&priv->i2c->dev, "%s(): tune failed\n", __func__);
3327                 goto done;
3328         }
3329 
3330         if (!(priv->flags & CXD2841ER_EARLY_TUNE))
3331                 cxd2841er_tuner_set(fe);
3332 
3333         cxd2841er_tune_done(priv);
3334         timeout = ((3000000 + (symbol_rate - 1)) / symbol_rate) + 150;
3335 
3336         i = 0;
3337         do {
3338                 usleep_range(CXD2841ER_DVBS_POLLING_INVL*1000,
3339                         (CXD2841ER_DVBS_POLLING_INVL + 2) * 1000);
3340                 cxd2841er_read_status_s(fe, &status);
3341                 if (status & FE_HAS_LOCK)
3342                         break;
3343                 i++;
3344         } while (i < timeout / CXD2841ER_DVBS_POLLING_INVL);
3345 
3346         if (status & FE_HAS_LOCK) {
3347                 if (cxd2841er_get_carrier_offset_s_s2(
3348                                 priv, &carr_offset)) {
3349                         ret = -EINVAL;
3350                         goto done;
3351                 }
3352                 dev_dbg(&priv->i2c->dev, "%s(): carrier_offset=%d\n",
3353                         __func__, carr_offset);
3354         }
3355 done:
3356         /* Reset stats */
3357         p->strength.stat[0].scale = FE_SCALE_RELATIVE;
3358         p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3359         p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3360         p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3361         p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3362 
3363         return ret;
3364 }
3365 
3366 static int cxd2841er_set_frontend_tc(struct dvb_frontend *fe)
3367 {
3368         int ret = 0, timeout;
3369         enum fe_status status;
3370         struct cxd2841er_priv *priv = fe->demodulator_priv;
3371         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3372 
3373         dev_dbg(&priv->i2c->dev, "%s() delivery_system=%d bandwidth_hz=%d\n",
3374                  __func__, p->delivery_system, p->bandwidth_hz);
3375 
3376         if (priv->flags & CXD2841ER_EARLY_TUNE)
3377                 cxd2841er_tuner_set(fe);
3378 
3379         /* deconfigure/put demod to sleep on delsys switch if active */
3380         if (priv->state == STATE_ACTIVE_TC &&
3381             priv->system != p->delivery_system) {
3382                 dev_dbg(&priv->i2c->dev, "%s(): old_delsys=%d, new_delsys=%d -> sleep\n",
3383                          __func__, priv->system, p->delivery_system);
3384                 cxd2841er_sleep_tc(fe);
3385         }
3386 
3387         if (p->delivery_system == SYS_DVBT) {
3388                 priv->system = SYS_DVBT;
3389                 switch (priv->state) {
3390                 case STATE_SLEEP_TC:
3391                         ret = cxd2841er_sleep_tc_to_active_t(
3392                                 priv, p->bandwidth_hz);
3393                         break;
3394                 case STATE_ACTIVE_TC:
3395                         ret = cxd2841er_retune_active(priv, p);
3396                         break;
3397                 default:
3398                         dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
3399                                 __func__, priv->state);
3400                         ret = -EINVAL;
3401                 }
3402         } else if (p->delivery_system == SYS_DVBT2) {
3403                 priv->system = SYS_DVBT2;
3404                 cxd2841er_dvbt2_set_plp_config(priv,
3405                         (int)(p->stream_id > 255), p->stream_id);
3406                 cxd2841er_dvbt2_set_profile(priv, DVBT2_PROFILE_BASE);
3407                 switch (priv->state) {
3408                 case STATE_SLEEP_TC:
3409                         ret = cxd2841er_sleep_tc_to_active_t2(priv,
3410                                 p->bandwidth_hz);
3411                         break;
3412                 case STATE_ACTIVE_TC:
3413                         ret = cxd2841er_retune_active(priv, p);
3414                         break;
3415                 default:
3416                         dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
3417                                 __func__, priv->state);
3418                         ret = -EINVAL;
3419                 }
3420         } else if (p->delivery_system == SYS_ISDBT) {
3421                 priv->system = SYS_ISDBT;
3422                 switch (priv->state) {
3423                 case STATE_SLEEP_TC:
3424                         ret = cxd2841er_sleep_tc_to_active_i(
3425                                         priv, p->bandwidth_hz);
3426                         break;
3427                 case STATE_ACTIVE_TC:
3428                         ret = cxd2841er_retune_active(priv, p);
3429                         break;
3430                 default:
3431                         dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
3432                                         __func__, priv->state);
3433                         ret = -EINVAL;
3434                 }
3435         } else if (p->delivery_system == SYS_DVBC_ANNEX_A ||
3436                         p->delivery_system == SYS_DVBC_ANNEX_C) {
3437                 priv->system = SYS_DVBC_ANNEX_A;
3438                 /* correct bandwidth */
3439                 if (p->bandwidth_hz != 6000000 &&
3440                                 p->bandwidth_hz != 7000000 &&
3441                                 p->bandwidth_hz != 8000000) {
3442                         p->bandwidth_hz = 8000000;
3443                         dev_dbg(&priv->i2c->dev, "%s(): forcing bandwidth to %d\n",
3444                                         __func__, p->bandwidth_hz);
3445                 }
3446 
3447                 switch (priv->state) {
3448                 case STATE_SLEEP_TC:
3449                         ret = cxd2841er_sleep_tc_to_active_c(
3450                                 priv, p->bandwidth_hz);
3451                         break;
3452                 case STATE_ACTIVE_TC:
3453                         ret = cxd2841er_retune_active(priv, p);
3454                         break;
3455                 default:
3456                         dev_dbg(&priv->i2c->dev, "%s(): invalid state %d\n",
3457                                 __func__, priv->state);
3458                         ret = -EINVAL;
3459                 }
3460         } else {
3461                 dev_dbg(&priv->i2c->dev,
3462                         "%s(): invalid delivery system %d\n",
3463                         __func__, p->delivery_system);
3464                 ret = -EINVAL;
3465         }
3466         if (ret)
3467                 goto done;
3468 
3469         if (!(priv->flags & CXD2841ER_EARLY_TUNE))
3470                 cxd2841er_tuner_set(fe);
3471 
3472         cxd2841er_tune_done(priv);
3473 
3474         if (priv->flags & CXD2841ER_NO_WAIT_LOCK)
3475                 goto done;
3476 
3477         timeout = 2500;
3478         while (timeout > 0) {
3479                 ret = cxd2841er_read_status_tc(fe, &status);
3480                 if (ret)
3481                         goto done;
3482                 if (status & FE_HAS_LOCK)
3483                         break;
3484                 msleep(20);
3485                 timeout -= 20;
3486         }
3487         if (timeout < 0)
3488                 dev_dbg(&priv->i2c->dev,
3489                         "%s(): LOCK wait timeout\n", __func__);
3490 done:
3491         return ret;
3492 }
3493 
3494 static int cxd2841er_tune_s(struct dvb_frontend *fe,
3495                             bool re_tune,
3496                             unsigned int mode_flags,
3497                             unsigned int *delay,
3498                             enum fe_status *status)
3499 {
3500         int ret, carrier_offset;
3501         struct cxd2841er_priv *priv = fe->demodulator_priv;
3502         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3503 
3504         dev_dbg(&priv->i2c->dev, "%s() re_tune=%d\n", __func__, re_tune);
3505         if (re_tune) {
3506                 ret = cxd2841er_set_frontend_s(fe);
3507                 if (ret)
3508                         return ret;
3509                 cxd2841er_read_status_s(fe, status);
3510                 if (*status & FE_HAS_LOCK) {
3511                         if (cxd2841er_get_carrier_offset_s_s2(
3512                                         priv, &carrier_offset))
3513                                 return -EINVAL;
3514                         p->frequency += carrier_offset;
3515                         ret = cxd2841er_set_frontend_s(fe);
3516                         if (ret)
3517                                 return ret;
3518                 }
3519         }
3520         *delay = HZ / 5;
3521         return cxd2841er_read_status_s(fe, status);
3522 }
3523 
3524 static int cxd2841er_tune_tc(struct dvb_frontend *fe,
3525                              bool re_tune,
3526                              unsigned int mode_flags,
3527                              unsigned int *delay,
3528                              enum fe_status *status)
3529 {
3530         int ret, carrier_offset;
3531         struct cxd2841er_priv *priv = fe->demodulator_priv;
3532         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3533 
3534         dev_dbg(&priv->i2c->dev, "%s(): re_tune %d bandwidth=%d\n", __func__,
3535                         re_tune, p->bandwidth_hz);
3536         if (re_tune) {
3537                 ret = cxd2841er_set_frontend_tc(fe);
3538                 if (ret)
3539                         return ret;
3540                 cxd2841er_read_status_tc(fe, status);
3541                 if (*status & FE_HAS_LOCK) {
3542                         switch (priv->system) {
3543                         case SYS_ISDBT:
3544                                 ret = cxd2841er_get_carrier_offset_i(
3545                                                 priv, p->bandwidth_hz,
3546                                                 &carrier_offset);
3547                                 if (ret)
3548                                         return ret;
3549                                 break;
3550                         case SYS_DVBT:
3551                                 ret = cxd2841er_get_carrier_offset_t(
3552                                         priv, p->bandwidth_hz,
3553                                         &carrier_offset);
3554                                 if (ret)
3555                                         return ret;
3556                                 break;
3557                         case SYS_DVBT2:
3558                                 ret = cxd2841er_get_carrier_offset_t2(
3559                                         priv, p->bandwidth_hz,
3560                                         &carrier_offset);
3561                                 if (ret)
3562                                         return ret;
3563                                 break;
3564                         case SYS_DVBC_ANNEX_A:
3565                                 ret = cxd2841er_get_carrier_offset_c(
3566                                         priv, &carrier_offset);
3567                                 if (ret)
3568                                         return ret;
3569                                 break;
3570                         default:
3571                                 dev_dbg(&priv->i2c->dev,
3572                                         "%s(): invalid delivery system %d\n",
3573                                         __func__, priv->system);
3574                                 return -EINVAL;
3575                         }
3576                         dev_dbg(&priv->i2c->dev, "%s(): carrier offset %d\n",
3577                                 __func__, carrier_offset);
3578                         p->frequency += carrier_offset;
3579                         ret = cxd2841er_set_frontend_tc(fe);
3580                         if (ret)
3581                                 return ret;
3582                 }
3583         }
3584         *delay = HZ / 5;
3585         return cxd2841er_read_status_tc(fe, status);
3586 }
3587 
3588 static int cxd2841er_sleep_s(struct dvb_frontend *fe)
3589 {
3590         struct cxd2841er_priv *priv = fe->demodulator_priv;
3591 
3592         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3593         cxd2841er_active_s_to_sleep_s(fe->demodulator_priv);
3594         cxd2841er_sleep_s_to_shutdown(fe->demodulator_priv);
3595         return 0;
3596 }
3597 
3598 static int cxd2841er_sleep_tc(struct dvb_frontend *fe)
3599 {
3600         struct cxd2841er_priv *priv = fe->demodulator_priv;
3601 
3602         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3603 
3604         if (priv->state == STATE_ACTIVE_TC) {
3605                 switch (priv->system) {
3606                 case SYS_DVBT:
3607                         cxd2841er_active_t_to_sleep_tc(priv);
3608                         break;
3609                 case SYS_DVBT2:
3610                         cxd2841er_active_t2_to_sleep_tc(priv);
3611                         break;
3612                 case SYS_ISDBT:
3613                         cxd2841er_active_i_to_sleep_tc(priv);
3614                         break;
3615                 case SYS_DVBC_ANNEX_A:
3616                         cxd2841er_active_c_to_sleep_tc(priv);
3617                         break;
3618                 default:
3619                         dev_warn(&priv->i2c->dev,
3620                                 "%s(): unknown delivery system %d\n",
3621                                 __func__, priv->system);
3622                 }
3623         }
3624         if (priv->state != STATE_SLEEP_TC) {
3625                 dev_err(&priv->i2c->dev, "%s(): invalid state %d\n",
3626                         __func__, priv->state);
3627                 return -EINVAL;
3628         }
3629         return 0;
3630 }
3631 
3632 static int cxd2841er_shutdown_tc(struct dvb_frontend *fe)
3633 {
3634         struct cxd2841er_priv *priv = fe->demodulator_priv;
3635 
3636         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3637 
3638         if (!cxd2841er_sleep_tc(fe))
3639                 cxd2841er_sleep_tc_to_shutdown(priv);
3640         return 0;
3641 }
3642 
3643 static int cxd2841er_send_burst(struct dvb_frontend *fe,
3644                                 enum fe_sec_mini_cmd burst)
3645 {
3646         u8 data;
3647         struct cxd2841er_priv *priv  = fe->demodulator_priv;
3648 
3649         dev_dbg(&priv->i2c->dev, "%s(): burst mode %s\n", __func__,
3650                 (burst == SEC_MINI_A ? "A" : "B"));
3651         if (priv->state != STATE_SLEEP_S &&
3652                         priv->state != STATE_ACTIVE_S) {
3653                 dev_err(&priv->i2c->dev, "%s(): invalid demod state %d\n",
3654                         __func__, priv->state);
3655                 return -EINVAL;
3656         }
3657         data = (burst == SEC_MINI_A ? 0 : 1);
3658         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xbb);
3659         cxd2841er_write_reg(priv, I2C_SLVT, 0x34, 0x01);
3660         cxd2841er_write_reg(priv, I2C_SLVT, 0x35, data);
3661         return 0;
3662 }
3663 
3664 static int cxd2841er_set_tone(struct dvb_frontend *fe,
3665                               enum fe_sec_tone_mode tone)
3666 {
3667         u8 data;
3668         struct cxd2841er_priv *priv  = fe->demodulator_priv;
3669 
3670         dev_dbg(&priv->i2c->dev, "%s(): tone %s\n", __func__,
3671                 (tone == SEC_TONE_ON ? "On" : "Off"));
3672         if (priv->state != STATE_SLEEP_S &&
3673                         priv->state != STATE_ACTIVE_S) {
3674                 dev_err(&priv->i2c->dev, "%s(): invalid demod state %d\n",
3675                         __func__, priv->state);
3676                 return -EINVAL;
3677         }
3678         data = (tone == SEC_TONE_ON ? 1 : 0);
3679         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xbb);
3680         cxd2841er_write_reg(priv, I2C_SLVT, 0x36, data);
3681         return 0;
3682 }
3683 
3684 static int cxd2841er_send_diseqc_msg(struct dvb_frontend *fe,
3685                                      struct dvb_diseqc_master_cmd *cmd)
3686 {
3687         int i;
3688         u8 data[12];
3689         struct cxd2841er_priv *priv  = fe->demodulator_priv;
3690 
3691         if (priv->state != STATE_SLEEP_S &&
3692                         priv->state != STATE_ACTIVE_S) {
3693                 dev_err(&priv->i2c->dev, "%s(): invalid demod state %d\n",
3694                         __func__, priv->state);
3695                 return -EINVAL;
3696         }
3697         dev_dbg(&priv->i2c->dev,
3698                 "%s(): cmd->len %d\n", __func__, cmd->msg_len);
3699         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xbb);
3700         /* DiDEqC enable */
3701         cxd2841er_write_reg(priv, I2C_SLVT, 0x33, 0x01);
3702         /* cmd1 length & data */
3703         cxd2841er_write_reg(priv, I2C_SLVT, 0x3d, cmd->msg_len);
3704         memset(data, 0, sizeof(data));
3705         for (i = 0; i < cmd->msg_len && i < sizeof(data); i++)
3706                 data[i] = cmd->msg[i];
3707         cxd2841er_write_regs(priv, I2C_SLVT, 0x3e, data, sizeof(data));
3708         /* repeat count for cmd1 */
3709         cxd2841er_write_reg(priv, I2C_SLVT, 0x37, 1);
3710         /* repeat count for cmd2: always 0 */
3711         cxd2841er_write_reg(priv, I2C_SLVT, 0x38, 0);
3712         /* start transmit */
3713         cxd2841er_write_reg(priv, I2C_SLVT, 0x32, 0x01);
3714         /* wait for 1 sec timeout */
3715         for (i = 0; i < 50; i++) {
3716                 cxd2841er_read_reg(priv, I2C_SLVT, 0x10, data);
3717                 if (!data[0]) {
3718                         dev_dbg(&priv->i2c->dev,
3719                                 "%s(): DiSEqC cmd has been sent\n", __func__);
3720                         return 0;
3721                 }
3722                 msleep(20);
3723         }
3724         dev_dbg(&priv->i2c->dev,
3725                 "%s(): DiSEqC cmd transmit timeout\n", __func__);
3726         return -ETIMEDOUT;
3727 }
3728 
3729 static void cxd2841er_release(struct dvb_frontend *fe)
3730 {
3731         struct cxd2841er_priv *priv  = fe->demodulator_priv;
3732 
3733         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3734         kfree(priv);
3735 }
3736 
3737 static int cxd2841er_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
3738 {
3739         struct cxd2841er_priv *priv = fe->demodulator_priv;
3740 
3741         dev_dbg(&priv->i2c->dev, "%s(): enable=%d\n", __func__, enable);
3742         cxd2841er_set_reg_bits(
3743                 priv, I2C_SLVX, 0x8, (enable ? 0x01 : 0x00), 0x01);
3744         return 0;
3745 }
3746 
3747 static enum dvbfe_algo cxd2841er_get_algo(struct dvb_frontend *fe)
3748 {
3749         struct cxd2841er_priv *priv = fe->demodulator_priv;
3750 
3751         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3752         return DVBFE_ALGO_HW;
3753 }
3754 
3755 static void cxd2841er_init_stats(struct dvb_frontend *fe)
3756 {
3757         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3758 
3759         p->strength.len = 1;
3760         p->strength.stat[0].scale = FE_SCALE_RELATIVE;
3761         p->cnr.len = 1;
3762         p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3763         p->block_error.len = 1;
3764         p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3765         p->post_bit_error.len = 1;
3766         p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3767         p->post_bit_count.len = 1;
3768         p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
3769 }
3770 
3771 
3772 static int cxd2841er_init_s(struct dvb_frontend *fe)
3773 {
3774         struct cxd2841er_priv *priv = fe->demodulator_priv;
3775 
3776         /* sanity. force demod to SHUTDOWN state */
3777         if (priv->state == STATE_SLEEP_S) {
3778                 dev_dbg(&priv->i2c->dev, "%s() forcing sleep->shutdown\n",
3779                                 __func__);
3780                 cxd2841er_sleep_s_to_shutdown(priv);
3781         } else if (priv->state == STATE_ACTIVE_S) {
3782                 dev_dbg(&priv->i2c->dev, "%s() forcing active->sleep->shutdown\n",
3783                                 __func__);
3784                 cxd2841er_active_s_to_sleep_s(priv);
3785                 cxd2841er_sleep_s_to_shutdown(priv);
3786         }
3787 
3788         dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
3789         cxd2841er_shutdown_to_sleep_s(priv);
3790         /* SONY_DEMOD_CONFIG_SAT_IFAGCNEG set to 1 */
3791         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0xa0);
3792         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xb9, 0x01, 0x01);
3793 
3794         cxd2841er_init_stats(fe);
3795 
3796         return 0;
3797 }
3798 
3799 static int cxd2841er_init_tc(struct dvb_frontend *fe)
3800 {
3801         struct cxd2841er_priv *priv = fe->demodulator_priv;
3802         struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3803 
3804         dev_dbg(&priv->i2c->dev, "%s() bandwidth_hz=%d\n",
3805                         __func__, p->bandwidth_hz);
3806         cxd2841er_shutdown_to_sleep_tc(priv);
3807         /* SONY_DEMOD_CONFIG_IFAGCNEG = 1 (0 for NO_AGCNEG */
3808         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x10);
3809         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xcb,
3810                 ((priv->flags & CXD2841ER_NO_AGCNEG) ? 0x00 : 0x40), 0x40);
3811         /* SONY_DEMOD_CONFIG_IFAGC_ADC_FS = 0 */
3812         cxd2841er_write_reg(priv, I2C_SLVT, 0xcd, 0x50);
3813         /* SONY_DEMOD_CONFIG_PARALLEL_SEL = 1 */
3814         cxd2841er_write_reg(priv, I2C_SLVT, 0x00, 0x00);
3815         cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4,
3816                 ((priv->flags & CXD2841ER_TS_SERIAL) ? 0x80 : 0x00), 0x80);
3817 
3818         /* clear TSCFG bits 3+4 */
3819         if (priv->flags & CXD2841ER_TSBITS)
3820                 cxd2841er_set_reg_bits(priv, I2C_SLVT, 0xc4, 0x00, 0x18);
3821 
3822         cxd2841er_init_stats(fe);
3823 
3824         return 0;
3825 }
3826 
3827 static const struct dvb_frontend_ops cxd2841er_dvbs_s2_ops;
3828 static struct dvb_frontend_ops cxd2841er_t_c_ops;
3829 
3830 static struct dvb_frontend *cxd2841er_attach(struct cxd2841er_config *cfg,
3831                                              struct i2c_adapter *i2c,
3832                                              u8 system)
3833 {
3834         u8 chip_id = 0;
3835         const char *type;
3836         const char *name;
3837         struct cxd2841er_priv *priv = NULL;
3838 
3839         /* allocate memory for the internal state */
3840         priv = kzalloc(sizeof(struct cxd2841er_priv), GFP_KERNEL);
3841         if (!priv)
3842                 return NULL;
3843         priv->i2c = i2c;
3844         priv->config = cfg;
3845         priv->i2c_addr_slvx = (cfg->i2c_addr + 4) >> 1;
3846         priv->i2c_addr_slvt = (cfg->i2c_addr) >> 1;
3847         priv->xtal = cfg->xtal;
3848         priv->flags = cfg->flags;
3849         priv->frontend.demodulator_priv = priv;
3850         dev_info(&priv->i2c->dev,
3851                 "%s(): I2C adapter %p SLVX addr %x SLVT addr %x\n",
3852                 __func__, priv->i2c,
3853                 priv->i2c_addr_slvx, priv->i2c_addr_slvt);
3854         chip_id = cxd2841er_chip_id(priv);
3855         switch (chip_id) {
3856         case CXD2837ER_CHIP_ID:
3857                 snprintf(cxd2841er_t_c_ops.info.name, 128,
3858                                 "Sony CXD2837ER DVB-T/T2/C demodulator");
3859                 name = "CXD2837ER";
3860                 type = "C/T/T2";
3861                 break;
3862         case CXD2838ER_CHIP_ID:
3863                 snprintf(cxd2841er_t_c_ops.info.name, 128,
3864                                 "Sony CXD2838ER ISDB-T demodulator");
3865                 cxd2841er_t_c_ops.delsys[0] = SYS_ISDBT;
3866                 cxd2841er_t_c_ops.delsys[1] = SYS_UNDEFINED;
3867                 cxd2841er_t_c_ops.delsys[2] = SYS_UNDEFINED;
3868                 name = "CXD2838ER";
3869                 type = "ISDB-T";
3870                 break;
3871         case CXD2841ER_CHIP_ID:
3872                 snprintf(cxd2841er_t_c_ops.info.name, 128,
3873                                 "Sony CXD2841ER DVB-T/T2/C demodulator");
3874                 name = "CXD2841ER";
3875                 type = "T/T2/C/ISDB-T";
3876                 break;
3877         case CXD2843ER_CHIP_ID:
3878                 snprintf(cxd2841er_t_c_ops.info.name, 128,
3879                                 "Sony CXD2843ER DVB-T/T2/C/C2 demodulator");
3880                 name = "CXD2843ER";
3881                 type = "C/C2/T/T2";
3882                 break;
3883         case CXD2854ER_CHIP_ID:
3884                 snprintf(cxd2841er_t_c_ops.info.name, 128,
3885                                 "Sony CXD2854ER DVB-T/T2/C and ISDB-T demodulator");
3886                 cxd2841er_t_c_ops.delsys[3] = SYS_ISDBT;
3887                 name = "CXD2854ER";
3888                 type = "C/C2/T/T2/ISDB-T";
3889                 break;
3890         default:
3891                 dev_err(&priv->i2c->dev, "%s(): invalid chip ID 0x%02x\n",
3892                                 __func__, chip_id);
3893                 priv->frontend.demodulator_priv = NULL;
3894                 kfree(priv);
3895                 return NULL;
3896         }
3897 
3898         /* create dvb_frontend */
3899         if (system == SYS_DVBS) {
3900                 memcpy(&priv->frontend.ops,
3901                         &cxd2841er_dvbs_s2_ops,
3902                         sizeof(struct dvb_frontend_ops));
3903                 type = "S/S2";
3904         } else {
3905                 memcpy(&priv->frontend.ops,
3906                         &cxd2841er_t_c_ops,
3907                         sizeof(struct dvb_frontend_ops));
3908         }
3909 
3910         dev_info(&priv->i2c->dev,
3911                 "%s(): attaching %s DVB-%s frontend\n",
3912                 __func__, name, type);
3913         dev_info(&priv->i2c->dev, "%s(): chip ID 0x%02x OK.\n",
3914                 __func__, chip_id);
3915         return &priv->frontend;
3916 }
3917 
3918 struct dvb_frontend *cxd2841er_attach_s(struct cxd2841er_config *cfg,
3919                                         struct i2c_adapter *i2c)
3920 {
3921         return cxd2841er_attach(cfg, i2c, SYS_DVBS);
3922 }
3923 EXPORT_SYMBOL(cxd2841er_attach_s);
3924 
3925 struct dvb_frontend *cxd2841er_attach_t_c(struct cxd2841er_config *cfg,
3926                                         struct i2c_adapter *i2c)
3927 {
3928         return cxd2841er_attach(cfg, i2c, 0);
3929 }
3930 EXPORT_SYMBOL(cxd2841er_attach_t_c);
3931 
3932 static const struct dvb_frontend_ops cxd2841er_dvbs_s2_ops = {
3933         .delsys = { SYS_DVBS, SYS_DVBS2 },
3934         .info = {
3935                 .name           = "Sony CXD2841ER DVB-S/S2 demodulator",
3936                 .frequency_min_hz       =  500 * MHz,
3937                 .frequency_max_hz       = 2500 * MHz,
3938                 .symbol_rate_min = 1000000,
3939                 .symbol_rate_max = 45000000,
3940                 .symbol_rate_tolerance = 500,
3941                 .caps = FE_CAN_INVERSION_AUTO |
3942                         FE_CAN_FEC_AUTO |
3943                         FE_CAN_QPSK,
3944         },
3945         .init = cxd2841er_init_s,
3946         .sleep = cxd2841er_sleep_s,
3947         .release = cxd2841er_release,
3948         .set_frontend = cxd2841er_set_frontend_s,
3949         .get_frontend = cxd2841er_get_frontend,
3950         .read_status = cxd2841er_read_status_s,
3951         .i2c_gate_ctrl = cxd2841er_i2c_gate_ctrl,
3952         .get_frontend_algo = cxd2841er_get_algo,
3953         .set_tone = cxd2841er_set_tone,
3954         .diseqc_send_burst = cxd2841er_send_burst,
3955         .diseqc_send_master_cmd = cxd2841er_send_diseqc_msg,
3956         .tune = cxd2841er_tune_s
3957 };
3958 
3959 static struct dvb_frontend_ops cxd2841er_t_c_ops = {
3960         .delsys = { SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A },
3961         .info = {
3962                 .name   = "", /* will set in attach function */
3963                 .caps = FE_CAN_FEC_1_2 |
3964                         FE_CAN_FEC_2_3 |
3965                         FE_CAN_FEC_3_4 |
3966                         FE_CAN_FEC_5_6 |
3967                         FE_CAN_FEC_7_8 |
3968                         FE_CAN_FEC_AUTO |
3969                         FE_CAN_QPSK |
3970                         FE_CAN_QAM_16 |
3971                         FE_CAN_QAM_32 |
3972                         FE_CAN_QAM_64 |
3973                         FE_CAN_QAM_128 |
3974                         FE_CAN_QAM_256 |
3975                         FE_CAN_QAM_AUTO |
3976                         FE_CAN_TRANSMISSION_MODE_AUTO |
3977                         FE_CAN_GUARD_INTERVAL_AUTO |
3978                         FE_CAN_HIERARCHY_AUTO |
3979                         FE_CAN_MUTE_TS |
3980                         FE_CAN_2G_MODULATION,
3981                 .frequency_min_hz =   42 * MHz,
3982                 .frequency_max_hz = 1002 * MHz,
3983                 .symbol_rate_min = 870000,
3984                 .symbol_rate_max = 11700000
3985         },
3986         .init = cxd2841er_init_tc,
3987         .sleep = cxd2841er_shutdown_tc,
3988         .release = cxd2841er_release,
3989         .set_frontend = cxd2841er_set_frontend_tc,
3990         .get_frontend = cxd2841er_get_frontend,
3991         .read_status = cxd2841er_read_status_tc,
3992         .tune = cxd2841er_tune_tc,
3993         .i2c_gate_ctrl = cxd2841er_i2c_gate_ctrl,
3994         .get_frontend_algo = cxd2841er_get_algo
3995 };
3996 
3997 MODULE_DESCRIPTION("Sony CXD2837/38/41/43/54ER DVB-C/C2/T/T2/S/S2 demodulator driver");
3998 MODULE_AUTHOR("Sergey Kozlov <serjk@netup.ru>, Abylay Ospan <aospan@netup.ru>");
3999 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */