blob: c2469fb42f128bad54aaaf64a54acf85d80a9811 [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>
Antti Palosaari75c24002014-12-16 13:54:23 -03005 * Copyright (C) 2012-2014 Antti Palosaari <crope@iki.fi>
Thomas Mair82041c02012-05-18 14:47:40 -03006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22#include "rtl2832_priv.h"
Thomas Mair82041c02012-05-18 14:47:40 -030023
Mauro Carvalho Chehab298f18a2012-07-05 12:16:26 -030024#define REG_MASK(b) (BIT(b + 1) - 1)
Thomas Mair82041c02012-05-18 14:47:40 -030025
26static const struct rtl2832_reg_entry registers[] = {
Antti Palosaarieec21be2014-12-15 01:17:25 -030027 [DVBT_SOFT_RST] = {0x101, 2, 2},
28 [DVBT_IIC_REPEAT] = {0x101, 3, 3},
29 [DVBT_TR_WAIT_MIN_8K] = {0x188, 11, 2},
30 [DVBT_RSD_BER_FAIL_VAL] = {0x18f, 15, 0},
31 [DVBT_EN_BK_TRK] = {0x1a6, 7, 7},
32 [DVBT_AD_EN_REG] = {0x008, 7, 7},
33 [DVBT_AD_EN_REG1] = {0x008, 6, 6},
34 [DVBT_EN_BBIN] = {0x1b1, 0, 0},
35 [DVBT_MGD_THD0] = {0x195, 7, 0},
36 [DVBT_MGD_THD1] = {0x196, 7, 0},
37 [DVBT_MGD_THD2] = {0x197, 7, 0},
38 [DVBT_MGD_THD3] = {0x198, 7, 0},
39 [DVBT_MGD_THD4] = {0x199, 7, 0},
40 [DVBT_MGD_THD5] = {0x19a, 7, 0},
41 [DVBT_MGD_THD6] = {0x19b, 7, 0},
42 [DVBT_MGD_THD7] = {0x19c, 7, 0},
43 [DVBT_EN_CACQ_NOTCH] = {0x161, 4, 4},
44 [DVBT_AD_AV_REF] = {0x009, 6, 0},
45 [DVBT_REG_PI] = {0x00a, 2, 0},
46 [DVBT_PIP_ON] = {0x021, 3, 3},
47 [DVBT_SCALE1_B92] = {0x292, 7, 0},
48 [DVBT_SCALE1_B93] = {0x293, 7, 0},
49 [DVBT_SCALE1_BA7] = {0x2a7, 7, 0},
50 [DVBT_SCALE1_BA9] = {0x2a9, 7, 0},
51 [DVBT_SCALE1_BAA] = {0x2aa, 7, 0},
52 [DVBT_SCALE1_BAB] = {0x2ab, 7, 0},
53 [DVBT_SCALE1_BAC] = {0x2ac, 7, 0},
54 [DVBT_SCALE1_BB0] = {0x2b0, 7, 0},
55 [DVBT_SCALE1_BB1] = {0x2b1, 7, 0},
56 [DVBT_KB_P1] = {0x164, 3, 1},
57 [DVBT_KB_P2] = {0x164, 6, 4},
58 [DVBT_KB_P3] = {0x165, 2, 0},
59 [DVBT_OPT_ADC_IQ] = {0x006, 5, 4},
60 [DVBT_AD_AVI] = {0x009, 1, 0},
61 [DVBT_AD_AVQ] = {0x009, 3, 2},
62 [DVBT_K1_CR_STEP12] = {0x2ad, 9, 4},
63 [DVBT_TRK_KS_P2] = {0x16f, 2, 0},
64 [DVBT_TRK_KS_I2] = {0x170, 5, 3},
65 [DVBT_TR_THD_SET2] = {0x172, 3, 0},
66 [DVBT_TRK_KC_P2] = {0x173, 5, 3},
67 [DVBT_TRK_KC_I2] = {0x175, 2, 0},
68 [DVBT_CR_THD_SET2] = {0x176, 7, 6},
69 [DVBT_PSET_IFFREQ] = {0x119, 21, 0},
70 [DVBT_SPEC_INV] = {0x115, 0, 0},
71 [DVBT_RSAMP_RATIO] = {0x19f, 27, 2},
72 [DVBT_CFREQ_OFF_RATIO] = {0x19d, 23, 4},
73 [DVBT_FSM_STAGE] = {0x351, 6, 3},
74 [DVBT_RX_CONSTEL] = {0x33c, 3, 2},
75 [DVBT_RX_HIER] = {0x33c, 6, 4},
76 [DVBT_RX_C_RATE_LP] = {0x33d, 2, 0},
77 [DVBT_RX_C_RATE_HP] = {0x33d, 5, 3},
78 [DVBT_GI_IDX] = {0x351, 1, 0},
79 [DVBT_FFT_MODE_IDX] = {0x351, 2, 2},
80 [DVBT_RSD_BER_EST] = {0x34e, 15, 0},
81 [DVBT_CE_EST_EVM] = {0x40c, 15, 0},
82 [DVBT_RF_AGC_VAL] = {0x35b, 13, 0},
83 [DVBT_IF_AGC_VAL] = {0x359, 13, 0},
84 [DVBT_DAGC_VAL] = {0x305, 7, 0},
85 [DVBT_SFREQ_OFF] = {0x318, 13, 0},
86 [DVBT_CFREQ_OFF] = {0x35f, 17, 0},
87 [DVBT_POLAR_RF_AGC] = {0x00e, 1, 1},
88 [DVBT_POLAR_IF_AGC] = {0x00e, 0, 0},
89 [DVBT_AAGC_HOLD] = {0x104, 5, 5},
90 [DVBT_EN_RF_AGC] = {0x104, 6, 6},
91 [DVBT_EN_IF_AGC] = {0x104, 7, 7},
92 [DVBT_IF_AGC_MIN] = {0x108, 7, 0},
93 [DVBT_IF_AGC_MAX] = {0x109, 7, 0},
94 [DVBT_RF_AGC_MIN] = {0x10a, 7, 0},
95 [DVBT_RF_AGC_MAX] = {0x10b, 7, 0},
96 [DVBT_IF_AGC_MAN] = {0x10c, 6, 6},
97 [DVBT_IF_AGC_MAN_VAL] = {0x10c, 13, 0},
98 [DVBT_RF_AGC_MAN] = {0x10e, 6, 6},
99 [DVBT_RF_AGC_MAN_VAL] = {0x10e, 13, 0},
100 [DVBT_DAGC_TRG_VAL] = {0x112, 7, 0},
101 [DVBT_AGC_TARG_VAL_0] = {0x102, 0, 0},
102 [DVBT_AGC_TARG_VAL_8_1] = {0x103, 7, 0},
103 [DVBT_AAGC_LOOP_GAIN] = {0x1c7, 5, 1},
104 [DVBT_LOOP_GAIN2_3_0] = {0x104, 4, 1},
105 [DVBT_LOOP_GAIN2_4] = {0x105, 7, 7},
106 [DVBT_LOOP_GAIN3] = {0x1c8, 4, 0},
107 [DVBT_VTOP1] = {0x106, 5, 0},
108 [DVBT_VTOP2] = {0x1c9, 5, 0},
109 [DVBT_VTOP3] = {0x1ca, 5, 0},
110 [DVBT_KRF1] = {0x1cb, 7, 0},
111 [DVBT_KRF2] = {0x107, 7, 0},
112 [DVBT_KRF3] = {0x1cd, 7, 0},
113 [DVBT_KRF4] = {0x1ce, 7, 0},
114 [DVBT_EN_GI_PGA] = {0x1e5, 0, 0},
115 [DVBT_THD_LOCK_UP] = {0x1d9, 8, 0},
116 [DVBT_THD_LOCK_DW] = {0x1db, 8, 0},
117 [DVBT_THD_UP1] = {0x1dd, 7, 0},
118 [DVBT_THD_DW1] = {0x1de, 7, 0},
119 [DVBT_INTER_CNT_LEN] = {0x1d8, 3, 0},
120 [DVBT_GI_PGA_STATE] = {0x1e6, 3, 3},
121 [DVBT_EN_AGC_PGA] = {0x1d7, 0, 0},
122 [DVBT_CKOUTPAR] = {0x17b, 5, 5},
123 [DVBT_CKOUT_PWR] = {0x17b, 6, 6},
124 [DVBT_SYNC_DUR] = {0x17b, 7, 7},
125 [DVBT_ERR_DUR] = {0x17c, 0, 0},
126 [DVBT_SYNC_LVL] = {0x17c, 1, 1},
127 [DVBT_ERR_LVL] = {0x17c, 2, 2},
128 [DVBT_VAL_LVL] = {0x17c, 3, 3},
129 [DVBT_SERIAL] = {0x17c, 4, 4},
130 [DVBT_SER_LSB] = {0x17c, 5, 5},
131 [DVBT_CDIV_PH0] = {0x17d, 3, 0},
132 [DVBT_CDIV_PH1] = {0x17d, 7, 4},
133 [DVBT_MPEG_IO_OPT_2_2] = {0x006, 7, 7},
134 [DVBT_MPEG_IO_OPT_1_0] = {0x007, 7, 6},
135 [DVBT_CKOUTPAR_PIP] = {0x0b7, 4, 4},
136 [DVBT_CKOUT_PWR_PIP] = {0x0b7, 3, 3},
137 [DVBT_SYNC_LVL_PIP] = {0x0b7, 2, 2},
138 [DVBT_ERR_LVL_PIP] = {0x0b7, 1, 1},
139 [DVBT_VAL_LVL_PIP] = {0x0b7, 0, 0},
140 [DVBT_CKOUTPAR_PID] = {0x0b9, 4, 4},
141 [DVBT_CKOUT_PWR_PID] = {0x0b9, 3, 3},
142 [DVBT_SYNC_LVL_PID] = {0x0b9, 2, 2},
143 [DVBT_ERR_LVL_PID] = {0x0b9, 1, 1},
144 [DVBT_VAL_LVL_PID] = {0x0b9, 0, 0},
145 [DVBT_SM_PASS] = {0x193, 11, 0},
146 [DVBT_AD7_SETTING] = {0x011, 15, 0},
147 [DVBT_RSSI_R] = {0x301, 6, 0},
148 [DVBT_ACI_DET_IND] = {0x312, 0, 0},
149 [DVBT_REG_MON] = {0x00d, 1, 0},
150 [DVBT_REG_MONSEL] = {0x00d, 2, 2},
151 [DVBT_REG_GPE] = {0x00d, 7, 7},
152 [DVBT_REG_GPO] = {0x010, 0, 0},
153 [DVBT_REG_4MSEL] = {0x013, 0, 0},
Thomas Mair82041c02012-05-18 14:47:40 -0300154};
155
Antti Palosaarid1016582014-12-14 04:45:57 -0300156/* Our regmap is bypassing I2C adapter lock, thus we do it! */
Mauro Carvalho Chehabbda977b2015-02-03 16:34:29 -0200157static int rtl2832_bulk_write(struct i2c_client *client, unsigned int reg,
158 const void *val, size_t val_count)
Thomas Mair82041c02012-05-18 14:47:40 -0300159{
Antti Palosaarid1016582014-12-14 04:45:57 -0300160 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Thomas Mair82041c02012-05-18 14:47:40 -0300161 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300162
Antti Palosaarid1016582014-12-14 04:45:57 -0300163 i2c_lock_adapter(client->adapter);
164 ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
165 i2c_unlock_adapter(client->adapter);
Thomas Mair82041c02012-05-18 14:47:40 -0300166 return ret;
167}
168
Mauro Carvalho Chehabbda977b2015-02-03 16:34:29 -0200169static int rtl2832_update_bits(struct i2c_client *client, unsigned int reg,
170 unsigned int mask, unsigned int val)
Thomas Mair82041c02012-05-18 14:47:40 -0300171{
Antti Palosaarid1016582014-12-14 04:45:57 -0300172 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Thomas Mair82041c02012-05-18 14:47:40 -0300173 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300174
Antti Palosaarid1016582014-12-14 04:45:57 -0300175 i2c_lock_adapter(client->adapter);
176 ret = regmap_update_bits(dev->regmap, reg, mask, val);
177 i2c_unlock_adapter(client->adapter);
178 return ret;
179}
180
Mauro Carvalho Chehabbda977b2015-02-03 16:34:29 -0200181static int rtl2832_bulk_read(struct i2c_client *client, unsigned int reg,
182 void *val, size_t val_count)
Antti Palosaarid1016582014-12-14 04:45:57 -0300183{
184 struct rtl2832_dev *dev = i2c_get_clientdata(client);
185 int ret;
186
187 i2c_lock_adapter(client->adapter);
188 ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
189 i2c_unlock_adapter(client->adapter);
Antti Palosaari298efdd2012-09-11 22:27:11 -0300190 return ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300191}
192
Antti Palosaari038c6f22014-12-13 00:37:43 -0300193static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val)
Thomas Mair82041c02012-05-18 14:47:40 -0300194{
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300195 struct i2c_client *client = dev->client;
Antti Palosaaricd559e02014-12-16 13:37:18 -0300196 int ret, i;
Antti Palosaarieec21be2014-12-15 01:17:25 -0300197 u16 reg_start_addr;
Antti Palosaaricd559e02014-12-16 13:37:18 -0300198 u8 msb, lsb, reading[4], len;
199 u32 reading_tmp, mask;
Thomas Mair82041c02012-05-18 14:47:40 -0300200
201 reg_start_addr = registers[reg].start_address;
202 msb = registers[reg].msb;
203 lsb = registers[reg].lsb;
Thomas Mair82041c02012-05-18 14:47:40 -0300204 len = (msb >> 3) + 1;
Mauro Carvalho Chehab298f18a2012-07-05 12:16:26 -0300205 mask = REG_MASK(msb - lsb);
Thomas Mair82041c02012-05-18 14:47:40 -0300206
Antti Palosaarieec21be2014-12-15 01:17:25 -0300207 ret = rtl2832_bulk_read(client, reg_start_addr, reading, len);
Thomas Mair82041c02012-05-18 14:47:40 -0300208 if (ret)
209 goto err;
210
211 reading_tmp = 0;
212 for (i = 0; i < len; i++)
213 reading_tmp |= reading[i] << ((len - 1 - i) * 8);
214
215 *val = (reading_tmp >> lsb) & mask;
216
Antti Palosaaricd559e02014-12-16 13:37:18 -0300217 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300218err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300219 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300220 return ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300221}
222
Antti Palosaari038c6f22014-12-13 00:37:43 -0300223static int rtl2832_wr_demod_reg(struct rtl2832_dev *dev, int reg, u32 val)
Thomas Mair82041c02012-05-18 14:47:40 -0300224{
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300225 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300226 int ret, i;
Antti Palosaarieec21be2014-12-15 01:17:25 -0300227 u16 reg_start_addr;
Antti Palosaaricd559e02014-12-16 13:37:18 -0300228 u8 msb, lsb, reading[4], writing[4], len;
229 u32 reading_tmp, writing_tmp, mask;
Thomas Mair82041c02012-05-18 14:47:40 -0300230
231 reg_start_addr = registers[reg].start_address;
232 msb = registers[reg].msb;
233 lsb = registers[reg].lsb;
Thomas Mair82041c02012-05-18 14:47:40 -0300234 len = (msb >> 3) + 1;
Mauro Carvalho Chehab298f18a2012-07-05 12:16:26 -0300235 mask = REG_MASK(msb - lsb);
Thomas Mair82041c02012-05-18 14:47:40 -0300236
Antti Palosaarieec21be2014-12-15 01:17:25 -0300237 ret = rtl2832_bulk_read(client, reg_start_addr, reading, len);
Thomas Mair82041c02012-05-18 14:47:40 -0300238 if (ret)
239 goto err;
240
241 reading_tmp = 0;
242 for (i = 0; i < len; i++)
243 reading_tmp |= reading[i] << ((len - 1 - i) * 8);
244
245 writing_tmp = reading_tmp & ~(mask << lsb);
246 writing_tmp |= ((val & mask) << lsb);
247
Thomas Mair82041c02012-05-18 14:47:40 -0300248 for (i = 0; i < len; i++)
249 writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
250
Antti Palosaarieec21be2014-12-15 01:17:25 -0300251 ret = rtl2832_bulk_write(client, reg_start_addr, writing, len);
Thomas Mair82041c02012-05-18 14:47:40 -0300252 if (ret)
253 goto err;
254
Antti Palosaaricd559e02014-12-16 13:37:18 -0300255 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300256err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300257 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300258 return ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300259}
260
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300261static int rtl2832_set_if(struct dvb_frontend *fe, u32 if_freq)
262{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300263 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300264 struct i2c_client *client = dev->client;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300265 int ret;
266 u64 pset_iffreq;
267 u8 en_bbin = (if_freq == 0 ? 0x1 : 0x0);
268
269 /*
270 * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
271 * / CrystalFreqHz)
272 */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300273 pset_iffreq = if_freq % dev->pdata->clk;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300274 pset_iffreq *= 0x400000;
Antti Palosaarie1174d72014-12-13 05:26:27 -0300275 pset_iffreq = div_u64(pset_iffreq, dev->pdata->clk);
Mauro Carvalho Chehabc8832e82013-04-15 19:44:39 -0300276 pset_iffreq = -pset_iffreq;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300277 pset_iffreq = pset_iffreq & 0x3fffff;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300278 dev_dbg(&client->dev, "if_frequency=%d pset_iffreq=%08x\n",
279 if_freq, (unsigned)pset_iffreq);
Mauro Carvalho Chehabc8832e82013-04-15 19:44:39 -0300280
Antti Palosaari038c6f22014-12-13 00:37:43 -0300281 ret = rtl2832_wr_demod_reg(dev, DVBT_EN_BBIN, en_bbin);
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300282 if (ret)
Antti Palosaaricd559e02014-12-16 13:37:18 -0300283 goto err;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300284
Antti Palosaari038c6f22014-12-13 00:37:43 -0300285 ret = rtl2832_wr_demod_reg(dev, DVBT_PSET_IFFREQ, pset_iffreq);
Antti Palosaaricd559e02014-12-16 13:37:18 -0300286 if (ret)
287 goto err;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300288
Antti Palosaaricd559e02014-12-16 13:37:18 -0300289 return 0;
290err:
291 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari3ca24182013-10-13 00:06:44 -0300292 return ret;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300293}
294
Thomas Mair82041c02012-05-18 14:47:40 -0300295static int rtl2832_init(struct dvb_frontend *fe)
296{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300297 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300298 struct i2c_client *client = dev->client;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300299 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300300 const struct rtl2832_reg_value *init;
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300301 int i, ret, len;
Thomas Mair82041c02012-05-18 14:47:40 -0300302 /* initialization values for the demodulator registers */
303 struct rtl2832_reg_value rtl2832_initial_regs[] = {
304 {DVBT_AD_EN_REG, 0x1},
305 {DVBT_AD_EN_REG1, 0x1},
306 {DVBT_RSD_BER_FAIL_VAL, 0x2800},
307 {DVBT_MGD_THD0, 0x10},
308 {DVBT_MGD_THD1, 0x20},
309 {DVBT_MGD_THD2, 0x20},
310 {DVBT_MGD_THD3, 0x40},
311 {DVBT_MGD_THD4, 0x22},
312 {DVBT_MGD_THD5, 0x32},
313 {DVBT_MGD_THD6, 0x37},
314 {DVBT_MGD_THD7, 0x39},
315 {DVBT_EN_BK_TRK, 0x0},
316 {DVBT_EN_CACQ_NOTCH, 0x0},
317 {DVBT_AD_AV_REF, 0x2a},
318 {DVBT_REG_PI, 0x6},
319 {DVBT_PIP_ON, 0x0},
320 {DVBT_CDIV_PH0, 0x8},
321 {DVBT_CDIV_PH1, 0x8},
322 {DVBT_SCALE1_B92, 0x4},
323 {DVBT_SCALE1_B93, 0xb0},
324 {DVBT_SCALE1_BA7, 0x78},
325 {DVBT_SCALE1_BA9, 0x28},
326 {DVBT_SCALE1_BAA, 0x59},
327 {DVBT_SCALE1_BAB, 0x83},
328 {DVBT_SCALE1_BAC, 0xd4},
329 {DVBT_SCALE1_BB0, 0x65},
330 {DVBT_SCALE1_BB1, 0x43},
331 {DVBT_KB_P1, 0x1},
332 {DVBT_KB_P2, 0x4},
333 {DVBT_KB_P3, 0x7},
334 {DVBT_K1_CR_STEP12, 0xa},
335 {DVBT_REG_GPE, 0x1},
336 {DVBT_SERIAL, 0x0},
337 {DVBT_CDIV_PH0, 0x9},
338 {DVBT_CDIV_PH1, 0x9},
339 {DVBT_MPEG_IO_OPT_2_2, 0x0},
340 {DVBT_MPEG_IO_OPT_1_0, 0x0},
341 {DVBT_TRK_KS_P2, 0x4},
342 {DVBT_TRK_KS_I2, 0x7},
343 {DVBT_TR_THD_SET2, 0x6},
344 {DVBT_TRK_KC_I2, 0x5},
345 {DVBT_CR_THD_SET2, 0x1},
Thomas Mair82041c02012-05-18 14:47:40 -0300346 };
347
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300348 dev_dbg(&client->dev, "\n");
Thomas Mair82041c02012-05-18 14:47:40 -0300349
Thomas Mair82041c02012-05-18 14:47:40 -0300350 for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300351 ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
Thomas Mair82041c02012-05-18 14:47:40 -0300352 rtl2832_initial_regs[i].value);
353 if (ret)
354 goto err;
355 }
356
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300357 /* load tuner specific settings */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300358 dev_dbg(&client->dev, "load settings for tuner=%02x\n",
359 dev->pdata->tuner);
360 switch (dev->pdata->tuner) {
Antti Palosaarif88aae92015-04-23 22:52:07 -0300361 case RTL2832_TUNER_FC2580:
362 len = ARRAY_SIZE(rtl2832_tuner_init_fc2580);
363 init = rtl2832_tuner_init_fc2580;
364 break;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300365 case RTL2832_TUNER_FC0012:
366 case RTL2832_TUNER_FC0013:
367 len = ARRAY_SIZE(rtl2832_tuner_init_fc0012);
368 init = rtl2832_tuner_init_fc0012;
369 break;
Antti Palosaari5db41872012-09-11 22:27:08 -0300370 case RTL2832_TUNER_TUA9001:
371 len = ARRAY_SIZE(rtl2832_tuner_init_tua9001);
372 init = rtl2832_tuner_init_tua9001;
373 break;
Antti Palosaari7e688de2012-09-17 17:53:04 -0300374 case RTL2832_TUNER_E4000:
375 len = ARRAY_SIZE(rtl2832_tuner_init_e4000);
376 init = rtl2832_tuner_init_e4000;
377 break;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300378 case RTL2832_TUNER_R820T:
Antti Palosaaria26758e2013-10-30 00:36:38 -0300379 case RTL2832_TUNER_R828D:
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300380 len = ARRAY_SIZE(rtl2832_tuner_init_r820t);
381 init = rtl2832_tuner_init_r820t;
382 break;
Olli Salonen699dcff2015-05-05 13:54:19 -0300383 case RTL2832_TUNER_SI2157:
384 len = ARRAY_SIZE(rtl2832_tuner_init_si2157);
385 init = rtl2832_tuner_init_si2157;
386 break;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300387 default:
388 ret = -EINVAL;
389 goto err;
390 }
391
392 for (i = 0; i < len; i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300393 ret = rtl2832_wr_demod_reg(dev, init[i].reg, init[i].value);
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300394 if (ret)
395 goto err;
396 }
397
Antti Palosaari19d273d2014-12-14 06:55:43 -0300398 /* init stats here in order signal app which stats are supported */
Antti Palosaari25ef9f52014-12-14 11:00:50 -0300399 c->strength.len = 1;
400 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300401 c->cnr.len = 1;
402 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300403 c->post_bit_error.len = 1;
404 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
405 c->post_bit_count.len = 1;
406 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300407 /* start statistics polling */
408 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
Antti Palosaari038c6f22014-12-13 00:37:43 -0300409 dev->sleeping = false;
Thomas Mair82041c02012-05-18 14:47:40 -0300410
Antti Palosaaricd559e02014-12-16 13:37:18 -0300411 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300412err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300413 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300414 return ret;
415}
416
417static int rtl2832_sleep(struct dvb_frontend *fe)
418{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300419 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300420 struct i2c_client *client = dev->client;
Antti Palosaaria08c3782014-12-16 14:51:33 -0300421 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300422
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300423 dev_dbg(&client->dev, "\n");
Antti Palosaaria08c3782014-12-16 14:51:33 -0300424
Antti Palosaari038c6f22014-12-13 00:37:43 -0300425 dev->sleeping = true;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300426 /* stop statistics polling */
427 cancel_delayed_work_sync(&dev->stat_work);
428 dev->fe_status = 0;
Antti Palosaaria08c3782014-12-16 14:51:33 -0300429
430 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
431 if (ret)
432 goto err;
433
Thomas Mair82041c02012-05-18 14:47:40 -0300434 return 0;
Antti Palosaaria08c3782014-12-16 14:51:33 -0300435err:
436 dev_dbg(&client->dev, "failed=%d\n", ret);
437 return ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300438}
439
Mauro Carvalho Chehabb0944ea2012-10-27 11:24:37 -0300440static int rtl2832_get_tune_settings(struct dvb_frontend *fe,
Thomas Mair82041c02012-05-18 14:47:40 -0300441 struct dvb_frontend_tune_settings *s)
442{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300443 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300444 struct i2c_client *client = dev->client;
Antti Palosaari298efdd2012-09-11 22:27:11 -0300445
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300446 dev_dbg(&client->dev, "\n");
Thomas Mair82041c02012-05-18 14:47:40 -0300447 s->min_delay_ms = 1000;
448 s->step_size = fe->ops.info.frequency_stepsize * 2;
449 s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
450 return 0;
451}
452
453static int rtl2832_set_frontend(struct dvb_frontend *fe)
454{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300455 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300456 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300457 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
458 int ret, i, j;
459 u64 bw_mode, num, num2;
460 u32 resamp_ratio, cfreq_off_ratio;
Thomas Mair82041c02012-05-18 14:47:40 -0300461 static u8 bw_params[3][32] = {
462 /* 6 MHz bandwidth */
463 {
464 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
465 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
466 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
467 0x19, 0xe0,
468 },
469
470 /* 7 MHz bandwidth */
471 {
472 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
473 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
474 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
475 0x19, 0x10,
476 },
477
478 /* 8 MHz bandwidth */
479 {
480 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
481 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
482 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
483 0x19, 0xe0,
484 },
485 };
486
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300487 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
488 c->frequency, c->bandwidth_hz, c->inversion);
Thomas Mair82041c02012-05-18 14:47:40 -0300489
490 /* program tuner */
491 if (fe->ops.tuner_ops.set_params)
492 fe->ops.tuner_ops.set_params(fe);
493
Antti Palosaarife37b382013-11-28 19:15:19 -0300494 /* PIP mode related */
Antti Palosaarieec21be2014-12-15 01:17:25 -0300495 ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3);
Antti Palosaarife37b382013-11-28 19:15:19 -0300496 if (ret)
497 goto err;
498
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300499 /* If the frontend has get_if_frequency(), use it */
500 if (fe->ops.tuner_ops.get_if_frequency) {
501 u32 if_freq;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300502
503 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
504 if (ret)
505 goto err;
506
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300507 ret = rtl2832_set_if(fe, if_freq);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300508 if (ret)
509 goto err;
510 }
511
Thomas Mair82041c02012-05-18 14:47:40 -0300512 switch (c->bandwidth_hz) {
513 case 6000000:
514 i = 0;
515 bw_mode = 48000000;
516 break;
517 case 7000000:
518 i = 1;
519 bw_mode = 56000000;
520 break;
521 case 8000000:
522 i = 2;
523 bw_mode = 64000000;
524 break;
525 default:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300526 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
527 c->bandwidth_hz);
528 ret = -EINVAL;
529 goto err;
Thomas Mair82041c02012-05-18 14:47:40 -0300530 }
531
Hans-Frieder Vogtfc4b3fa2012-07-15 13:56:47 -0300532 for (j = 0; j < sizeof(bw_params[0]); j++) {
Antti Palosaarieec21be2014-12-15 01:17:25 -0300533 ret = rtl2832_bulk_write(client, 0x11c + j, &bw_params[i][j], 1);
Thomas Mair82041c02012-05-18 14:47:40 -0300534 if (ret)
535 goto err;
536 }
537
538 /* calculate and set resample ratio
539 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
540 * / ConstWithBandwidthMode)
541 */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300542 num = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300543 num *= 0x400000;
544 num = div_u64(num, bw_mode);
545 resamp_ratio = num & 0x3ffffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300546 ret = rtl2832_wr_demod_reg(dev, DVBT_RSAMP_RATIO, resamp_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300547 if (ret)
548 goto err;
549
550 /* calculate and set cfreq off ratio
551 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
552 * / (CrystalFreqHz * 7))
553 */
554 num = bw_mode << 20;
Antti Palosaarie1174d72014-12-13 05:26:27 -0300555 num2 = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300556 num = div_u64(num, num2);
557 num = -num;
558 cfreq_off_ratio = num & 0xfffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300559 ret = rtl2832_wr_demod_reg(dev, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300560 if (ret)
561 goto err;
562
Thomas Mair82041c02012-05-18 14:47:40 -0300563 /* soft reset */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300564 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
Thomas Mair82041c02012-05-18 14:47:40 -0300565 if (ret)
566 goto err;
567
Antti Palosaari038c6f22014-12-13 00:37:43 -0300568 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
Thomas Mair82041c02012-05-18 14:47:40 -0300569 if (ret)
570 goto err;
571
Antti Palosaaricd559e02014-12-16 13:37:18 -0300572 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300573err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300574 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300575 return ret;
576}
577
Mauro Carvalho Chehab7e3e68b2016-02-04 12:58:30 -0200578static int rtl2832_get_frontend(struct dvb_frontend *fe,
579 struct dtv_frontend_properties *c)
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300580{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300581 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300582 struct i2c_client *client = dev->client;
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300583 int ret;
584 u8 buf[3];
585
Antti Palosaari038c6f22014-12-13 00:37:43 -0300586 if (dev->sleeping)
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300587 return 0;
588
Antti Palosaarieec21be2014-12-15 01:17:25 -0300589 ret = rtl2832_bulk_read(client, 0x33c, buf, 2);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300590 if (ret)
591 goto err;
592
Antti Palosaarieec21be2014-12-15 01:17:25 -0300593 ret = rtl2832_bulk_read(client, 0x351, &buf[2], 1);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300594 if (ret)
595 goto err;
596
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300597 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300598
599 switch ((buf[0] >> 2) & 3) {
600 case 0:
601 c->modulation = QPSK;
602 break;
603 case 1:
604 c->modulation = QAM_16;
605 break;
606 case 2:
607 c->modulation = QAM_64;
608 break;
609 }
610
611 switch ((buf[2] >> 2) & 1) {
612 case 0:
613 c->transmission_mode = TRANSMISSION_MODE_2K;
614 break;
615 case 1:
616 c->transmission_mode = TRANSMISSION_MODE_8K;
617 }
618
619 switch ((buf[2] >> 0) & 3) {
620 case 0:
621 c->guard_interval = GUARD_INTERVAL_1_32;
622 break;
623 case 1:
624 c->guard_interval = GUARD_INTERVAL_1_16;
625 break;
626 case 2:
627 c->guard_interval = GUARD_INTERVAL_1_8;
628 break;
629 case 3:
630 c->guard_interval = GUARD_INTERVAL_1_4;
631 break;
632 }
633
634 switch ((buf[0] >> 4) & 7) {
635 case 0:
636 c->hierarchy = HIERARCHY_NONE;
637 break;
638 case 1:
639 c->hierarchy = HIERARCHY_1;
640 break;
641 case 2:
642 c->hierarchy = HIERARCHY_2;
643 break;
644 case 3:
645 c->hierarchy = HIERARCHY_4;
646 break;
647 }
648
649 switch ((buf[1] >> 3) & 7) {
650 case 0:
651 c->code_rate_HP = FEC_1_2;
652 break;
653 case 1:
654 c->code_rate_HP = FEC_2_3;
655 break;
656 case 2:
657 c->code_rate_HP = FEC_3_4;
658 break;
659 case 3:
660 c->code_rate_HP = FEC_5_6;
661 break;
662 case 4:
663 c->code_rate_HP = FEC_7_8;
664 break;
665 }
666
667 switch ((buf[1] >> 0) & 7) {
668 case 0:
669 c->code_rate_LP = FEC_1_2;
670 break;
671 case 1:
672 c->code_rate_LP = FEC_2_3;
673 break;
674 case 2:
675 c->code_rate_LP = FEC_3_4;
676 break;
677 case 3:
678 c->code_rate_LP = FEC_5_6;
679 break;
680 case 4:
681 c->code_rate_LP = FEC_7_8;
682 break;
683 }
684
685 return 0;
686err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300687 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300688 return ret;
689}
690
Mauro Carvalho Chehab0df289a2015-06-07 14:53:52 -0300691static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
Thomas Mair82041c02012-05-18 14:47:40 -0300692{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300693 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300694 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300695 int ret;
Luis de Bethencourt20357752015-02-11 08:08:51 -0300696 u32 uninitialized_var(tmp);
Thomas Mair82041c02012-05-18 14:47:40 -0300697
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300698 dev_dbg(&client->dev, "\n");
699
700 *status = 0;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300701 if (dev->sleeping)
Thomas Mair82041c02012-05-18 14:47:40 -0300702 return 0;
703
Antti Palosaari038c6f22014-12-13 00:37:43 -0300704 ret = rtl2832_rd_demod_reg(dev, DVBT_FSM_STAGE, &tmp);
Thomas Mair82041c02012-05-18 14:47:40 -0300705 if (ret)
706 goto err;
707
708 if (tmp == 11) {
709 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
710 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
Antti Palosaari1c7da402014-12-14 12:15:55 -0300711 } else if (tmp == 10) {
Thomas Mair82041c02012-05-18 14:47:40 -0300712 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
713 FE_HAS_VITERBI;
Antti Palosaari1c7da402014-12-14 12:15:55 -0300714 }
Thomas Mair82041c02012-05-18 14:47:40 -0300715
Antti Palosaari19d273d2014-12-14 06:55:43 -0300716 dev->fe_status = *status;
Antti Palosaaricd559e02014-12-16 13:37:18 -0300717 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300718err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300719 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300720 return ret;
721}
722
Antti Palosaari73983492012-08-21 19:56:21 -0300723static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
724{
Antti Palosaarif7caf932014-12-14 10:05:49 -0300725 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
Antti Palosaari73983492012-08-21 19:56:21 -0300726
Antti Palosaarif7caf932014-12-14 10:05:49 -0300727 /* report SNR in resolution of 0.1 dB */
728 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
729 *snr = div_s64(c->cnr.stat[0].svalue, 100);
Antti Palosaari73983492012-08-21 19:56:21 -0300730 else
731 *snr = 0;
732
733 return 0;
Antti Palosaari73983492012-08-21 19:56:21 -0300734}
735
Antti Palosaaridb32d742012-08-21 19:56:22 -0300736static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
737{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300738 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300739
Antti Palosaari084330b2014-12-14 10:10:22 -0300740 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
741 dev->post_bit_error_prev = dev->post_bit_error;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300742
743 return 0;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300744}
745
Antti Palosaari19d273d2014-12-14 06:55:43 -0300746static void rtl2832_stat_work(struct work_struct *work)
747{
748 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, stat_work.work);
749 struct i2c_client *client = dev->client;
750 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
751 int ret, tmp;
752 u8 u8tmp, buf[2];
753 u16 u16tmp;
754
755 dev_dbg(&client->dev, "\n");
756
Antti Palosaari25ef9f52014-12-14 11:00:50 -0300757 /* signal strength */
758 if (dev->fe_status & FE_HAS_SIGNAL) {
759 /* read digital AGC */
760 ret = rtl2832_bulk_read(client, 0x305, &u8tmp, 1);
761 if (ret)
762 goto err;
763
764 dev_dbg(&client->dev, "digital agc=%02x", u8tmp);
765
766 u8tmp = ~u8tmp;
767 u16tmp = u8tmp << 8 | u8tmp << 0;
768
769 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
770 c->strength.stat[0].uvalue = u16tmp;
771 } else {
772 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
773 }
774
Antti Palosaari19d273d2014-12-14 06:55:43 -0300775 /* CNR */
776 if (dev->fe_status & FE_HAS_VITERBI) {
777 unsigned hierarchy, constellation;
778 #define CONSTELLATION_NUM 3
779 #define HIERARCHY_NUM 4
780 static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
781 {85387325, 85387325, 85387325, 85387325},
782 {86676178, 86676178, 87167949, 87795660},
783 {87659938, 87659938, 87885178, 88241743},
784 };
785
786 ret = rtl2832_bulk_read(client, 0x33c, &u8tmp, 1);
787 if (ret)
788 goto err;
789
790 constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
791 if (constellation > CONSTELLATION_NUM - 1)
792 goto err_schedule_delayed_work;
793
794 hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
795 if (hierarchy > HIERARCHY_NUM - 1)
796 goto err_schedule_delayed_work;
797
798 ret = rtl2832_bulk_read(client, 0x40c, buf, 2);
799 if (ret)
800 goto err;
801
802 u16tmp = buf[0] << 8 | buf[1] << 0;
803 if (u16tmp)
804 tmp = (constant[constellation][hierarchy] -
805 intlog10(u16tmp)) / ((1 << 24) / 10000);
806 else
807 tmp = 0;
808
809 dev_dbg(&client->dev, "cnr raw=%u\n", u16tmp);
810
811 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
812 c->cnr.stat[0].svalue = tmp;
813 } else {
814 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
815 }
816
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300817 /* BER */
818 if (dev->fe_status & FE_HAS_LOCK) {
819 ret = rtl2832_bulk_read(client, 0x34e, buf, 2);
820 if (ret)
821 goto err;
822
823 u16tmp = buf[0] << 8 | buf[1] << 0;
824 dev->post_bit_error += u16tmp;
825 dev->post_bit_count += 1000000;
826
827 dev_dbg(&client->dev, "ber errors=%u total=1000000\n", u16tmp);
828
829 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
830 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
831 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
832 c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
833 } else {
834 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
835 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
836 }
837
Antti Palosaari19d273d2014-12-14 06:55:43 -0300838err_schedule_delayed_work:
839 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
840 return;
841err:
842 dev_dbg(&client->dev, "failed=%d\n", ret);
843}
844
Antti Palosaari92d20d92014-02-08 03:50:04 -0300845/*
Antti Palosaarid1016582014-12-14 04:45:57 -0300846 * I2C gate/mux/repeater logic
847 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
848 * adapter lock is already taken by tuner driver.
849 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
850 * is delayed here a little bit in order to see if there is sequence of I2C
Antti Palosaari92d20d92014-02-08 03:50:04 -0300851 * messages sent to same I2C bus.
Antti Palosaari92d20d92014-02-08 03:50:04 -0300852 */
853static void rtl2832_i2c_gate_work(struct work_struct *work)
Antti Palosaari8823f022013-11-26 12:53:46 -0300854{
Antti Palosaarid1016582014-12-14 04:45:57 -0300855 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, i2c_gate_work.work);
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300856 struct i2c_client *client = dev->client;
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300857 int ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300858
Antti Palosaarid1016582014-12-14 04:45:57 -0300859 /* close gate */
860 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
861 if (ret)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300862 goto err;
863
Antti Palosaari92d20d92014-02-08 03:50:04 -0300864 return;
865err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300866 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300867}
868
869static int rtl2832_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
870{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300871 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300872 struct i2c_client *client = dev->client;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300873 int ret;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300874
875 /* terminate possible gate closing */
Antti Palosaarid1016582014-12-14 04:45:57 -0300876 cancel_delayed_work(&dev->i2c_gate_work);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300877
Antti Palosaarid1016582014-12-14 04:45:57 -0300878 /*
Antti Palosaarid1016582014-12-14 04:45:57 -0300879 * I2C adapter lock is already taken and due to that we will use
880 * regmap_update_bits() which does not lock again I2C adapter.
881 */
Antti Palosaari0d117902014-12-18 06:30:32 -0300882 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
Antti Palosaarid1016582014-12-14 04:45:57 -0300883 if (ret)
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300884 goto err;
885
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300886 return 0;
887err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300888 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaarid1016582014-12-14 04:45:57 -0300889 return ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300890}
891
Antti Palosaari92d20d92014-02-08 03:50:04 -0300892static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv,
Antti Palosaarid1016582014-12-14 04:45:57 -0300893 u32 chan_id)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300894{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300895 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300896
Antti Palosaari038c6f22014-12-13 00:37:43 -0300897 schedule_delayed_work(&dev->i2c_gate_work, usecs_to_jiffies(100));
Antti Palosaari92d20d92014-02-08 03:50:04 -0300898 return 0;
899}
900
Thomas Mair82041c02012-05-18 14:47:40 -0300901static struct dvb_frontend_ops rtl2832_ops = {
902 .delsys = { SYS_DVBT },
903 .info = {
904 .name = "Realtek RTL2832 (DVB-T)",
905 .frequency_min = 174000000,
906 .frequency_max = 862000000,
907 .frequency_stepsize = 166667,
908 .caps = FE_CAN_FEC_1_2 |
909 FE_CAN_FEC_2_3 |
910 FE_CAN_FEC_3_4 |
911 FE_CAN_FEC_5_6 |
912 FE_CAN_FEC_7_8 |
913 FE_CAN_FEC_AUTO |
914 FE_CAN_QPSK |
915 FE_CAN_QAM_16 |
916 FE_CAN_QAM_64 |
917 FE_CAN_QAM_AUTO |
918 FE_CAN_TRANSMISSION_MODE_AUTO |
919 FE_CAN_GUARD_INTERVAL_AUTO |
920 FE_CAN_HIERARCHY_AUTO |
921 FE_CAN_RECOVER |
922 FE_CAN_MUTE_TS
923 },
924
Thomas Mair82041c02012-05-18 14:47:40 -0300925 .init = rtl2832_init,
926 .sleep = rtl2832_sleep,
927
928 .get_tune_settings = rtl2832_get_tune_settings,
929
930 .set_frontend = rtl2832_set_frontend,
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300931 .get_frontend = rtl2832_get_frontend,
Thomas Mair82041c02012-05-18 14:47:40 -0300932
933 .read_status = rtl2832_read_status,
Antti Palosaari73983492012-08-21 19:56:21 -0300934 .read_snr = rtl2832_read_snr,
Antti Palosaaridb32d742012-08-21 19:56:22 -0300935 .read_ber = rtl2832_read_ber,
Thomas Mair82041c02012-05-18 14:47:40 -0300936};
937
Antti Palosaaridcadb822014-12-14 16:23:28 -0300938static bool rtl2832_volatile_reg(struct device *dev, unsigned int reg)
939{
940 switch (reg) {
941 case 0x305:
942 case 0x33c:
943 case 0x34e:
944 case 0x351:
945 case 0x40c ... 0x40d:
946 return true;
947 default:
948 break;
949 }
950
951 return false;
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) {
Antti Palosaari891e0552015-10-05 21:16:39 -0300979 dev_warn(&client->dev, "i2c reg read failed %d reg %02x\n",
980 ret, *(u8 *)reg_buf);
Antti Palosaarid1016582014-12-14 04:45:57 -0300981 if (ret >= 0)
982 ret = -EREMOTEIO;
983 return ret;
984 }
985 return 0;
986}
987
988static int rtl2832_regmap_write(void *context, const void *data, size_t count)
989{
990 struct i2c_client *client = context;
991 int ret;
992 struct i2c_msg msg[1] = {
993 {
994 .addr = client->addr,
995 .flags = 0,
996 .len = count,
997 .buf = (u8 *)data,
998 }
999 };
1000
1001 ret = __i2c_transfer(client->adapter, msg, 1);
1002 if (ret != 1) {
Antti Palosaari891e0552015-10-05 21:16:39 -03001003 dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n",
1004 ret, *(u8 *)data);
Antti Palosaarid1016582014-12-14 04:45:57 -03001005 if (ret >= 0)
1006 ret = -EREMOTEIO;
1007 return ret;
1008 }
1009 return 0;
1010}
1011
1012static int rtl2832_regmap_gather_write(void *context, const void *reg,
1013 size_t reg_len, const void *val,
1014 size_t val_len)
1015{
1016 struct i2c_client *client = context;
1017 int ret;
1018 u8 buf[256];
1019 struct i2c_msg msg[1] = {
1020 {
1021 .addr = client->addr,
1022 .flags = 0,
1023 .len = 1 + val_len,
1024 .buf = buf,
1025 }
1026 };
1027
1028 buf[0] = *(u8 const *)reg;
1029 memcpy(&buf[1], val, val_len);
1030
1031 ret = __i2c_transfer(client->adapter, msg, 1);
1032 if (ret != 1) {
Antti Palosaari891e0552015-10-05 21:16:39 -03001033 dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n",
1034 ret, *(u8 const *)reg);
Antti Palosaarid1016582014-12-14 04:45:57 -03001035 if (ret >= 0)
1036 ret = -EREMOTEIO;
1037 return ret;
1038 }
1039 return 0;
1040}
1041
Antti Palosaarib410dae2014-12-18 07:22:46 -03001042/*
1043 * FIXME: Hack. Implement own regmap locking in order to silence lockdep
1044 * recursive lock warning. That happens when regmap I2C client calls I2C mux
1045 * adapter, which leads demod I2C repeater enable via demod regmap. Operation
1046 * takes two regmap locks recursively - but those are different regmap instances
1047 * in a two different I2C drivers, so it is not deadlock. Proper fix is to make
1048 * regmap aware of lockdep.
1049 */
1050static void rtl2832_regmap_lock(void *__dev)
1051{
1052 struct rtl2832_dev *dev = __dev;
1053 struct i2c_client *client = dev->client;
1054
1055 dev_dbg(&client->dev, "\n");
1056 mutex_lock(&dev->regmap_mutex);
1057}
1058
1059static void rtl2832_regmap_unlock(void *__dev)
1060{
1061 struct rtl2832_dev *dev = __dev;
1062 struct i2c_client *client = dev->client;
1063
1064 dev_dbg(&client->dev, "\n");
1065 mutex_unlock(&dev->regmap_mutex);
1066}
1067
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001068static struct dvb_frontend *rtl2832_get_dvb_frontend(struct i2c_client *client)
1069{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001070 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001071
1072 dev_dbg(&client->dev, "\n");
1073 return &dev->fe;
1074}
1075
Antti Palosaaricd559e02014-12-16 13:37:18 -03001076static struct i2c_adapter *rtl2832_get_i2c_adapter(struct i2c_client *client)
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001077{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001078 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001079
1080 dev_dbg(&client->dev, "\n");
1081 return dev->i2c_adapter_tuner;
1082}
1083
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001084static int rtl2832_enable_slave_ts(struct i2c_client *client)
1085{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001086 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001087 int ret;
1088
Antti Palosaari6e6aac62014-12-13 02:28:33 -03001089 dev_dbg(&client->dev, "\n");
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001090
Antti Palosaarieec21be2014-12-15 01:17:25 -03001091 ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001092 if (ret)
1093 goto err;
1094
1095 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
1096 if (ret)
1097 goto err;
1098
Antti Palosaarieec21be2014-12-15 01:17:25 -03001099 ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001100 if (ret)
1101 goto err;
1102
Antti Palosaarieec21be2014-12-15 01:17:25 -03001103 ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001104 if (ret)
1105 goto err;
1106
1107 /* soft reset */
1108 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
1109 if (ret)
1110 goto err;
1111
1112 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
1113 if (ret)
1114 goto err;
1115
1116 return 0;
1117err:
1118 dev_dbg(&client->dev, "failed=%d\n", ret);
1119 return ret;
1120}
1121
Antti Palosaari4b01e012014-12-14 14:07:35 -03001122static int rtl2832_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
1123{
1124 struct rtl2832_dev *dev = fe->demodulator_priv;
1125 struct i2c_client *client = dev->client;
1126 int ret;
1127 u8 u8tmp;
1128
1129 dev_dbg(&client->dev, "onoff=%d\n", onoff);
1130
1131 /* enable / disable PID filter */
1132 if (onoff)
1133 u8tmp = 0x80;
1134 else
1135 u8tmp = 0x00;
1136
1137 ret = rtl2832_update_bits(client, 0x061, 0xc0, u8tmp);
1138 if (ret)
1139 goto err;
1140
1141 return 0;
1142err:
1143 dev_dbg(&client->dev, "failed=%d\n", ret);
1144 return ret;
1145}
1146
1147static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid,
1148 int onoff)
1149{
1150 struct rtl2832_dev *dev = fe->demodulator_priv;
1151 struct i2c_client *client = dev->client;
1152 int ret;
1153 u8 buf[4];
1154
1155 dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
1156 index, pid, onoff);
1157
1158 /* skip invalid PIDs (0x2000) */
1159 if (pid > 0x1fff || index > 32)
1160 return 0;
1161
1162 if (onoff)
1163 set_bit(index, &dev->filters);
1164 else
1165 clear_bit(index, &dev->filters);
1166
1167 /* enable / disable PIDs */
1168 buf[0] = (dev->filters >> 0) & 0xff;
1169 buf[1] = (dev->filters >> 8) & 0xff;
1170 buf[2] = (dev->filters >> 16) & 0xff;
1171 buf[3] = (dev->filters >> 24) & 0xff;
1172 ret = rtl2832_bulk_write(client, 0x062, buf, 4);
1173 if (ret)
1174 goto err;
1175
1176 /* add PID */
1177 buf[0] = (pid >> 8) & 0xff;
1178 buf[1] = (pid >> 0) & 0xff;
1179 ret = rtl2832_bulk_write(client, 0x066 + 2 * index, buf, 2);
1180 if (ret)
1181 goto err;
1182
1183 return 0;
1184err:
1185 dev_dbg(&client->dev, "failed=%d\n", ret);
1186 return ret;
1187}
1188
Antti Palosaaric2c83862014-12-02 10:55:17 -03001189static int rtl2832_probe(struct i2c_client *client,
1190 const struct i2c_device_id *id)
1191{
1192 struct rtl2832_platform_data *pdata = client->dev.platform_data;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001193 struct i2c_adapter *i2c = client->adapter;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001194 struct rtl2832_dev *dev;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001195 int ret;
1196 u8 tmp;
Antti Palosaarid1016582014-12-14 04:45:57 -03001197 static const struct regmap_bus regmap_bus = {
1198 .read = rtl2832_regmap_read,
1199 .write = rtl2832_regmap_write,
1200 .gather_write = rtl2832_regmap_gather_write,
1201 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
1202 };
1203 static const struct regmap_range_cfg regmap_range_cfg[] = {
1204 {
1205 .selector_reg = 0x00,
1206 .selector_mask = 0xff,
1207 .selector_shift = 0,
1208 .window_start = 0,
1209 .window_len = 0x100,
1210 .range_min = 0 * 0x100,
1211 .range_max = 5 * 0x100,
1212 },
1213 };
Antti Palosaaric2c83862014-12-02 10:55:17 -03001214
1215 dev_dbg(&client->dev, "\n");
1216
Antti Palosaaric2c83862014-12-02 10:55:17 -03001217 /* allocate memory for the internal state */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001218 dev = kzalloc(sizeof(struct rtl2832_dev), GFP_KERNEL);
1219 if (dev == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001220 ret = -ENOMEM;
1221 goto err;
1222 }
1223
Antti Palosaari038c6f22014-12-13 00:37:43 -03001224 /* setup the state */
Antti Palosaarid1016582014-12-14 04:45:57 -03001225 i2c_set_clientdata(client, dev);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001226 dev->client = client;
Antti Palosaarie1174d72014-12-13 05:26:27 -03001227 dev->pdata = client->dev.platform_data;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001228 dev->sleeping = true;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001229 INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work);
Antti Palosaari19d273d2014-12-14 06:55:43 -03001230 INIT_DELAYED_WORK(&dev->stat_work, rtl2832_stat_work);
Antti Palosaarid1016582014-12-14 04:45:57 -03001231 /* create regmap */
Antti Palosaarib410dae2014-12-18 07:22:46 -03001232 mutex_init(&dev->regmap_mutex);
1233 dev->regmap_config.reg_bits = 8,
1234 dev->regmap_config.val_bits = 8,
1235 dev->regmap_config.lock = rtl2832_regmap_lock,
1236 dev->regmap_config.unlock = rtl2832_regmap_unlock,
1237 dev->regmap_config.lock_arg = dev,
1238 dev->regmap_config.volatile_reg = rtl2832_volatile_reg,
1239 dev->regmap_config.max_register = 5 * 0x100,
1240 dev->regmap_config.ranges = regmap_range_cfg,
1241 dev->regmap_config.num_ranges = ARRAY_SIZE(regmap_range_cfg),
Antti Palosaarib3b2bf82015-03-14 11:13:07 -03001242 dev->regmap_config.cache_type = REGCACHE_NONE,
Antti Palosaarid1016582014-12-14 04:45:57 -03001243 dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
Antti Palosaarib410dae2014-12-18 07:22:46 -03001244 &dev->regmap_config);
Antti Palosaarid1016582014-12-14 04:45:57 -03001245 if (IS_ERR(dev->regmap)) {
1246 ret = PTR_ERR(dev->regmap);
1247 goto err_kfree;
1248 }
Antti Palosaaric2c83862014-12-02 10:55:17 -03001249
1250 /* check if the demod is there */
Antti Palosaarieec21be2014-12-15 01:17:25 -03001251 ret = rtl2832_bulk_read(client, 0x000, &tmp, 1);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001252 if (ret)
Antti Palosaari0d117902014-12-18 06:30:32 -03001253 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001254
1255 /* create muxed i2c adapter for demod tuner bus */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001256 dev->i2c_adapter_tuner = i2c_add_mux_adapter(i2c, &i2c->dev, dev,
Antti Palosaari0d117902014-12-18 06:30:32 -03001257 0, 0, 0, rtl2832_select, rtl2832_deselect);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001258 if (dev->i2c_adapter_tuner == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001259 ret = -ENODEV;
Antti Palosaari0d117902014-12-18 06:30:32 -03001260 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001261 }
1262
1263 /* create dvb_frontend */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001264 memcpy(&dev->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
1265 dev->fe.demodulator_priv = dev;
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001266
1267 /* setup callbacks */
1268 pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
Antti Palosaaricd559e02014-12-16 13:37:18 -03001269 pdata->get_i2c_adapter = rtl2832_get_i2c_adapter;
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001270 pdata->enable_slave_ts = rtl2832_enable_slave_ts;
Antti Palosaari4b01e012014-12-14 14:07:35 -03001271 pdata->pid_filter = rtl2832_pid_filter;
1272 pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
Antti Palosaari0aa32ef92014-12-15 13:34:13 -03001273 pdata->bulk_read = rtl2832_bulk_read;
1274 pdata->bulk_write = rtl2832_bulk_write;
1275 pdata->update_bits = rtl2832_update_bits;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001276
1277 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
1278 return 0;
Antti Palosaarid1016582014-12-14 04:45:57 -03001279err_regmap_exit:
1280 regmap_exit(dev->regmap);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001281err_kfree:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001282 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001283err:
1284 dev_dbg(&client->dev, "failed=%d\n", ret);
1285 return ret;
1286}
1287
1288static int rtl2832_remove(struct i2c_client *client)
1289{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001290 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001291
1292 dev_dbg(&client->dev, "\n");
1293
Antti Palosaari038c6f22014-12-13 00:37:43 -03001294 cancel_delayed_work_sync(&dev->i2c_gate_work);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001295
Antti Palosaari038c6f22014-12-13 00:37:43 -03001296 i2c_del_mux_adapter(dev->i2c_adapter_tuner);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001297
Antti Palosaarid1016582014-12-14 04:45:57 -03001298 regmap_exit(dev->regmap);
1299
Antti Palosaari038c6f22014-12-13 00:37:43 -03001300 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001301
1302 return 0;
1303}
1304
1305static const struct i2c_device_id rtl2832_id_table[] = {
1306 {"rtl2832", 0},
1307 {}
1308};
1309MODULE_DEVICE_TABLE(i2c, rtl2832_id_table);
1310
1311static struct i2c_driver rtl2832_driver = {
1312 .driver = {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001313 .name = "rtl2832",
1314 },
1315 .probe = rtl2832_probe,
1316 .remove = rtl2832_remove,
1317 .id_table = rtl2832_id_table,
1318};
1319
1320module_i2c_driver(rtl2832_driver);
1321
Thomas Mair82041c02012-05-18 14:47:40 -03001322MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
Antti Palosaari75c24002014-12-16 13:54:23 -03001323MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
Thomas Mair82041c02012-05-18 14:47:40 -03001324MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1325MODULE_LICENSE("GPL");