1 /*
2  * Sony CXD2820R demodulator driver
3  *
4  * Copyright (C) 2010 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  *    You should have received a copy of the GNU General Public License along
17  *    with this program; if not, write to the Free Software Foundation, Inc.,
18  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 
22 #include "cxd2820r_priv.h"
23 
24 /* Max transfer size done by I2C transfer functions */
25 #define MAX_XFER_SIZE  64
26 
27 /* write multiple registers */
28 static int cxd2820r_wr_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg,
29 	u8 *val, int len)
30 {
31 	int ret;
32 	u8 buf[MAX_XFER_SIZE];
33 	struct i2c_msg msg[1] = {
34 		{
35 			.addr = i2c,
36 			.flags = 0,
37 			.len = len + 1,
38 			.buf = buf,
39 		}
40 	};
41 
42 	if (1 + len > sizeof(buf)) {
43 		dev_warn(&priv->i2c->dev,
44 			 "%s: i2c wr reg=%04x: len=%d is too big!\n",
45 			 KBUILD_MODNAME, reg, len);
46 		return -EINVAL;
47 	}
48 
49 	buf[0] = reg;
50 	memcpy(&buf[1], val, len);
51 
52 	ret = i2c_transfer(priv->i2c, msg, 1);
53 	if (ret == 1) {
54 		ret = 0;
55 	} else {
56 		dev_warn(&priv->i2c->dev, "%s: i2c wr failed=%d reg=%02x " \
57 				"len=%d\n", KBUILD_MODNAME, ret, reg, len);
58 		ret = -EREMOTEIO;
59 	}
60 	return ret;
61 }
62 
63 /* read multiple registers */
64 static int cxd2820r_rd_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg,
65 	u8 *val, int len)
66 {
67 	int ret;
68 	u8 buf[MAX_XFER_SIZE];
69 	struct i2c_msg msg[2] = {
70 		{
71 			.addr = i2c,
72 			.flags = 0,
73 			.len = 1,
74 			.buf = &reg,
75 		}, {
76 			.addr = i2c,
77 			.flags = I2C_M_RD,
78 			.len = len,
79 			.buf = buf,
80 		}
81 	};
82 
83 	if (len > sizeof(buf)) {
84 		dev_warn(&priv->i2c->dev,
85 			 "%s: i2c wr reg=%04x: len=%d is too big!\n",
86 			 KBUILD_MODNAME, reg, len);
87 		return -EINVAL;
88 	}
89 
90 	ret = i2c_transfer(priv->i2c, msg, 2);
91 	if (ret == 2) {
92 		memcpy(val, buf, len);
93 		ret = 0;
94 	} else {
95 		dev_warn(&priv->i2c->dev, "%s: i2c rd failed=%d reg=%02x " \
96 				"len=%d\n", KBUILD_MODNAME, ret, reg, len);
97 		ret = -EREMOTEIO;
98 	}
99 
100 	return ret;
101 }
102 
103 /* write multiple registers */
104 int cxd2820r_wr_regs(struct cxd2820r_priv *priv, u32 reginfo, u8 *val,
105 	int len)
106 {
107 	int ret;
108 	u8 i2c_addr;
109 	u8 reg = (reginfo >> 0) & 0xff;
110 	u8 bank = (reginfo >> 8) & 0xff;
111 	u8 i2c = (reginfo >> 16) & 0x01;
112 
113 	/* select I2C */
114 	if (i2c)
115 		i2c_addr = priv->cfg.i2c_address | (1 << 1); /* DVB-C */
116 	else
117 		i2c_addr = priv->cfg.i2c_address; /* DVB-T/T2 */
118 
119 	/* switch bank if needed */
120 	if (bank != priv->bank[i2c]) {
121 		ret = cxd2820r_wr_regs_i2c(priv, i2c_addr, 0x00, &bank, 1);
122 		if (ret)
123 			return ret;
124 		priv->bank[i2c] = bank;
125 	}
126 	return cxd2820r_wr_regs_i2c(priv, i2c_addr, reg, val, len);
127 }
128 
129 /* read multiple registers */
130 int cxd2820r_rd_regs(struct cxd2820r_priv *priv, u32 reginfo, u8 *val,
131 	int len)
132 {
133 	int ret;
134 	u8 i2c_addr;
135 	u8 reg = (reginfo >> 0) & 0xff;
136 	u8 bank = (reginfo >> 8) & 0xff;
137 	u8 i2c = (reginfo >> 16) & 0x01;
138 
139 	/* select I2C */
140 	if (i2c)
141 		i2c_addr = priv->cfg.i2c_address | (1 << 1); /* DVB-C */
142 	else
143 		i2c_addr = priv->cfg.i2c_address; /* DVB-T/T2 */
144 
145 	/* switch bank if needed */
146 	if (bank != priv->bank[i2c]) {
147 		ret = cxd2820r_wr_regs_i2c(priv, i2c_addr, 0x00, &bank, 1);
148 		if (ret)
149 			return ret;
150 		priv->bank[i2c] = bank;
151 	}
152 	return cxd2820r_rd_regs_i2c(priv, i2c_addr, reg, val, len);
153 }
154 
155 /* write single register */
156 int cxd2820r_wr_reg(struct cxd2820r_priv *priv, u32 reg, u8 val)
157 {
158 	return cxd2820r_wr_regs(priv, reg, &val, 1);
159 }
160 
161 /* read single register */
162 int cxd2820r_rd_reg(struct cxd2820r_priv *priv, u32 reg, u8 *val)
163 {
164 	return cxd2820r_rd_regs(priv, reg, val, 1);
165 }
166 
167 /* write single register with mask */
168 int cxd2820r_wr_reg_mask(struct cxd2820r_priv *priv, u32 reg, u8 val,
169 	u8 mask)
170 {
171 	int ret;
172 	u8 tmp;
173 
174 	/* no need for read if whole reg is written */
175 	if (mask != 0xff) {
176 		ret = cxd2820r_rd_reg(priv, reg, &tmp);
177 		if (ret)
178 			return ret;
179 
180 		val &= mask;
181 		tmp &= ~mask;
182 		val |= tmp;
183 	}
184 
185 	return cxd2820r_wr_reg(priv, reg, val);
186 }
187 
188 int cxd2820r_gpio(struct dvb_frontend *fe, u8 *gpio)
189 {
190 	struct cxd2820r_priv *priv = fe->demodulator_priv;
191 	int ret, i;
192 	u8 tmp0, tmp1;
193 
194 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
195 			fe->dtv_property_cache.delivery_system);
196 
197 	/* update GPIOs only when needed */
198 	if (!memcmp(gpio, priv->gpio, sizeof(priv->gpio)))
199 		return 0;
200 
201 	tmp0 = 0x00;
202 	tmp1 = 0x00;
203 	for (i = 0; i < sizeof(priv->gpio); i++) {
204 		/* enable / disable */
205 		if (gpio[i] & CXD2820R_GPIO_E)
206 			tmp0 |= (2 << 6) >> (2 * i);
207 		else
208 			tmp0 |= (1 << 6) >> (2 * i);
209 
210 		/* input / output */
211 		if (gpio[i] & CXD2820R_GPIO_I)
212 			tmp1 |= (1 << (3 + i));
213 		else
214 			tmp1 |= (0 << (3 + i));
215 
216 		/* high / low */
217 		if (gpio[i] & CXD2820R_GPIO_H)
218 			tmp1 |= (1 << (0 + i));
219 		else
220 			tmp1 |= (0 << (0 + i));
221 
222 		dev_dbg(&priv->i2c->dev, "%s: gpio i=%d %02x %02x\n", __func__,
223 				i, tmp0, tmp1);
224 	}
225 
226 	dev_dbg(&priv->i2c->dev, "%s: wr gpio=%02x %02x\n", __func__, tmp0,
227 			tmp1);
228 
229 	/* write bits [7:2] */
230 	ret = cxd2820r_wr_reg_mask(priv, 0x00089, tmp0, 0xfc);
231 	if (ret)
232 		goto error;
233 
234 	/* write bits [5:0] */
235 	ret = cxd2820r_wr_reg_mask(priv, 0x0008e, tmp1, 0x3f);
236 	if (ret)
237 		goto error;
238 
239 	memcpy(priv->gpio, gpio, sizeof(priv->gpio));
240 
241 	return ret;
242 error:
243 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
244 	return ret;
245 }
246 
247 /* 64 bit div with round closest, like DIV_ROUND_CLOSEST but 64 bit */
248 u32 cxd2820r_div_u64_round_closest(u64 dividend, u32 divisor)
249 {
250 	return div_u64(dividend + (divisor / 2), divisor);
251 }
252 
253 static int cxd2820r_set_frontend(struct dvb_frontend *fe)
254 {
255 	struct cxd2820r_priv *priv = fe->demodulator_priv;
256 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
257 	int ret;
258 
259 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
260 			fe->dtv_property_cache.delivery_system);
261 
262 	switch (c->delivery_system) {
263 	case SYS_DVBT:
264 		ret = cxd2820r_init_t(fe);
265 		if (ret < 0)
266 			goto err;
267 		ret = cxd2820r_set_frontend_t(fe);
268 		if (ret < 0)
269 			goto err;
270 		break;
271 	case SYS_DVBT2:
272 		ret = cxd2820r_init_t(fe);
273 		if (ret < 0)
274 			goto err;
275 		ret = cxd2820r_set_frontend_t2(fe);
276 		if (ret < 0)
277 			goto err;
278 		break;
279 	case SYS_DVBC_ANNEX_A:
280 		ret = cxd2820r_init_c(fe);
281 		if (ret < 0)
282 			goto err;
283 		ret = cxd2820r_set_frontend_c(fe);
284 		if (ret < 0)
285 			goto err;
286 		break;
287 	default:
288 		dev_dbg(&priv->i2c->dev, "%s: error state=%d\n", __func__,
289 				fe->dtv_property_cache.delivery_system);
290 		ret = -EINVAL;
291 		break;
292 	}
293 err:
294 	return ret;
295 }
296 static int cxd2820r_read_status(struct dvb_frontend *fe, fe_status_t *status)
297 {
298 	struct cxd2820r_priv *priv = fe->demodulator_priv;
299 	int ret;
300 
301 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
302 			fe->dtv_property_cache.delivery_system);
303 
304 	switch (fe->dtv_property_cache.delivery_system) {
305 	case SYS_DVBT:
306 		ret = cxd2820r_read_status_t(fe, status);
307 		break;
308 	case SYS_DVBT2:
309 		ret = cxd2820r_read_status_t2(fe, status);
310 		break;
311 	case SYS_DVBC_ANNEX_A:
312 		ret = cxd2820r_read_status_c(fe, status);
313 		break;
314 	default:
315 		ret = -EINVAL;
316 		break;
317 	}
318 	return ret;
319 }
320 
321 static int cxd2820r_get_frontend(struct dvb_frontend *fe)
322 {
323 	struct cxd2820r_priv *priv = fe->demodulator_priv;
324 	int ret;
325 
326 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
327 			fe->dtv_property_cache.delivery_system);
328 
329 	if (priv->delivery_system == SYS_UNDEFINED)
330 		return 0;
331 
332 	switch (fe->dtv_property_cache.delivery_system) {
333 	case SYS_DVBT:
334 		ret = cxd2820r_get_frontend_t(fe);
335 		break;
336 	case SYS_DVBT2:
337 		ret = cxd2820r_get_frontend_t2(fe);
338 		break;
339 	case SYS_DVBC_ANNEX_A:
340 		ret = cxd2820r_get_frontend_c(fe);
341 		break;
342 	default:
343 		ret = -EINVAL;
344 		break;
345 	}
346 	return ret;
347 }
348 
349 static int cxd2820r_read_ber(struct dvb_frontend *fe, u32 *ber)
350 {
351 	struct cxd2820r_priv *priv = fe->demodulator_priv;
352 	int ret;
353 
354 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
355 			fe->dtv_property_cache.delivery_system);
356 
357 	switch (fe->dtv_property_cache.delivery_system) {
358 	case SYS_DVBT:
359 		ret = cxd2820r_read_ber_t(fe, ber);
360 		break;
361 	case SYS_DVBT2:
362 		ret = cxd2820r_read_ber_t2(fe, ber);
363 		break;
364 	case SYS_DVBC_ANNEX_A:
365 		ret = cxd2820r_read_ber_c(fe, ber);
366 		break;
367 	default:
368 		ret = -EINVAL;
369 		break;
370 	}
371 	return ret;
372 }
373 
374 static int cxd2820r_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
375 {
376 	struct cxd2820r_priv *priv = fe->demodulator_priv;
377 	int ret;
378 
379 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
380 			fe->dtv_property_cache.delivery_system);
381 
382 	switch (fe->dtv_property_cache.delivery_system) {
383 	case SYS_DVBT:
384 		ret = cxd2820r_read_signal_strength_t(fe, strength);
385 		break;
386 	case SYS_DVBT2:
387 		ret = cxd2820r_read_signal_strength_t2(fe, strength);
388 		break;
389 	case SYS_DVBC_ANNEX_A:
390 		ret = cxd2820r_read_signal_strength_c(fe, strength);
391 		break;
392 	default:
393 		ret = -EINVAL;
394 		break;
395 	}
396 	return ret;
397 }
398 
399 static int cxd2820r_read_snr(struct dvb_frontend *fe, u16 *snr)
400 {
401 	struct cxd2820r_priv *priv = fe->demodulator_priv;
402 	int ret;
403 
404 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
405 			fe->dtv_property_cache.delivery_system);
406 
407 	switch (fe->dtv_property_cache.delivery_system) {
408 	case SYS_DVBT:
409 		ret = cxd2820r_read_snr_t(fe, snr);
410 		break;
411 	case SYS_DVBT2:
412 		ret = cxd2820r_read_snr_t2(fe, snr);
413 		break;
414 	case SYS_DVBC_ANNEX_A:
415 		ret = cxd2820r_read_snr_c(fe, snr);
416 		break;
417 	default:
418 		ret = -EINVAL;
419 		break;
420 	}
421 	return ret;
422 }
423 
424 static int cxd2820r_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
425 {
426 	struct cxd2820r_priv *priv = fe->demodulator_priv;
427 	int ret;
428 
429 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
430 			fe->dtv_property_cache.delivery_system);
431 
432 	switch (fe->dtv_property_cache.delivery_system) {
433 	case SYS_DVBT:
434 		ret = cxd2820r_read_ucblocks_t(fe, ucblocks);
435 		break;
436 	case SYS_DVBT2:
437 		ret = cxd2820r_read_ucblocks_t2(fe, ucblocks);
438 		break;
439 	case SYS_DVBC_ANNEX_A:
440 		ret = cxd2820r_read_ucblocks_c(fe, ucblocks);
441 		break;
442 	default:
443 		ret = -EINVAL;
444 		break;
445 	}
446 	return ret;
447 }
448 
449 static int cxd2820r_init(struct dvb_frontend *fe)
450 {
451 	return 0;
452 }
453 
454 static int cxd2820r_sleep(struct dvb_frontend *fe)
455 {
456 	struct cxd2820r_priv *priv = fe->demodulator_priv;
457 	int ret;
458 
459 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
460 			fe->dtv_property_cache.delivery_system);
461 
462 	switch (fe->dtv_property_cache.delivery_system) {
463 	case SYS_DVBT:
464 		ret = cxd2820r_sleep_t(fe);
465 		break;
466 	case SYS_DVBT2:
467 		ret = cxd2820r_sleep_t2(fe);
468 		break;
469 	case SYS_DVBC_ANNEX_A:
470 		ret = cxd2820r_sleep_c(fe);
471 		break;
472 	default:
473 		ret = -EINVAL;
474 		break;
475 	}
476 	return ret;
477 }
478 
479 static int cxd2820r_get_tune_settings(struct dvb_frontend *fe,
480 				      struct dvb_frontend_tune_settings *s)
481 {
482 	struct cxd2820r_priv *priv = fe->demodulator_priv;
483 	int ret;
484 
485 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
486 			fe->dtv_property_cache.delivery_system);
487 
488 	switch (fe->dtv_property_cache.delivery_system) {
489 	case SYS_DVBT:
490 		ret = cxd2820r_get_tune_settings_t(fe, s);
491 		break;
492 	case SYS_DVBT2:
493 		ret = cxd2820r_get_tune_settings_t2(fe, s);
494 		break;
495 	case SYS_DVBC_ANNEX_A:
496 		ret = cxd2820r_get_tune_settings_c(fe, s);
497 		break;
498 	default:
499 		ret = -EINVAL;
500 		break;
501 	}
502 	return ret;
503 }
504 
505 static enum dvbfe_search cxd2820r_search(struct dvb_frontend *fe)
506 {
507 	struct cxd2820r_priv *priv = fe->demodulator_priv;
508 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
509 	int ret, i;
510 	fe_status_t status = 0;
511 
512 	dev_dbg(&priv->i2c->dev, "%s: delsys=%d\n", __func__,
513 			fe->dtv_property_cache.delivery_system);
514 
515 	/* switch between DVB-T and DVB-T2 when tune fails */
516 	if (priv->last_tune_failed) {
517 		if (priv->delivery_system == SYS_DVBT) {
518 			ret = cxd2820r_sleep_t(fe);
519 			if (ret)
520 				goto error;
521 
522 			c->delivery_system = SYS_DVBT2;
523 		} else if (priv->delivery_system == SYS_DVBT2) {
524 			ret = cxd2820r_sleep_t2(fe);
525 			if (ret)
526 				goto error;
527 
528 			c->delivery_system = SYS_DVBT;
529 		}
530 	}
531 
532 	/* set frontend */
533 	ret = cxd2820r_set_frontend(fe);
534 	if (ret)
535 		goto error;
536 
537 
538 	/* frontend lock wait loop count */
539 	switch (priv->delivery_system) {
540 	case SYS_DVBT:
541 	case SYS_DVBC_ANNEX_A:
542 		i = 20;
543 		break;
544 	case SYS_DVBT2:
545 		i = 40;
546 		break;
547 	case SYS_UNDEFINED:
548 	default:
549 		i = 0;
550 		break;
551 	}
552 
553 	/* wait frontend lock */
554 	for (; i > 0; i--) {
555 		dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
556 		msleep(50);
557 		ret = cxd2820r_read_status(fe, &status);
558 		if (ret)
559 			goto error;
560 
561 		if (status & FE_HAS_LOCK)
562 			break;
563 	}
564 
565 	/* check if we have a valid signal */
566 	if (status & FE_HAS_LOCK) {
567 		priv->last_tune_failed = false;
568 		return DVBFE_ALGO_SEARCH_SUCCESS;
569 	} else {
570 		priv->last_tune_failed = true;
571 		return DVBFE_ALGO_SEARCH_AGAIN;
572 	}
573 
574 error:
575 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
576 	return DVBFE_ALGO_SEARCH_ERROR;
577 }
578 
579 static int cxd2820r_get_frontend_algo(struct dvb_frontend *fe)
580 {
581 	return DVBFE_ALGO_CUSTOM;
582 }
583 
584 static void cxd2820r_release(struct dvb_frontend *fe)
585 {
586 	struct cxd2820r_priv *priv = fe->demodulator_priv;
587 
588 	dev_dbg(&priv->i2c->dev, "%s\n", __func__);
589 
590 #ifdef CONFIG_GPIOLIB
591 	/* remove GPIOs */
592 	if (priv->gpio_chip.label)
593 		gpiochip_remove(&priv->gpio_chip);
594 
595 #endif
596 	kfree(priv);
597 	return;
598 }
599 
600 static int cxd2820r_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
601 {
602 	struct cxd2820r_priv *priv = fe->demodulator_priv;
603 
604 	dev_dbg(&priv->i2c->dev, "%s: %d\n", __func__, enable);
605 
606 	/* Bit 0 of reg 0xdb in bank 0x00 controls I2C repeater */
607 	return cxd2820r_wr_reg_mask(priv, 0xdb, enable ? 1 : 0, 0x1);
608 }
609 
610 #ifdef CONFIG_GPIOLIB
611 static int cxd2820r_gpio_direction_output(struct gpio_chip *chip, unsigned nr,
612 		int val)
613 {
614 	struct cxd2820r_priv *priv =
615 			container_of(chip, struct cxd2820r_priv, gpio_chip);
616 	u8 gpio[GPIO_COUNT];
617 
618 	dev_dbg(&priv->i2c->dev, "%s: nr=%d val=%d\n", __func__, nr, val);
619 
620 	memcpy(gpio, priv->gpio, sizeof(gpio));
621 	gpio[nr] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | (val << 2);
622 
623 	return cxd2820r_gpio(&priv->fe, gpio);
624 }
625 
626 static void cxd2820r_gpio_set(struct gpio_chip *chip, unsigned nr, int val)
627 {
628 	struct cxd2820r_priv *priv =
629 			container_of(chip, struct cxd2820r_priv, gpio_chip);
630 	u8 gpio[GPIO_COUNT];
631 
632 	dev_dbg(&priv->i2c->dev, "%s: nr=%d val=%d\n", __func__, nr, val);
633 
634 	memcpy(gpio, priv->gpio, sizeof(gpio));
635 	gpio[nr] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | (val << 2);
636 
637 	(void) cxd2820r_gpio(&priv->fe, gpio);
638 
639 	return;
640 }
641 
642 static int cxd2820r_gpio_get(struct gpio_chip *chip, unsigned nr)
643 {
644 	struct cxd2820r_priv *priv =
645 			container_of(chip, struct cxd2820r_priv, gpio_chip);
646 
647 	dev_dbg(&priv->i2c->dev, "%s: nr=%d\n", __func__, nr);
648 
649 	return (priv->gpio[nr] >> 2) & 0x01;
650 }
651 #endif
652 
653 static const struct dvb_frontend_ops cxd2820r_ops = {
654 	.delsys = { SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A },
655 	/* default: DVB-T/T2 */
656 	.info = {
657 		.name = "Sony CXD2820R",
658 
659 		.caps =	FE_CAN_FEC_1_2			|
660 			FE_CAN_FEC_2_3			|
661 			FE_CAN_FEC_3_4			|
662 			FE_CAN_FEC_5_6			|
663 			FE_CAN_FEC_7_8			|
664 			FE_CAN_FEC_AUTO			|
665 			FE_CAN_QPSK			|
666 			FE_CAN_QAM_16			|
667 			FE_CAN_QAM_32			|
668 			FE_CAN_QAM_64			|
669 			FE_CAN_QAM_128			|
670 			FE_CAN_QAM_256			|
671 			FE_CAN_QAM_AUTO			|
672 			FE_CAN_TRANSMISSION_MODE_AUTO	|
673 			FE_CAN_GUARD_INTERVAL_AUTO	|
674 			FE_CAN_HIERARCHY_AUTO		|
675 			FE_CAN_MUTE_TS			|
676 			FE_CAN_2G_MODULATION		|
677 			FE_CAN_MULTISTREAM
678 		},
679 
680 	.release		= cxd2820r_release,
681 	.init			= cxd2820r_init,
682 	.sleep			= cxd2820r_sleep,
683 
684 	.get_tune_settings	= cxd2820r_get_tune_settings,
685 	.i2c_gate_ctrl		= cxd2820r_i2c_gate_ctrl,
686 
687 	.get_frontend		= cxd2820r_get_frontend,
688 
689 	.get_frontend_algo	= cxd2820r_get_frontend_algo,
690 	.search			= cxd2820r_search,
691 
692 	.read_status		= cxd2820r_read_status,
693 	.read_snr		= cxd2820r_read_snr,
694 	.read_ber		= cxd2820r_read_ber,
695 	.read_ucblocks		= cxd2820r_read_ucblocks,
696 	.read_signal_strength	= cxd2820r_read_signal_strength,
697 };
698 
699 struct dvb_frontend *cxd2820r_attach(const struct cxd2820r_config *cfg,
700 		struct i2c_adapter *i2c, int *gpio_chip_base
701 )
702 {
703 	struct cxd2820r_priv *priv;
704 	int ret;
705 	u8 tmp;
706 
707 	priv = kzalloc(sizeof(struct cxd2820r_priv), GFP_KERNEL);
708 	if (!priv) {
709 		ret = -ENOMEM;
710 		dev_err(&i2c->dev, "%s: kzalloc() failed\n",
711 				KBUILD_MODNAME);
712 		goto error;
713 	}
714 
715 	priv->i2c = i2c;
716 	memcpy(&priv->cfg, cfg, sizeof(struct cxd2820r_config));
717 	memcpy(&priv->fe.ops, &cxd2820r_ops, sizeof(struct dvb_frontend_ops));
718 	priv->fe.demodulator_priv = priv;
719 
720 	priv->bank[0] = priv->bank[1] = 0xff;
721 	ret = cxd2820r_rd_reg(priv, 0x000fd, &tmp);
722 	dev_dbg(&priv->i2c->dev, "%s: chip id=%02x\n", __func__, tmp);
723 	if (ret || tmp != 0xe1)
724 		goto error;
725 
726 	if (gpio_chip_base) {
727 #ifdef CONFIG_GPIOLIB
728 		/* add GPIOs */
729 		priv->gpio_chip.label = KBUILD_MODNAME;
730 		priv->gpio_chip.dev = &priv->i2c->dev;
731 		priv->gpio_chip.owner = THIS_MODULE;
732 		priv->gpio_chip.direction_output =
733 				cxd2820r_gpio_direction_output;
734 		priv->gpio_chip.set = cxd2820r_gpio_set;
735 		priv->gpio_chip.get = cxd2820r_gpio_get;
736 		priv->gpio_chip.base = -1; /* dynamic allocation */
737 		priv->gpio_chip.ngpio = GPIO_COUNT;
738 		priv->gpio_chip.can_sleep = 1;
739 		ret = gpiochip_add(&priv->gpio_chip);
740 		if (ret)
741 			goto error;
742 
743 		dev_dbg(&priv->i2c->dev, "%s: gpio_chip.base=%d\n", __func__,
744 				priv->gpio_chip.base);
745 
746 		*gpio_chip_base = priv->gpio_chip.base;
747 #else
748 		/*
749 		 * Use static GPIO configuration if GPIOLIB is undefined.
750 		 * This is fallback condition.
751 		 */
752 		u8 gpio[GPIO_COUNT];
753 		gpio[0] = (*gpio_chip_base >> 0) & 0x07;
754 		gpio[1] = (*gpio_chip_base >> 3) & 0x07;
755 		gpio[2] = 0;
756 		ret = cxd2820r_gpio(&priv->fe, gpio);
757 		if (ret)
758 			goto error;
759 #endif
760 	}
761 
762 	return &priv->fe;
763 error:
764 	dev_dbg(&i2c->dev, "%s: failed=%d\n", __func__, ret);
765 	kfree(priv);
766 	return NULL;
767 }
768 EXPORT_SYMBOL(cxd2820r_attach);
769 
770 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
771 MODULE_DESCRIPTION("Sony CXD2820R demodulator driver");
772 MODULE_LICENSE("GPL");
773