blob: e80c6b974f4c95f76cf2b87a907d00a2369c51fc [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! */
157int 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
Antti Palosaarid1016582014-12-14 04:45:57 -0300169int 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
181int rtl2832_bulk_read(struct i2c_client *client, unsigned int reg, void *val,
182 size_t val_count)
183{
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 Palosaari832cc7c2012-09-11 22:27:04 -0300361 case RTL2832_TUNER_FC0012:
362 case RTL2832_TUNER_FC0013:
363 len = ARRAY_SIZE(rtl2832_tuner_init_fc0012);
364 init = rtl2832_tuner_init_fc0012;
365 break;
Antti Palosaari5db41872012-09-11 22:27:08 -0300366 case RTL2832_TUNER_TUA9001:
367 len = ARRAY_SIZE(rtl2832_tuner_init_tua9001);
368 init = rtl2832_tuner_init_tua9001;
369 break;
Antti Palosaari7e688de2012-09-17 17:53:04 -0300370 case RTL2832_TUNER_E4000:
371 len = ARRAY_SIZE(rtl2832_tuner_init_e4000);
372 init = rtl2832_tuner_init_e4000;
373 break;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300374 case RTL2832_TUNER_R820T:
Antti Palosaaria26758e2013-10-30 00:36:38 -0300375 case RTL2832_TUNER_R828D:
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300376 len = ARRAY_SIZE(rtl2832_tuner_init_r820t);
377 init = rtl2832_tuner_init_r820t;
378 break;
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300379 default:
380 ret = -EINVAL;
381 goto err;
382 }
383
384 for (i = 0; i < len; i++) {
Antti Palosaari038c6f22014-12-13 00:37:43 -0300385 ret = rtl2832_wr_demod_reg(dev, init[i].reg, init[i].value);
Antti Palosaari832cc7c2012-09-11 22:27:04 -0300386 if (ret)
387 goto err;
388 }
389
Antti Palosaari19d273d2014-12-14 06:55:43 -0300390 /* init stats here in order signal app which stats are supported */
Antti Palosaari25ef9f52014-12-14 11:00:50 -0300391 c->strength.len = 1;
392 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300393 c->cnr.len = 1;
394 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300395 c->post_bit_error.len = 1;
396 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
397 c->post_bit_count.len = 1;
398 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300399 /* start statistics polling */
400 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
Antti Palosaari038c6f22014-12-13 00:37:43 -0300401 dev->sleeping = false;
Thomas Mair82041c02012-05-18 14:47:40 -0300402
Antti Palosaaricd559e02014-12-16 13:37:18 -0300403 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300404err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300405 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300406 return ret;
407}
408
409static int rtl2832_sleep(struct dvb_frontend *fe)
410{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300411 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300412 struct i2c_client *client = dev->client;
Antti Palosaaria08c3782014-12-16 14:51:33 -0300413 int ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300414
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300415 dev_dbg(&client->dev, "\n");
Antti Palosaaria08c3782014-12-16 14:51:33 -0300416
Antti Palosaari038c6f22014-12-13 00:37:43 -0300417 dev->sleeping = true;
Antti Palosaari19d273d2014-12-14 06:55:43 -0300418 /* stop statistics polling */
419 cancel_delayed_work_sync(&dev->stat_work);
420 dev->fe_status = 0;
Antti Palosaaria08c3782014-12-16 14:51:33 -0300421
422 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
423 if (ret)
424 goto err;
425
Thomas Mair82041c02012-05-18 14:47:40 -0300426 return 0;
Antti Palosaaria08c3782014-12-16 14:51:33 -0300427err:
428 dev_dbg(&client->dev, "failed=%d\n", ret);
429 return ret;
Thomas Mair82041c02012-05-18 14:47:40 -0300430}
431
Mauro Carvalho Chehabb0944ea2012-10-27 11:24:37 -0300432static int rtl2832_get_tune_settings(struct dvb_frontend *fe,
Thomas Mair82041c02012-05-18 14:47:40 -0300433 struct dvb_frontend_tune_settings *s)
434{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300435 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300436 struct i2c_client *client = dev->client;
Antti Palosaari298efdd2012-09-11 22:27:11 -0300437
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300438 dev_dbg(&client->dev, "\n");
Thomas Mair82041c02012-05-18 14:47:40 -0300439 s->min_delay_ms = 1000;
440 s->step_size = fe->ops.info.frequency_stepsize * 2;
441 s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
442 return 0;
443}
444
445static int rtl2832_set_frontend(struct dvb_frontend *fe)
446{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300447 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300448 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300449 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
450 int ret, i, j;
451 u64 bw_mode, num, num2;
452 u32 resamp_ratio, cfreq_off_ratio;
Thomas Mair82041c02012-05-18 14:47:40 -0300453 static u8 bw_params[3][32] = {
454 /* 6 MHz bandwidth */
455 {
456 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
457 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
458 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
459 0x19, 0xe0,
460 },
461
462 /* 7 MHz bandwidth */
463 {
464 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
465 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
466 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
467 0x19, 0x10,
468 },
469
470 /* 8 MHz bandwidth */
471 {
472 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
473 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
474 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
475 0x19, 0xe0,
476 },
477 };
478
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300479 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
480 c->frequency, c->bandwidth_hz, c->inversion);
Thomas Mair82041c02012-05-18 14:47:40 -0300481
482 /* program tuner */
483 if (fe->ops.tuner_ops.set_params)
484 fe->ops.tuner_ops.set_params(fe);
485
Antti Palosaarife37b382013-11-28 19:15:19 -0300486 /* PIP mode related */
Antti Palosaarieec21be2014-12-15 01:17:25 -0300487 ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3);
Antti Palosaarife37b382013-11-28 19:15:19 -0300488 if (ret)
489 goto err;
490
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300491 /* If the frontend has get_if_frequency(), use it */
492 if (fe->ops.tuner_ops.get_if_frequency) {
493 u32 if_freq;
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300494
495 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
496 if (ret)
497 goto err;
498
Mauro Carvalho Chehab884655a2013-04-09 22:16:52 -0300499 ret = rtl2832_set_if(fe, if_freq);
Mauro Carvalho Chehabfa4bfd22013-04-09 18:19:50 -0300500 if (ret)
501 goto err;
502 }
503
Thomas Mair82041c02012-05-18 14:47:40 -0300504 switch (c->bandwidth_hz) {
505 case 6000000:
506 i = 0;
507 bw_mode = 48000000;
508 break;
509 case 7000000:
510 i = 1;
511 bw_mode = 56000000;
512 break;
513 case 8000000:
514 i = 2;
515 bw_mode = 64000000;
516 break;
517 default:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300518 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
519 c->bandwidth_hz);
520 ret = -EINVAL;
521 goto err;
Thomas Mair82041c02012-05-18 14:47:40 -0300522 }
523
Hans-Frieder Vogtfc4b3fa2012-07-15 13:56:47 -0300524 for (j = 0; j < sizeof(bw_params[0]); j++) {
Antti Palosaarieec21be2014-12-15 01:17:25 -0300525 ret = rtl2832_bulk_write(client, 0x11c + j, &bw_params[i][j], 1);
Thomas Mair82041c02012-05-18 14:47:40 -0300526 if (ret)
527 goto err;
528 }
529
530 /* calculate and set resample ratio
531 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
532 * / ConstWithBandwidthMode)
533 */
Antti Palosaarie1174d72014-12-13 05:26:27 -0300534 num = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300535 num *= 0x400000;
536 num = div_u64(num, bw_mode);
537 resamp_ratio = num & 0x3ffffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300538 ret = rtl2832_wr_demod_reg(dev, DVBT_RSAMP_RATIO, resamp_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300539 if (ret)
540 goto err;
541
542 /* calculate and set cfreq off ratio
543 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
544 * / (CrystalFreqHz * 7))
545 */
546 num = bw_mode << 20;
Antti Palosaarie1174d72014-12-13 05:26:27 -0300547 num2 = dev->pdata->clk * 7;
Thomas Mair82041c02012-05-18 14:47:40 -0300548 num = div_u64(num, num2);
549 num = -num;
550 cfreq_off_ratio = num & 0xfffff;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300551 ret = rtl2832_wr_demod_reg(dev, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
Thomas Mair82041c02012-05-18 14:47:40 -0300552 if (ret)
553 goto err;
554
Thomas Mair82041c02012-05-18 14:47:40 -0300555 /* soft reset */
Antti Palosaari038c6f22014-12-13 00:37:43 -0300556 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
Thomas Mair82041c02012-05-18 14:47:40 -0300557 if (ret)
558 goto err;
559
Antti Palosaari038c6f22014-12-13 00:37:43 -0300560 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
Thomas Mair82041c02012-05-18 14:47:40 -0300561 if (ret)
562 goto err;
563
Antti Palosaaricd559e02014-12-16 13:37:18 -0300564 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300565err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300566 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300567 return ret;
568}
569
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300570static int rtl2832_get_frontend(struct dvb_frontend *fe)
571{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300572 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300573 struct i2c_client *client = dev->client;
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300574 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
575 int ret;
576 u8 buf[3];
577
Antti Palosaari038c6f22014-12-13 00:37:43 -0300578 if (dev->sleeping)
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300579 return 0;
580
Antti Palosaarieec21be2014-12-15 01:17:25 -0300581 ret = rtl2832_bulk_read(client, 0x33c, buf, 2);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300582 if (ret)
583 goto err;
584
Antti Palosaarieec21be2014-12-15 01:17:25 -0300585 ret = rtl2832_bulk_read(client, 0x351, &buf[2], 1);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300586 if (ret)
587 goto err;
588
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300589 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300590
591 switch ((buf[0] >> 2) & 3) {
592 case 0:
593 c->modulation = QPSK;
594 break;
595 case 1:
596 c->modulation = QAM_16;
597 break;
598 case 2:
599 c->modulation = QAM_64;
600 break;
601 }
602
603 switch ((buf[2] >> 2) & 1) {
604 case 0:
605 c->transmission_mode = TRANSMISSION_MODE_2K;
606 break;
607 case 1:
608 c->transmission_mode = TRANSMISSION_MODE_8K;
609 }
610
611 switch ((buf[2] >> 0) & 3) {
612 case 0:
613 c->guard_interval = GUARD_INTERVAL_1_32;
614 break;
615 case 1:
616 c->guard_interval = GUARD_INTERVAL_1_16;
617 break;
618 case 2:
619 c->guard_interval = GUARD_INTERVAL_1_8;
620 break;
621 case 3:
622 c->guard_interval = GUARD_INTERVAL_1_4;
623 break;
624 }
625
626 switch ((buf[0] >> 4) & 7) {
627 case 0:
628 c->hierarchy = HIERARCHY_NONE;
629 break;
630 case 1:
631 c->hierarchy = HIERARCHY_1;
632 break;
633 case 2:
634 c->hierarchy = HIERARCHY_2;
635 break;
636 case 3:
637 c->hierarchy = HIERARCHY_4;
638 break;
639 }
640
641 switch ((buf[1] >> 3) & 7) {
642 case 0:
643 c->code_rate_HP = FEC_1_2;
644 break;
645 case 1:
646 c->code_rate_HP = FEC_2_3;
647 break;
648 case 2:
649 c->code_rate_HP = FEC_3_4;
650 break;
651 case 3:
652 c->code_rate_HP = FEC_5_6;
653 break;
654 case 4:
655 c->code_rate_HP = FEC_7_8;
656 break;
657 }
658
659 switch ((buf[1] >> 0) & 7) {
660 case 0:
661 c->code_rate_LP = FEC_1_2;
662 break;
663 case 1:
664 c->code_rate_LP = FEC_2_3;
665 break;
666 case 2:
667 c->code_rate_LP = FEC_3_4;
668 break;
669 case 3:
670 c->code_rate_LP = FEC_5_6;
671 break;
672 case 4:
673 c->code_rate_LP = FEC_7_8;
674 break;
675 }
676
677 return 0;
678err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300679 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300680 return ret;
681}
682
Thomas Mair82041c02012-05-18 14:47:40 -0300683static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
684{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300685 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300686 struct i2c_client *client = dev->client;
Thomas Mair82041c02012-05-18 14:47:40 -0300687 int ret;
688 u32 tmp;
Thomas Mair82041c02012-05-18 14:47:40 -0300689
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300690 dev_dbg(&client->dev, "\n");
691
692 *status = 0;
Antti Palosaari038c6f22014-12-13 00:37:43 -0300693 if (dev->sleeping)
Thomas Mair82041c02012-05-18 14:47:40 -0300694 return 0;
695
Antti Palosaari038c6f22014-12-13 00:37:43 -0300696 ret = rtl2832_rd_demod_reg(dev, DVBT_FSM_STAGE, &tmp);
Thomas Mair82041c02012-05-18 14:47:40 -0300697 if (ret)
698 goto err;
699
700 if (tmp == 11) {
701 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
702 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
Antti Palosaari1c7da402014-12-14 12:15:55 -0300703 } else if (tmp == 10) {
Thomas Mair82041c02012-05-18 14:47:40 -0300704 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
705 FE_HAS_VITERBI;
Antti Palosaari1c7da402014-12-14 12:15:55 -0300706 }
Thomas Mair82041c02012-05-18 14:47:40 -0300707
Antti Palosaari19d273d2014-12-14 06:55:43 -0300708 dev->fe_status = *status;
Antti Palosaaricd559e02014-12-16 13:37:18 -0300709 return 0;
Thomas Mair82041c02012-05-18 14:47:40 -0300710err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300711 dev_dbg(&client->dev, "failed=%d\n", ret);
Thomas Mair82041c02012-05-18 14:47:40 -0300712 return ret;
713}
714
Antti Palosaari73983492012-08-21 19:56:21 -0300715static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
716{
Antti Palosaarif7caf932014-12-14 10:05:49 -0300717 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
Antti Palosaari73983492012-08-21 19:56:21 -0300718
Antti Palosaarif7caf932014-12-14 10:05:49 -0300719 /* report SNR in resolution of 0.1 dB */
720 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
721 *snr = div_s64(c->cnr.stat[0].svalue, 100);
Antti Palosaari73983492012-08-21 19:56:21 -0300722 else
723 *snr = 0;
724
725 return 0;
Antti Palosaari73983492012-08-21 19:56:21 -0300726}
727
Antti Palosaaridb32d742012-08-21 19:56:22 -0300728static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
729{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300730 struct rtl2832_dev *dev = fe->demodulator_priv;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300731
Antti Palosaari084330b2014-12-14 10:10:22 -0300732 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
733 dev->post_bit_error_prev = dev->post_bit_error;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300734
735 return 0;
Antti Palosaaridb32d742012-08-21 19:56:22 -0300736}
737
Antti Palosaari19d273d2014-12-14 06:55:43 -0300738static void rtl2832_stat_work(struct work_struct *work)
739{
740 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, stat_work.work);
741 struct i2c_client *client = dev->client;
742 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
743 int ret, tmp;
744 u8 u8tmp, buf[2];
745 u16 u16tmp;
746
747 dev_dbg(&client->dev, "\n");
748
Antti Palosaari25ef9f52014-12-14 11:00:50 -0300749 /* signal strength */
750 if (dev->fe_status & FE_HAS_SIGNAL) {
751 /* read digital AGC */
752 ret = rtl2832_bulk_read(client, 0x305, &u8tmp, 1);
753 if (ret)
754 goto err;
755
756 dev_dbg(&client->dev, "digital agc=%02x", u8tmp);
757
758 u8tmp = ~u8tmp;
759 u16tmp = u8tmp << 8 | u8tmp << 0;
760
761 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
762 c->strength.stat[0].uvalue = u16tmp;
763 } else {
764 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
765 }
766
Antti Palosaari19d273d2014-12-14 06:55:43 -0300767 /* CNR */
768 if (dev->fe_status & FE_HAS_VITERBI) {
769 unsigned hierarchy, constellation;
770 #define CONSTELLATION_NUM 3
771 #define HIERARCHY_NUM 4
772 static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
773 {85387325, 85387325, 85387325, 85387325},
774 {86676178, 86676178, 87167949, 87795660},
775 {87659938, 87659938, 87885178, 88241743},
776 };
777
778 ret = rtl2832_bulk_read(client, 0x33c, &u8tmp, 1);
779 if (ret)
780 goto err;
781
782 constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
783 if (constellation > CONSTELLATION_NUM - 1)
784 goto err_schedule_delayed_work;
785
786 hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
787 if (hierarchy > HIERARCHY_NUM - 1)
788 goto err_schedule_delayed_work;
789
790 ret = rtl2832_bulk_read(client, 0x40c, buf, 2);
791 if (ret)
792 goto err;
793
794 u16tmp = buf[0] << 8 | buf[1] << 0;
795 if (u16tmp)
796 tmp = (constant[constellation][hierarchy] -
797 intlog10(u16tmp)) / ((1 << 24) / 10000);
798 else
799 tmp = 0;
800
801 dev_dbg(&client->dev, "cnr raw=%u\n", u16tmp);
802
803 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
804 c->cnr.stat[0].svalue = tmp;
805 } else {
806 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
807 }
808
Antti Palosaari6b4fd012014-12-14 09:59:20 -0300809 /* BER */
810 if (dev->fe_status & FE_HAS_LOCK) {
811 ret = rtl2832_bulk_read(client, 0x34e, buf, 2);
812 if (ret)
813 goto err;
814
815 u16tmp = buf[0] << 8 | buf[1] << 0;
816 dev->post_bit_error += u16tmp;
817 dev->post_bit_count += 1000000;
818
819 dev_dbg(&client->dev, "ber errors=%u total=1000000\n", u16tmp);
820
821 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
822 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
823 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
824 c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
825 } else {
826 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
827 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
828 }
829
Antti Palosaari19d273d2014-12-14 06:55:43 -0300830err_schedule_delayed_work:
831 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
832 return;
833err:
834 dev_dbg(&client->dev, "failed=%d\n", ret);
835}
836
Antti Palosaari92d20d92014-02-08 03:50:04 -0300837/*
Antti Palosaarid1016582014-12-14 04:45:57 -0300838 * I2C gate/mux/repeater logic
839 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
840 * adapter lock is already taken by tuner driver.
841 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
842 * is delayed here a little bit in order to see if there is sequence of I2C
Antti Palosaari92d20d92014-02-08 03:50:04 -0300843 * messages sent to same I2C bus.
Antti Palosaari92d20d92014-02-08 03:50:04 -0300844 */
845static void rtl2832_i2c_gate_work(struct work_struct *work)
Antti Palosaari8823f022013-11-26 12:53:46 -0300846{
Antti Palosaarid1016582014-12-14 04:45:57 -0300847 struct rtl2832_dev *dev = container_of(work, struct rtl2832_dev, i2c_gate_work.work);
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300848 struct i2c_client *client = dev->client;
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300849 int ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300850
Antti Palosaarid1016582014-12-14 04:45:57 -0300851 /* close gate */
852 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
853 if (ret)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300854 goto err;
855
Antti Palosaari92d20d92014-02-08 03:50:04 -0300856 return;
857err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300858 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300859}
860
861static int rtl2832_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
862{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300863 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300864 struct i2c_client *client = dev->client;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300865 int ret;
Antti Palosaari92d20d92014-02-08 03:50:04 -0300866
867 /* terminate possible gate closing */
Antti Palosaarid1016582014-12-14 04:45:57 -0300868 cancel_delayed_work(&dev->i2c_gate_work);
Antti Palosaari92d20d92014-02-08 03:50:04 -0300869
Antti Palosaarid1016582014-12-14 04:45:57 -0300870 /*
871 * chan_id 1 is muxed adapter demod provides and chan_id 0 is demod
872 * itself. We need open gate when request is for chan_id 1. On that case
873 * I2C adapter lock is already taken and due to that we will use
874 * regmap_update_bits() which does not lock again I2C adapter.
875 */
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300876 if (chan_id == 1)
Antti Palosaarid1016582014-12-14 04:45:57 -0300877 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300878 else
Antti Palosaarid1016582014-12-14 04:45:57 -0300879 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00);
880 if (ret)
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300881 goto err;
882
Antti Palosaari0ea872d2013-12-03 18:19:39 -0300883 return 0;
884err:
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300885 dev_dbg(&client->dev, "failed=%d\n", ret);
Antti Palosaarid1016582014-12-14 04:45:57 -0300886 return ret;
Antti Palosaari8823f022013-11-26 12:53:46 -0300887}
888
Antti Palosaari92d20d92014-02-08 03:50:04 -0300889static int rtl2832_deselect(struct i2c_adapter *adap, void *mux_priv,
Antti Palosaarid1016582014-12-14 04:45:57 -0300890 u32 chan_id)
Antti Palosaari92d20d92014-02-08 03:50:04 -0300891{
Antti Palosaari038c6f22014-12-13 00:37:43 -0300892 struct rtl2832_dev *dev = mux_priv;
Antti Palosaari6e6aac62014-12-13 02:28:33 -0300893
Antti Palosaari038c6f22014-12-13 00:37:43 -0300894 schedule_delayed_work(&dev->i2c_gate_work, usecs_to_jiffies(100));
Antti Palosaari92d20d92014-02-08 03:50:04 -0300895 return 0;
896}
897
Thomas Mair82041c02012-05-18 14:47:40 -0300898static struct dvb_frontend_ops rtl2832_ops = {
899 .delsys = { SYS_DVBT },
900 .info = {
901 .name = "Realtek RTL2832 (DVB-T)",
902 .frequency_min = 174000000,
903 .frequency_max = 862000000,
904 .frequency_stepsize = 166667,
905 .caps = FE_CAN_FEC_1_2 |
906 FE_CAN_FEC_2_3 |
907 FE_CAN_FEC_3_4 |
908 FE_CAN_FEC_5_6 |
909 FE_CAN_FEC_7_8 |
910 FE_CAN_FEC_AUTO |
911 FE_CAN_QPSK |
912 FE_CAN_QAM_16 |
913 FE_CAN_QAM_64 |
914 FE_CAN_QAM_AUTO |
915 FE_CAN_TRANSMISSION_MODE_AUTO |
916 FE_CAN_GUARD_INTERVAL_AUTO |
917 FE_CAN_HIERARCHY_AUTO |
918 FE_CAN_RECOVER |
919 FE_CAN_MUTE_TS
920 },
921
Thomas Mair82041c02012-05-18 14:47:40 -0300922 .init = rtl2832_init,
923 .sleep = rtl2832_sleep,
924
925 .get_tune_settings = rtl2832_get_tune_settings,
926
927 .set_frontend = rtl2832_set_frontend,
Antti Palosaari0ce67a22012-08-21 19:56:20 -0300928 .get_frontend = rtl2832_get_frontend,
Thomas Mair82041c02012-05-18 14:47:40 -0300929
930 .read_status = rtl2832_read_status,
Antti Palosaari73983492012-08-21 19:56:21 -0300931 .read_snr = rtl2832_read_snr,
Antti Palosaaridb32d742012-08-21 19:56:22 -0300932 .read_ber = rtl2832_read_ber,
Thomas Mair82041c02012-05-18 14:47:40 -0300933};
934
Antti Palosaaridcadb822014-12-14 16:23:28 -0300935static bool rtl2832_volatile_reg(struct device *dev, unsigned int reg)
936{
937 switch (reg) {
938 case 0x305:
939 case 0x33c:
940 case 0x34e:
941 case 0x351:
942 case 0x40c ... 0x40d:
943 return true;
944 default:
945 break;
946 }
947
948 return false;
949}
950
Antti Palosaarid1016582014-12-14 04:45:57 -0300951/*
952 * We implement own I2C access routines for regmap in order to get manual access
953 * to I2C adapter lock, which is needed for I2C mux adapter.
954 */
955static int rtl2832_regmap_read(void *context, const void *reg_buf,
956 size_t reg_size, void *val_buf, size_t val_size)
957{
958 struct i2c_client *client = context;
959 int ret;
960 struct i2c_msg msg[2] = {
961 {
962 .addr = client->addr,
963 .flags = 0,
964 .len = reg_size,
965 .buf = (u8 *)reg_buf,
966 }, {
967 .addr = client->addr,
968 .flags = I2C_M_RD,
969 .len = val_size,
970 .buf = val_buf,
971 }
972 };
973
974 ret = __i2c_transfer(client->adapter, msg, 2);
975 if (ret != 2) {
976 dev_warn(&client->dev, "i2c reg read failed %d\n", ret);
977 if (ret >= 0)
978 ret = -EREMOTEIO;
979 return ret;
980 }
981 return 0;
982}
983
984static int rtl2832_regmap_write(void *context, const void *data, size_t count)
985{
986 struct i2c_client *client = context;
987 int ret;
988 struct i2c_msg msg[1] = {
989 {
990 .addr = client->addr,
991 .flags = 0,
992 .len = count,
993 .buf = (u8 *)data,
994 }
995 };
996
997 ret = __i2c_transfer(client->adapter, msg, 1);
998 if (ret != 1) {
999 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
1000 if (ret >= 0)
1001 ret = -EREMOTEIO;
1002 return ret;
1003 }
1004 return 0;
1005}
1006
1007static int rtl2832_regmap_gather_write(void *context, const void *reg,
1008 size_t reg_len, const void *val,
1009 size_t val_len)
1010{
1011 struct i2c_client *client = context;
1012 int ret;
1013 u8 buf[256];
1014 struct i2c_msg msg[1] = {
1015 {
1016 .addr = client->addr,
1017 .flags = 0,
1018 .len = 1 + val_len,
1019 .buf = buf,
1020 }
1021 };
1022
1023 buf[0] = *(u8 const *)reg;
1024 memcpy(&buf[1], val, val_len);
1025
1026 ret = __i2c_transfer(client->adapter, msg, 1);
1027 if (ret != 1) {
1028 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
1029 if (ret >= 0)
1030 ret = -EREMOTEIO;
1031 return ret;
1032 }
1033 return 0;
1034}
1035
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001036static struct dvb_frontend *rtl2832_get_dvb_frontend(struct i2c_client *client)
1037{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001038 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001039
1040 dev_dbg(&client->dev, "\n");
1041 return &dev->fe;
1042}
1043
Antti Palosaaricd559e02014-12-16 13:37:18 -03001044static struct i2c_adapter *rtl2832_get_i2c_adapter(struct i2c_client *client)
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001045{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001046 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001047
1048 dev_dbg(&client->dev, "\n");
1049 return dev->i2c_adapter_tuner;
1050}
1051
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001052static int rtl2832_enable_slave_ts(struct i2c_client *client)
1053{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001054 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001055 int ret;
1056
Antti Palosaari6e6aac62014-12-13 02:28:33 -03001057 dev_dbg(&client->dev, "\n");
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001058
Antti Palosaarieec21be2014-12-15 01:17:25 -03001059 ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001060 if (ret)
1061 goto err;
1062
1063 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
1064 if (ret)
1065 goto err;
1066
Antti Palosaarieec21be2014-12-15 01:17:25 -03001067 ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001068 if (ret)
1069 goto err;
1070
Antti Palosaarieec21be2014-12-15 01:17:25 -03001071 ret = rtl2832_bulk_write(client, 0x022, "\x01", 1);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001072 if (ret)
1073 goto err;
1074
Antti Palosaarieec21be2014-12-15 01:17:25 -03001075 ret = rtl2832_bulk_write(client, 0x026, "\x1f", 1);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001076 if (ret)
1077 goto err;
1078
Antti Palosaarieec21be2014-12-15 01:17:25 -03001079 ret = rtl2832_bulk_write(client, 0x027, "\xff", 1);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001080 if (ret)
1081 goto err;
1082
Antti Palosaarieec21be2014-12-15 01:17:25 -03001083 ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3);
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001084 if (ret)
1085 goto err;
1086
1087 /* soft reset */
1088 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
1089 if (ret)
1090 goto err;
1091
1092 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
1093 if (ret)
1094 goto err;
1095
1096 return 0;
1097err:
1098 dev_dbg(&client->dev, "failed=%d\n", ret);
1099 return ret;
1100}
1101
Antti Palosaari4b01e012014-12-14 14:07:35 -03001102static int rtl2832_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
1103{
1104 struct rtl2832_dev *dev = fe->demodulator_priv;
1105 struct i2c_client *client = dev->client;
1106 int ret;
1107 u8 u8tmp;
1108
1109 dev_dbg(&client->dev, "onoff=%d\n", onoff);
1110
1111 /* enable / disable PID filter */
1112 if (onoff)
1113 u8tmp = 0x80;
1114 else
1115 u8tmp = 0x00;
1116
1117 ret = rtl2832_update_bits(client, 0x061, 0xc0, u8tmp);
1118 if (ret)
1119 goto err;
1120
1121 return 0;
1122err:
1123 dev_dbg(&client->dev, "failed=%d\n", ret);
1124 return ret;
1125}
1126
1127static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid,
1128 int onoff)
1129{
1130 struct rtl2832_dev *dev = fe->demodulator_priv;
1131 struct i2c_client *client = dev->client;
1132 int ret;
1133 u8 buf[4];
1134
1135 dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
1136 index, pid, onoff);
1137
1138 /* skip invalid PIDs (0x2000) */
1139 if (pid > 0x1fff || index > 32)
1140 return 0;
1141
1142 if (onoff)
1143 set_bit(index, &dev->filters);
1144 else
1145 clear_bit(index, &dev->filters);
1146
1147 /* enable / disable PIDs */
1148 buf[0] = (dev->filters >> 0) & 0xff;
1149 buf[1] = (dev->filters >> 8) & 0xff;
1150 buf[2] = (dev->filters >> 16) & 0xff;
1151 buf[3] = (dev->filters >> 24) & 0xff;
1152 ret = rtl2832_bulk_write(client, 0x062, buf, 4);
1153 if (ret)
1154 goto err;
1155
1156 /* add PID */
1157 buf[0] = (pid >> 8) & 0xff;
1158 buf[1] = (pid >> 0) & 0xff;
1159 ret = rtl2832_bulk_write(client, 0x066 + 2 * index, buf, 2);
1160 if (ret)
1161 goto err;
1162
1163 return 0;
1164err:
1165 dev_dbg(&client->dev, "failed=%d\n", ret);
1166 return ret;
1167}
1168
Antti Palosaaric2c83862014-12-02 10:55:17 -03001169static int rtl2832_probe(struct i2c_client *client,
1170 const struct i2c_device_id *id)
1171{
1172 struct rtl2832_platform_data *pdata = client->dev.platform_data;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001173 struct i2c_adapter *i2c = client->adapter;
Antti Palosaari038c6f22014-12-13 00:37:43 -03001174 struct rtl2832_dev *dev;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001175 int ret;
1176 u8 tmp;
Antti Palosaarid1016582014-12-14 04:45:57 -03001177 static const struct regmap_bus regmap_bus = {
1178 .read = rtl2832_regmap_read,
1179 .write = rtl2832_regmap_write,
1180 .gather_write = rtl2832_regmap_gather_write,
1181 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
1182 };
1183 static const struct regmap_range_cfg regmap_range_cfg[] = {
1184 {
1185 .selector_reg = 0x00,
1186 .selector_mask = 0xff,
1187 .selector_shift = 0,
1188 .window_start = 0,
1189 .window_len = 0x100,
1190 .range_min = 0 * 0x100,
1191 .range_max = 5 * 0x100,
1192 },
1193 };
1194 static const struct regmap_config regmap_config = {
1195 .reg_bits = 8,
1196 .val_bits = 8,
Antti Palosaaridcadb822014-12-14 16:23:28 -03001197 .volatile_reg = rtl2832_volatile_reg,
Antti Palosaarid1016582014-12-14 04:45:57 -03001198 .max_register = 5 * 0x100,
1199 .ranges = regmap_range_cfg,
1200 .num_ranges = ARRAY_SIZE(regmap_range_cfg),
Antti Palosaaridcadb822014-12-14 16:23:28 -03001201 .cache_type = REGCACHE_RBTREE,
Antti Palosaarid1016582014-12-14 04:45:57 -03001202 };
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 Palosaari19d273d2014-12-14 06:55:43 -03001219 INIT_DELAYED_WORK(&dev->stat_work, rtl2832_stat_work);
Antti Palosaarid1016582014-12-14 04:45:57 -03001220 /* create regmap */
1221 dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
1222 &regmap_config);
1223 if (IS_ERR(dev->regmap)) {
1224 ret = PTR_ERR(dev->regmap);
1225 goto err_kfree;
1226 }
Antti Palosaaric2c83862014-12-02 10:55:17 -03001227 /* create muxed i2c adapter for demod itself */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001228 dev->i2c_adapter = i2c_add_mux_adapter(i2c, &i2c->dev, dev, 0, 0, 0,
Antti Palosaaric2c83862014-12-02 10:55:17 -03001229 rtl2832_select, NULL);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001230 if (dev->i2c_adapter == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001231 ret = -ENODEV;
Antti Palosaarid1016582014-12-14 04:45:57 -03001232 goto err_regmap_exit;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001233 }
1234
1235 /* check if the demod is there */
Antti Palosaarieec21be2014-12-15 01:17:25 -03001236 ret = rtl2832_bulk_read(client, 0x000, &tmp, 1);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001237 if (ret)
1238 goto err_i2c_del_mux_adapter;
1239
1240 /* create muxed i2c adapter for demod tuner bus */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001241 dev->i2c_adapter_tuner = i2c_add_mux_adapter(i2c, &i2c->dev, dev,
Antti Palosaaric2c83862014-12-02 10:55:17 -03001242 0, 1, 0, rtl2832_select, rtl2832_deselect);
Antti Palosaari038c6f22014-12-13 00:37:43 -03001243 if (dev->i2c_adapter_tuner == NULL) {
Antti Palosaaric2c83862014-12-02 10:55:17 -03001244 ret = -ENODEV;
1245 goto err_i2c_del_mux_adapter;
1246 }
1247
1248 /* create dvb_frontend */
Antti Palosaari038c6f22014-12-13 00:37:43 -03001249 memcpy(&dev->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
1250 dev->fe.demodulator_priv = dev;
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001251
1252 /* setup callbacks */
1253 pdata->get_dvb_frontend = rtl2832_get_dvb_frontend;
Antti Palosaaricd559e02014-12-16 13:37:18 -03001254 pdata->get_i2c_adapter = rtl2832_get_i2c_adapter;
Antti Palosaari6f5f6ee2014-12-12 23:16:19 -03001255 pdata->enable_slave_ts = rtl2832_enable_slave_ts;
Antti Palosaari4b01e012014-12-14 14:07:35 -03001256 pdata->pid_filter = rtl2832_pid_filter;
1257 pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
Antti Palosaari0aa32ef92014-12-15 13:34:13 -03001258 pdata->bulk_read = rtl2832_bulk_read;
1259 pdata->bulk_write = rtl2832_bulk_write;
1260 pdata->update_bits = rtl2832_update_bits;
Antti Palosaaric2c83862014-12-02 10:55:17 -03001261
1262 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
1263 return 0;
1264err_i2c_del_mux_adapter:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001265 i2c_del_mux_adapter(dev->i2c_adapter);
Antti Palosaarid1016582014-12-14 04:45:57 -03001266err_regmap_exit:
1267 regmap_exit(dev->regmap);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001268err_kfree:
Antti Palosaari038c6f22014-12-13 00:37:43 -03001269 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001270err:
1271 dev_dbg(&client->dev, "failed=%d\n", ret);
1272 return ret;
1273}
1274
1275static int rtl2832_remove(struct i2c_client *client)
1276{
Antti Palosaari038c6f22014-12-13 00:37:43 -03001277 struct rtl2832_dev *dev = i2c_get_clientdata(client);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001278
1279 dev_dbg(&client->dev, "\n");
1280
Antti Palosaari038c6f22014-12-13 00:37:43 -03001281 cancel_delayed_work_sync(&dev->i2c_gate_work);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001282
Antti Palosaari038c6f22014-12-13 00:37:43 -03001283 i2c_del_mux_adapter(dev->i2c_adapter_tuner);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001284
Antti Palosaari038c6f22014-12-13 00:37:43 -03001285 i2c_del_mux_adapter(dev->i2c_adapter);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001286
Antti Palosaarid1016582014-12-14 04:45:57 -03001287 regmap_exit(dev->regmap);
1288
Antti Palosaari038c6f22014-12-13 00:37:43 -03001289 kfree(dev);
Antti Palosaaric2c83862014-12-02 10:55:17 -03001290
1291 return 0;
1292}
1293
1294static const struct i2c_device_id rtl2832_id_table[] = {
1295 {"rtl2832", 0},
1296 {}
1297};
1298MODULE_DEVICE_TABLE(i2c, rtl2832_id_table);
1299
1300static struct i2c_driver rtl2832_driver = {
1301 .driver = {
1302 .owner = THIS_MODULE,
1303 .name = "rtl2832",
1304 },
1305 .probe = rtl2832_probe,
1306 .remove = rtl2832_remove,
1307 .id_table = rtl2832_id_table,
1308};
1309
1310module_i2c_driver(rtl2832_driver);
1311
Thomas Mair82041c02012-05-18 14:47:40 -03001312MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
Antti Palosaari75c24002014-12-16 13:54:23 -03001313MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
Thomas Mair82041c02012-05-18 14:47:40 -03001314MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1315MODULE_LICENSE("GPL");