blob: 5d7ea23f02f70b6f87e8f5f14df8dae638d94d03 [file] [log] [blame]
Thomas Mair82041c02012-05-18 14:47:40 -03001/*
2 * Realtek RTL2832 DVB-T demodulator driver
3 *
4 * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21#include "rtl2832_priv.h"
Antti Palosaari73983492012-08-21 19:56:21 -030022#include "dvb_math.h"
Mauro Carvalho Chehab298f18a2012-07-05 12:16:26 -030023#include <linux/bitops.h>
Thomas Mair82041c02012-05-18 14:47:40 -030024
Mauro Carvalho Chehab298f18a2012-07-05 12:16:26 -030025#define REG_MASK(b) (BIT(b + 1) - 1)
Thomas Mair82041c02012-05-18 14:47:40 -030026
27static const struct rtl2832_reg_entry registers[] = {
28 [DVBT_SOFT_RST] = {0x1, 0x1, 2, 2},
29 [DVBT_IIC_REPEAT] = {0x1, 0x1, 3, 3},
30 [DVBT_TR_WAIT_MIN_8K] = {0x1, 0x88, 11, 2},
31 [DVBT_RSD_BER_FAIL_VAL] = {0x1, 0x8f, 15, 0},
32 [DVBT_EN_BK_TRK] = {0x1, 0xa6, 7, 7},
33 [DVBT_AD_EN_REG] = {0x0, 0x8, 7, 7},
34 [DVBT_AD_EN_REG1] = {0x0, 0x8, 6, 6},
35 [DVBT_EN_BBIN] = {0x1, 0xb1, 0, 0},
36 [DVBT_MGD_THD0] = {0x1, 0x95, 7, 0},
37 [DVBT_MGD_THD1] = {0x1, 0x96, 7, 0},
38 [DVBT_MGD_THD2] = {0x1, 0x97, 7, 0},
39 [DVBT_MGD_THD3] = {0x1, 0x98, 7, 0},
40 [DVBT_MGD_THD4] = {0x1, 0x99, 7, 0},
41 [DVBT_MGD_THD5] = {0x1, 0x9a, 7, 0},
42 [DVBT_MGD_THD6] = {0x1, 0x9b, 7, 0},
43 [DVBT_MGD_THD7] = {0x1, 0x9c, 7, 0},
44 [DVBT_EN_CACQ_NOTCH] = {0x1, 0x61, 4, 4},
45 [DVBT_AD_AV_REF] = {0x0, 0x9, 6, 0},
46 [DVBT_REG_PI] = {0x0, 0xa, 2, 0},
47 [DVBT_PIP_ON] = {0x0, 0x21, 3, 3},
48 [DVBT_SCALE1_B92] = {0x2, 0x92, 7, 0},
49 [DVBT_SCALE1_B93] = {0x2, 0x93, 7, 0},
50 [DVBT_SCALE1_BA7] = {0x2, 0xa7, 7, 0},
51 [DVBT_SCALE1_BA9] = {0x2, 0xa9, 7, 0},
52 [DVBT_SCALE1_BAA] = {0x2, 0xaa, 7, 0},
53 [DVBT_SCALE1_BAB] = {0x2, 0xab, 7, 0},
54 [DVBT_SCALE1_BAC] = {0x2, 0xac, 7, 0},
55 [DVBT_SCALE1_BB0] = {0x2, 0xb0, 7, 0},
56 [DVBT_SCALE1_BB1] = {0x2, 0xb1, 7, 0},
57 [DVBT_KB_P1] = {0x1, 0x64, 3, 1},
58 [DVBT_KB_P2] = {0x1, 0x64, 6, 4},
59 [DVBT_KB_P3] = {0x1, 0x65, 2, 0},
60 [DVBT_OPT_ADC_IQ] = {0x0, 0x6, 5, 4},
61 [DVBT_AD_AVI] = {0x0, 0x9, 1, 0},
62 [DVBT_AD_AVQ] = {0x0, 0x9, 3, 2},
63 [DVBT_K1_CR_STEP12] = {0x2, 0xad, 9, 4},
64 [DVBT_TRK_KS_P2] = {0x1, 0x6f, 2, 0},
65 [DVBT_TRK_KS_I2] = {0x1, 0x70, 5, 3},
66 [DVBT_TR_THD_SET2] = {0x1, 0x72, 3, 0},
67 [DVBT_TRK_KC_P2] = {0x1, 0x73, 5, 3},
68 [DVBT_TRK_KC_I2] = {0x1, 0x75, 2, 0},
69 [DVBT_CR_THD_SET2] = {0x1, 0x76, 7, 6},
70 [DVBT_PSET_IFFREQ] = {0x1, 0x19, 21, 0},
71 [DVBT_SPEC_INV] = {0x1, 0x15, 0, 0},
72 [DVBT_RSAMP_RATIO] = {0x1, 0x9f, 27, 2},
73 [DVBT_CFREQ_OFF_RATIO] = {0x1, 0x9d, 23, 4},
74 [DVBT_FSM_STAGE] = {0x3, 0x51, 6, 3},
75 [DVBT_RX_CONSTEL] = {0x3, 0x3c, 3, 2},
76 [DVBT_RX_HIER] = {0x3, 0x3c, 6, 4},
77 [DVBT_RX_C_RATE_LP] = {0x3, 0x3d, 2, 0},
78 [DVBT_RX_C_RATE_HP] = {0x3, 0x3d, 5, 3},
79 [DVBT_GI_IDX] = {0x3, 0x51, 1, 0},
80 [DVBT_FFT_MODE_IDX] = {0x3, 0x51, 2, 2},
81 [DVBT_RSD_BER_EST] = {0x3, 0x4e, 15, 0},
82 [DVBT_CE_EST_EVM] = {0x4, 0xc, 15, 0},
83 [DVBT_RF_AGC_VAL] = {0x3, 0x5b, 13, 0},
84 [DVBT_IF_AGC_VAL] = {0x3, 0x59, 13, 0},
85 [DVBT_DAGC_VAL] = {0x3, 0x5, 7, 0},
86 [DVBT_SFREQ_OFF] = {0x3, 0x18, 13, 0},
87 [DVBT_CFREQ_OFF] = {0x3, 0x5f, 17, 0},
88 [DVBT_POLAR_RF_AGC] = {0x0, 0xe, 1, 1},
89 [DVBT_POLAR_IF_AGC] = {0x0, 0xe, 0, 0},
90 [DVBT_AAGC_HOLD] = {0x1, 0x4, 5, 5},
91 [DVBT_EN_RF_AGC] = {0x1, 0x4, 6, 6},
92 [DVBT_EN_IF_AGC] = {0x1, 0x4, 7, 7},
93 [DVBT_IF_AGC_MIN] = {0x1, 0x8, 7, 0},
94 [DVBT_IF_AGC_MAX] = {0x1, 0x9, 7, 0},
95 [DVBT_RF_AGC_MIN] = {0x1, 0xa, 7, 0},
96 [DVBT_RF_AGC_MAX] = {0x1, 0xb, 7, 0},
97 [DVBT_IF_AGC_MAN] = {0x1, 0xc, 6, 6},
98 [DVBT_IF_AGC_MAN_VAL] = {0x1, 0xc, 13, 0},
99 [DVBT_RF_AGC_MAN] = {0x1, 0xe, 6, 6},
100 [DVBT_RF_AGC_MAN_VAL] = {0x1, 0xe, 13, 0},
101 [DVBT_DAGC_TRG_VAL] = {0x1, 0x12, 7, 0},
102 [DVBT_AGC_TARG_VAL_0] = {0x1, 0x2, 0, 0},
103 [DVBT_AGC_TARG_VAL_8_1] = {0x1, 0x3, 7, 0},
104 [DVBT_AAGC_LOOP_GAIN] = {0x1, 0xc7, 5, 1},
105 [DVBT_LOOP_GAIN2_3_0] = {0x1, 0x4, 4, 1},
106 [DVBT_LOOP_GAIN2_4] = {0x1, 0x5, 7, 7},
107 [DVBT_LOOP_GAIN3] = {0x1, 0xc8, 4, 0},
108 [DVBT_VTOP1] = {0x1, 0x6, 5, 0},
109 [DVBT_VTOP2] = {0x1, 0xc9, 5, 0},
110 [DVBT_VTOP3] = {0x1, 0xca, 5, 0},
111 [DVBT_KRF1] = {0x1, 0xcb, 7, 0},
112 [DVBT_KRF2] = {0x1, 0x7, 7, 0},
113 [DVBT_KRF3] = {0x1, 0xcd, 7, 0},
114 [DVBT_KRF4] = {0x1, 0xce, 7, 0},
115 [DVBT_EN_GI_PGA] = {0x1, 0xe5, 0, 0},
116 [DVBT_THD_LOCK_UP] = {0x1, 0xd9, 8, 0},
117 [DVBT_THD_LOCK_DW] = {0x1, 0xdb, 8, 0},
118 [DVBT_THD_UP1] = {0x1, 0xdd, 7, 0},
119 [DVBT_THD_DW1] = {0x1, 0xde, 7, 0},
120 [DVBT_INTER_CNT_LEN] = {0x1, 0xd8, 3, 0},
121 [DVBT_GI_PGA_STATE] = {0x1, 0xe6, 3, 3},
122 [DVBT_EN_AGC_PGA] = {0x1, 0xd7, 0, 0},
123 [DVBT_CKOUTPAR] = {0x1, 0x7b, 5, 5},
124 [DVBT_CKOUT_PWR] = {0x1, 0x7b, 6, 6},
125 [DVBT_SYNC_DUR] = {0x1, 0x7b, 7, 7},
126 [DVBT_ERR_DUR] = {0x1, 0x7c, 0, 0},
127 [DVBT_SYNC_LVL] = {0x1, 0x7c, 1, 1},
128 [DVBT_ERR_LVL] = {0x1, 0x7c, 2, 2},
129 [DVBT_VAL_LVL] = {0x1, 0x7c, 3, 3},
130 [DVBT_SERIAL] = {0x1, 0x7c, 4, 4},
131 [DVBT_SER_LSB] = {0x1, 0x7c, 5, 5},
132 [DVBT_CDIV_PH0] = {0x1, 0x7d, 3, 0},
133 [DVBT_CDIV_PH1] = {0x1, 0x7d, 7, 4},
134 [DVBT_MPEG_IO_OPT_2_2] = {0x0, 0x6, 7, 7},
135 [DVBT_MPEG_IO_OPT_1_0] = {0x0, 0x7, 7, 6},
136 [DVBT_CKOUTPAR_PIP] = {0x0, 0xb7, 4, 4},
137 [DVBT_CKOUT_PWR_PIP] = {0x0, 0xb7, 3, 3},
138 [DVBT_SYNC_LVL_PIP] = {0x0, 0xb7, 2, 2},
139 [DVBT_ERR_LVL_PIP] = {0x0, 0xb7, 1, 1},
140 [DVBT_VAL_LVL_PIP] = {0x0, 0xb7, 0, 0},
141 [DVBT_CKOUTPAR_PID] = {0x0, 0xb9, 4, 4},
142 [DVBT_CKOUT_PWR_PID] = {0x0, 0xb9, 3, 3},
143 [DVBT_SYNC_LVL_PID] = {0x0, 0xb9, 2, 2},
144 [DVBT_ERR_LVL_PID] = {0x0, 0xb9, 1, 1},
145 [DVBT_VAL_LVL_PID] = {0x0, 0xb9, 0, 0},
146 [DVBT_SM_PASS] = {0x1, 0x93, 11, 0},
147 [DVBT_AD7_SETTING] = {0x0, 0x11, 15, 0},
148 [DVBT_RSSI_R] = {0x3, 0x1, 6, 0},
149 [DVBT_ACI_DET_IND] = {0x3, 0x12, 0, 0},
150 [DVBT_REG_MON] = {0x0, 0xd, 1, 0},
151 [DVBT_REG_MONSEL] = {0x0, 0xd, 2, 2},
152 [DVBT_REG_GPE] = {0x0, 0xd, 7, 7},
153 [DVBT_REG_GPO] = {0x0, 0x10, 0, 0},
154 [DVBT_REG_4MSEL] = {0x0, 0x13, 0, 0},
155};
156
Antti Palosaarid1016582014-12-14 04:45:57 -0300157/* Our regmap is bypassing I2C adapter lock, thus we do it! */
158int rtl2832_bulk_write(struct i2c_client *client, unsigned int reg,
159 const void *val, size_t val_count)
Thomas Mair82041c02012-05-18 14:47:40 -0300160{
Antti Palosaarid1016582014-12-14 04:45:57 -0300161 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Thomas Mair82041c02012-05-18 14:47:40 -0300162 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300163
Antti Palosaarid1016582014-12-14 04:45:57 -0300164 i2c_lock_adapter(client->adapter);
165 ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
166 i2c_unlock_adapter(client->adapter);
Thomas Mair82041c02012-05-18 14:47:40 -0300167 return ret;
168}
169
Antti Palosaarid1016582014-12-14 04:45:57 -0300170int rtl2832_update_bits(struct i2c_client *client, unsigned int reg,
171 unsigned int mask, unsigned int val)
Thomas Mair82041c02012-05-18 14:47:40 -0300172{
Antti Palosaarid1016582014-12-14 04:45:57 -0300173 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Thomas Mair82041c02012-05-18 14:47:40 -0300174 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300175
Antti Palosaarid1016582014-12-14 04:45:57 -0300176 i2c_lock_adapter(client->adapter);
177 ret = regmap_update_bits(dev->regmap, reg, mask, val);
178 i2c_unlock_adapter(client->adapter);
179 return ret;
180}
181
182int rtl2832_bulk_read(struct i2c_client *client, unsigned int reg, void *val,
183 size_t val_count)
184{
185 struct rtl2832_dev *dev = i2c_get_clientdata(client);
186 int ret;
187
188 i2c_lock_adapter(client->adapter);
189 ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
190 i2c_unlock_adapter(client->adapter);
Antti Palosaari298efdd2012-09-11 22:27:11 -0300191 return ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300192}
193
194/* write multiple registers */
Antti Palosaarid1016582014-12-14 04:45:57 -0300195static int rtl2832_wr_regs(struct rtl2832_dev *dev, u8 reg, u8 page, u8 *val, int len)
Thomas Mair82041c02012-05-18 14:47:40 -0300196{
Antti Palosaarid1016582014-12-14 04:45:57 -0300197 return rtl2832_bulk_write(dev->client, page << 8 | reg, val, len);
Thomas Mair82041c02012-05-18 14:47:40 -0300198}
199
200/* read multiple registers */
Antti Palosaarid1016582014-12-14 04:45:57 -0300201static int rtl2832_rd_regs(struct rtl2832_dev *dev, u8 reg, u8 page, u8 *val, int len)
Thomas Mair82041c02012-05-18 14:47:40 -0300202{
Antti Palosaarid1016582014-12-14 04:45:57 -0300203 return rtl2832_bulk_read(dev->client, page << 8 | reg, val, len);
Thomas Mair82041c02012-05-18 14:47:40 -0300204}
205
Thomas Mair82041c02012-05-18 14:47:40 -0300206/* write single register */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300207static int rtl2832_wr_reg(struct rtl2832_dev *dev, u8 reg, u8 page, u8 val)
Thomas Mair82041c02012-05-18 14:47:40 -0300208{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300209 return rtl2832_wr_regs(dev, reg, page, &val, 1);
Thomas Mair82041c02012-05-18 14:47:40 -0300210}
Thomas Mair82041c02012-05-18 14:47:40 -0300211
212/* read single register */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300213static int rtl2832_rd_reg(struct rtl2832_dev *dev, u8 reg, u8 page, u8 *val)
Thomas Mair82041c02012-05-18 14:47:40 -0300214{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300215 return rtl2832_rd_regs(dev, reg, page, val, 1);
Thomas Mair82041c02012-05-18 14:47:40 -0300216}
217
Antti Palosaari038c6f22014-12-13 00:37:43 -0300218static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val)
Thomas Mair82041c02012-05-18 14:47:40 -0300219{
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300220 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300221 int ret;
222
223 u8 reg_start_addr;
224 u8 msb, lsb;
225 u8 page;
226 u8 reading[4];
227 u32 reading_tmp;
228 int i;
229
230 u8 len;
231 u32 mask;
232
233 reg_start_addr = registers[reg].start_address;
234 msb = registers[reg].msb;
235 lsb = registers[reg].lsb;
236 page = registers[reg].page;
237
238 len = (msb >> 3) + 1;
Mauro Carvalho Chehab298f18a2012-07-05 12:16:26 -0300239 mask = REG_MASK(msb - lsb);
Thomas Mair82041c02012-05-18 14:47:40 -0300240
Antti Palosaari038c6f22014-12-13 00:37:43 -0300241 ret = rtl2832_rd_regs(dev, reg_start_addr, page, &reading[0], len);
Thomas Mair82041c02012-05-18 14:47:40 -0300242 if (ret)
243 goto err;
244
245 reading_tmp = 0;
246 for (i = 0; i < len; i++)
247 reading_tmp |= reading[i] << ((len - 1 - i) * 8);
248
249 *val = (reading_tmp >> lsb) & mask;
250
251 return ret;
252
253err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300254 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300255 return ret;
256
257}
258
Antti Palosaari038c6f22014-12-13 00:37:43 -0300259static int rtl2832_wr_demod_reg(struct rtl2832_dev *dev, int reg, u32 val)
Thomas Mair82041c02012-05-18 14:47:40 -0300260{
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300261 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300262 int ret, i;
263 u8 len;
264 u8 reg_start_addr;
265 u8 msb, lsb;
266 u8 page;
267 u32 mask;
268
269
270 u8 reading[4];
271 u8 writing[4];
272 u32 reading_tmp;
273 u32 writing_tmp;
274
275
276 reg_start_addr = registers[reg].start_address;
277 msb = registers[reg].msb;
278 lsb = registers[reg].lsb;
279 page = registers[reg].page;
280
281 len = (msb >> 3) + 1;
Mauro Carvalho Chehab298f18a2012-07-05 12:16:26 -0300282 mask = REG_MASK(msb - lsb);
Thomas Mair82041c02012-05-18 14:47:40 -0300283
284
Antti Palosaari038c6f22014-12-13 00:37:43 -0300285 ret = rtl2832_rd_regs(dev, reg_start_addr, page, &reading[0], len);
Thomas Mair82041c02012-05-18 14:47:40 -0300286 if (ret)
287 goto err;
288
289 reading_tmp = 0;
290 for (i = 0; i < len; i++)
291 reading_tmp |= reading[i] << ((len - 1 - i) * 8);
292
293 writing_tmp = reading_tmp & ~(mask << lsb);
294 writing_tmp |= ((val & mask) << lsb);
295
296
297 for (i = 0; i < len; i++)
298 writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
299
Antti Palosaari038c6f22014-12-13 00:37:43 -0300300 ret = rtl2832_wr_regs(dev, reg_start_addr, page, &writing[0], len);
Thomas Mair82041c02012-05-18 14:47:40 -0300301 if (ret)
302 goto err;
303
304 return ret;
305
306err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300307 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300308 return ret;
309
310}
311
Thomas Mair82041c02012-05-18 14:47:40 -0300312static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
313{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300314 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300315 struct i2c_client *client = dev->client;
316 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300317
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300318 dev_dbg(&client->dev, "enable=%d\n", enable);
Thomas Mair82041c02012-05-18 14:47:40 -0300319
320 /* gate already open or close */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300321 if (dev->i2c_gate_state == enable)
Thomas Mair82041c02012-05-18 14:47:40 -0300322 return 0;
323
Antti Palosaari038c6f22014-12-13 00:37:43 -0300324 ret = rtl2832_wr_demod_reg(dev, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
Thomas Mair82041c02012-05-18 14:47:40 -0300325 if (ret)
326 goto err;
327
Antti Palosaari038c6f22014-12-13 00:37:43 -0300328 dev->i2c_gate_state = enable;
Thomas Mair82041c02012-05-18 14:47:40 -0300329
330 return ret;
331err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300332 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300333 return ret;
334}
335
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300336static int rtl2832_set_if(struct dvb_frontend *fe, u32 if_freq)
337{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300338 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300339 struct i2c_client *client = dev->client;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300340 int ret;
341 u64 pset_iffreq;
342 u8 en_bbin = (if_freq == 0 ? 0x1 : 0x0);
343
344 /*
345 * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
346 * / CrystalFreqHz)
347 */
348
Antti Palosaarie1174d72014-12-13 05:26:27 -0300349 pset_iffreq = if_freq % dev->pdata->clk;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300350 pset_iffreq *= 0x400000;
Antti Palosaarie1174d72014-12-13 05:26:27 -0300351 pset_iffreq = div_u64(pset_iffreq, dev->pdata->clk);
Mauro Carvalho Chehabc8832e82013-04-15 19:44:39 -0300352 pset_iffreq = -pset_iffreq;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300353 pset_iffreq = pset_iffreq & 0x3fffff;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300354 dev_dbg(&client->dev, "if_frequency=%d pset_iffreq=%08x\n",
355 if_freq, (unsigned)pset_iffreq);
Mauro Carvalho Chehabc8832e82013-04-15 19:44:39 -0300356
Antti Palosaari038c6f22014-12-13 00:37:43 -0300357 ret = rtl2832_wr_demod_reg(dev, DVBT_EN_BBIN, en_bbin);
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300358 if (ret)
359 return ret;
360
Antti Palosaari038c6f22014-12-13 00:37:43 -0300361 ret = rtl2832_wr_demod_reg(dev, DVBT_PSET_IFFREQ, pset_iffreq);
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300362
Antti Palosaari3ca24182013-10-13 00:06:44 -0300363 return ret;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300364}
365
Thomas Mair82041c02012-05-18 14:47:40 -0300366static int rtl2832_init(struct dvb_frontend *fe)
367{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300368 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300369 struct i2c_client *client = dev->client;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300370 const struct rtl2832_reg_value *init;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300371 int i, ret, len;
Thomas Mair82041c02012-05-18 14:47:40 -0300372 /* initialization values for the demodulator registers */
373 struct rtl2832_reg_value rtl2832_initial_regs[] = {
374 {DVBT_AD_EN_REG, 0x1},
375 {DVBT_AD_EN_REG1, 0x1},
376 {DVBT_RSD_BER_FAIL_VAL, 0x2800},
377 {DVBT_MGD_THD0, 0x10},
378 {DVBT_MGD_THD1, 0x20},
379 {DVBT_MGD_THD2, 0x20},
380 {DVBT_MGD_THD3, 0x40},
381 {DVBT_MGD_THD4, 0x22},
382 {DVBT_MGD_THD5, 0x32},
383 {DVBT_MGD_THD6, 0x37},
384 {DVBT_MGD_THD7, 0x39},
385 {DVBT_EN_BK_TRK, 0x0},
386 {DVBT_EN_CACQ_NOTCH, 0x0},
387 {DVBT_AD_AV_REF, 0x2a},
388 {DVBT_REG_PI, 0x6},
389 {DVBT_PIP_ON, 0x0},
390 {DVBT_CDIV_PH0, 0x8},
391 {DVBT_CDIV_PH1, 0x8},
392 {DVBT_SCALE1_B92, 0x4},
393 {DVBT_SCALE1_B93, 0xb0},
394 {DVBT_SCALE1_BA7, 0x78},
395 {DVBT_SCALE1_BA9, 0x28},
396 {DVBT_SCALE1_BAA, 0x59},
397 {DVBT_SCALE1_BAB, 0x83},
398 {DVBT_SCALE1_BAC, 0xd4},
399 {DVBT_SCALE1_BB0, 0x65},
400 {DVBT_SCALE1_BB1, 0x43},
401 {DVBT_KB_P1, 0x1},
402 {DVBT_KB_P2, 0x4},
403 {DVBT_KB_P3, 0x7},
404 {DVBT_K1_CR_STEP12, 0xa},
405 {DVBT_REG_GPE, 0x1},
406 {DVBT_SERIAL, 0x0},
407 {DVBT_CDIV_PH0, 0x9},
408 {DVBT_CDIV_PH1, 0x9},
409 {DVBT_MPEG_IO_OPT_2_2, 0x0},
410 {DVBT_MPEG_IO_OPT_1_0, 0x0},
411 {DVBT_TRK_KS_P2, 0x4},
412 {DVBT_TRK_KS_I2, 0x7},
413 {DVBT_TR_THD_SET2, 0x6},
414 {DVBT_TRK_KC_I2, 0x5},
415 {DVBT_CR_THD_SET2, 0x1},
Thomas Mair82041c02012-05-18 14:47:40 -0300416 };
417
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300418 dev_dbg(&client->dev, "\n");
Thomas Mair82041c02012-05-18 14:47:40 -0300419
Thomas Mair82041c02012-05-18 14:47:40 -0300420 for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300421 ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
Thomas Mair82041c02012-05-18 14:47:40 -0300422 rtl2832_initial_regs[i].value);
423 if (ret)
424 goto err;
425 }
426
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300427 /* load tuner specific settings */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300428 dev_dbg(&client->dev, "load settings for tuner=%02x\n",
429 dev->pdata->tuner);
430 switch (dev->pdata->tuner) {
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300431 case RTL2832_TUNER_FC0012:
432 case RTL2832_TUNER_FC0013:
433 len = ARRAY_SIZE(rtl2832_tuner_init_fc0012);
434 init = rtl2832_tuner_init_fc0012;
435 break;
Antti Palosaari5db41872012-09-11 22:27:08 -0300436 case RTL2832_TUNER_TUA9001:
437 len = ARRAY_SIZE(rtl2832_tuner_init_tua9001);
438 init = rtl2832_tuner_init_tua9001;
439 break;
Antti Palosaari7e688de2012-09-17 17:53:04 -0300440 case RTL2832_TUNER_E4000:
441 len = ARRAY_SIZE(rtl2832_tuner_init_e4000);
442 init = rtl2832_tuner_init_e4000;
443 break;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300444 case RTL2832_TUNER_R820T:
Antti Palosaaria26758e2013-10-30 00:36:38 -0300445 case RTL2832_TUNER_R828D:
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300446 len = ARRAY_SIZE(rtl2832_tuner_init_r820t);
447 init = rtl2832_tuner_init_r820t;
448 break;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300449 default:
450 ret = -EINVAL;
451 goto err;
452 }
453
454 for (i = 0; i < len; i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300455 ret = rtl2832_wr_demod_reg(dev, init[i].reg, init[i].value);
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300456 if (ret)
457 goto err;
458 }
459
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300460 /*
461 * r820t NIM code does a software reset here at the demod -
Antti Palosaari3ca24182013-10-13 00:06:44 -0300462 * may not be needed, as there's already a software reset at
463 * set_params()
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300464 */
465#if 1
466 /* soft reset */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300467 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300468 if (ret)
469 goto err;
470
Antti Palosaari038c6f22014-12-13 00:37:43 -0300471 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300472 if (ret)
473 goto err;
474#endif
Thomas Mair82041c02012-05-18 14:47:40 -0300475
Antti Palosaari038c6f22014-12-13 00:37:43 -0300476 dev->sleeping = false;
Thomas Mair82041c02012-05-18 14:47:40 -0300477
478 return ret;
479
480err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300481 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300482 return ret;
483}
484
485static int rtl2832_sleep(struct dvb_frontend *fe)
486{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300487 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300488 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300489
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300490 dev_dbg(&client->dev, "\n");
Antti Palosaari038c6f22014-12-13 00:37:43 -0300491 dev->sleeping = true;
Thomas Mair82041c02012-05-18 14:47:40 -0300492 return 0;
493}
494
Mauro Carvalho Chehabb0944ea2012-10-27 11:24:37 -0300495static int rtl2832_get_tune_settings(struct dvb_frontend *fe,
Thomas Mair82041c02012-05-18 14:47:40 -0300496 struct dvb_frontend_tune_settings *s)
497{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300498 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300499 struct i2c_client *client = dev->client;
Antti Palosaari298efdd2012-09-11 22:27:11 -0300500
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300501 dev_dbg(&client->dev, "\n");
Thomas Mair82041c02012-05-18 14:47:40 -0300502 s->min_delay_ms = 1000;
503 s->step_size = fe->ops.info.frequency_stepsize * 2;
504 s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
505 return 0;
506}
507
508static int rtl2832_set_frontend(struct dvb_frontend *fe)
509{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300510 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300511 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300512 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
513 int ret, i, j;
514 u64 bw_mode, num, num2;
515 u32 resamp_ratio, cfreq_off_ratio;
Thomas Mair82041c02012-05-18 14:47:40 -0300516 static u8 bw_params[3][32] = {
517 /* 6 MHz bandwidth */
518 {
519 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
520 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
521 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
522 0x19, 0xe0,
523 },
524
525 /* 7 MHz bandwidth */
526 {
527 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
528 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
529 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
530 0x19, 0x10,
531 },
532
533 /* 8 MHz bandwidth */
534 {
535 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
536 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
537 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
538 0x19, 0xe0,
539 },
540 };
541
542
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300543 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
544 c->frequency, c->bandwidth_hz, c->inversion);
Thomas Mair82041c02012-05-18 14:47:40 -0300545
546 /* program tuner */
547 if (fe->ops.tuner_ops.set_params)
548 fe->ops.tuner_ops.set_params(fe);
549
Antti Palosaarife37b382013-11-28 19:15:19 -0300550 /* PIP mode related */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300551 ret = rtl2832_wr_regs(dev, 0x92, 1, "\x00\x0f\xff", 3);
Antti Palosaarife37b382013-11-28 19:15:19 -0300552 if (ret)
553 goto err;
554
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300555 /* If the frontend has get_if_frequency(), use it */
556 if (fe->ops.tuner_ops.get_if_frequency) {
557 u32 if_freq;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300558
559 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
560 if (ret)
561 goto err;
562
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300563 ret = rtl2832_set_if(fe, if_freq);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300564 if (ret)
565 goto err;
566 }
567
Thomas Mair82041c02012-05-18 14:47:40 -0300568 switch (c->bandwidth_hz) {
569 case 6000000:
570 i = 0;
571 bw_mode = 48000000;
572 break;
573 case 7000000:
574 i = 1;
575 bw_mode = 56000000;
576 break;
577 case 8000000:
578 i = 2;
579 bw_mode = 64000000;
580 break;
581 default:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300582 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
583 c->bandwidth_hz);
584 ret = -EINVAL;
585 goto err;
Thomas Mair82041c02012-05-18 14:47:40 -0300586 }
587
Hans-Frieder Vogtfc4b3fa2012-07-15 13:56:47 -0300588 for (j = 0; j < sizeof(bw_params[0]); j++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300589 ret = rtl2832_wr_regs(dev, 0x1c+j, 1, &bw_params[i][j], 1);
Thomas Mair82041c02012-05-18 14:47:40 -0300590 if (ret)
591 goto err;
592 }
593
594 /* calculate and set resample ratio
595 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
596 * / ConstWithBandwidthMode)
597 */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300598 num = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300599 num *= 0x400000;
600 num = div_u64(num, bw_mode);
601 resamp_ratio = num & 0x3ffffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300602 ret = rtl2832_wr_demod_reg(dev, DVBT_RSAMP_RATIO, resamp_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300603 if (ret)
604 goto err;
605
606 /* calculate and set cfreq off ratio
607 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
608 * / (CrystalFreqHz * 7))
609 */
610 num = bw_mode << 20;
Antti Palosaarie1174d72014-12-13 05:26:27 -0300611 num2 = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300612 num = div_u64(num, num2);
613 num = -num;
614 cfreq_off_ratio = num & 0xfffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300615 ret = rtl2832_wr_demod_reg(dev, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300616 if (ret)
617 goto err;
618
Thomas Mair82041c02012-05-18 14:47:40 -0300619 /* soft reset */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300620 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
Thomas Mair82041c02012-05-18 14:47:40 -0300621 if (ret)
622 goto err;
623
Antti Palosaari038c6f22014-12-13 00:37:43 -0300624 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
Thomas Mair82041c02012-05-18 14:47:40 -0300625 if (ret)
626 goto err;
627
628 return ret;
629err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300630 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300631 return ret;
632}
633
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300634static int rtl2832_get_frontend(struct dvb_frontend *fe)
635{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300636 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300637 struct i2c_client *client = dev->client;
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300638 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
639 int ret;
640 u8 buf[3];
641
Antti Palosaari038c6f22014-12-13 00:37:43 -0300642 if (dev->sleeping)
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300643 return 0;
644
Antti Palosaari038c6f22014-12-13 00:37:43 -0300645 ret = rtl2832_rd_regs(dev, 0x3c, 3, buf, 2);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300646 if (ret)
647 goto err;
648
Antti Palosaari038c6f22014-12-13 00:37:43 -0300649 ret = rtl2832_rd_reg(dev, 0x51, 3, &buf[2]);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300650 if (ret)
651 goto err;
652
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300653 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300654
655 switch ((buf[0] >> 2) & 3) {
656 case 0:
657 c->modulation = QPSK;
658 break;
659 case 1:
660 c->modulation = QAM_16;
661 break;
662 case 2:
663 c->modulation = QAM_64;
664 break;
665 }
666
667 switch ((buf[2] >> 2) & 1) {
668 case 0:
669 c->transmission_mode = TRANSMISSION_MODE_2K;
670 break;
671 case 1:
672 c->transmission_mode = TRANSMISSION_MODE_8K;
673 }
674
675 switch ((buf[2] >> 0) & 3) {
676 case 0:
677 c->guard_interval = GUARD_INTERVAL_1_32;
678 break;
679 case 1:
680 c->guard_interval = GUARD_INTERVAL_1_16;
681 break;
682 case 2:
683 c->guard_interval = GUARD_INTERVAL_1_8;
684 break;
685 case 3:
686 c->guard_interval = GUARD_INTERVAL_1_4;
687 break;
688 }
689
690 switch ((buf[0] >> 4) & 7) {
691 case 0:
692 c->hierarchy = HIERARCHY_NONE;
693 break;
694 case 1:
695 c->hierarchy = HIERARCHY_1;
696 break;
697 case 2:
698 c->hierarchy = HIERARCHY_2;
699 break;
700 case 3:
701 c->hierarchy = HIERARCHY_4;
702 break;
703 }
704
705 switch ((buf[1] >> 3) & 7) {
706 case 0:
707 c->code_rate_HP = FEC_1_2;
708 break;
709 case 1:
710 c->code_rate_HP = FEC_2_3;
711 break;
712 case 2:
713 c->code_rate_HP = FEC_3_4;
714 break;
715 case 3:
716 c->code_rate_HP = FEC_5_6;
717 break;
718 case 4:
719 c->code_rate_HP = FEC_7_8;
720 break;
721 }
722
723 switch ((buf[1] >> 0) & 7) {
724 case 0:
725 c->code_rate_LP = FEC_1_2;
726 break;
727 case 1:
728 c->code_rate_LP = FEC_2_3;
729 break;
730 case 2:
731 c->code_rate_LP = FEC_3_4;
732 break;
733 case 3:
734 c->code_rate_LP = FEC_5_6;
735 break;
736 case 4:
737 c->code_rate_LP = FEC_7_8;
738 break;
739 }
740
741 return 0;
742err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300743 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300744 return ret;
745}
746
Thomas Mair82041c02012-05-18 14:47:40 -0300747static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
748{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300749 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300750 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300751 int ret;
752 u32 tmp;
Thomas Mair82041c02012-05-18 14:47:40 -0300753
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300754 dev_dbg(&client->dev, "\n");
755
756 *status = 0;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300757 if (dev->sleeping)
Thomas Mair82041c02012-05-18 14:47:40 -0300758 return 0;
759
Antti Palosaari038c6f22014-12-13 00:37:43 -0300760 ret = rtl2832_rd_demod_reg(dev, DVBT_FSM_STAGE, &tmp);
Thomas Mair82041c02012-05-18 14:47:40 -0300761 if (ret)
762 goto err;
763
764 if (tmp == 11) {
765 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
766 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
767 }
768 /* TODO find out if this is also true for rtl2832? */
769 /*else if (tmp == 10) {
770 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
771 FE_HAS_VITERBI;
772 }*/
773
774 return ret;
775err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300776 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300777 return ret;
778}
779
Antti Palosaari73983492012-08-21 19:56:21 -0300780static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
781{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300782 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300783 struct i2c_client *client = dev->client;
Antti Palosaari73983492012-08-21 19:56:21 -0300784 int ret, hierarchy, constellation;
785 u8 buf[2], tmp;
786 u16 tmp16;
787#define CONSTELLATION_NUM 3
788#define HIERARCHY_NUM 4
789 static const u32 snr_constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
790 { 85387325, 85387325, 85387325, 85387325 },
791 { 86676178, 86676178, 87167949, 87795660 },
792 { 87659938, 87659938, 87885178, 88241743 },
793 };
794
795 /* reports SNR in resolution of 0.1 dB */
796
Antti Palosaari038c6f22014-12-13 00:37:43 -0300797 ret = rtl2832_rd_reg(dev, 0x3c, 3, &tmp);
Antti Palosaari73983492012-08-21 19:56:21 -0300798 if (ret)
799 goto err;
800
801 constellation = (tmp >> 2) & 0x03; /* [3:2] */
802 if (constellation > CONSTELLATION_NUM - 1)
803 goto err;
804
805 hierarchy = (tmp >> 4) & 0x07; /* [6:4] */
806 if (hierarchy > HIERARCHY_NUM - 1)
807 goto err;
808
Antti Palosaari038c6f22014-12-13 00:37:43 -0300809 ret = rtl2832_rd_regs(dev, 0x0c, 4, buf, 2);
Antti Palosaari73983492012-08-21 19:56:21 -0300810 if (ret)
811 goto err;
812
813 tmp16 = buf[0] << 8 | buf[1];
814
815 if (tmp16)
816 *snr = (snr_constant[constellation][hierarchy] -
817 intlog10(tmp16)) / ((1 << 24) / 100);
818 else
819 *snr = 0;
820
821 return 0;
822err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300823 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari73983492012-08-21 19:56:21 -0300824 return ret;
825}
826
Antti Palosaaridb32d742012-08-21 19:56:22 -0300827static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
828{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300829 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300830 struct i2c_client *client = dev->client;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300831 int ret;
832 u8 buf[2];
833
Antti Palosaari038c6f22014-12-13 00:37:43 -0300834 ret = rtl2832_rd_regs(dev, 0x4e, 3, buf, 2);
Antti Palosaaridb32d742012-08-21 19:56:22 -0300835 if (ret)
836 goto err;
837
838 *ber = buf[0] << 8 | buf[1];
839
840 return 0;
841err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300842 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaaridb32d742012-08-21 19:56:22 -0300843 return ret;
844}
845
Antti Palosaari92d20d92014-02-08 03:50:04 -0300846/*
Antti Palosaarid1016582014-12-14 04:45:57 -0300847 * I2C gate/mux/repeater logic
848 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
849 * adapter lock is already taken by tuner driver.
850 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
851 * is delayed here a little bit in order to see if there is sequence of I2C
Antti Palosaari92d20d92014-02-08 03:50:04 -0300852 * messages sent to same I2C bus.
Antti Palosaari92d20d92014-02-08 03:50:04 -0300853 */
854static void rtl2832_i2c_gate_work(struct work_struct *work)
Antti Palosaari8823f022013-11-26 12:53:46 -0300855{
Antti Palosaarid1016582014-12-14 04:45:57 -0300856 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, i2c_gate_work.work);
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300857 struct i2c_client *client = dev->client;
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300858 int ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300859
Antti Palosaarid1016582014-12-14 04:45:57 -0300860 /* close gate */
861 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
862 if (ret)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300863 goto err;
864
Antti Palosaari038c6f22014-12-13 00:37:43 -0300865 dev->i2c_gate_state = false;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300866
867 return;
868err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300869 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300870 return;
871}
872
873static int rtl2832_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
874{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300875 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300876 struct i2c_client *client = dev->client;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300877 int ret;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300878
879 /* terminate possible gate closing */
Antti Palosaarid1016582014-12-14 04:45:57 -0300880 cancel_delayed_work(&dev->i2c_gate_work);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300881
Antti Palosaari038c6f22014-12-13 00:37:43 -0300882 if (dev->i2c_gate_state == chan_id)
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300883 return 0;
884
Antti Palosaarid1016582014-12-14 04:45:57 -0300885 /*
886 * chan_id 1 is muxed adapter demod provides and chan_id 0 is demod
887 * itself. We need open gate when request is for chan_id 1. On that case
888 * I2C adapter lock is already taken and due to that we will use
889 * regmap_update_bits() which does not lock again I2C adapter.
890 */
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300891 if (chan_id == 1)
Antti Palosaarid1016582014-12-14 04:45:57 -0300892 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300893 else
Antti Palosaarid1016582014-12-14 04:45:57 -0300894 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
895 if (ret)
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300896 goto err;
897
Antti Palosaari038c6f22014-12-13 00:37:43 -0300898 dev->i2c_gate_state = chan_id;
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300899
900 return 0;
901err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300902 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaarid1016582014-12-14 04:45:57 -0300903 return ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300904}
905
Antti Palosaari92d20d92014-02-08 03:50:04 -0300906static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv,
Antti Palosaarid1016582014-12-14 04:45:57 -0300907 u32 chan_id)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300908{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300909 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300910
Antti Palosaari038c6f22014-12-13 00:37:43 -0300911 schedule_delayed_work(&dev->i2c_gate_work, usecs_to_jiffies(100));
Antti Palosaari92d20d92014-02-08 03:50:04 -0300912 return 0;
913}
914
Thomas Mair82041c02012-05-18 14:47:40 -0300915static struct dvb_frontend_ops rtl2832_ops = {
916 .delsys = { SYS_DVBT },
917 .info = {
918 .name = "Realtek RTL2832 (DVB-T)",
919 .frequency_min = 174000000,
920 .frequency_max = 862000000,
921 .frequency_stepsize = 166667,
922 .caps = FE_CAN_FEC_1_2 |
923 FE_CAN_FEC_2_3 |
924 FE_CAN_FEC_3_4 |
925 FE_CAN_FEC_5_6 |
926 FE_CAN_FEC_7_8 |
927 FE_CAN_FEC_AUTO |
928 FE_CAN_QPSK |
929 FE_CAN_QAM_16 |
930 FE_CAN_QAM_64 |
931 FE_CAN_QAM_AUTO |
932 FE_CAN_TRANSMISSION_MODE_AUTO |
933 FE_CAN_GUARD_INTERVAL_AUTO |
934 FE_CAN_HIERARCHY_AUTO |
935 FE_CAN_RECOVER |
936 FE_CAN_MUTE_TS
937 },
938
Thomas Mair82041c02012-05-18 14:47:40 -0300939 .init = rtl2832_init,
940 .sleep = rtl2832_sleep,
941
942 .get_tune_settings = rtl2832_get_tune_settings,
943
944 .set_frontend = rtl2832_set_frontend,
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300945 .get_frontend = rtl2832_get_frontend,
Thomas Mair82041c02012-05-18 14:47:40 -0300946
947 .read_status = rtl2832_read_status,
Antti Palosaari73983492012-08-21 19:56:21 -0300948 .read_snr = rtl2832_read_snr,
Antti Palosaaridb32d742012-08-21 19:56:22 -0300949 .read_ber = rtl2832_read_ber,
Antti Palosaari73983492012-08-21 19:56:21 -0300950
Thomas Mair82041c02012-05-18 14:47:40 -0300951 .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
952};
953
Antti Palosaarid1016582014-12-14 04:45:57 -0300954/*
955 * We implement own I2C access routines for regmap in order to get manual access
956 * to I2C adapter lock, which is needed for I2C mux adapter.
957 */
958static int rtl2832_regmap_read(void *context, const void *reg_buf,
959 size_t reg_size, void *val_buf, size_t val_size)
960{
961 struct i2c_client *client = context;
962 int ret;
963 struct i2c_msg msg[2] = {
964 {
965 .addr = client->addr,
966 .flags = 0,
967 .len = reg_size,
968 .buf = (u8 *)reg_buf,
969 }, {
970 .addr = client->addr,
971 .flags = I2C_M_RD,
972 .len = val_size,
973 .buf = val_buf,
974 }
975 };
976
977 ret = __i2c_transfer(client->adapter, msg, 2);
978 if (ret != 2) {
979 dev_warn(&client->dev, "i2c reg read failed %d\n", ret);
980 if (ret >= 0)
981 ret = -EREMOTEIO;
982 return ret;
983 }
984 return 0;
985}
986
987static int rtl2832_regmap_write(void *context, const void *data, size_t count)
988{
989 struct i2c_client *client = context;
990 int ret;
991 struct i2c_msg msg[1] = {
992 {
993 .addr = client->addr,
994 .flags = 0,
995 .len = count,
996 .buf = (u8 *)data,
997 }
998 };
999
1000 ret = __i2c_transfer(client->adapter, msg, 1);
1001 if (ret != 1) {
1002 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
1003 if (ret >= 0)
1004 ret = -EREMOTEIO;
1005 return ret;
1006 }
1007 return 0;
1008}
1009
1010static int rtl2832_regmap_gather_write(void *context, const void *reg,
1011 size_t reg_len, const void *val,
1012 size_t val_len)
1013{
1014 struct i2c_client *client = context;
1015 int ret;
1016 u8 buf[256];
1017 struct i2c_msg msg[1] = {
1018 {
1019 .addr = client->addr,
1020 .flags = 0,
1021 .len = 1 + val_len,
1022 .buf = buf,
1023 }
1024 };
1025
1026 buf[0] = *(u8 const *)reg;
1027 memcpy(&buf[1], val, val_len);
1028
1029 ret = __i2c_transfer(client->adapter, msg, 1);
1030 if (ret != 1) {
1031 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
1032 if (ret >= 0)
1033 ret = -EREMOTEIO;
1034 return ret;
1035 }
1036 return 0;
1037}
1038
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001039static struct dvb_frontend *rtl2832_get_dvb_frontend(struct i2c_client *client)
1040{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001041 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001042
1043 dev_dbg(&client->dev, "\n");
1044 return &dev->fe;
1045}
1046
1047static struct i2c_adapter *rtl2832_get_i2c_adapter_(struct i2c_client *client)
1048{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001049 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001050
1051 dev_dbg(&client->dev, "\n");
1052 return dev->i2c_adapter_tuner;
1053}
1054
1055static struct i2c_adapter *rtl2832_get_private_i2c_adapter_(struct i2c_client *client)
1056{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001057 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001058
1059 dev_dbg(&client->dev, "\n");
1060 return dev->i2c_adapter;
1061}
1062
1063static int rtl2832_enable_slave_ts(struct i2c_client *client)
1064{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001065 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001066 int ret;
1067
Antti Palosaari6e6aac62014-12-13 02:28:33 -03001068 dev_dbg(&client->dev, "\n");
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001069
1070 ret = rtl2832_wr_regs(dev, 0x0c, 1, "\x5f\xff", 2);
1071 if (ret)
1072 goto err;
1073
1074 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
1075 if (ret)
1076 goto err;
1077
1078 ret = rtl2832_wr_reg(dev, 0xbc, 0, 0x18);
1079 if (ret)
1080 goto err;
1081
1082 ret = rtl2832_wr_reg(dev, 0x22, 0, 0x01);
1083 if (ret)
1084 goto err;
1085
1086 ret = rtl2832_wr_reg(dev, 0x26, 0, 0x1f);
1087 if (ret)
1088 goto err;
1089
1090 ret = rtl2832_wr_reg(dev, 0x27, 0, 0xff);
1091 if (ret)
1092 goto err;
1093
1094 ret = rtl2832_wr_regs(dev, 0x92, 1, "\x7f\xf7\xff", 3);
1095 if (ret)
1096 goto err;
1097
1098 /* soft reset */
1099 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
1100 if (ret)
1101 goto err;
1102
1103 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
1104 if (ret)
1105 goto err;
1106
1107 return 0;
1108err:
1109 dev_dbg(&client->dev, "failed=%d\n", ret);
1110 return ret;
1111}
1112
Antti Palosaaric2c83862014-12-02 10:55:17 -03001113static int rtl2832_probe(struct i2c_client *client,
1114 const struct i2c_device_id *id)
1115{
1116 struct rtl2832_platform_data *pdata = client->dev.platform_data;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001117 struct i2c_adapter *i2c = client->adapter;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001118 struct rtl2832_dev *dev;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001119 int ret;
1120 u8 tmp;
Antti Palosaarid1016582014-12-14 04:45:57 -03001121 static const struct regmap_bus regmap_bus = {
1122 .read = rtl2832_regmap_read,
1123 .write = rtl2832_regmap_write,
1124 .gather_write = rtl2832_regmap_gather_write,
1125 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
1126 };
1127 static const struct regmap_range_cfg regmap_range_cfg[] = {
1128 {
1129 .selector_reg = 0x00,
1130 .selector_mask = 0xff,
1131 .selector_shift = 0,
1132 .window_start = 0,
1133 .window_len = 0x100,
1134 .range_min = 0 * 0x100,
1135 .range_max = 5 * 0x100,
1136 },
1137 };
1138 static const struct regmap_config regmap_config = {
1139 .reg_bits = 8,
1140 .val_bits = 8,
1141 .max_register = 5 * 0x100,
1142 .ranges = regmap_range_cfg,
1143 .num_ranges = ARRAY_SIZE(regmap_range_cfg),
1144 };
Antti Palosaaric2c83862014-12-02 10:55:17 -03001145
1146 dev_dbg(&client->dev, "\n");
1147
Antti Palosaaric2c83862014-12-02 10:55:17 -03001148 /* allocate memory for the internal state */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001149 dev = kzalloc(sizeof(struct rtl2832_dev), GFP_KERNEL);
1150 if (dev == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001151 ret = -ENOMEM;
1152 goto err;
1153 }
1154
Antti Palosaari038c6f22014-12-13 00:37:43 -03001155 /* setup the state */
Antti Palosaarid1016582014-12-14 04:45:57 -03001156 i2c_set_clientdata(client, dev);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001157 dev->client = client;
Antti Palosaarie1174d72014-12-13 05:26:27 -03001158 dev->pdata = client->dev.platform_data;
1159 if (pdata->config) {
1160 dev->pdata->clk = pdata->config->xtal;
1161 dev->pdata->tuner = pdata->config->tuner;
1162 }
Antti Palosaari038c6f22014-12-13 00:37:43 -03001163 dev->sleeping = true;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001164 INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work);
Antti Palosaarid1016582014-12-14 04:45:57 -03001165 /* create regmap */
1166 dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
1167 &regmap_config);
1168 if (IS_ERR(dev->regmap)) {
1169 ret = PTR_ERR(dev->regmap);
1170 goto err_kfree;
1171 }
Antti Palosaaric2c83862014-12-02 10:55:17 -03001172 /* create muxed i2c adapter for demod itself */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001173 dev->i2c_adapter = i2c_add_mux_adapter(i2c, &i2c->dev, dev, 0, 0, 0,
Antti Palosaaric2c83862014-12-02 10:55:17 -03001174 rtl2832_select, NULL);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001175 if (dev->i2c_adapter == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001176 ret = -ENODEV;
Antti Palosaarid1016582014-12-14 04:45:57 -03001177 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001178 }
1179
1180 /* check if the demod is there */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001181 ret = rtl2832_rd_reg(dev, 0x00, 0x0, &tmp);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001182 if (ret)
1183 goto err_i2c_del_mux_adapter;
1184
1185 /* create muxed i2c adapter for demod tuner bus */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001186 dev->i2c_adapter_tuner = i2c_add_mux_adapter(i2c, &i2c->dev, dev,
Antti Palosaaric2c83862014-12-02 10:55:17 -03001187 0, 1, 0, rtl2832_select, rtl2832_deselect);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001188 if (dev->i2c_adapter_tuner == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001189 ret = -ENODEV;
1190 goto err_i2c_del_mux_adapter;
1191 }
1192
1193 /* create dvb_frontend */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001194 memcpy(&dev->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
1195 dev->fe.demodulator_priv = dev;
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001196
1197 /* setup callbacks */
1198 pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
1199 pdata->get_i2c_adapter = rtl2832_get_i2c_adapter_;
1200 pdata->get_private_i2c_adapter = rtl2832_get_private_i2c_adapter_;
1201 pdata->enable_slave_ts = rtl2832_enable_slave_ts;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001202
1203 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
1204 return 0;
1205err_i2c_del_mux_adapter:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001206 i2c_del_mux_adapter(dev->i2c_adapter);
Antti Palosaarid1016582014-12-14 04:45:57 -03001207err_regmap_exit:
1208 regmap_exit(dev->regmap);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001209err_kfree:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001210 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001211err:
1212 dev_dbg(&client->dev, "failed=%d\n", ret);
1213 return ret;
1214}
1215
1216static int rtl2832_remove(struct i2c_client *client)
1217{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001218 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001219
1220 dev_dbg(&client->dev, "\n");
1221
Antti Palosaari038c6f22014-12-13 00:37:43 -03001222 cancel_delayed_work_sync(&dev->i2c_gate_work);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001223
Antti Palosaari038c6f22014-12-13 00:37:43 -03001224 i2c_del_mux_adapter(dev->i2c_adapter_tuner);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001225
Antti Palosaari038c6f22014-12-13 00:37:43 -03001226 i2c_del_mux_adapter(dev->i2c_adapter);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001227
Antti Palosaarid1016582014-12-14 04:45:57 -03001228 regmap_exit(dev->regmap);
1229
Antti Palosaari038c6f22014-12-13 00:37:43 -03001230 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001231
1232 return 0;
1233}
1234
1235static const struct i2c_device_id rtl2832_id_table[] = {
1236 {"rtl2832", 0},
1237 {}
1238};
1239MODULE_DEVICE_TABLE(i2c, rtl2832_id_table);
1240
1241static struct i2c_driver rtl2832_driver = {
1242 .driver = {
1243 .owner = THIS_MODULE,
1244 .name = "rtl2832",
1245 },
1246 .probe = rtl2832_probe,
1247 .remove = rtl2832_remove,
1248 .id_table = rtl2832_id_table,
1249};
1250
1251module_i2c_driver(rtl2832_driver);
1252
Thomas Mair82041c02012-05-18 14:47:40 -03001253MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
1254MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1255MODULE_LICENSE("GPL");
1256MODULE_VERSION("0.5");