1 /*
2  * Panasonic MN88472 DVB-T/T2/C demodulator driver
3  *
4  * Copyright (C) 2013 Antti Palosaari <crope@iki.fi>
5  *
6  *    This program is free software; you can redistribute it and/or modify
7  *    it under the terms of the GNU General Public License as published by
8  *    the Free Software Foundation; either version 2 of the License, or
9  *    (at your option) any later version.
10  *
11  *    This program is distributed in the hope that it will be useful,
12  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *    GNU General Public License for more details.
15  */
16 
17 #include "mn88472_priv.h"
18 
19 static int mn88472_get_tune_settings(struct dvb_frontend *fe,
20 	struct dvb_frontend_tune_settings *s)
21 {
22 	s->min_delay_ms = 400;
23 	return 0;
24 }
25 
26 static int mn88472_set_frontend(struct dvb_frontend *fe)
27 {
28 	struct i2c_client *client = fe->demodulator_priv;
29 	struct mn88472_dev *dev = i2c_get_clientdata(client);
30 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
31 	int ret;
32 	u32 if_frequency = 0;
33 
34 	dev_dbg(&client->dev,
35 			"delivery_system=%d modulation=%d frequency=%d symbol_rate=%d inversion=%d\n",
36 			c->delivery_system, c->modulation,
37 			c->frequency, c->symbol_rate, c->inversion);
38 
39 	if (!dev->warm) {
40 		ret = -EAGAIN;
41 		goto err;
42 	}
43 
44 	/* program tuner */
45 	if (fe->ops.tuner_ops.set_params) {
46 		ret = fe->ops.tuner_ops.set_params(fe);
47 		if (ret)
48 			goto err;
49 	}
50 
51 	if (fe->ops.tuner_ops.get_if_frequency) {
52 		ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
53 		if (ret)
54 			goto err;
55 
56 		dev_dbg(&client->dev, "get_if_frequency=%d\n", if_frequency);
57 	}
58 
59 	if (if_frequency != 5070000) {
60 		dev_err(&client->dev, "IF frequency %d not supported\n",
61 				if_frequency);
62 		ret = -EINVAL;
63 		goto err;
64 	}
65 
66 	ret = regmap_write(dev->regmap[2], 0x08, 0x1d);
67 	if (ret)
68 		goto err;
69 
70 	ret = regmap_write(dev->regmap[0], 0xd9, 0xe3);
71 	if (ret)
72 		goto err;
73 
74 	ret = regmap_write(dev->regmap[2], 0x83, 0x01);
75 	if (ret)
76 		goto err;
77 
78 	ret = regmap_bulk_write(dev->regmap[2], 0x00,
79 			"\x66\x00\x01\x04\x00", 5);
80 	if (ret)
81 		goto err;
82 
83 	ret = regmap_bulk_write(dev->regmap[2], 0x10,
84 			"\x3f\x50\x2c\x8f\x80\x00\x08\xee\x08\xee", 10);
85 	if (ret)
86 		goto err;
87 
88 	ret = regmap_write(dev->regmap[0], 0x46, 0x00);
89 	if (ret)
90 		goto err;
91 
92 	ret = regmap_write(dev->regmap[0], 0xae, 0x00);
93 	if (ret)
94 		goto err;
95 
96 	ret = regmap_write(dev->regmap[0], 0xb0, 0x0b);
97 	if (ret)
98 		goto err;
99 
100 	ret = regmap_write(dev->regmap[0], 0xb4, 0x00);
101 	if (ret)
102 		goto err;
103 
104 	ret = regmap_write(dev->regmap[0], 0xcd, 0x17);
105 	if (ret)
106 		goto err;
107 
108 	ret = regmap_write(dev->regmap[0], 0xd4, 0x09);
109 	if (ret)
110 		goto err;
111 
112 	ret = regmap_write(dev->regmap[0], 0xd6, 0x48);
113 	if (ret)
114 		goto err;
115 
116 	ret = regmap_write(dev->regmap[1], 0x00, 0xb0);
117 	if (ret)
118 		goto err;
119 
120 	ret = regmap_write(dev->regmap[2], 0xf8, 0x9f);
121 	if (ret)
122 		goto err;
123 
124 	dev->delivery_system = c->delivery_system;
125 
126 	return 0;
127 err:
128 	dev_dbg(&client->dev, "failed=%d\n", ret);
129 	return ret;
130 }
131 
132 static int mn88472_read_status(struct dvb_frontend *fe, fe_status_t *status)
133 {
134 	struct i2c_client *client = fe->demodulator_priv;
135 	struct mn88472_dev *dev = i2c_get_clientdata(client);
136 	int ret;
137 	unsigned int utmp;
138 
139 	*status = 0;
140 
141 	if (!dev->warm) {
142 		ret = -EAGAIN;
143 		goto err;
144 	}
145 
146 	ret = regmap_read(dev->regmap[1], 0x84, &utmp);
147 	if (ret)
148 		goto err;
149 
150 	if (utmp == 0x08)
151 		*status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
152 				FE_HAS_SYNC | FE_HAS_LOCK;
153 
154 	return 0;
155 err:
156 	dev_dbg(&client->dev, "failed=%d\n", ret);
157 	return ret;
158 }
159 
160 static int mn88472_init(struct dvb_frontend *fe)
161 {
162 	struct i2c_client *client = fe->demodulator_priv;
163 	struct mn88472_dev *dev = i2c_get_clientdata(client);
164 	int ret, len, remaining;
165 	const struct firmware *fw = NULL;
166 	u8 *fw_file = MN88472_FIRMWARE;
167 
168 	dev_dbg(&client->dev, "\n");
169 
170 	/* set cold state by default */
171 	dev->warm = false;
172 
173 	/* power on */
174 	ret = regmap_write(dev->regmap[2], 0x05, 0x00);
175 	if (ret)
176 		goto err;
177 
178 	ret = regmap_bulk_write(dev->regmap[2], 0x0b, "\x00\x00", 2);
179 	if (ret)
180 		goto err;
181 
182 	/* request the firmware, this will block and timeout */
183 	ret = request_firmware(&fw, fw_file, &client->dev);
184 	if (ret) {
185 		dev_err(&client->dev, "firmare file '%s' not found\n",
186 				fw_file);
187 		goto err;
188 	}
189 
190 	dev_info(&client->dev, "downloading firmware from file '%s'\n",
191 			fw_file);
192 
193 	ret = regmap_write(dev->regmap[0], 0xf5, 0x03);
194 	if (ret)
195 		goto err;
196 
197 	for (remaining = fw->size; remaining > 0;
198 			remaining -= (dev->i2c_wr_max - 1)) {
199 		len = remaining;
200 		if (len > (dev->i2c_wr_max - 1))
201 			len = (dev->i2c_wr_max - 1);
202 
203 		ret = regmap_bulk_write(dev->regmap[0], 0xf6,
204 				&fw->data[fw->size - remaining], len);
205 		if (ret) {
206 			dev_err(&client->dev,
207 					"firmware download failed=%d\n", ret);
208 			goto err;
209 		}
210 	}
211 
212 	ret = regmap_write(dev->regmap[0], 0xf5, 0x00);
213 	if (ret)
214 		goto err;
215 
216 	release_firmware(fw);
217 	fw = NULL;
218 
219 	/* warm state */
220 	dev->warm = true;
221 
222 	return 0;
223 err:
224 	if (fw)
225 		release_firmware(fw);
226 
227 	dev_dbg(&client->dev, "failed=%d\n", ret);
228 	return ret;
229 }
230 
231 static int mn88472_sleep(struct dvb_frontend *fe)
232 {
233 	struct i2c_client *client = fe->demodulator_priv;
234 	struct mn88472_dev *dev = i2c_get_clientdata(client);
235 	int ret;
236 
237 	dev_dbg(&client->dev, "\n");
238 
239 	/* power off */
240 	ret = regmap_write(dev->regmap[2], 0x0b, 0x30);
241 
242 	if (ret)
243 		goto err;
244 
245 	ret = regmap_write(dev->regmap[2], 0x05, 0x3e);
246 	if (ret)
247 		goto err;
248 
249 	dev->delivery_system = SYS_UNDEFINED;
250 
251 	return 0;
252 err:
253 	dev_dbg(&client->dev, "failed=%d\n", ret);
254 	return ret;
255 }
256 
257 static struct dvb_frontend_ops mn88472_ops = {
258 	.delsys = {SYS_DVBC_ANNEX_A},
259 	.info = {
260 		.name = "Panasonic MN88472",
261 		.caps =	FE_CAN_FEC_1_2                 |
262 			FE_CAN_FEC_2_3                 |
263 			FE_CAN_FEC_3_4                 |
264 			FE_CAN_FEC_5_6                 |
265 			FE_CAN_FEC_7_8                 |
266 			FE_CAN_FEC_AUTO                |
267 			FE_CAN_QPSK                    |
268 			FE_CAN_QAM_16                  |
269 			FE_CAN_QAM_32                  |
270 			FE_CAN_QAM_64                  |
271 			FE_CAN_QAM_128                 |
272 			FE_CAN_QAM_256                 |
273 			FE_CAN_QAM_AUTO                |
274 			FE_CAN_TRANSMISSION_MODE_AUTO  |
275 			FE_CAN_GUARD_INTERVAL_AUTO     |
276 			FE_CAN_HIERARCHY_AUTO          |
277 			FE_CAN_MUTE_TS                 |
278 			FE_CAN_2G_MODULATION           |
279 			FE_CAN_MULTISTREAM
280 	},
281 
282 	.get_tune_settings = mn88472_get_tune_settings,
283 
284 	.init = mn88472_init,
285 	.sleep = mn88472_sleep,
286 
287 	.set_frontend = mn88472_set_frontend,
288 
289 	.read_status = mn88472_read_status,
290 };
291 
292 static int mn88472_probe(struct i2c_client *client,
293 		const struct i2c_device_id *id)
294 {
295 	struct mn88472_config *config = client->dev.platform_data;
296 	struct mn88472_dev *dev;
297 	int ret;
298 	unsigned int utmp;
299 	static const struct regmap_config regmap_config = {
300 		.reg_bits = 8,
301 		.val_bits = 8,
302 	};
303 
304 	dev_dbg(&client->dev, "\n");
305 
306 	/* Caller really need to provide pointer for frontend we create. */
307 	if (config->fe == NULL) {
308 		dev_err(&client->dev, "frontend pointer not defined\n");
309 		ret = -EINVAL;
310 		goto err;
311 	}
312 
313 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
314 	if (dev == NULL) {
315 		ret = -ENOMEM;
316 		goto err;
317 	}
318 
319 	dev->i2c_wr_max = config->i2c_wr_max;
320 	dev->client[0] = client;
321 	dev->regmap[0] = regmap_init_i2c(dev->client[0], &regmap_config);
322 	if (IS_ERR(dev->regmap[0])) {
323 		ret = PTR_ERR(dev->regmap[0]);
324 		goto err_kfree;
325 	}
326 
327 	/* check demod answers to I2C */
328 	ret = regmap_read(dev->regmap[0], 0x00, &utmp);
329 	if (ret)
330 		goto err_regmap_0_regmap_exit;
331 
332 	/*
333 	 * Chip has three I2C addresses for different register pages. Used
334 	 * addresses are 0x18, 0x1a and 0x1c. We register two dummy clients,
335 	 * 0x1a and 0x1c, in order to get own I2C client for each register page.
336 	 */
337 	dev->client[1] = i2c_new_dummy(client->adapter, 0x1a);
338 	if (dev->client[1] == NULL) {
339 		ret = -ENODEV;
340 		dev_err(&client->dev, "I2C registration failed\n");
341 		if (ret)
342 			goto err_regmap_0_regmap_exit;
343 	}
344 	dev->regmap[1] = regmap_init_i2c(dev->client[1], &regmap_config);
345 	if (IS_ERR(dev->regmap[1])) {
346 		ret = PTR_ERR(dev->regmap[1]);
347 		goto err_client_1_i2c_unregister_device;
348 	}
349 	i2c_set_clientdata(dev->client[1], dev);
350 
351 	dev->client[2] = i2c_new_dummy(client->adapter, 0x1c);
352 	if (dev->client[2] == NULL) {
353 		ret = -ENODEV;
354 		dev_err(&client->dev, "2nd I2C registration failed\n");
355 		if (ret)
356 			goto err_regmap_1_regmap_exit;
357 	}
358 	dev->regmap[2] = regmap_init_i2c(dev->client[2], &regmap_config);
359 	if (IS_ERR(dev->regmap[2])) {
360 		ret = PTR_ERR(dev->regmap[2]);
361 		goto err_client_2_i2c_unregister_device;
362 	}
363 	i2c_set_clientdata(dev->client[2], dev);
364 
365 	/* create dvb_frontend */
366 	memcpy(&dev->fe.ops, &mn88472_ops, sizeof(struct dvb_frontend_ops));
367 	dev->fe.demodulator_priv = client;
368 	*config->fe = &dev->fe;
369 	i2c_set_clientdata(client, dev);
370 
371 	dev_info(&client->dev, "Panasonic MN88472 successfully attached\n");
372 	return 0;
373 
374 err_client_2_i2c_unregister_device:
375 	i2c_unregister_device(dev->client[2]);
376 err_regmap_1_regmap_exit:
377 	regmap_exit(dev->regmap[1]);
378 err_client_1_i2c_unregister_device:
379 	i2c_unregister_device(dev->client[1]);
380 err_regmap_0_regmap_exit:
381 	regmap_exit(dev->regmap[0]);
382 err_kfree:
383 	kfree(dev);
384 err:
385 	dev_dbg(&client->dev, "failed=%d\n", ret);
386 	return ret;
387 }
388 
389 static int mn88472_remove(struct i2c_client *client)
390 {
391 	struct mn88472_dev *dev = i2c_get_clientdata(client);
392 
393 	dev_dbg(&client->dev, "\n");
394 
395 	regmap_exit(dev->regmap[2]);
396 	i2c_unregister_device(dev->client[2]);
397 
398 	regmap_exit(dev->regmap[1]);
399 	i2c_unregister_device(dev->client[1]);
400 
401 	regmap_exit(dev->regmap[0]);
402 
403 	kfree(dev);
404 
405 	return 0;
406 }
407 
408 static const struct i2c_device_id mn88472_id_table[] = {
409 	{"mn88472", 0},
410 	{}
411 };
412 MODULE_DEVICE_TABLE(i2c, mn88472_id_table);
413 
414 static struct i2c_driver mn88472_driver = {
415 	.driver = {
416 		.owner	= THIS_MODULE,
417 		.name	= "mn88472",
418 	},
419 	.probe		= mn88472_probe,
420 	.remove		= mn88472_remove,
421 	.id_table	= mn88472_id_table,
422 };
423 
424 module_i2c_driver(mn88472_driver);
425 
426 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
427 MODULE_DESCRIPTION("Panasonic MN88472 DVB-T/T2/C demodulator driver");
428 MODULE_LICENSE("GPL");
429 MODULE_FIRMWARE(MN88472_FIRMWARE);
430