blob: 1b23788797b50a6c178f544ea4e02d79c7026399 [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
Antti Palosaarid884aca2016-02-05 18:26:30 -0200350 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
351 if (ret)
352 goto err;
353
Thomas Mair82041c02012-05-18 14:47:40 -0300354 for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300355 ret = rtl2832_wr_demod_reg(dev, rtl2832_initial_regs[i].reg,
Thomas Mair82041c02012-05-18 14:47:40 -0300356 rtl2832_initial_regs[i].value);
357 if (ret)
358 goto err;
359 }
360
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300361 /* load tuner specific settings */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300362 dev_dbg(&client->dev, "load settings for tuner=%02x\n",
363 dev->pdata->tuner);
364 switch (dev->pdata->tuner) {
Antti Palosaarif88aae92015-04-23 22:52:07 -0300365 case RTL2832_TUNER_FC2580:
366 len = ARRAY_SIZE(rtl2832_tuner_init_fc2580);
367 init = rtl2832_tuner_init_fc2580;
368 break;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300369 case RTL2832_TUNER_FC0012:
370 case RTL2832_TUNER_FC0013:
371 len = ARRAY_SIZE(rtl2832_tuner_init_fc0012);
372 init = rtl2832_tuner_init_fc0012;
373 break;
Antti Palosaari5db41872012-09-11 22:27:08 -0300374 case RTL2832_TUNER_TUA9001:
375 len = ARRAY_SIZE(rtl2832_tuner_init_tua9001);
376 init = rtl2832_tuner_init_tua9001;
377 break;
Antti Palosaari7e688de2012-09-17 17:53:04 -0300378 case RTL2832_TUNER_E4000:
379 len = ARRAY_SIZE(rtl2832_tuner_init_e4000);
380 init = rtl2832_tuner_init_e4000;
381 break;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300382 case RTL2832_TUNER_R820T:
Antti Palosaaria26758e2013-10-30 00:36:38 -0300383 case RTL2832_TUNER_R828D:
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300384 len = ARRAY_SIZE(rtl2832_tuner_init_r820t);
385 init = rtl2832_tuner_init_r820t;
386 break;
Olli Salonen699dcff2015-05-05 13:54:19 -0300387 case RTL2832_TUNER_SI2157:
388 len = ARRAY_SIZE(rtl2832_tuner_init_si2157);
389 init = rtl2832_tuner_init_si2157;
390 break;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300391 default:
392 ret = -EINVAL;
393 goto err;
394 }
395
396 for (i = 0; i < len; i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300397 ret = rtl2832_wr_demod_reg(dev, init[i].reg, init[i].value);
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300398 if (ret)
399 goto err;
400 }
401
Antti Palosaari19d273d2014-12-14 06:55:43 -0300402 /* init stats here in order signal app which stats are supported */
Antti Palosaari25ef9f52014-12-14 11:00:50 -0300403 c->strength.len = 1;
404 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300405 c->cnr.len = 1;
406 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300407 c->post_bit_error.len = 1;
408 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
409 c->post_bit_count.len = 1;
410 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300411 dev->sleeping = false;
Thomas Mair82041c02012-05-18 14:47:40 -0300412
Antti Palosaaricd559e02014-12-16 13:37:18 -0300413 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300414err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300415 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300416 return ret;
417}
418
419static int rtl2832_sleep(struct dvb_frontend *fe)
420{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300421 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300422 struct i2c_client *client = dev->client;
Antti Palosaaria08c3782014-12-16 14:51:33 -0300423 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300424
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300425 dev_dbg(&client->dev, "\n");
Antti Palosaaria08c3782014-12-16 14:51:33 -0300426
Antti Palosaari038c6f22014-12-13 00:37:43 -0300427 dev->sleeping = true;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300428 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
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300494 /* If the frontend has get_if_frequency(), use it */
495 if (fe->ops.tuner_ops.get_if_frequency) {
496 u32 if_freq;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300497
498 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
499 if (ret)
500 goto err;
501
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300502 ret = rtl2832_set_if(fe, if_freq);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300503 if (ret)
504 goto err;
505 }
506
Thomas Mair82041c02012-05-18 14:47:40 -0300507 switch (c->bandwidth_hz) {
508 case 6000000:
509 i = 0;
510 bw_mode = 48000000;
511 break;
512 case 7000000:
513 i = 1;
514 bw_mode = 56000000;
515 break;
516 case 8000000:
517 i = 2;
518 bw_mode = 64000000;
519 break;
520 default:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300521 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
522 c->bandwidth_hz);
523 ret = -EINVAL;
524 goto err;
Thomas Mair82041c02012-05-18 14:47:40 -0300525 }
526
Hans-Frieder Vogtfc4b3fa2012-07-15 13:56:47 -0300527 for (j = 0; j < sizeof(bw_params[0]); j++) {
Antti Palosaarieec21be2014-12-15 01:17:25 -0300528 ret = rtl2832_bulk_write(client, 0x11c + j, &bw_params[i][j], 1);
Thomas Mair82041c02012-05-18 14:47:40 -0300529 if (ret)
530 goto err;
531 }
532
533 /* calculate and set resample ratio
534 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
535 * / ConstWithBandwidthMode)
536 */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300537 num = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300538 num *= 0x400000;
539 num = div_u64(num, bw_mode);
540 resamp_ratio = num & 0x3ffffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300541 ret = rtl2832_wr_demod_reg(dev, DVBT_RSAMP_RATIO, resamp_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300542 if (ret)
543 goto err;
544
545 /* calculate and set cfreq off ratio
546 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
547 * / (CrystalFreqHz * 7))
548 */
549 num = bw_mode << 20;
Antti Palosaarie1174d72014-12-13 05:26:27 -0300550 num2 = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300551 num = div_u64(num, num2);
552 num = -num;
553 cfreq_off_ratio = num & 0xfffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300554 ret = rtl2832_wr_demod_reg(dev, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300555 if (ret)
556 goto err;
557
Thomas Mair82041c02012-05-18 14:47:40 -0300558 /* soft reset */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300559 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
Thomas Mair82041c02012-05-18 14:47:40 -0300560 if (ret)
561 goto err;
562
Antti Palosaari038c6f22014-12-13 00:37:43 -0300563 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
Thomas Mair82041c02012-05-18 14:47:40 -0300564 if (ret)
565 goto err;
566
Antti Palosaaricd559e02014-12-16 13:37:18 -0300567 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300568err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300569 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300570 return ret;
571}
572
Mauro Carvalho Chehab7e3e68b2016-02-04 12:58:30 -0200573static int rtl2832_get_frontend(struct dvb_frontend *fe,
574 struct dtv_frontend_properties *c)
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300575{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300576 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300577 struct i2c_client *client = dev->client;
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300578 int ret;
579 u8 buf[3];
580
Antti Palosaari038c6f22014-12-13 00:37:43 -0300581 if (dev->sleeping)
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300582 return 0;
583
Antti Palosaarieec21be2014-12-15 01:17:25 -0300584 ret = rtl2832_bulk_read(client, 0x33c, buf, 2);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300585 if (ret)
586 goto err;
587
Antti Palosaarieec21be2014-12-15 01:17:25 -0300588 ret = rtl2832_bulk_read(client, 0x351, &buf[2], 1);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300589 if (ret)
590 goto err;
591
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300592 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300593
594 switch ((buf[0] >> 2) & 3) {
595 case 0:
596 c->modulation = QPSK;
597 break;
598 case 1:
599 c->modulation = QAM_16;
600 break;
601 case 2:
602 c->modulation = QAM_64;
603 break;
604 }
605
606 switch ((buf[2] >> 2) & 1) {
607 case 0:
608 c->transmission_mode = TRANSMISSION_MODE_2K;
609 break;
610 case 1:
611 c->transmission_mode = TRANSMISSION_MODE_8K;
612 }
613
614 switch ((buf[2] >> 0) & 3) {
615 case 0:
616 c->guard_interval = GUARD_INTERVAL_1_32;
617 break;
618 case 1:
619 c->guard_interval = GUARD_INTERVAL_1_16;
620 break;
621 case 2:
622 c->guard_interval = GUARD_INTERVAL_1_8;
623 break;
624 case 3:
625 c->guard_interval = GUARD_INTERVAL_1_4;
626 break;
627 }
628
629 switch ((buf[0] >> 4) & 7) {
630 case 0:
631 c->hierarchy = HIERARCHY_NONE;
632 break;
633 case 1:
634 c->hierarchy = HIERARCHY_1;
635 break;
636 case 2:
637 c->hierarchy = HIERARCHY_2;
638 break;
639 case 3:
640 c->hierarchy = HIERARCHY_4;
641 break;
642 }
643
644 switch ((buf[1] >> 3) & 7) {
645 case 0:
646 c->code_rate_HP = FEC_1_2;
647 break;
648 case 1:
649 c->code_rate_HP = FEC_2_3;
650 break;
651 case 2:
652 c->code_rate_HP = FEC_3_4;
653 break;
654 case 3:
655 c->code_rate_HP = FEC_5_6;
656 break;
657 case 4:
658 c->code_rate_HP = FEC_7_8;
659 break;
660 }
661
662 switch ((buf[1] >> 0) & 7) {
663 case 0:
664 c->code_rate_LP = FEC_1_2;
665 break;
666 case 1:
667 c->code_rate_LP = FEC_2_3;
668 break;
669 case 2:
670 c->code_rate_LP = FEC_3_4;
671 break;
672 case 3:
673 c->code_rate_LP = FEC_5_6;
674 break;
675 case 4:
676 c->code_rate_LP = FEC_7_8;
677 break;
678 }
679
680 return 0;
681err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300682 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300683 return ret;
684}
685
Mauro Carvalho Chehab0df289a2015-06-07 14:53:52 -0300686static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
Thomas Mair82041c02012-05-18 14:47:40 -0300687{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300688 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300689 struct i2c_client *client = dev->client;
Antti Palosaari426508e2016-02-06 20:12:05 -0200690 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
Thomas Mair82041c02012-05-18 14:47:40 -0300691 int ret;
Luis de Bethencourt20357752015-02-11 08:08:51 -0300692 u32 uninitialized_var(tmp);
Antti Palosaari426508e2016-02-06 20:12:05 -0200693 u8 u8tmp, buf[2];
694 u16 u16tmp;
Thomas Mair82041c02012-05-18 14:47:40 -0300695
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300696 dev_dbg(&client->dev, "\n");
697
698 *status = 0;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300699 if (dev->sleeping)
Thomas Mair82041c02012-05-18 14:47:40 -0300700 return 0;
701
Antti Palosaari038c6f22014-12-13 00:37:43 -0300702 ret = rtl2832_rd_demod_reg(dev, DVBT_FSM_STAGE, &tmp);
Thomas Mair82041c02012-05-18 14:47:40 -0300703 if (ret)
704 goto err;
705
706 if (tmp == 11) {
707 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
708 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
Antti Palosaari1c7da402014-12-14 12:15:55 -0300709 } else if (tmp == 10) {
Thomas Mair82041c02012-05-18 14:47:40 -0300710 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
711 FE_HAS_VITERBI;
Antti Palosaari1c7da402014-12-14 12:15:55 -0300712 }
Thomas Mair82041c02012-05-18 14:47:40 -0300713
Antti Palosaari19d273d2014-12-14 06:55:43 -0300714 dev->fe_status = *status;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300715
Antti Palosaari25ef9f52014-12-14 11:00:50 -0300716 /* signal strength */
717 if (dev->fe_status & FE_HAS_SIGNAL) {
718 /* read digital AGC */
719 ret = rtl2832_bulk_read(client, 0x305, &u8tmp, 1);
720 if (ret)
721 goto err;
722
723 dev_dbg(&client->dev, "digital agc=%02x", u8tmp);
724
725 u8tmp = ~u8tmp;
726 u16tmp = u8tmp << 8 | u8tmp << 0;
727
728 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
729 c->strength.stat[0].uvalue = u16tmp;
730 } else {
731 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
732 }
733
Antti Palosaari19d273d2014-12-14 06:55:43 -0300734 /* CNR */
735 if (dev->fe_status & FE_HAS_VITERBI) {
736 unsigned hierarchy, constellation;
737 #define CONSTELLATION_NUM 3
738 #define HIERARCHY_NUM 4
739 static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
740 {85387325, 85387325, 85387325, 85387325},
741 {86676178, 86676178, 87167949, 87795660},
742 {87659938, 87659938, 87885178, 88241743},
743 };
744
745 ret = rtl2832_bulk_read(client, 0x33c, &u8tmp, 1);
746 if (ret)
747 goto err;
748
749 constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
750 if (constellation > CONSTELLATION_NUM - 1)
Antti Palosaari426508e2016-02-06 20:12:05 -0200751 goto err;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300752
753 hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
754 if (hierarchy > HIERARCHY_NUM - 1)
Antti Palosaari426508e2016-02-06 20:12:05 -0200755 goto err;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300756
757 ret = rtl2832_bulk_read(client, 0x40c, buf, 2);
758 if (ret)
759 goto err;
760
761 u16tmp = buf[0] << 8 | buf[1] << 0;
762 if (u16tmp)
763 tmp = (constant[constellation][hierarchy] -
764 intlog10(u16tmp)) / ((1 << 24) / 10000);
765 else
766 tmp = 0;
767
768 dev_dbg(&client->dev, "cnr raw=%u\n", u16tmp);
769
770 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
771 c->cnr.stat[0].svalue = tmp;
772 } else {
773 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
774 }
775
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300776 /* BER */
777 if (dev->fe_status & FE_HAS_LOCK) {
778 ret = rtl2832_bulk_read(client, 0x34e, buf, 2);
779 if (ret)
780 goto err;
781
782 u16tmp = buf[0] << 8 | buf[1] << 0;
783 dev->post_bit_error += u16tmp;
784 dev->post_bit_count += 1000000;
785
786 dev_dbg(&client->dev, "ber errors=%u total=1000000\n", u16tmp);
787
788 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
789 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
790 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
791 c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
792 } else {
793 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
794 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
795 }
796
Antti Palosaari426508e2016-02-06 20:12:05 -0200797 return 0;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300798err:
799 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari426508e2016-02-06 20:12:05 -0200800 return ret;
801}
802
803static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
804{
805 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
806
807 /* report SNR in resolution of 0.1 dB */
808 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
809 *snr = div_s64(c->cnr.stat[0].svalue, 100);
810 else
811 *snr = 0;
812
813 return 0;
814}
815
816static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
817{
818 struct rtl2832_dev *dev = fe->demodulator_priv;
819
820 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
821 dev->post_bit_error_prev = dev->post_bit_error;
822
823 return 0;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300824}
825
Antti Palosaari92d20d92014-02-08 03:50:04 -0300826/*
Antti Palosaarid1016582014-12-14 04:45:57 -0300827 * I2C gate/mux/repeater logic
828 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
829 * adapter lock is already taken by tuner driver.
830 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
831 * is delayed here a little bit in order to see if there is sequence of I2C
Antti Palosaari92d20d92014-02-08 03:50:04 -0300832 * messages sent to same I2C bus.
Antti Palosaari92d20d92014-02-08 03:50:04 -0300833 */
834static void rtl2832_i2c_gate_work(struct work_struct *work)
Antti Palosaari8823f022013-11-26 12:53:46 -0300835{
Antti Palosaarid1016582014-12-14 04:45:57 -0300836 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, i2c_gate_work.work);
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300837 struct i2c_client *client = dev->client;
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300838 int ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300839
Antti Palosaarid1016582014-12-14 04:45:57 -0300840 /* close gate */
841 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
842 if (ret)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300843 goto err;
844
Antti Palosaari92d20d92014-02-08 03:50:04 -0300845 return;
846err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300847 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300848}
849
Peter Rosincddcc402016-04-20 08:41:25 +0200850static int rtl2832_select(struct i2c_mux_core *muxc, u32 chan_id)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300851{
Peter Rosincddcc402016-04-20 08:41:25 +0200852 struct rtl2832_dev *dev = i2c_mux_priv(muxc);
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300853 struct i2c_client *client = dev->client;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300854 int ret;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300855
856 /* terminate possible gate closing */
Antti Palosaarid1016582014-12-14 04:45:57 -0300857 cancel_delayed_work(&dev->i2c_gate_work);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300858
Antti Palosaarid1016582014-12-14 04:45:57 -0300859 /*
Antti Palosaarid1016582014-12-14 04:45:57 -0300860 * I2C adapter lock is already taken and due to that we will use
861 * regmap_update_bits() which does not lock again I2C adapter.
862 */
Antti Palosaari0d117902014-12-18 06:30:32 -0300863 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
Antti Palosaarid1016582014-12-14 04:45:57 -0300864 if (ret)
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300865 goto err;
866
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300867 return 0;
868err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300869 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaarid1016582014-12-14 04:45:57 -0300870 return ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300871}
872
Peter Rosincddcc402016-04-20 08:41:25 +0200873static int rtl2832_deselect(struct i2c_mux_core *muxc, u32 chan_id)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300874{
Peter Rosincddcc402016-04-20 08:41:25 +0200875 struct rtl2832_dev *dev = i2c_mux_priv(muxc);
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300876
Antti Palosaari038c6f22014-12-13 00:37:43 -0300877 schedule_delayed_work(&dev->i2c_gate_work, usecs_to_jiffies(100));
Antti Palosaari92d20d92014-02-08 03:50:04 -0300878 return 0;
879}
880
Thomas Mair82041c02012-05-18 14:47:40 -0300881static struct dvb_frontend_ops rtl2832_ops = {
882 .delsys = { SYS_DVBT },
883 .info = {
884 .name = "Realtek RTL2832 (DVB-T)",
885 .frequency_min = 174000000,
886 .frequency_max = 862000000,
887 .frequency_stepsize = 166667,
888 .caps = FE_CAN_FEC_1_2 |
889 FE_CAN_FEC_2_3 |
890 FE_CAN_FEC_3_4 |
891 FE_CAN_FEC_5_6 |
892 FE_CAN_FEC_7_8 |
893 FE_CAN_FEC_AUTO |
894 FE_CAN_QPSK |
895 FE_CAN_QAM_16 |
896 FE_CAN_QAM_64 |
897 FE_CAN_QAM_AUTO |
898 FE_CAN_TRANSMISSION_MODE_AUTO |
899 FE_CAN_GUARD_INTERVAL_AUTO |
900 FE_CAN_HIERARCHY_AUTO |
901 FE_CAN_RECOVER |
902 FE_CAN_MUTE_TS
903 },
904
Thomas Mair82041c02012-05-18 14:47:40 -0300905 .init = rtl2832_init,
906 .sleep = rtl2832_sleep,
907
908 .get_tune_settings = rtl2832_get_tune_settings,
909
910 .set_frontend = rtl2832_set_frontend,
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300911 .get_frontend = rtl2832_get_frontend,
Thomas Mair82041c02012-05-18 14:47:40 -0300912
913 .read_status = rtl2832_read_status,
Antti Palosaari73983492012-08-21 19:56:21 -0300914 .read_snr = rtl2832_read_snr,
Antti Palosaaridb32d742012-08-21 19:56:22 -0300915 .read_ber = rtl2832_read_ber,
Thomas Mair82041c02012-05-18 14:47:40 -0300916};
917
Antti Palosaaridcadb822014-12-14 16:23:28 -0300918static bool rtl2832_volatile_reg(struct device *dev, unsigned int reg)
919{
920 switch (reg) {
921 case 0x305:
922 case 0x33c:
923 case 0x34e:
924 case 0x351:
925 case 0x40c ... 0x40d:
926 return true;
927 default:
928 break;
929 }
930
931 return false;
932}
933
Antti Palosaarid1016582014-12-14 04:45:57 -0300934/*
935 * We implement own I2C access routines for regmap in order to get manual access
936 * to I2C adapter lock, which is needed for I2C mux adapter.
937 */
938static int rtl2832_regmap_read(void *context, const void *reg_buf,
939 size_t reg_size, void *val_buf, size_t val_size)
940{
941 struct i2c_client *client = context;
942 int ret;
943 struct i2c_msg msg[2] = {
944 {
945 .addr = client->addr,
946 .flags = 0,
947 .len = reg_size,
948 .buf = (u8 *)reg_buf,
949 }, {
950 .addr = client->addr,
951 .flags = I2C_M_RD,
952 .len = val_size,
953 .buf = val_buf,
954 }
955 };
956
957 ret = __i2c_transfer(client->adapter, msg, 2);
958 if (ret != 2) {
Antti Palosaari891e0552015-10-05 21:16:39 -0300959 dev_warn(&client->dev, "i2c reg read failed %d reg %02x\n",
960 ret, *(u8 *)reg_buf);
Antti Palosaarid1016582014-12-14 04:45:57 -0300961 if (ret >= 0)
962 ret = -EREMOTEIO;
963 return ret;
964 }
965 return 0;
966}
967
968static int rtl2832_regmap_write(void *context, const void *data, size_t count)
969{
970 struct i2c_client *client = context;
971 int ret;
972 struct i2c_msg msg[1] = {
973 {
974 .addr = client->addr,
975 .flags = 0,
976 .len = count,
977 .buf = (u8 *)data,
978 }
979 };
980
981 ret = __i2c_transfer(client->adapter, msg, 1);
982 if (ret != 1) {
Antti Palosaari891e0552015-10-05 21:16:39 -0300983 dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n",
984 ret, *(u8 *)data);
Antti Palosaarid1016582014-12-14 04:45:57 -0300985 if (ret >= 0)
986 ret = -EREMOTEIO;
987 return ret;
988 }
989 return 0;
990}
991
992static int rtl2832_regmap_gather_write(void *context, const void *reg,
993 size_t reg_len, const void *val,
994 size_t val_len)
995{
996 struct i2c_client *client = context;
997 int ret;
998 u8 buf[256];
999 struct i2c_msg msg[1] = {
1000 {
1001 .addr = client->addr,
1002 .flags = 0,
1003 .len = 1 + val_len,
1004 .buf = buf,
1005 }
1006 };
1007
1008 buf[0] = *(u8 const *)reg;
1009 memcpy(&buf[1], val, val_len);
1010
1011 ret = __i2c_transfer(client->adapter, msg, 1);
1012 if (ret != 1) {
Antti Palosaari891e0552015-10-05 21:16:39 -03001013 dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n",
1014 ret, *(u8 const *)reg);
Antti Palosaarid1016582014-12-14 04:45:57 -03001015 if (ret >= 0)
1016 ret = -EREMOTEIO;
1017 return ret;
1018 }
1019 return 0;
1020}
1021
Antti Palosaarib410dae2014-12-18 07:22:46 -03001022/*
1023 * FIXME: Hack. Implement own regmap locking in order to silence lockdep
1024 * recursive lock warning. That happens when regmap I2C client calls I2C mux
1025 * adapter, which leads demod I2C repeater enable via demod regmap. Operation
1026 * takes two regmap locks recursively - but those are different regmap instances
1027 * in a two different I2C drivers, so it is not deadlock. Proper fix is to make
1028 * regmap aware of lockdep.
1029 */
1030static void rtl2832_regmap_lock(void *__dev)
1031{
1032 struct rtl2832_dev *dev = __dev;
1033 struct i2c_client *client = dev->client;
1034
1035 dev_dbg(&client->dev, "\n");
1036 mutex_lock(&dev->regmap_mutex);
1037}
1038
1039static void rtl2832_regmap_unlock(void *__dev)
1040{
1041 struct rtl2832_dev *dev = __dev;
1042 struct i2c_client *client = dev->client;
1043
1044 dev_dbg(&client->dev, "\n");
1045 mutex_unlock(&dev->regmap_mutex);
1046}
1047
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001048static struct dvb_frontend *rtl2832_get_dvb_frontend(struct i2c_client *client)
1049{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001050 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001051
1052 dev_dbg(&client->dev, "\n");
1053 return &dev->fe;
1054}
1055
Antti Palosaaricd559e02014-12-16 13:37:18 -03001056static struct i2c_adapter *rtl2832_get_i2c_adapter(struct i2c_client *client)
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001057{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001058 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001059
1060 dev_dbg(&client->dev, "\n");
Peter Rosincddcc402016-04-20 08:41:25 +02001061 return dev->muxc->adapter[0];
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001062}
1063
Antti Palosaarid884aca2016-02-05 18:26:30 -02001064static int rtl2832_slave_ts_ctrl(struct i2c_client *client, bool enable)
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001065{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001066 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001067 int ret;
1068
Antti Palosaarid884aca2016-02-05 18:26:30 -02001069 dev_dbg(&client->dev, "enable=%d\n", enable);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001070
Antti Palosaarid884aca2016-02-05 18:26:30 -02001071 if (enable) {
1072 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
1073 if (ret)
1074 goto err;
1075 ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2);
1076 if (ret)
1077 goto err;
1078 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
1079 if (ret)
1080 goto err;
1081 ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1);
1082 if (ret)
1083 goto err;
1084 ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3);
1085 if (ret)
1086 goto err;
1087 } else {
1088 ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3);
1089 if (ret)
1090 goto err;
1091 ret = rtl2832_bulk_write(client, 0x0bc, "\x08", 1);
1092 if (ret)
1093 goto err;
1094 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0);
1095 if (ret)
1096 goto err;
1097 ret = rtl2832_bulk_write(client, 0x10c, "\x00\x00", 2);
1098 if (ret)
1099 goto err;
1100 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
1101 if (ret)
1102 goto err;
1103 }
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001104
1105 return 0;
1106err:
1107 dev_dbg(&client->dev, "failed=%d\n", ret);
1108 return ret;
1109}
1110
Antti Palosaari4b01e012014-12-14 14:07:35 -03001111static int rtl2832_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
1112{
1113 struct rtl2832_dev *dev = fe->demodulator_priv;
1114 struct i2c_client *client = dev->client;
1115 int ret;
1116 u8 u8tmp;
1117
1118 dev_dbg(&client->dev, "onoff=%d\n", onoff);
1119
1120 /* enable / disable PID filter */
1121 if (onoff)
1122 u8tmp = 0x80;
1123 else
1124 u8tmp = 0x00;
1125
1126 ret = rtl2832_update_bits(client, 0x061, 0xc0, u8tmp);
1127 if (ret)
1128 goto err;
1129
1130 return 0;
1131err:
1132 dev_dbg(&client->dev, "failed=%d\n", ret);
1133 return ret;
1134}
1135
1136static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid,
1137 int onoff)
1138{
1139 struct rtl2832_dev *dev = fe->demodulator_priv;
1140 struct i2c_client *client = dev->client;
1141 int ret;
1142 u8 buf[4];
1143
1144 dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
1145 index, pid, onoff);
1146
1147 /* skip invalid PIDs (0x2000) */
1148 if (pid > 0x1fff || index > 32)
1149 return 0;
1150
1151 if (onoff)
1152 set_bit(index, &dev->filters);
1153 else
1154 clear_bit(index, &dev->filters);
1155
1156 /* enable / disable PIDs */
1157 buf[0] = (dev->filters >> 0) & 0xff;
1158 buf[1] = (dev->filters >> 8) & 0xff;
1159 buf[2] = (dev->filters >> 16) & 0xff;
1160 buf[3] = (dev->filters >> 24) & 0xff;
1161 ret = rtl2832_bulk_write(client, 0x062, buf, 4);
1162 if (ret)
1163 goto err;
1164
1165 /* add PID */
1166 buf[0] = (pid >> 8) & 0xff;
1167 buf[1] = (pid >> 0) & 0xff;
1168 ret = rtl2832_bulk_write(client, 0x066 + 2 * index, buf, 2);
1169 if (ret)
1170 goto err;
1171
1172 return 0;
1173err:
1174 dev_dbg(&client->dev, "failed=%d\n", ret);
1175 return ret;
1176}
1177
Antti Palosaaric2c83862014-12-02 10:55:17 -03001178static int rtl2832_probe(struct i2c_client *client,
1179 const struct i2c_device_id *id)
1180{
1181 struct rtl2832_platform_data *pdata = client->dev.platform_data;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001182 struct i2c_adapter *i2c = client->adapter;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001183 struct rtl2832_dev *dev;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001184 int ret;
1185 u8 tmp;
Antti Palosaarid1016582014-12-14 04:45:57 -03001186 static const struct regmap_bus regmap_bus = {
1187 .read = rtl2832_regmap_read,
1188 .write = rtl2832_regmap_write,
1189 .gather_write = rtl2832_regmap_gather_write,
1190 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
1191 };
1192 static const struct regmap_range_cfg regmap_range_cfg[] = {
1193 {
1194 .selector_reg = 0x00,
1195 .selector_mask = 0xff,
1196 .selector_shift = 0,
1197 .window_start = 0,
1198 .window_len = 0x100,
1199 .range_min = 0 * 0x100,
1200 .range_max = 5 * 0x100,
1201 },
1202 };
Antti Palosaaric2c83862014-12-02 10:55:17 -03001203
1204 dev_dbg(&client->dev, "\n");
1205
Antti Palosaaric2c83862014-12-02 10:55:17 -03001206 /* allocate memory for the internal state */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001207 dev = kzalloc(sizeof(struct rtl2832_dev), GFP_KERNEL);
1208 if (dev == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001209 ret = -ENOMEM;
1210 goto err;
1211 }
1212
Antti Palosaari038c6f22014-12-13 00:37:43 -03001213 /* setup the state */
Antti Palosaarid1016582014-12-14 04:45:57 -03001214 i2c_set_clientdata(client, dev);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001215 dev->client = client;
Antti Palosaarie1174d72014-12-13 05:26:27 -03001216 dev->pdata = client->dev.platform_data;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001217 dev->sleeping = true;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001218 INIT_DELAYED_WORK(&dev->i2c_gate_work, rtl2832_i2c_gate_work);
Antti Palosaarid1016582014-12-14 04:45:57 -03001219 /* create regmap */
Antti Palosaarib410dae2014-12-18 07:22:46 -03001220 mutex_init(&dev->regmap_mutex);
1221 dev->regmap_config.reg_bits = 8,
1222 dev->regmap_config.val_bits = 8,
1223 dev->regmap_config.lock = rtl2832_regmap_lock,
1224 dev->regmap_config.unlock = rtl2832_regmap_unlock,
1225 dev->regmap_config.lock_arg = dev,
1226 dev->regmap_config.volatile_reg = rtl2832_volatile_reg,
1227 dev->regmap_config.max_register = 5 * 0x100,
1228 dev->regmap_config.ranges = regmap_range_cfg,
1229 dev->regmap_config.num_ranges = ARRAY_SIZE(regmap_range_cfg),
Antti Palosaarib3b2bf82015-03-14 11:13:07 -03001230 dev->regmap_config.cache_type = REGCACHE_NONE,
Antti Palosaarid1016582014-12-14 04:45:57 -03001231 dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
Antti Palosaarib410dae2014-12-18 07:22:46 -03001232 &dev->regmap_config);
Antti Palosaarid1016582014-12-14 04:45:57 -03001233 if (IS_ERR(dev->regmap)) {
1234 ret = PTR_ERR(dev->regmap);
1235 goto err_kfree;
1236 }
Antti Palosaaric2c83862014-12-02 10:55:17 -03001237
1238 /* check if the demod is there */
Antti Palosaarieec21be2014-12-15 01:17:25 -03001239 ret = rtl2832_bulk_read(client, 0x000, &tmp, 1);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001240 if (ret)
Antti Palosaari0d117902014-12-18 06:30:32 -03001241 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001242
1243 /* create muxed i2c adapter for demod tuner bus */
Peter Rosincddcc402016-04-20 08:41:25 +02001244 dev->muxc = i2c_mux_alloc(i2c, &i2c->dev, 1, 0, 0,
1245 rtl2832_select, rtl2832_deselect);
1246 if (!dev->muxc) {
1247 ret = -ENOMEM;
Antti Palosaari0d117902014-12-18 06:30:32 -03001248 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001249 }
Peter Rosincddcc402016-04-20 08:41:25 +02001250 dev->muxc->priv = dev;
1251 ret = i2c_mux_add_adapter(dev->muxc, 0, 0, 0);
1252 if (ret)
1253 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001254
1255 /* create dvb_frontend */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001256 memcpy(&dev->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
1257 dev->fe.demodulator_priv = dev;
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001258
1259 /* setup callbacks */
1260 pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
Antti Palosaaricd559e02014-12-16 13:37:18 -03001261 pdata->get_i2c_adapter = rtl2832_get_i2c_adapter;
Antti Palosaarid884aca2016-02-05 18:26:30 -02001262 pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl;
Antti Palosaari4b01e012014-12-14 14:07:35 -03001263 pdata->pid_filter = rtl2832_pid_filter;
1264 pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
Antti Palosaari0aa32ef92014-12-15 13:34:13 -03001265 pdata->bulk_read = rtl2832_bulk_read;
1266 pdata->bulk_write = rtl2832_bulk_write;
1267 pdata->update_bits = rtl2832_update_bits;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001268
1269 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
1270 return 0;
Antti Palosaarid1016582014-12-14 04:45:57 -03001271err_regmap_exit:
1272 regmap_exit(dev->regmap);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001273err_kfree:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001274 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001275err:
1276 dev_dbg(&client->dev, "failed=%d\n", ret);
1277 return ret;
1278}
1279
1280static int rtl2832_remove(struct i2c_client *client)
1281{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001282 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001283
1284 dev_dbg(&client->dev, "\n");
1285
Antti Palosaari038c6f22014-12-13 00:37:43 -03001286 cancel_delayed_work_sync(&dev->i2c_gate_work);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001287
Peter Rosincddcc402016-04-20 08:41:25 +02001288 i2c_mux_del_adapters(dev->muxc);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001289
Antti Palosaarid1016582014-12-14 04:45:57 -03001290 regmap_exit(dev->regmap);
1291
Antti Palosaari038c6f22014-12-13 00:37:43 -03001292 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001293
1294 return 0;
1295}
1296
1297static const struct i2c_device_id rtl2832_id_table[] = {
1298 {"rtl2832", 0},
1299 {}
1300};
1301MODULE_DEVICE_TABLE(i2c, rtl2832_id_table);
1302
1303static struct i2c_driver rtl2832_driver = {
1304 .driver = {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001305 .name = "rtl2832",
1306 },
1307 .probe = rtl2832_probe,
1308 .remove = rtl2832_remove,
1309 .id_table = rtl2832_id_table,
1310};
1311
1312module_i2c_driver(rtl2832_driver);
1313
Thomas Mair82041c02012-05-18 14:47:40 -03001314MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
Antti Palosaari75c24002014-12-16 13:54:23 -03001315MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
Thomas Mair82041c02012-05-18 14:47:40 -03001316MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1317MODULE_LICENSE("GPL");