1a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/*
2a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * DVB USB Linux driver for Anysee E30 DVB-C & DVB-T USB2.0 receiver
3a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *
4a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *
6a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    This program is free software; you can redistribute it and/or modify
7a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    it under the terms of the GNU General Public License as published by
8a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    the Free Software Foundation; either version 2 of the License, or
9a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    (at your option) any later version.
10a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *
11a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    This program is distributed in the hope that it will be useful,
12a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    but WITHOUT ANY WARRANTY; without even the implied warranty of
13a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    GNU General Public License for more details.
15a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *
16a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    You should have received a copy of the GNU General Public License
17a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    along with this program; if not, write to the Free Software
18a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *
20a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * TODO:
21a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * - add smart card reader support for Conditional Access (CA)
22a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *
23a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * Card reader in Anysee is nothing more than ISO 7816 card reader.
24a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * There is no hardware CAM in any Anysee device sold.
25a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * In my understanding it should be implemented by making own module
269fdd9caf44296213c1e1130e86c2f919f83124daAntti Palosaari * for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This
279fdd9caf44296213c1e1130e86c2f919f83124daAntti Palosaari * module registers serial interface that can be used to communicate
28a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * with any ISO 7816 smart card.
29a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari *
30a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * Any help according to implement serial smart card reader support
31a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari * is highly welcome!
32a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari */
33a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
34a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari#include "anysee.h"
35a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari#include "tda1002x.h"
36a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari#include "mt352.h"
37a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari#include "mt352_priv.h"
38a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari#include "zl10353.h"
3972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari#include "tda18212.h"
40f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari#include "cx24116.h"
41bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari#include "stv0900.h"
42bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari#include "stv6110.h"
43f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari#include "isl6423.h"
44608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari#include "cxd2820r.h"
45a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
46a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* debug */
47a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int dvb_usb_anysee_debug;
48a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaarimodule_param_named(debug, dvb_usb_anysee_debug, int, 0644);
49a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
50ffbc5f88148ff77039a4269e3f945e8471b2e0bbMauro Carvalho Chehabstatic int dvb_usb_anysee_delsys;
510f77c3a4880f33127bc8d593e0e466f004a4addeAntti Palosaarimodule_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
520f77c3a4880f33127bc8d593e0e466f004a4addeAntti PalosaariMODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
53a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
54a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
55dec0c46ac2af9bbc4a2acd56e5bffbf02f20113eAkinobu Mitastatic DEFINE_MUTEX(anysee_usb_mutex);
56a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
57a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
58a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 *rbuf, u8 rlen)
59a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
60a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct anysee_state *state = d->priv;
61a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int act_len, ret;
62a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[64];
63a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
64a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	memcpy(&buf[0], sbuf, slen);
65a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	buf[60] = state->seq++;
66a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
67a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
68a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -EAGAIN;
69a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
704048da2fa3c8c5088901d2adc4f7b5b5ccc05e79Antti Palosaari	deb_xfer(">>> ");
714048da2fa3c8c5088901d2adc4f7b5b5ccc05e79Antti Palosaari	debug_dump(buf, slen, deb_xfer);
724048da2fa3c8c5088901d2adc4f7b5b5ccc05e79Antti Palosaari
73a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* We need receive one message more after dvb_usb_generic_rw due
74a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   to weird transaction flow, which is 1 x send + 2 x receive. */
75a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
76a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (!ret) {
77a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		/* receive 2nd answer */
78a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
79a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
80a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			&act_len, 2000);
81a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		if (ret)
82a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			err("%s: recv bulk message failed: %d", __func__, ret);
83a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		else {
84a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			deb_xfer("<<< ");
854048da2fa3c8c5088901d2adc4f7b5b5ccc05e79Antti Palosaari			debug_dump(buf, rlen, deb_xfer);
864048da2fa3c8c5088901d2adc4f7b5b5ccc05e79Antti Palosaari
874048da2fa3c8c5088901d2adc4f7b5b5ccc05e79Antti Palosaari			if (buf[63] != 0x4f)
884048da2fa3c8c5088901d2adc4f7b5b5ccc05e79Antti Palosaari				deb_info("%s: cmd failed\n", __func__);
89a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		}
90a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
91a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
92a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* read request, copy returned data to return buf */
93a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (!ret && rbuf && rlen)
94a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		memcpy(rbuf, buf, rlen);
95a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
96a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mutex_unlock(&anysee_usb_mutex);
97a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
98a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return ret;
99a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
100a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
101a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
102a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
103a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
104a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
105a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
106a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: reg:%04x val:%02x\n", __func__, reg, *val);
107a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return ret;
108a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
109a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
110a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
111a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
112a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
113a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: reg:%04x val:%02x\n", __func__, reg, val);
114a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
115a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
116a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
11741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari/* write single register with mask */
11841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaaristatic int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
11941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	u8 mask)
12041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari{
12141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	int ret;
12241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	u8 tmp;
12341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
12441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	/* no need for read if whole reg is written */
12541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	if (mask != 0xff) {
12641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_read_reg(d, reg, &tmp);
12741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
12841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			return ret;
12941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
13041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		val &= mask;
13141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		tmp &= ~mask;
13241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		val |= tmp;
13341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	}
13441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
13541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	return anysee_write_reg(d, reg, val);
13641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari}
13741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
13805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari/* read single register with mask */
13905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
14005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 mask)
14105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
14205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret, i;
14305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 tmp;
14405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
14505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_read_reg(d, reg, &tmp);
14605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
14705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
14805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
14905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	tmp &= mask;
15005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
15105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	/* find position of the first bit */
15205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	for (i = 0; i < 8; i++) {
15305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		if ((mask >> i) & 0x01)
15405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari			break;
15505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	}
15605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	*val = tmp >> i;
15705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
15805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
15905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
16005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
161a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
162a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
163a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_GET_HW_INFO};
164a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
165a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
166a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
167a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
168a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
169a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
170a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: onoff:%02x\n", __func__, onoff);
171a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(adap->dev, buf, sizeof(buf), NULL, 0);
172a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
173a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
174a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
175a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
176a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
177a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: state:%02x interval:%02x\n", __func__, mode, interval);
178a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
179a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
180a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
181a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
182a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
183a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
184a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: onoff:%02x\n", __func__, onoff);
185a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
186a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
187a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
188a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* I2C */
189a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
190a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int num)
191a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
192a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct dvb_usb_device *d = i2c_get_adapdata(adap);
193902571aaa91263bc27e923e94ddf161c106befeeMauro Carvalho Chehab	int ret = 0, inc, i = 0;
19421d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari	u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
195a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
196a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
197a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -EAGAIN;
198a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
199a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	while (i < num) {
200a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
20121d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			if (msg[i].len > 2 || msg[i+1].len > 60) {
20221d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				ret = -EOPNOTSUPP;
20321d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				break;
20421d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			}
205a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[0] = CMD_I2C_READ;
2067ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari			buf[1] = (msg[i].addr << 1) | 0x01;
207a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[2] = msg[i].buf[0];
208882b82caf2cb8210e6829231cb352dea33f83f4cAntti Palosaari			buf[3] = msg[i].buf[1];
209882b82caf2cb8210e6829231cb352dea33f83f4cAntti Palosaari			buf[4] = msg[i].len-1;
210b3e6a5af2162d114df4fd67353bbadd3d8a22c3eAntti Palosaari			buf[5] = msg[i+1].len;
21121d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
212a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				msg[i+1].len);
213a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			inc = 2;
214a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		} else {
21521d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			if (msg[i].len > 48) {
21621d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				ret = -EOPNOTSUPP;
21721d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				break;
21821d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			}
219a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[0] = CMD_I2C_WRITE;
2207ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari			buf[1] = (msg[i].addr << 1);
221a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[2] = msg[i].len;
222a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[3] = 0x01;
223a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			memcpy(&buf[4], msg[i].buf, msg[i].len);
22421d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
225a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			inc = 1;
226a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		}
227a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		if (ret)
228e613f8fa5432d4cacaf81615f62b6d25d77947c5Antti Palosaari			break;
229a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
230a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		i += inc;
231a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
232a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
233a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mutex_unlock(&d->i2c_mutex);
234a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
235e613f8fa5432d4cacaf81615f62b6d25d77947c5Antti Palosaari	return ret ? ret : i;
236a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
237a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
238a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic u32 anysee_i2c_func(struct i2c_adapter *adapter)
239a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
240a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return I2C_FUNC_I2C;
241a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
242a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
243a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct i2c_algorithm anysee_i2c_algo = {
244a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.master_xfer   = anysee_master_xfer,
245a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.functionality = anysee_i2c_func,
246a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
247a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
248a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_mt352_demod_init(struct dvb_frontend *fe)
249a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
250ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 clock_config[]   = { CLOCK_CTL,  0x38, 0x28 };
251ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 reset[]          = { RESET,      0x80 };
252ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 adc_ctl_1_cfg[]  = { ADC_CTL_1,  0x40 };
253ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 agc_cfg[]        = { AGC_TARGET, 0x28, 0x20 };
254ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 gpp_ctl_cfg[]    = { GPP_CTL,    0x33 };
255a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
256a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
257a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, clock_config,   sizeof(clock_config));
258a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	udelay(200);
259a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, reset,          sizeof(reset));
260a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
261a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
262a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
263a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
264a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
265a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
266a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return 0;
267a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
268a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
269a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* Callbacks for DVB USB */
270a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct tda10023_config anysee_tda10023_config = {
2717ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari	.demod_address = (0x1a >> 1),
272a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.invert = 0,
273a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.xtal   = 16000000,
274a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.pll_m  = 11,
275a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.pll_p  = 3,
276a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.pll_n  = 1,
2775ae2fcaee4b0d6bf0fa5d9bd71e1291c9a9a6e60Antti Palosaari	.output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
2785ae2fcaee4b0d6bf0fa5d9bd71e1291c9a9a6e60Antti Palosaari	.deltaf = 0xfeeb,
279a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
280a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
281a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct mt352_config anysee_mt352_config = {
2827ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari	.demod_address = (0x1e >> 1),
283a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.demod_init    = anysee_mt352_demod_init,
284a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
285a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
286a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct zl10353_config anysee_zl10353_config = {
2877ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari	.demod_address = (0x1e >> 1),
288a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.parallel_ts = 1,
289a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
290a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
2911fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaaristatic struct zl10353_config anysee_zl10353_tda18212_config2 = {
2921fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.demod_address = (0x1e >> 1),
2931fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.parallel_ts = 1,
2941fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.disable_i2c_gate_ctrl = 1,
2951fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.no_tuner = 1,
2961fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.if2 = 41500,
2971fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari};
2981fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari
29972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaaristatic struct zl10353_config anysee_zl10353_tda18212_config = {
30072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.demod_address = (0x18 >> 1),
30172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.parallel_ts = 1,
30272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.disable_i2c_gate_ctrl = 1,
30372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.no_tuner = 1,
30472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if2 = 41500,
30572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari};
30672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
30772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaaristatic struct tda10023_config anysee_tda10023_tda18212_config = {
30872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.demod_address = (0x1a >> 1),
30972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.xtal   = 16000000,
31072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.pll_m  = 12,
31172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.pll_p  = 3,
31272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.pll_n  = 1,
31305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	.output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
31472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.deltaf = 0xba02,
31572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari};
31672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
31772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaaristatic struct tda18212_config anysee_tda18212_config = {
31872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.i2c_address = (0xc0 >> 1),
31972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbt_6 = 4150,
32072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbt_7 = 4150,
32172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbt_8 = 4150,
32272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbc = 5000,
32372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari};
32472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
325608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaaristatic struct tda18212_config anysee_tda18212_config2 = {
326608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.i2c_address = 0x60 /* (0xc0 >> 1) */,
327608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.if_dvbt_6 = 3550,
328608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.if_dvbt_7 = 3700,
329608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.if_dvbt_8 = 4150,
330608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.if_dvbt2_6 = 3250,
331608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.if_dvbt2_7 = 4000,
332608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.if_dvbt2_8 = 4000,
333608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.if_dvbc = 5000,
334608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari};
335608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari
336f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaaristatic struct cx24116_config anysee_cx24116_config = {
337f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.demod_address = (0xaa >> 1),
338f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.mpg_clk_pos_pol = 0x00,
339f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.i2c_wr_max = 48,
340f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari};
341f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
342bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaaristatic struct stv0900_config anysee_stv0900_config = {
343bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.demod_address = (0xd0 >> 1),
344bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.demod_mode = 0,
345bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.xtal = 8000000,
346bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.clkmode = 3,
347bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.diseqc_mode = 2,
348bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.tun1_maddress = 0,
349bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.tun1_adc = 1, /* 1 Vpp */
350bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.path1_mode = 3,
351bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari};
352bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
353bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaaristatic struct stv6110_config anysee_stv6110_config = {
354bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.i2c_address = (0xc0 >> 1),
355bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.mclk = 16000000,
356bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.clk_div = 1,
357bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari};
358bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
359f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaaristatic struct isl6423_config anysee_isl6423_config = {
360f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.current_max = SEC_CURRENT_800m,
361f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.curlim  = SEC_CURRENT_LIM_OFF,
362f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.mod_extern = 1,
363f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.addr = (0x10 >> 1),
364f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari};
365f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
366608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaaristatic struct cxd2820r_config anysee_cxd2820r_config = {
367608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.i2c_address = 0x6d, /* (0xda >> 1) */
368608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	.ts_mode = 0x38,
369608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari};
370608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari
37141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari/*
37241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * New USB device strings: Mfr=1, Product=2, SerialNumber=0
37341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * Manufacturer: AMT.CO.KR
37441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
37541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
37641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: ?
37770fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: DNOS404ZH102A(MT352, DTT7579(?))
37841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
37905c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
38005c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * PCB: PCB 507T (rev1.61)
38170fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
38205c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
38305c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
38441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
38541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
38641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507CD (rev1.1)
38770fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
38805c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
38905c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
39041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[0] ZL10353 1=enabled
39141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOA[7] TS 0=enabled
39241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
39341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
39441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
39541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507DC (rev0.2)
39670fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: TDA10023, DTOS403IH102B TM, CST56I01
39705c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
39805c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
39941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[0] TDA10023 1=enabled
40041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
401f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
402f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * PCB: 507SI (rev2.1)
403f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
40405c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
40505c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
406f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * IOD[0] CX24116 1=enabled
407f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari *
40841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
40941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507FA (rev0.4)
41070fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: TDA10023, DTOS403IH102B TM, TDA8024
41105c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
41205c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
41341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[5] TDA10023 1=enabled
41441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOE[0] tuner 1=enabled
41541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
41641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
41741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507FA (rev1.1)
41870fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
41905c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
42005c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
42141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * DVB-C:
42241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[5] TDA10023 1=enabled
42341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOE[0] tuner 1=enabled
42441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * DVB-T:
42541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[0] ZL10353 1=enabled
42641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOE[0] tuner 0=enabled
42741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * tuner is behind ZL10353 I2C-gate
42870fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari *
42970fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
43070fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * PCB: 508TC (rev0.6)
43170fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
43205c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
43305c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
43470fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOA[7] TS 1=enabled
43570fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOE[4] TDA18212 1=enabled
43670fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * DVB-C:
43770fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[6] ZL10353 0=disabled
43870fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[5] TDA10023 1=enabled
43970fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOE[0] IF 1=enabled
44070fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * DVB-T:
44170fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[5] TDA10023 0=disabled
44270fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[6] ZL10353 1=enabled
44370fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOE[0] IF 0=enabled
444bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari *
445bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
446bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * PCB: 508S2 (rev0.7)
447bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * parts: DNBU10512IST(STV0903, STV6110), ISL6423
44805c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
44905c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
450bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * IOA[7] TS 1=enabled
451bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * IOE[5] STV0903 1=enabled
452bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari *
453608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
454608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * PCB: 508T2C (rev0.3)
455608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
456608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
457608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
458608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * IOA[7] TS 1=enabled
459608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * IOE[5] CXD2820R 1=enabled
460608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari *
4618439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
4628439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * PCB: 508PTC (rev0.5)
4638439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
4648439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
4658439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
4668439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOA[7] TS 1=enabled
4678439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOE[4] TDA18212 1=enabled
4688439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * DVB-C:
4698439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[6] ZL10353 0=disabled
4708439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[5] TDA10023 1=enabled
4718439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOE[0] IF 1=enabled
4728439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * DVB-T:
4738439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[5] TDA10023 0=disabled
4748439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[6] ZL10353 1=enabled
4758439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOE[0] IF 0=enabled
476fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari *
477608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
478fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * PCB: 508PS2 (rev0.4)
479fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * parts: DNBU10512IST(STV0903, STV6110), ISL6423
480fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
481fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
482fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * IOA[7] TS 1=enabled
483fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * IOE[5] STV0903 1=enabled
48441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari */
48541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
486be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari
487be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari/* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
488be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaaristatic int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
489be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari{
490be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari	struct dvb_usb_adapter *adap = fe->dvb->priv;
491be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari
492be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari	/* enable / disable tuner access on IOE[4] */
493be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari	return anysee_wr_reg_mask(adap->dev, REG_IOE, (enable << 4), 0x10);
494be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari}
495be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari
496449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaaristatic int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
497449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari{
498449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	struct dvb_usb_adapter *adap = fe->dvb->priv;
499449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	struct anysee_state *state = adap->dev->priv;
500449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	int ret;
501449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
502449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	deb_info("%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
503449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
504449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	/* no frontend sleep control */
505449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	if (onoff == 0)
506449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		return 0;
507449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
508449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	switch (state->hw) {
509449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	case ANYSEE_HW_507FA: /* 15 */
510449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E30 Combo Plus */
511449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E30 C Plus */
512449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
513449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
514449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[0] */
515449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
516449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
517449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
518449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
519449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
520449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
521449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
522449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
523449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
524449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
525449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
526449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C tuner on IOE[0] */
527449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
528449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
529449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
530449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
531449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		} else {
532449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
533449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
534449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
535449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
536449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
537449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
538449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[0] */
539449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
540449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
541449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
542449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
543449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
544449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T tuner on IOE[0] */
545449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
546449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
547449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
548449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
549449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		}
550449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
551449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		break;
552449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	case ANYSEE_HW_508TC: /* 18 */
553449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	case ANYSEE_HW_508PTC: /* 21 */
554449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E7 TC */
555449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E7 PTC */
556449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
557449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
558449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[6] */
559449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
560449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x40);
561449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
562449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
563449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
564449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
565449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
566449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
567449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
568449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
569449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
570449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable IF route on IOE[0] */
571449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
572449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
573449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
574449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
575449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		} else {
576449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
577449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
578449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
579449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
580449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
581449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
582449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[6] */
583449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
584449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x40);
585449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
586449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
587449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
588449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable IF route on IOE[0] */
589449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
590449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
591449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
592449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
593449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		}
594449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
595449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		break;
596449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	default:
597449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		ret = 0;
598449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	}
599449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
600449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaarierror:
601449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	return ret;
602449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari}
603449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
604a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_frontend_attach(struct dvb_usb_adapter *adap)
605a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
606a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
607a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct anysee_state *state = adap->dev->priv;
608a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 hw_info[3];
60972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	u8 tmp;
61072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	struct i2c_msg msg[2] = {
61172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		{
61272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.addr = anysee_tda18212_config.i2c_address,
61372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.flags = 0,
61472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.len = 1,
61572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.buf = "\x00",
61672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		}, {
61772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.addr = anysee_tda18212_config.i2c_address,
61872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.flags = I2C_M_RD,
61972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.len = 1,
62072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.buf = &tmp,
62172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		}
62272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	};
623a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
624449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	/* detect hardware only once */
62577eed219fed5a913f59329cc846420fdeab0150fMichael Krufky	if (adap->fe_adap[0].fe == NULL) {
626449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* Check which hardware we have.
6278f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		 * We must do this call two times to get reliable values
6288f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		 * (hw/fw bug).
629449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		 */
630449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		ret = anysee_get_hw_info(adap->dev, hw_info);
631449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (ret)
632449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			goto error;
63341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
634449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		ret = anysee_get_hw_info(adap->dev, hw_info);
635449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (ret)
636449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			goto error;
637449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
638449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* Meaning of these info bytes are guessed. */
639449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		info("firmware version:%d.%d hardware id:%d",
640449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			hw_info[1], hw_info[2], hw_info[0]);
641a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
642449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		state->hw = hw_info[0];
643449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	}
644a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
645449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	/* set current frondend ID for devices having two frondends */
64677eed219fed5a913f59329cc846420fdeab0150fMichael Krufky	if (adap->fe_adap[0].fe)
647449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		state->fe_id++;
648a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
64941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	switch (state->hw) {
65005c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari	case ANYSEE_HW_507T: /* 2 */
65141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 */
652a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
653449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
654449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
655449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
65641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
6578f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		adap->fe_adap[0].fe = dvb_attach(mt352_attach,
6588f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			&anysee_mt352_config, &adap->dev->i2c_adap);
65977eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		if (adap->fe_adap[0].fe)
66041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			break;
6610f77c3a4880f33127bc8d593e0e466f004a4addeAntti Palosaari
66241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
6638f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
6648f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			&anysee_zl10353_config, &adap->dev->i2c_adap);
6650f77c3a4880f33127bc8d593e0e466f004a4addeAntti Palosaari
66641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
66741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507CD: /* 6 */
66841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Plus */
669a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
670449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
671449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
672449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
67341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* enable DVB-T demod on IOD[0] */
67441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
67541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
67641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			goto error;
677a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
67841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* enable transport stream on IOA[7] */
67941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
68041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
68141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			goto error;
682a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
68341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
68477eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
685449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&anysee_zl10353_config, &adap->dev->i2c_adap);
686a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
68741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
68841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507DC: /* 10 */
68941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
69041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
691449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
692449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
693449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
69441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* enable DVB-C demod on IOD[0] */
69541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
69641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
69741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			goto error;
69841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
69941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
70077eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
701449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
702a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
70341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
704f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	case ANYSEE_HW_507SI: /* 11 */
705f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* E30 S2 Plus */
706f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
707449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
708449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
709449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
710f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* enable DVB-S/S2 demod on IOD[0] */
711f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
712f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		if (ret)
713f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari			goto error;
714f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
715f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* attach demod */
7168f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		adap->fe_adap[0].fe = dvb_attach(cx24116_attach,
7178f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			&anysee_cx24116_config, &adap->dev->i2c_adap);
718f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
719f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		break;
72041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507FA: /* 15 */
72141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Combo Plus */
72241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
72341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
72472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* enable tuner on IOE[4] */
72572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
72672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret)
72772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			goto error;
72872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
72972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* probe TDA18212 */
73072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		tmp = 0;
73172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
73272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret == 2 && tmp == 0xc7)
73372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			deb_info("%s: TDA18212 found\n", __func__);
73472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		else
73572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			tmp = 0;
73672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
73772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* disable tuner on IOE[4] */
73872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
73972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret)
74072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			goto error;
74172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
742449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
743449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[0] */
744449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
745449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
74641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
74741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
74841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
749449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
750449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
751449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
75241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
75341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
75441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
75541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			/* attach demod */
75672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			if (tmp == 0xc7) {
75772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* TDA18212 config */
75877eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				adap->fe_adap[state->fe_id].fe = dvb_attach(
759449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					tda10023_attach,
760449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_tda10023_tda18212_config,
761449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap, 0x48);
76272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			} else {
76372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* PLL config */
76477eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				adap->fe_adap[state->fe_id].fe = dvb_attach(
765449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					tda10023_attach,
766449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_tda10023_config,
767449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap, 0x48);
76872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			}
76941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		} else {
770449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
771449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
772449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
77341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
77441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
77541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
776449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[0] */
777449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
778449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
77941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
78041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
78141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
78241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			/* attach demod */
78372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			if (tmp == 0xc7) {
78472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* TDA18212 config */
78577eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				adap->fe_adap[state->fe_id].fe = dvb_attach(
786449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					zl10353_attach,
787449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_zl10353_tda18212_config2,
788449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap);
78972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			} else {
79072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* PLL config */
79177eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				adap->fe_adap[state->fe_id].fe = dvb_attach(
792449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					zl10353_attach,
793449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_zl10353_config,
794449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap);
79572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			}
79641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		}
797e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
798be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari		/* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
799be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari		if (tmp == 0xc7) {
800be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari			if (adap->fe_adap[state->fe_id].fe)
801be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari				adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
802be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari					anysee_i2c_gate_ctrl;
803be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari		}
804be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari
80541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
806a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari	case ANYSEE_HW_508TC: /* 18 */
8078439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari	case ANYSEE_HW_508PTC: /* 21 */
808a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* E7 TC */
8098439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari		/* E7 PTC */
810a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
811449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
812449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[6] */
813449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
814a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				0x40);
815a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
816a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
817a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
818449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
819449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
820449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
821a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
822a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
823a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
824a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			/* attach demod */
8258f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			adap->fe_adap[state->fe_id].fe =
8268f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari				dvb_attach(tda10023_attach,
827449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&anysee_tda10023_tda18212_config,
828449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&adap->dev->i2c_adap, 0x48);
829a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		} else {
830449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
831449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
832a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				0x20);
833a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
834a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
835a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
836449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[6] */
837449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
838449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x40);
839a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
840a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
841a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
842a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			/* attach demod */
8438f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			adap->fe_adap[state->fe_id].fe =
8448f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari				dvb_attach(zl10353_attach,
845449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&anysee_zl10353_tda18212_config,
846449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&adap->dev->i2c_adap);
847a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		}
848e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
849be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari		/* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
850be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari		if (adap->fe_adap[state->fe_id].fe)
851be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari			adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
852be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari				anysee_i2c_gate_ctrl;
853be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari
85405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		state->has_ci = true;
85505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
856a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		break;
857bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	case ANYSEE_HW_508S2: /* 19 */
858fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari	case ANYSEE_HW_508PS2: /* 22 */
859bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* E7 S2 */
860fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari		/* E7 PS2 */
861bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
862449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
863449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
864449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
865bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* enable DVB-S/S2 demod on IOE[5] */
866bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
867bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		if (ret)
868bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			goto error;
869bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
870bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* attach demod */
8718f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		adap->fe_adap[0].fe = dvb_attach(stv0900_attach,
8728f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			&anysee_stv0900_config, &adap->dev->i2c_adap, 0);
873bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
87405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		state->has_ci = true;
87505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
876bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		break;
877608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	case ANYSEE_HW_508T2C: /* 20 */
878608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari		/* E7 T2C */
879608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari
880faf27976a745ac126943a500c48b30c0dd1082d3Antti Palosaari		if (state->fe_id)
881faf27976a745ac126943a500c48b30c0dd1082d3Antti Palosaari			break;
882faf27976a745ac126943a500c48b30c0dd1082d3Antti Palosaari
883608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari		/* enable DVB-T/T2/C demod on IOE[5] */
884bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
885bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		if (ret)
886bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			goto error;
887bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
888faf27976a745ac126943a500c48b30c0dd1082d3Antti Palosaari		/* attach demod */
889faf27976a745ac126943a500c48b30c0dd1082d3Antti Palosaari		adap->fe_adap[state->fe_id].fe = dvb_attach(cxd2820r_attach,
890c2bbbe7b5e79974c5ed1c828690731f6f5106beeAntti Palosaari				&anysee_cxd2820r_config, &adap->dev->i2c_adap);
891608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari
89205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		state->has_ci = true;
893bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
894bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		break;
89541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	}
896a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
89777eed219fed5a913f59329cc846420fdeab0150fMichael Krufky	if (!adap->fe_adap[0].fe) {
89841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* we have no frontend :-( */
89941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = -ENODEV;
900e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		err("Unsupported Anysee version. " \
901e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari			"Please report the <linux-media@vger.kernel.org>.");
90241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	}
90341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaarierror:
90441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	return ret;
905a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
906a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
907a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_tuner_attach(struct dvb_usb_adapter *adap)
908a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
909a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct anysee_state *state = adap->dev->priv;
91072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	struct dvb_frontend *fe;
911e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari	int ret;
912449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	deb_info("%s: fe=%d\n", __func__, state->fe_id);
913a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
91441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	switch (state->hw) {
91505c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari	case ANYSEE_HW_507T: /* 2 */
91641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 */
91741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
91841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
9198f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
9208f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			(0xc2 >> 1), NULL, DVB_PLL_THOMSON_DTT7579);
921e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
922a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		break;
92341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507CD: /* 6 */
92441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Plus */
92541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
92641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
9278f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
9288f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			(0xc2 >> 1), &adap->dev->i2c_adap,
9298f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			DVB_PLL_THOMSON_DTT7579);
93041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
93141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
93241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507DC: /* 10 */
93341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
93441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
93541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
9368f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
9378f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			(0xc0 >> 1), &adap->dev->i2c_adap,
9388f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari			DVB_PLL_SAMSUNG_DTOS403IH102A);
939e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
94041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
941f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	case ANYSEE_HW_507SI: /* 11 */
942f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* E30 S2 Plus */
943f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
944f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* attach LNB controller */
94577eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
946449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&adap->dev->i2c_adap, &anysee_isl6423_config);
947f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
948f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		break;
94941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507FA: /* 15 */
95041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Combo Plus */
95141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
95241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
95372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* Try first attach TDA18212 silicon tuner on IOE[4], if that
95472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		 * fails attach old simple PLL. */
95572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
95672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* attach tuner */
95777eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
958449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&adap->dev->i2c_adap, &anysee_tda18212_config);
95972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (fe)
96072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			break;
96172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
96241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
96377eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
964449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			(0xc0 >> 1), &adap->dev->i2c_adap,
965449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			DVB_PLL_SAMSUNG_DTOS403IH102A);
96641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
967a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		break;
968a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari	case ANYSEE_HW_508TC: /* 18 */
9698439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari	case ANYSEE_HW_508PTC: /* 21 */
970a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* E7 TC */
9718439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari		/* E7 PTC */
972a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
973a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* attach tuner */
97477eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
975449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&adap->dev->i2c_adap, &anysee_tda18212_config);
976a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
977a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		break;
978bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	case ANYSEE_HW_508S2: /* 19 */
979fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari	case ANYSEE_HW_508PS2: /* 22 */
980bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* E7 S2 */
981fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari		/* E7 PS2 */
982bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
983bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* attach tuner */
98477eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe,
985bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			&anysee_stv6110_config, &adap->dev->i2c_adap);
986bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
987bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		if (fe) {
988bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			/* attach LNB controller */
98977eed219fed5a913f59329cc846420fdeab0150fMichael Krufky			fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
990bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari				&adap->dev->i2c_adap, &anysee_isl6423_config);
991bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		}
992bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
993bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		break;
994608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari
995608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari	case ANYSEE_HW_508T2C: /* 20 */
996608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari		/* E7 T2C */
997608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari
998608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari		/* attach tuner */
999be94351e592cb71fb61aa8eeed7bf3f877dc6fffAntti Palosaari		fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
1000608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari			&adap->dev->i2c_adap, &anysee_tda18212_config2);
1001608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari
1002608add85decc7a13194072fbb0c6aadc89d394e5Antti Palosaari		break;
100341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	default:
1004e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		fe = NULL;
1005a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
1006a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1007e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari	if (fe)
1008e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		ret = 0;
1009e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari	else
1010e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		ret = -ENODEV;
1011e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
101241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	return ret;
1013a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
1014a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1015a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaaristatic int anysee_rc_query(struct dvb_usb_device *d)
1016a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
1017a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_GET_IR_CODE};
1018a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 ircode[2];
1019a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	int ret;
1020a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari
1021a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	/* Remote controller is basic NEC using address byte 0x08.
1022a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   Anysee device RC query returns only two bytes, status and code,
1023a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   address byte is dropped. Also it does not return any value for
1024a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   NEC RCs having address byte other than 0x08. Due to that, we
1025a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   cannot use that device as standard NEC receiver.
1026a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   It could be possible make hack which reads whole code directly
1027a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   from device memory... */
1028a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1029a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
1030a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
1031a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
1032a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1033a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	if (ircode[0]) {
1034a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
1035ca86674b8a93ea11c4bb6f4dd0113b1adf1fa841Mauro Carvalho Chehab		rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
1036a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
1037a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari
1038a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return 0;
1039a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
1040a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
104105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
104205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int addr)
104305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
104405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
104505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
104605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
104705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 val;
104805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
104905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
105005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
105105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
105205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
105305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return val;
105405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
105505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
105605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
105705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int addr, u8 val)
105805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
105905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
106005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
106105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
106205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
106305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
106405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
106505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
106605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
106705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
106805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
106905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
107005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
107105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 addr)
107205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
107305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
107405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
107505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
107605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 val;
107705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
107805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
107905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
108005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
108105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
108205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return val;
108305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
108405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
108505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
108605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 addr, u8 val)
108705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
108805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
108905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
109005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
109105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
109205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
109305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
109405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
109505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
109605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
109705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
109805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
109905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
110005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
110105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
110205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
110305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct anysee_state *state = d->priv;
110405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
110505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
110605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
110705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
110805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
110905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
111005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
111105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	msleep(300);
111205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
111305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
111405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
111505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
111605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
111705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
111805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
111905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
112005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
112105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
112205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
112305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
112405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
112505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
112605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
112705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
112805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
112905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	msleep(30);
113005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
113105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
113205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
113305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
113405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
113505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
113605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
113705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
113805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
113905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
114005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
114105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
114205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
114305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
114405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
114505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
114605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
114705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
114805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
114905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
115005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
115105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int open)
115205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
115305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = ci->data;
115405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct anysee_state *state = d->priv;
115505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
115605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	u8 tmp;
115705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
115805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
115905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
116005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
116105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
116205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (tmp == 0) {
116305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
116405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		if (time_after(jiffies, state->ci_cam_ready))
116505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari			ret |= DVB_CA_EN50221_POLL_CAM_READY;
116605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	}
116705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
116805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return ret;
116905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
117005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
117105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_ci_init(struct dvb_usb_device *d)
117205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
117305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct anysee_state *state = d->priv;
117405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
117505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
117605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.owner               = THIS_MODULE;
117705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.read_attribute_mem  = anysee_ci_read_attribute_mem;
117805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
117905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.read_cam_control    = anysee_ci_read_cam_control;
118005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.write_cam_control   = anysee_ci_write_cam_control;
118105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.slot_reset          = anysee_ci_slot_reset;
118205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.slot_shutdown       = anysee_ci_slot_shutdown;
118305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.slot_ts_enable      = anysee_ci_slot_ts_enable;
118405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.poll_slot_status    = anysee_ci_poll_slot_status;
118505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	state->ci.data                = d;
118605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
118705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
118805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
118905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
119005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
119146de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
119246de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari	if (ret)
119346de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari		return ret;
119446de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari
119546de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari	ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
119646de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari	if (ret)
119746de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari		return ret;
119846de20a78ae4b122b79fc02633e9a6c3d539ecadAntti Palosaari
119905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
120005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
120105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
120205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
120305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
120405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
120505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
120605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic void anysee_ci_release(struct dvb_usb_device *d)
120705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
120805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct anysee_state *state = d->priv;
120905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
121005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	/* detach CI */
121105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (state->has_ci)
121205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		dvb_ca_en50221_release(&state->ci);
121305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
121405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return;
121505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
121605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
121705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic int anysee_init(struct dvb_usb_device *d)
121805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
121905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct anysee_state *state = d->priv;
122005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	int ret;
122105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
122205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	/* LED light */
122305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_led_ctrl(d, 0x01, 0x03);
122405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
122505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
122605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
122705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	/* enable IR */
122805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	ret = anysee_ir_ctrl(d, 1);
122905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (ret)
123005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		return ret;
123105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
123205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	/* attach CI */
123305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	if (state->has_ci) {
123405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		ret = anysee_ci_init(d);
123505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		if (ret) {
123605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari			state->has_ci = false;
123705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari			return ret;
123805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari		}
123905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	}
124005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
124105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return 0;
124205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
124305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
1244a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* DVB USB Driver stuff */
1245a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct dvb_usb_device_properties anysee_properties;
1246a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1247a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_probe(struct usb_interface *intf,
1248a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			const struct usb_device_id *id)
1249a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
1250a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct dvb_usb_device *d;
1251a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct usb_host_interface *alt;
1252a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
1253a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1254a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* There is one interface with two alternate settings.
1255a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   Alternate setting 0 is for bulk transfer.
1256a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   Alternate setting 1 is for isochronous transfer.
1257a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   We use bulk transfer (alternate setting 0). */
1258a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (intf->num_altsetting < 1)
1259a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -ENODEV;
1260a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
12618b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	/*
12628b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
12638b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 * firmware from eeprom).  If dvb_usb_device_init() succeeds that
12648b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 * means d is a valid pointer.
12658b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 */
1266a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
1267a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		adapter_nr);
1268a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
1269a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
1270a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1271a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	alt = usb_altnum_to_altsetting(intf, 0);
1272a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (alt == NULL) {
1273a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		deb_info("%s: no alt found!\n", __func__);
1274a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -ENODEV;
1275a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
1276a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1277a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
1278a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		alt->desc.bAlternateSetting);
1279a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
1280a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
1281a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
12828b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	return anysee_init(d);
1283a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
1284a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
128505cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaaristatic void anysee_disconnect(struct usb_interface *intf)
128605cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari{
128705cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	struct dvb_usb_device *d = usb_get_intfdata(intf);
128805cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
128905cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	anysee_ci_release(d);
129005cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	dvb_usb_device_exit(intf);
129105cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
129205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	return;
129305cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari}
129405cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari
1295ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaaristatic struct usb_device_id anysee_table[] = {
1296a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	{ USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
1297a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	{ USB_DEVICE(USB_VID_AMT,     USB_PID_ANYSEE) },
1298a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	{ }		/* Terminating entry */
1299a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
1300a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_DEVICE_TABLE(usb, anysee_table);
1301a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1302a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct dvb_usb_device_properties anysee_properties = {
1303a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.caps             = DVB_USB_IS_AN_I2C_ADAPTER,
1304a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1305a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.usb_ctrl         = DEVICE_SPECIFIC,
1306a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1307a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.size_of_priv     = sizeof(struct anysee_state),
1308a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1309a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.num_adapters = 1,
1310a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.adapter = {
1311a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		{
131277eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		.num_frontends    = 2,
131377eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		.frontend_ctrl    = anysee_frontend_ctrl,
13148f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		.fe = { {
1315a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.streaming_ctrl   = anysee_streaming_ctrl,
1316a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.frontend_attach  = anysee_frontend_attach,
1317a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.tuner_attach     = anysee_tuner_attach,
1318a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.stream = {
1319a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.type = USB_BULK,
1320a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.count = 8,
1321a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.endpoint = 0x82,
1322a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.u = {
1323a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari					.bulk = {
1324ab69333690c9e0f278d5ca1dab4e76015f7ecc66Antti Palosaari						.buffersize = (16*512),
1325a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari					}
1326a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				}
1327a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			},
132877eed219fed5a913f59329cc846420fdeab0150fMichael Krufky		}, {
132977eed219fed5a913f59329cc846420fdeab0150fMichael Krufky			.streaming_ctrl   = anysee_streaming_ctrl,
133077eed219fed5a913f59329cc846420fdeab0150fMichael Krufky			.frontend_attach  = anysee_frontend_attach,
133177eed219fed5a913f59329cc846420fdeab0150fMichael Krufky			.tuner_attach     = anysee_tuner_attach,
133277eed219fed5a913f59329cc846420fdeab0150fMichael Krufky			.stream = {
133377eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				.type = USB_BULK,
133477eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				.count = 8,
133577eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				.endpoint = 0x82,
133677eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				.u = {
133777eed219fed5a913f59329cc846420fdeab0150fMichael Krufky					.bulk = {
133877eed219fed5a913f59329cc846420fdeab0150fMichael Krufky						.buffersize = (16*512),
133977eed219fed5a913f59329cc846420fdeab0150fMichael Krufky					}
134077eed219fed5a913f59329cc846420fdeab0150fMichael Krufky				}
134177eed219fed5a913f59329cc846420fdeab0150fMichael Krufky			},
13428f4ffb1d4752ebce153e88266ac1164e8ecc5854Antti Palosaari		} },
1343a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		}
1344a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	},
1345a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1346a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	.rc.core = {
1347a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		.rc_codes         = RC_MAP_ANYSEE,
134852b661449aecc47e652a164c0d8078b31e10aca0Mauro Carvalho Chehab		.protocol         = RC_TYPE_OTHER,
1349a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		.module_name      = "anysee",
1350f72a27b8ed4458bb9f7203408441d27382bc93f4Mauro Carvalho Chehab		.rc_query         = anysee_rc_query,
1351a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		.rc_interval      = 250,  /* windows driver uses 500ms */
1352f72a27b8ed4458bb9f7203408441d27382bc93f4Mauro Carvalho Chehab	},
1353a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1354a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.i2c_algo         = &anysee_i2c_algo,
1355a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1356a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.generic_bulk_ctrl_endpoint = 1,
1357a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1358a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.num_device_descs = 1,
1359a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.devices = {
1360a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		{
1361a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.name = "Anysee DVB USB2.0",
1362a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.cold_ids = {NULL},
1363a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.warm_ids = {&anysee_table[0],
1364a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				     &anysee_table[1], NULL},
1365a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		},
1366a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
1367a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
1368a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1369a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct usb_driver anysee_driver = {
1370a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.name       = "dvb_usb_anysee",
1371a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.probe      = anysee_probe,
137205cd37def5e697e158470d826cb75c5607c04bd1Antti Palosaari	.disconnect = anysee_disconnect,
1373a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.id_table   = anysee_table,
1374a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
1375a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1376ecb3b2b35db49778b6d89e3ffd0c400776c20735Greg Kroah-Hartmanmodule_usb_driver(anysee_driver);
1377a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1378a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1379a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1380a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_LICENSE("GPL");
1381