blob: 0a0899d2a6b204ad973fab959ab53c20d470d33c [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 Palosaari19d273d2014-12-14 06:55:43 -0300370 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300371 const struct rtl2832_reg_value *init;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300372 int i, ret, len;
Thomas Mair82041c02012-05-18 14:47:40 -0300373 /* initialization values for the demodulator registers */
374 struct rtl2832_reg_value rtl2832_initial_regs[] = {
375 {DVBT_AD_EN_REG, 0x1},
376 {DVBT_AD_EN_REG1, 0x1},
377 {DVBT_RSD_BER_FAIL_VAL, 0x2800},
378 {DVBT_MGD_THD0, 0x10},
379 {DVBT_MGD_THD1, 0x20},
380 {DVBT_MGD_THD2, 0x20},
381 {DVBT_MGD_THD3, 0x40},
382 {DVBT_MGD_THD4, 0x22},
383 {DVBT_MGD_THD5, 0x32},
384 {DVBT_MGD_THD6, 0x37},
385 {DVBT_MGD_THD7, 0x39},
386 {DVBT_EN_BK_TRK, 0x0},
387 {DVBT_EN_CACQ_NOTCH, 0x0},
388 {DVBT_AD_AV_REF, 0x2a},
389 {DVBT_REG_PI, 0x6},
390 {DVBT_PIP_ON, 0x0},
391 {DVBT_CDIV_PH0, 0x8},
392 {DVBT_CDIV_PH1, 0x8},
393 {DVBT_SCALE1_B92, 0x4},
394 {DVBT_SCALE1_B93, 0xb0},
395 {DVBT_SCALE1_BA7, 0x78},
396 {DVBT_SCALE1_BA9, 0x28},
397 {DVBT_SCALE1_BAA, 0x59},
398 {DVBT_SCALE1_BAB, 0x83},
399 {DVBT_SCALE1_BAC, 0xd4},
400 {DVBT_SCALE1_BB0, 0x65},
401 {DVBT_SCALE1_BB1, 0x43},
402 {DVBT_KB_P1, 0x1},
403 {DVBT_KB_P2, 0x4},
404 {DVBT_KB_P3, 0x7},
405 {DVBT_K1_CR_STEP12, 0xa},
406 {DVBT_REG_GPE, 0x1},
407 {DVBT_SERIAL, 0x0},
408 {DVBT_CDIV_PH0, 0x9},
409 {DVBT_CDIV_PH1, 0x9},
410 {DVBT_MPEG_IO_OPT_2_2, 0x0},
411 {DVBT_MPEG_IO_OPT_1_0, 0x0},
412 {DVBT_TRK_KS_P2, 0x4},
413 {DVBT_TRK_KS_I2, 0x7},
414 {DVBT_TR_THD_SET2, 0x6},
415 {DVBT_TRK_KC_I2, 0x5},
416 {DVBT_CR_THD_SET2, 0x1},
Thomas Mair82041c02012-05-18 14:47:40 -0300417 };
418
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300419 dev_dbg(&client->dev, "\n");
Thomas Mair82041c02012-05-18 14:47:40 -0300420
Thomas Mair82041c02012-05-18 14:47:40 -0300421 for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300422 ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
Thomas Mair82041c02012-05-18 14:47:40 -0300423 rtl2832_initial_regs[i].value);
424 if (ret)
425 goto err;
426 }
427
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300428 /* load tuner specific settings */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300429 dev_dbg(&client->dev, "load settings for tuner=%02x\n",
430 dev->pdata->tuner);
431 switch (dev->pdata->tuner) {
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300432 case RTL2832_TUNER_FC0012:
433 case RTL2832_TUNER_FC0013:
434 len = ARRAY_SIZE(rtl2832_tuner_init_fc0012);
435 init = rtl2832_tuner_init_fc0012;
436 break;
Antti Palosaari5db41872012-09-11 22:27:08 -0300437 case RTL2832_TUNER_TUA9001:
438 len = ARRAY_SIZE(rtl2832_tuner_init_tua9001);
439 init = rtl2832_tuner_init_tua9001;
440 break;
Antti Palosaari7e688de2012-09-17 17:53:04 -0300441 case RTL2832_TUNER_E4000:
442 len = ARRAY_SIZE(rtl2832_tuner_init_e4000);
443 init = rtl2832_tuner_init_e4000;
444 break;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300445 case RTL2832_TUNER_R820T:
Antti Palosaaria26758e2013-10-30 00:36:38 -0300446 case RTL2832_TUNER_R828D:
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300447 len = ARRAY_SIZE(rtl2832_tuner_init_r820t);
448 init = rtl2832_tuner_init_r820t;
449 break;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300450 default:
451 ret = -EINVAL;
452 goto err;
453 }
454
455 for (i = 0; i < len; i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300456 ret = rtl2832_wr_demod_reg(dev, init[i].reg, init[i].value);
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300457 if (ret)
458 goto err;
459 }
460
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300461 /*
462 * r820t NIM code does a software reset here at the demod -
Antti Palosaari3ca24182013-10-13 00:06:44 -0300463 * may not be needed, as there's already a software reset at
464 * set_params()
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300465 */
466#if 1
467 /* soft reset */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300468 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300469 if (ret)
470 goto err;
471
Antti Palosaari038c6f22014-12-13 00:37:43 -0300472 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300473 if (ret)
474 goto err;
475#endif
Antti Palosaari19d273d2014-12-14 06:55:43 -0300476 /* init stats here in order signal app which stats are supported */
477 c->cnr.len = 1;
478 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300479 c->post_bit_error.len = 1;
480 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
481 c->post_bit_count.len = 1;
482 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300483 /* start statistics polling */
484 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
Antti Palosaari038c6f22014-12-13 00:37:43 -0300485 dev->sleeping = false;
Thomas Mair82041c02012-05-18 14:47:40 -0300486
487 return ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300488err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300489 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300490 return ret;
491}
492
493static int rtl2832_sleep(struct dvb_frontend *fe)
494{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300495 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300496 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300497
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300498 dev_dbg(&client->dev, "\n");
Antti Palosaari038c6f22014-12-13 00:37:43 -0300499 dev->sleeping = true;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300500 /* stop statistics polling */
501 cancel_delayed_work_sync(&dev->stat_work);
502 dev->fe_status = 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300503 return 0;
504}
505
Mauro Carvalho Chehabb0944ea2012-10-27 11:24:37 -0300506static int rtl2832_get_tune_settings(struct dvb_frontend *fe,
Thomas Mair82041c02012-05-18 14:47:40 -0300507 struct dvb_frontend_tune_settings *s)
508{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300509 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300510 struct i2c_client *client = dev->client;
Antti Palosaari298efdd2012-09-11 22:27:11 -0300511
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300512 dev_dbg(&client->dev, "\n");
Thomas Mair82041c02012-05-18 14:47:40 -0300513 s->min_delay_ms = 1000;
514 s->step_size = fe->ops.info.frequency_stepsize * 2;
515 s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
516 return 0;
517}
518
519static int rtl2832_set_frontend(struct dvb_frontend *fe)
520{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300521 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300522 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300523 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
524 int ret, i, j;
525 u64 bw_mode, num, num2;
526 u32 resamp_ratio, cfreq_off_ratio;
Thomas Mair82041c02012-05-18 14:47:40 -0300527 static u8 bw_params[3][32] = {
528 /* 6 MHz bandwidth */
529 {
530 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
531 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
532 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
533 0x19, 0xe0,
534 },
535
536 /* 7 MHz bandwidth */
537 {
538 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
539 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
540 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
541 0x19, 0x10,
542 },
543
544 /* 8 MHz bandwidth */
545 {
546 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
547 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
548 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
549 0x19, 0xe0,
550 },
551 };
552
553
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300554 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
555 c->frequency, c->bandwidth_hz, c->inversion);
Thomas Mair82041c02012-05-18 14:47:40 -0300556
557 /* program tuner */
558 if (fe->ops.tuner_ops.set_params)
559 fe->ops.tuner_ops.set_params(fe);
560
Antti Palosaarife37b382013-11-28 19:15:19 -0300561 /* PIP mode related */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300562 ret = rtl2832_wr_regs(dev, 0x92, 1, "\x00\x0f\xff", 3);
Antti Palosaarife37b382013-11-28 19:15:19 -0300563 if (ret)
564 goto err;
565
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300566 /* If the frontend has get_if_frequency(), use it */
567 if (fe->ops.tuner_ops.get_if_frequency) {
568 u32 if_freq;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300569
570 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
571 if (ret)
572 goto err;
573
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300574 ret = rtl2832_set_if(fe, if_freq);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300575 if (ret)
576 goto err;
577 }
578
Thomas Mair82041c02012-05-18 14:47:40 -0300579 switch (c->bandwidth_hz) {
580 case 6000000:
581 i = 0;
582 bw_mode = 48000000;
583 break;
584 case 7000000:
585 i = 1;
586 bw_mode = 56000000;
587 break;
588 case 8000000:
589 i = 2;
590 bw_mode = 64000000;
591 break;
592 default:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300593 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
594 c->bandwidth_hz);
595 ret = -EINVAL;
596 goto err;
Thomas Mair82041c02012-05-18 14:47:40 -0300597 }
598
Hans-Frieder Vogtfc4b3fa2012-07-15 13:56:47 -0300599 for (j = 0; j < sizeof(bw_params[0]); j++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300600 ret = rtl2832_wr_regs(dev, 0x1c+j, 1, &bw_params[i][j], 1);
Thomas Mair82041c02012-05-18 14:47:40 -0300601 if (ret)
602 goto err;
603 }
604
605 /* calculate and set resample ratio
606 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
607 * / ConstWithBandwidthMode)
608 */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300609 num = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300610 num *= 0x400000;
611 num = div_u64(num, bw_mode);
612 resamp_ratio = num & 0x3ffffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300613 ret = rtl2832_wr_demod_reg(dev, DVBT_RSAMP_RATIO, resamp_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300614 if (ret)
615 goto err;
616
617 /* calculate and set cfreq off ratio
618 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
619 * / (CrystalFreqHz * 7))
620 */
621 num = bw_mode << 20;
Antti Palosaarie1174d72014-12-13 05:26:27 -0300622 num2 = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300623 num = div_u64(num, num2);
624 num = -num;
625 cfreq_off_ratio = num & 0xfffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300626 ret = rtl2832_wr_demod_reg(dev, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300627 if (ret)
628 goto err;
629
Thomas Mair82041c02012-05-18 14:47:40 -0300630 /* soft reset */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300631 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
Thomas Mair82041c02012-05-18 14:47:40 -0300632 if (ret)
633 goto err;
634
Antti Palosaari038c6f22014-12-13 00:37:43 -0300635 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
Thomas Mair82041c02012-05-18 14:47:40 -0300636 if (ret)
637 goto err;
638
639 return ret;
640err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300641 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300642 return ret;
643}
644
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300645static int rtl2832_get_frontend(struct dvb_frontend *fe)
646{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300647 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300648 struct i2c_client *client = dev->client;
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300649 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
650 int ret;
651 u8 buf[3];
652
Antti Palosaari038c6f22014-12-13 00:37:43 -0300653 if (dev->sleeping)
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300654 return 0;
655
Antti Palosaari038c6f22014-12-13 00:37:43 -0300656 ret = rtl2832_rd_regs(dev, 0x3c, 3, buf, 2);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300657 if (ret)
658 goto err;
659
Antti Palosaari038c6f22014-12-13 00:37:43 -0300660 ret = rtl2832_rd_reg(dev, 0x51, 3, &buf[2]);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300661 if (ret)
662 goto err;
663
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300664 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300665
666 switch ((buf[0] >> 2) & 3) {
667 case 0:
668 c->modulation = QPSK;
669 break;
670 case 1:
671 c->modulation = QAM_16;
672 break;
673 case 2:
674 c->modulation = QAM_64;
675 break;
676 }
677
678 switch ((buf[2] >> 2) & 1) {
679 case 0:
680 c->transmission_mode = TRANSMISSION_MODE_2K;
681 break;
682 case 1:
683 c->transmission_mode = TRANSMISSION_MODE_8K;
684 }
685
686 switch ((buf[2] >> 0) & 3) {
687 case 0:
688 c->guard_interval = GUARD_INTERVAL_1_32;
689 break;
690 case 1:
691 c->guard_interval = GUARD_INTERVAL_1_16;
692 break;
693 case 2:
694 c->guard_interval = GUARD_INTERVAL_1_8;
695 break;
696 case 3:
697 c->guard_interval = GUARD_INTERVAL_1_4;
698 break;
699 }
700
701 switch ((buf[0] >> 4) & 7) {
702 case 0:
703 c->hierarchy = HIERARCHY_NONE;
704 break;
705 case 1:
706 c->hierarchy = HIERARCHY_1;
707 break;
708 case 2:
709 c->hierarchy = HIERARCHY_2;
710 break;
711 case 3:
712 c->hierarchy = HIERARCHY_4;
713 break;
714 }
715
716 switch ((buf[1] >> 3) & 7) {
717 case 0:
718 c->code_rate_HP = FEC_1_2;
719 break;
720 case 1:
721 c->code_rate_HP = FEC_2_3;
722 break;
723 case 2:
724 c->code_rate_HP = FEC_3_4;
725 break;
726 case 3:
727 c->code_rate_HP = FEC_5_6;
728 break;
729 case 4:
730 c->code_rate_HP = FEC_7_8;
731 break;
732 }
733
734 switch ((buf[1] >> 0) & 7) {
735 case 0:
736 c->code_rate_LP = FEC_1_2;
737 break;
738 case 1:
739 c->code_rate_LP = FEC_2_3;
740 break;
741 case 2:
742 c->code_rate_LP = FEC_3_4;
743 break;
744 case 3:
745 c->code_rate_LP = FEC_5_6;
746 break;
747 case 4:
748 c->code_rate_LP = FEC_7_8;
749 break;
750 }
751
752 return 0;
753err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300754 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300755 return ret;
756}
757
Thomas Mair82041c02012-05-18 14:47:40 -0300758static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
759{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300760 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300761 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300762 int ret;
763 u32 tmp;
Thomas Mair82041c02012-05-18 14:47:40 -0300764
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300765 dev_dbg(&client->dev, "\n");
766
767 *status = 0;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300768 if (dev->sleeping)
Thomas Mair82041c02012-05-18 14:47:40 -0300769 return 0;
770
Antti Palosaari038c6f22014-12-13 00:37:43 -0300771 ret = rtl2832_rd_demod_reg(dev, DVBT_FSM_STAGE, &tmp);
Thomas Mair82041c02012-05-18 14:47:40 -0300772 if (ret)
773 goto err;
774
775 if (tmp == 11) {
776 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
777 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
778 }
779 /* TODO find out if this is also true for rtl2832? */
780 /*else if (tmp == 10) {
781 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
782 FE_HAS_VITERBI;
783 }*/
784
Antti Palosaari19d273d2014-12-14 06:55:43 -0300785 dev->fe_status = *status;
Thomas Mair82041c02012-05-18 14:47:40 -0300786 return ret;
787err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300788 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300789 return ret;
790}
791
Antti Palosaari73983492012-08-21 19:56:21 -0300792static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
793{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300794 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300795 struct i2c_client *client = dev->client;
Antti Palosaari73983492012-08-21 19:56:21 -0300796 int ret, hierarchy, constellation;
797 u8 buf[2], tmp;
798 u16 tmp16;
799#define CONSTELLATION_NUM 3
800#define HIERARCHY_NUM 4
801 static const u32 snr_constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
802 { 85387325, 85387325, 85387325, 85387325 },
803 { 86676178, 86676178, 87167949, 87795660 },
804 { 87659938, 87659938, 87885178, 88241743 },
805 };
806
807 /* reports SNR in resolution of 0.1 dB */
808
Antti Palosaari038c6f22014-12-13 00:37:43 -0300809 ret = rtl2832_rd_reg(dev, 0x3c, 3, &tmp);
Antti Palosaari73983492012-08-21 19:56:21 -0300810 if (ret)
811 goto err;
812
813 constellation = (tmp >> 2) & 0x03; /* [3:2] */
814 if (constellation > CONSTELLATION_NUM - 1)
815 goto err;
816
817 hierarchy = (tmp >> 4) & 0x07; /* [6:4] */
818 if (hierarchy > HIERARCHY_NUM - 1)
819 goto err;
820
Antti Palosaari038c6f22014-12-13 00:37:43 -0300821 ret = rtl2832_rd_regs(dev, 0x0c, 4, buf, 2);
Antti Palosaari73983492012-08-21 19:56:21 -0300822 if (ret)
823 goto err;
824
825 tmp16 = buf[0] << 8 | buf[1];
826
827 if (tmp16)
828 *snr = (snr_constant[constellation][hierarchy] -
829 intlog10(tmp16)) / ((1 << 24) / 100);
830 else
831 *snr = 0;
832
833 return 0;
834err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300835 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari73983492012-08-21 19:56:21 -0300836 return ret;
837}
838
Antti Palosaaridb32d742012-08-21 19:56:22 -0300839static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
840{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300841 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300842 struct i2c_client *client = dev->client;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300843 int ret;
844 u8 buf[2];
845
Antti Palosaari038c6f22014-12-13 00:37:43 -0300846 ret = rtl2832_rd_regs(dev, 0x4e, 3, buf, 2);
Antti Palosaaridb32d742012-08-21 19:56:22 -0300847 if (ret)
848 goto err;
849
850 *ber = buf[0] << 8 | buf[1];
851
852 return 0;
853err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300854 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaaridb32d742012-08-21 19:56:22 -0300855 return ret;
856}
857
Antti Palosaari19d273d2014-12-14 06:55:43 -0300858static void rtl2832_stat_work(struct work_struct *work)
859{
860 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, stat_work.work);
861 struct i2c_client *client = dev->client;
862 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
863 int ret, tmp;
864 u8 u8tmp, buf[2];
865 u16 u16tmp;
866
867 dev_dbg(&client->dev, "\n");
868
869 /* CNR */
870 if (dev->fe_status & FE_HAS_VITERBI) {
871 unsigned hierarchy, constellation;
872 #define CONSTELLATION_NUM 3
873 #define HIERARCHY_NUM 4
874 static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
875 {85387325, 85387325, 85387325, 85387325},
876 {86676178, 86676178, 87167949, 87795660},
877 {87659938, 87659938, 87885178, 88241743},
878 };
879
880 ret = rtl2832_bulk_read(client, 0x33c, &u8tmp, 1);
881 if (ret)
882 goto err;
883
884 constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
885 if (constellation > CONSTELLATION_NUM - 1)
886 goto err_schedule_delayed_work;
887
888 hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
889 if (hierarchy > HIERARCHY_NUM - 1)
890 goto err_schedule_delayed_work;
891
892 ret = rtl2832_bulk_read(client, 0x40c, buf, 2);
893 if (ret)
894 goto err;
895
896 u16tmp = buf[0] << 8 | buf[1] << 0;
897 if (u16tmp)
898 tmp = (constant[constellation][hierarchy] -
899 intlog10(u16tmp)) / ((1 << 24) / 10000);
900 else
901 tmp = 0;
902
903 dev_dbg(&client->dev, "cnr raw=%u\n", u16tmp);
904
905 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
906 c->cnr.stat[0].svalue = tmp;
907 } else {
908 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
909 }
910
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300911 /* BER */
912 if (dev->fe_status & FE_HAS_LOCK) {
913 ret = rtl2832_bulk_read(client, 0x34e, buf, 2);
914 if (ret)
915 goto err;
916
917 u16tmp = buf[0] << 8 | buf[1] << 0;
918 dev->post_bit_error += u16tmp;
919 dev->post_bit_count += 1000000;
920
921 dev_dbg(&client->dev, "ber errors=%u total=1000000\n", u16tmp);
922
923 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
924 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
925 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
926 c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
927 } else {
928 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
929 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
930 }
931
Antti Palosaari19d273d2014-12-14 06:55:43 -0300932err_schedule_delayed_work:
933 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
934 return;
935err:
936 dev_dbg(&client->dev, "failed=%d\n", ret);
937}
938
Antti Palosaari92d20d92014-02-08 03:50:04 -0300939/*
Antti Palosaarid1016582014-12-14 04:45:57 -0300940 * I2C gate/mux/repeater logic
941 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
942 * adapter lock is already taken by tuner driver.
943 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
944 * is delayed here a little bit in order to see if there is sequence of I2C
Antti Palosaari92d20d92014-02-08 03:50:04 -0300945 * messages sent to same I2C bus.
Antti Palosaari92d20d92014-02-08 03:50:04 -0300946 */
947static void rtl2832_i2c_gate_work(struct work_struct *work)
Antti Palosaari8823f022013-11-26 12:53:46 -0300948{
Antti Palosaarid1016582014-12-14 04:45:57 -0300949 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, i2c_gate_work.work);
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300950 struct i2c_client *client = dev->client;
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300951 int ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300952
Antti Palosaarid1016582014-12-14 04:45:57 -0300953 /* close gate */
954 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
955 if (ret)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300956 goto err;
957
Antti Palosaari038c6f22014-12-13 00:37:43 -0300958 dev->i2c_gate_state = false;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300959
960 return;
961err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300962 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300963 return;
964}
965
966static int rtl2832_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
967{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300968 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300969 struct i2c_client *client = dev->client;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300970 int ret;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300971
972 /* terminate possible gate closing */
Antti Palosaarid1016582014-12-14 04:45:57 -0300973 cancel_delayed_work(&dev->i2c_gate_work);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300974
Antti Palosaari038c6f22014-12-13 00:37:43 -0300975 if (dev->i2c_gate_state == chan_id)
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300976 return 0;
977
Antti Palosaarid1016582014-12-14 04:45:57 -0300978 /*
979 * chan_id 1 is muxed adapter demod provides and chan_id 0 is demod
980 * itself. We need open gate when request is for chan_id 1. On that case
981 * I2C adapter lock is already taken and due to that we will use
982 * regmap_update_bits() which does not lock again I2C adapter.
983 */
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300984 if (chan_id == 1)
Antti Palosaarid1016582014-12-14 04:45:57 -0300985 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300986 else
Antti Palosaarid1016582014-12-14 04:45:57 -0300987 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
988 if (ret)
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300989 goto err;
990
Antti Palosaari038c6f22014-12-13 00:37:43 -0300991 dev->i2c_gate_state = chan_id;
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300992
993 return 0;
994err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300995 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaarid1016582014-12-14 04:45:57 -0300996 return ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300997}
998
Antti Palosaari92d20d92014-02-08 03:50:04 -0300999static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv,
Antti Palosaarid1016582014-12-14 04:45:57 -03001000 u32 chan_id)
Antti Palosaari92d20d92014-02-08 03:50:04 -03001001{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001002 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -03001003
Antti Palosaari038c6f22014-12-13 00:37:43 -03001004 schedule_delayed_work(&dev->i2c_gate_work, usecs_to_jiffies(100));
Antti Palosaari92d20d92014-02-08 03:50:04 -03001005 return 0;
1006}
1007
Thomas Mair82041c02012-05-18 14:47:40 -03001008static struct dvb_frontend_ops rtl2832_ops = {
1009 .delsys = { SYS_DVBT },
1010 .info = {
1011 .name = "Realtek RTL2832 (DVB-T)",
1012 .frequency_min = 174000000,
1013 .frequency_max = 862000000,
1014 .frequency_stepsize = 166667,
1015 .caps = FE_CAN_FEC_1_2 |
1016 FE_CAN_FEC_2_3 |
1017 FE_CAN_FEC_3_4 |
1018 FE_CAN_FEC_5_6 |
1019 FE_CAN_FEC_7_8 |
1020 FE_CAN_FEC_AUTO |
1021 FE_CAN_QPSK |
1022 FE_CAN_QAM_16 |
1023 FE_CAN_QAM_64 |
1024 FE_CAN_QAM_AUTO |
1025 FE_CAN_TRANSMISSION_MODE_AUTO |
1026 FE_CAN_GUARD_INTERVAL_AUTO |
1027 FE_CAN_HIERARCHY_AUTO |
1028 FE_CAN_RECOVER |
1029 FE_CAN_MUTE_TS
1030 },
1031
Thomas Mair82041c02012-05-18 14:47:40 -03001032 .init = rtl2832_init,
1033 .sleep = rtl2832_sleep,
1034
1035 .get_tune_settings = rtl2832_get_tune_settings,
1036
1037 .set_frontend = rtl2832_set_frontend,
Antti Palosaari0ce67a22012-08-21 19:56:20 -03001038 .get_frontend = rtl2832_get_frontend,
Thomas Mair82041c02012-05-18 14:47:40 -03001039
1040 .read_status = rtl2832_read_status,
Antti Palosaari73983492012-08-21 19:56:21 -03001041 .read_snr = rtl2832_read_snr,
Antti Palosaaridb32d742012-08-21 19:56:22 -03001042 .read_ber = rtl2832_read_ber,
Antti Palosaari73983492012-08-21 19:56:21 -03001043
Thomas Mair82041c02012-05-18 14:47:40 -03001044 .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
1045};
1046
Antti Palosaarid1016582014-12-14 04:45:57 -03001047/*
1048 * We implement own I2C access routines for regmap in order to get manual access
1049 * to I2C adapter lock, which is needed for I2C mux adapter.
1050 */
1051static int rtl2832_regmap_read(void *context, const void *reg_buf,
1052 size_t reg_size, void *val_buf, size_t val_size)
1053{
1054 struct i2c_client *client = context;
1055 int ret;
1056 struct i2c_msg msg[2] = {
1057 {
1058 .addr = client->addr,
1059 .flags = 0,
1060 .len = reg_size,
1061 .buf = (u8 *)reg_buf,
1062 }, {
1063 .addr = client->addr,
1064 .flags = I2C_M_RD,
1065 .len = val_size,
1066 .buf = val_buf,
1067 }
1068 };
1069
1070 ret = __i2c_transfer(client->adapter, msg, 2);
1071 if (ret != 2) {
1072 dev_warn(&client->dev, "i2c reg read failed %d\n", ret);
1073 if (ret >= 0)
1074 ret = -EREMOTEIO;
1075 return ret;
1076 }
1077 return 0;
1078}
1079
1080static int rtl2832_regmap_write(void *context, const void *data, size_t count)
1081{
1082 struct i2c_client *client = context;
1083 int ret;
1084 struct i2c_msg msg[1] = {
1085 {
1086 .addr = client->addr,
1087 .flags = 0,
1088 .len = count,
1089 .buf = (u8 *)data,
1090 }
1091 };
1092
1093 ret = __i2c_transfer(client->adapter, msg, 1);
1094 if (ret != 1) {
1095 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
1096 if (ret >= 0)
1097 ret = -EREMOTEIO;
1098 return ret;
1099 }
1100 return 0;
1101}
1102
1103static int rtl2832_regmap_gather_write(void *context, const void *reg,
1104 size_t reg_len, const void *val,
1105 size_t val_len)
1106{
1107 struct i2c_client *client = context;
1108 int ret;
1109 u8 buf[256];
1110 struct i2c_msg msg[1] = {
1111 {
1112 .addr = client->addr,
1113 .flags = 0,
1114 .len = 1 + val_len,
1115 .buf = buf,
1116 }
1117 };
1118
1119 buf[0] = *(u8 const *)reg;
1120 memcpy(&buf[1], val, val_len);
1121
1122 ret = __i2c_transfer(client->adapter, msg, 1);
1123 if (ret != 1) {
1124 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
1125 if (ret >= 0)
1126 ret = -EREMOTEIO;
1127 return ret;
1128 }
1129 return 0;
1130}
1131
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001132static struct dvb_frontend *rtl2832_get_dvb_frontend(struct i2c_client *client)
1133{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001134 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001135
1136 dev_dbg(&client->dev, "\n");
1137 return &dev->fe;
1138}
1139
1140static struct i2c_adapter *rtl2832_get_i2c_adapter_(struct i2c_client *client)
1141{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001142 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001143
1144 dev_dbg(&client->dev, "\n");
1145 return dev->i2c_adapter_tuner;
1146}
1147
1148static struct i2c_adapter *rtl2832_get_private_i2c_adapter_(struct i2c_client *client)
1149{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001150 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001151
1152 dev_dbg(&client->dev, "\n");
1153 return dev->i2c_adapter;
1154}
1155
1156static int rtl2832_enable_slave_ts(struct i2c_client *client)
1157{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001158 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001159 int ret;
1160
Antti Palosaari6e6aac62014-12-13 02:28:33 -03001161 dev_dbg(&client->dev, "\n");
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001162
1163 ret = rtl2832_wr_regs(dev, 0x0c, 1, "\x5f\xff", 2);
1164 if (ret)
1165 goto err;
1166
1167 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
1168 if (ret)
1169 goto err;
1170
1171 ret = rtl2832_wr_reg(dev, 0xbc, 0, 0x18);
1172 if (ret)
1173 goto err;
1174
1175 ret = rtl2832_wr_reg(dev, 0x22, 0, 0x01);
1176 if (ret)
1177 goto err;
1178
1179 ret = rtl2832_wr_reg(dev, 0x26, 0, 0x1f);
1180 if (ret)
1181 goto err;
1182
1183 ret = rtl2832_wr_reg(dev, 0x27, 0, 0xff);
1184 if (ret)
1185 goto err;
1186
1187 ret = rtl2832_wr_regs(dev, 0x92, 1, "\x7f\xf7\xff", 3);
1188 if (ret)
1189 goto err;
1190
1191 /* soft reset */
1192 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
1193 if (ret)
1194 goto err;
1195
1196 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
1197 if (ret)
1198 goto err;
1199
1200 return 0;
1201err:
1202 dev_dbg(&client->dev, "failed=%d\n", ret);
1203 return ret;
1204}
1205
Antti Palosaaric2c83862014-12-02 10:55:17 -03001206static int rtl2832_probe(struct i2c_client *client,
1207 const struct i2c_device_id *id)
1208{
1209 struct rtl2832_platform_data *pdata = client->dev.platform_data;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001210 struct i2c_adapter *i2c = client->adapter;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001211 struct rtl2832_dev *dev;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001212 int ret;
1213 u8 tmp;
Antti Palosaarid1016582014-12-14 04:45:57 -03001214 static const struct regmap_bus regmap_bus = {
1215 .read = rtl2832_regmap_read,
1216 .write = rtl2832_regmap_write,
1217 .gather_write = rtl2832_regmap_gather_write,
1218 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
1219 };
1220 static const struct regmap_range_cfg regmap_range_cfg[] = {
1221 {
1222 .selector_reg = 0x00,
1223 .selector_mask = 0xff,
1224 .selector_shift = 0,
1225 .window_start = 0,
1226 .window_len = 0x100,
1227 .range_min = 0 * 0x100,
1228 .range_max = 5 * 0x100,
1229 },
1230 };
1231 static const struct regmap_config regmap_config = {
1232 .reg_bits = 8,
1233 .val_bits = 8,
1234 .max_register = 5 * 0x100,
1235 .ranges = regmap_range_cfg,
1236 .num_ranges = ARRAY_SIZE(regmap_range_cfg),
1237 };
Antti Palosaaric2c83862014-12-02 10:55:17 -03001238
1239 dev_dbg(&client->dev, "\n");
1240
Antti Palosaaric2c83862014-12-02 10:55:17 -03001241 /* allocate memory for the internal state */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001242 dev = kzalloc(sizeof(struct rtl2832_dev), GFP_KERNEL);
1243 if (dev == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001244 ret = -ENOMEM;
1245 goto err;
1246 }
1247
Antti Palosaari038c6f22014-12-13 00:37:43 -03001248 /* setup the state */
Antti Palosaarid1016582014-12-14 04:45:57 -03001249 i2c_set_clientdata(client, dev);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001250 dev->client = client;
Antti Palosaarie1174d72014-12-13 05:26:27 -03001251 dev->pdata = client->dev.platform_data;
1252 if (pdata->config) {
1253 dev->pdata->clk = pdata->config->xtal;
1254 dev->pdata->tuner = pdata->config->tuner;
1255 }
Antti Palosaari038c6f22014-12-13 00:37:43 -03001256 dev->sleeping = true;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001257 INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work);
Antti Palosaari19d273d2014-12-14 06:55:43 -03001258 INIT_DELAYED_WORK(&dev->stat_work, rtl2832_stat_work);
Antti Palosaarid1016582014-12-14 04:45:57 -03001259 /* create regmap */
1260 dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
1261 &regmap_config);
1262 if (IS_ERR(dev->regmap)) {
1263 ret = PTR_ERR(dev->regmap);
1264 goto err_kfree;
1265 }
Antti Palosaaric2c83862014-12-02 10:55:17 -03001266 /* create muxed i2c adapter for demod itself */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001267 dev->i2c_adapter = i2c_add_mux_adapter(i2c, &i2c->dev, dev, 0, 0, 0,
Antti Palosaaric2c83862014-12-02 10:55:17 -03001268 rtl2832_select, NULL);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001269 if (dev->i2c_adapter == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001270 ret = -ENODEV;
Antti Palosaarid1016582014-12-14 04:45:57 -03001271 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001272 }
1273
1274 /* check if the demod is there */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001275 ret = rtl2832_rd_reg(dev, 0x00, 0x0, &tmp);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001276 if (ret)
1277 goto err_i2c_del_mux_adapter;
1278
1279 /* create muxed i2c adapter for demod tuner bus */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001280 dev->i2c_adapter_tuner = i2c_add_mux_adapter(i2c, &i2c->dev, dev,
Antti Palosaaric2c83862014-12-02 10:55:17 -03001281 0, 1, 0, rtl2832_select, rtl2832_deselect);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001282 if (dev->i2c_adapter_tuner == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001283 ret = -ENODEV;
1284 goto err_i2c_del_mux_adapter;
1285 }
1286
1287 /* create dvb_frontend */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001288 memcpy(&dev->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
1289 dev->fe.demodulator_priv = dev;
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001290
1291 /* setup callbacks */
1292 pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
1293 pdata->get_i2c_adapter = rtl2832_get_i2c_adapter_;
1294 pdata->get_private_i2c_adapter = rtl2832_get_private_i2c_adapter_;
1295 pdata->enable_slave_ts = rtl2832_enable_slave_ts;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001296
1297 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
1298 return 0;
1299err_i2c_del_mux_adapter:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001300 i2c_del_mux_adapter(dev->i2c_adapter);
Antti Palosaarid1016582014-12-14 04:45:57 -03001301err_regmap_exit:
1302 regmap_exit(dev->regmap);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001303err_kfree:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001304 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001305err:
1306 dev_dbg(&client->dev, "failed=%d\n", ret);
1307 return ret;
1308}
1309
1310static int rtl2832_remove(struct i2c_client *client)
1311{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001312 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001313
1314 dev_dbg(&client->dev, "\n");
1315
Antti Palosaari038c6f22014-12-13 00:37:43 -03001316 cancel_delayed_work_sync(&dev->i2c_gate_work);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001317
Antti Palosaari038c6f22014-12-13 00:37:43 -03001318 i2c_del_mux_adapter(dev->i2c_adapter_tuner);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001319
Antti Palosaari038c6f22014-12-13 00:37:43 -03001320 i2c_del_mux_adapter(dev->i2c_adapter);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001321
Antti Palosaarid1016582014-12-14 04:45:57 -03001322 regmap_exit(dev->regmap);
1323
Antti Palosaari038c6f22014-12-13 00:37:43 -03001324 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001325
1326 return 0;
1327}
1328
1329static const struct i2c_device_id rtl2832_id_table[] = {
1330 {"rtl2832", 0},
1331 {}
1332};
1333MODULE_DEVICE_TABLE(i2c, rtl2832_id_table);
1334
1335static struct i2c_driver rtl2832_driver = {
1336 .driver = {
1337 .owner = THIS_MODULE,
1338 .name = "rtl2832",
1339 },
1340 .probe = rtl2832_probe,
1341 .remove = rtl2832_remove,
1342 .id_table = rtl2832_id_table,
1343};
1344
1345module_i2c_driver(rtl2832_driver);
1346
Thomas Mair82041c02012-05-18 14:47:40 -03001347MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
1348MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1349MODULE_LICENSE("GPL");
1350MODULE_VERSION("0.5");