anysee.c revision 449d1a0ad1732476d394fb2b885092a5c554f983
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"
44a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
45a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* debug */
46a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int dvb_usb_anysee_debug;
47a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaarimodule_param_named(debug, dvb_usb_anysee_debug, int, 0644);
48a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
49ffbc5f88148ff77039a4269e3f945e8471b2e0bbMauro Carvalho Chehabstatic int dvb_usb_anysee_delsys;
500f77c3a4880f33127bc8d593e0e466f004a4addeAntti Palosaarimodule_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
510f77c3a4880f33127bc8d593e0e466f004a4addeAntti PalosaariMODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
52a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
53a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
54dec0c46ac2af9bbc4a2acd56e5bffbf02f20113eAkinobu Mitastatic DEFINE_MUTEX(anysee_usb_mutex);
55a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
56a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
57a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 *rbuf, u8 rlen)
58a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
59a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct anysee_state *state = d->priv;
60a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int act_len, ret;
61a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[64];
62a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
63a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	memcpy(&buf[0], sbuf, slen);
64a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	buf[60] = state->seq++;
65a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
66a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
67a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -EAGAIN;
68a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
69a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* We need receive one message more after dvb_usb_generic_rw due
70a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   to weird transaction flow, which is 1 x send + 2 x receive. */
71a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
72a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
73a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (!ret) {
74a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		/* receive 2nd answer */
75a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
76a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
77a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			&act_len, 2000);
78a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		if (ret)
79a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			err("%s: recv bulk message failed: %d", __func__, ret);
80a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		else {
81a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			deb_xfer("<<< ");
82a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			debug_dump(buf, act_len, deb_xfer);
83a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		}
84a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
85a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
86a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* read request, copy returned data to return buf */
87a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (!ret && rbuf && rlen)
88a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		memcpy(rbuf, buf, rlen);
89a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
90a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mutex_unlock(&anysee_usb_mutex);
91a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
92a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return ret;
93a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
94a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
95a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
96a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
97a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
98a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
99a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
100a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: reg:%04x val:%02x\n", __func__, reg, *val);
101a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return ret;
102a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
103a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
104a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
105a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
106a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
107a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: reg:%04x val:%02x\n", __func__, reg, val);
108a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
109a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
110a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
11141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari/* write single register with mask */
11241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaaristatic int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
11341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	u8 mask)
11441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari{
11541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	int ret;
11641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	u8 tmp;
11741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
11841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	/* no need for read if whole reg is written */
11941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	if (mask != 0xff) {
12041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_read_reg(d, reg, &tmp);
12141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
12241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			return ret;
12341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
12441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		val &= mask;
12541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		tmp &= ~mask;
12641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		val |= tmp;
12741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	}
12841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
12941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	return anysee_write_reg(d, reg, val);
13041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari}
13141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
132a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
133a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
134a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_GET_HW_INFO};
135a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
136a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
137a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
138a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
139a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
140a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
141a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: onoff:%02x\n", __func__, onoff);
142a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(adap->dev, buf, sizeof(buf), NULL, 0);
143a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
144a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
145a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
146a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
147a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
148a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: state:%02x interval:%02x\n", __func__, mode, interval);
149a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
150a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
151a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
152a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
153a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
154a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
155a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	deb_info("%s: onoff:%02x\n", __func__, onoff);
156a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
157a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
158a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
159a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_init(struct dvb_usb_device *d)
160a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
161a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
162a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* LED light */
163a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = anysee_led_ctrl(d, 0x01, 0x03);
164a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
165a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
166a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
167a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* enable IR */
168a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = anysee_ir_ctrl(d, 1);
169a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
170a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
171a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
172a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return 0;
173a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
174a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
175a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* I2C */
176a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
177a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int num)
178a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
179a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct dvb_usb_device *d = i2c_get_adapdata(adap);
180902571aaa91263bc27e923e94ddf161c106befeeMauro Carvalho Chehab	int ret = 0, inc, i = 0;
18121d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari	u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
182a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
183a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
184a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -EAGAIN;
185a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
186a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	while (i < num) {
187a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
18821d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			if (msg[i].len > 2 || msg[i+1].len > 60) {
18921d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				ret = -EOPNOTSUPP;
19021d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				break;
19121d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			}
192a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[0] = CMD_I2C_READ;
1937ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari			buf[1] = (msg[i].addr << 1) | 0x01;
194a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[2] = msg[i].buf[0];
195882b82caf2cb8210e6829231cb352dea33f83f4cAntti Palosaari			buf[3] = msg[i].buf[1];
196882b82caf2cb8210e6829231cb352dea33f83f4cAntti Palosaari			buf[4] = msg[i].len-1;
197b3e6a5af2162d114df4fd67353bbadd3d8a22c3eAntti Palosaari			buf[5] = msg[i+1].len;
19821d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
199a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				msg[i+1].len);
200a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			inc = 2;
201a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		} else {
20221d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			if (msg[i].len > 48) {
20321d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				ret = -EOPNOTSUPP;
20421d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari				break;
20521d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			}
206a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[0] = CMD_I2C_WRITE;
2077ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari			buf[1] = (msg[i].addr << 1);
208a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[2] = msg[i].len;
209a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			buf[3] = 0x01;
210a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			memcpy(&buf[4], msg[i].buf, msg[i].len);
21121d2e938d34d201276de3470587a3aa2047c77a1Antti Palosaari			ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
212a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			inc = 1;
213a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		}
214a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		if (ret)
215e613f8fa5432d4cacaf81615f62b6d25d77947c5Antti Palosaari			break;
216a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
217a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		i += inc;
218a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
219a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
220a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mutex_unlock(&d->i2c_mutex);
221a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
222e613f8fa5432d4cacaf81615f62b6d25d77947c5Antti Palosaari	return ret ? ret : i;
223a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
224a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
225a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic u32 anysee_i2c_func(struct i2c_adapter *adapter)
226a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
227a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return I2C_FUNC_I2C;
228a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
229a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
230a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct i2c_algorithm anysee_i2c_algo = {
231a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.master_xfer   = anysee_master_xfer,
232a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.functionality = anysee_i2c_func,
233a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
234a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
235a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_mt352_demod_init(struct dvb_frontend *fe)
236a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
237ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 clock_config[]   = { CLOCK_CTL,  0x38, 0x28 };
238ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 reset[]          = { RESET,      0x80 };
239ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 adc_ctl_1_cfg[]  = { ADC_CTL_1,  0x40 };
240ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 agc_cfg[]        = { AGC_TARGET, 0x28, 0x20 };
241ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaari	static u8 gpp_ctl_cfg[]    = { GPP_CTL,    0x33 };
242a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
243a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
244a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, clock_config,   sizeof(clock_config));
245a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	udelay(200);
246a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, reset,          sizeof(reset));
247a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
248a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
249a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
250a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
251a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
252a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
253a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return 0;
254a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
255a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
256a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* Callbacks for DVB USB */
257a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct tda10023_config anysee_tda10023_config = {
2587ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari	.demod_address = (0x1a >> 1),
259a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.invert = 0,
260a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.xtal   = 16000000,
261a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.pll_m  = 11,
262a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.pll_p  = 3,
263a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.pll_n  = 1,
2645ae2fcaee4b0d6bf0fa5d9bd71e1291c9a9a6e60Antti Palosaari	.output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
2655ae2fcaee4b0d6bf0fa5d9bd71e1291c9a9a6e60Antti Palosaari	.deltaf = 0xfeeb,
266a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
267a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
268a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct mt352_config anysee_mt352_config = {
2697ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari	.demod_address = (0x1e >> 1),
270a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.demod_init    = anysee_mt352_demod_init,
271a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
272a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
273a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct zl10353_config anysee_zl10353_config = {
2747ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari	.demod_address = (0x1e >> 1),
275a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.parallel_ts = 1,
276a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
277a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
2781fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaaristatic struct zl10353_config anysee_zl10353_tda18212_config2 = {
2791fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.demod_address = (0x1e >> 1),
2801fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.parallel_ts = 1,
2811fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.disable_i2c_gate_ctrl = 1,
2821fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.no_tuner = 1,
2831fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari	.if2 = 41500,
2841fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari};
2851fd80701b5bd42fce36f4d32d5c5415354e68d98Antti Palosaari
28672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaaristatic struct zl10353_config anysee_zl10353_tda18212_config = {
28772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.demod_address = (0x18 >> 1),
28872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.parallel_ts = 1,
28972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.disable_i2c_gate_ctrl = 1,
29072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.no_tuner = 1,
29172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if2 = 41500,
29272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari};
29372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
29472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaaristatic struct tda10023_config anysee_tda10023_tda18212_config = {
29572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.demod_address = (0x1a >> 1),
29672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.xtal   = 16000000,
29772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.pll_m  = 12,
29872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.pll_p  = 3,
29972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.pll_n  = 1,
30072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
30172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.deltaf = 0xba02,
30272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari};
30372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
30472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaaristatic struct tda18212_config anysee_tda18212_config = {
30572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.i2c_address = (0xc0 >> 1),
30672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbt_6 = 4150,
30772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbt_7 = 4150,
30872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbt_8 = 4150,
30972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	.if_dvbc = 5000,
31072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari};
31172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
312f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaaristatic struct cx24116_config anysee_cx24116_config = {
313f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.demod_address = (0xaa >> 1),
314f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.mpg_clk_pos_pol = 0x00,
315f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.i2c_wr_max = 48,
316f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari};
317f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
318bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaaristatic struct stv0900_config anysee_stv0900_config = {
319bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.demod_address = (0xd0 >> 1),
320bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.demod_mode = 0,
321bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.xtal = 8000000,
322bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.clkmode = 3,
323bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.diseqc_mode = 2,
324bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.tun1_maddress = 0,
325bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.tun1_adc = 1, /* 1 Vpp */
326bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.path1_mode = 3,
327bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari};
328bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
329bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaaristatic struct stv6110_config anysee_stv6110_config = {
330bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.i2c_address = (0xc0 >> 1),
331bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.mclk = 16000000,
332bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	.clk_div = 1,
333bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari};
334bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
335f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaaristatic struct isl6423_config anysee_isl6423_config = {
336f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.current_max = SEC_CURRENT_800m,
337f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.curlim  = SEC_CURRENT_LIM_OFF,
338f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.mod_extern = 1,
339f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	.addr = (0x10 >> 1),
340f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari};
341f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
34241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari/*
34341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * New USB device strings: Mfr=1, Product=2, SerialNumber=0
34441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * Manufacturer: AMT.CO.KR
34541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
34641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
34741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: ?
34870fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: DNOS404ZH102A(MT352, DTT7579(?))
34941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
35005c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
35105c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * PCB: PCB 507T (rev1.61)
35270fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
35305c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
35405c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
35541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
35641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
35741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507CD (rev1.1)
35870fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
35905c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
36005c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
36141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[0] ZL10353 1=enabled
36241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOA[7] TS 0=enabled
36341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
36441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
36541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
36641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507DC (rev0.2)
36770fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: TDA10023, DTOS403IH102B TM, CST56I01
36805c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
36905c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
37041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[0] TDA10023 1=enabled
37141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
372f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
373f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * PCB: 507SI (rev2.1)
374f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
37505c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
37605c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
377f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari * IOD[0] CX24116 1=enabled
378f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari *
37941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
38041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507FA (rev0.4)
38170fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: TDA10023, DTOS403IH102B TM, TDA8024
38205c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
38305c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
38441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[5] TDA10023 1=enabled
38541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOE[0] tuner 1=enabled
38641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari *
38741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
38841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * PCB: 507FA (rev1.1)
38970fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
39005c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
39105c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
39241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * DVB-C:
39341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[5] TDA10023 1=enabled
39441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOE[0] tuner 1=enabled
39541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * DVB-T:
39641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOD[0] ZL10353 1=enabled
39741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * IOE[0] tuner 0=enabled
39841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari * tuner is behind ZL10353 I2C-gate
39970fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari *
40070fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
40170fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * PCB: 508TC (rev0.6)
40270fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
40305c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
40405c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
40570fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOA[7] TS 1=enabled
40670fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOE[4] TDA18212 1=enabled
40770fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * DVB-C:
40870fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[6] ZL10353 0=disabled
40970fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[5] TDA10023 1=enabled
41070fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOE[0] IF 1=enabled
41170fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * DVB-T:
41270fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[5] TDA10023 0=disabled
41370fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOD[6] ZL10353 1=enabled
41470fc26fbcd0ac8e6bc1ca1cdc6fe623e7ac37ca1Antti Palosaari * IOE[0] IF 0=enabled
415bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari *
416bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
417bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * PCB: 508S2 (rev0.7)
418bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * parts: DNBU10512IST(STV0903, STV6110), ISL6423
41905c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
42005c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
421bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * IOA[7] TS 1=enabled
422bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari * IOE[5] STV0903 1=enabled
423bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari *
4248439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
4258439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * PCB: 508PTC (rev0.5)
4268439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
4278439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
4288439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
4298439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOA[7] TS 1=enabled
4308439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOE[4] TDA18212 1=enabled
4318439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * DVB-C:
4328439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[6] ZL10353 0=disabled
4338439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[5] TDA10023 1=enabled
4348439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOE[0] IF 1=enabled
4358439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * DVB-T:
4368439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[5] TDA10023 0=disabled
4378439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOD[6] ZL10353 1=enabled
4388439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari * IOE[0] IF 0=enabled
439fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari *
440fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * E7 S2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
441fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * PCB: 508PS2 (rev0.4)
442fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * parts: DNBU10512IST(STV0903, STV6110), ISL6423
443fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
444fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
445fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * IOA[7] TS 1=enabled
446fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari * IOE[5] STV0903 1=enabled
44741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari */
44841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
449449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaaristatic int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
450449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari{
451449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	struct dvb_usb_adapter *adap = fe->dvb->priv;
452449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	struct anysee_state *state = adap->dev->priv;
453449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	int ret;
454449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
455449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	deb_info("%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
456449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
457449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	/* no frontend sleep control */
458449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	if (onoff == 0)
459449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		return 0;
460449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
461449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	switch (state->hw) {
462449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	case ANYSEE_HW_507FA: /* 15 */
463449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E30 Combo Plus */
464449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E30 C Plus */
465449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
466449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
467449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[0] */
468449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
469449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
470449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
471449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
472449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
473449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
474449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
475449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
476449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
477449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
478449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
479449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C tuner on IOE[0] */
480449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
481449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
482449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
483449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
484449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		} else {
485449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
486449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
487449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
488449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
489449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
490449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
491449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[0] */
492449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
493449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
494449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
495449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
496449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
497449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T tuner on IOE[0] */
498449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
499449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
500449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
501449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
502449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		}
503449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
504449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		break;
505449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	case ANYSEE_HW_508TC: /* 18 */
506449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	case ANYSEE_HW_508PTC: /* 21 */
507449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E7 TC */
508449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* E7 PTC */
509449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
510449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
511449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[6] */
512449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
513449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x40);
514449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
515449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
516449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
517449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
518449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
519449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
520449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
521449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
522449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
523449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable IF route on IOE[0] */
524449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
525449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
526449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
527449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
528449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		} else {
529449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
530449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
531449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
532449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
533449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
534449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
535449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[6] */
536449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
537449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x40);
538449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
539449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
540449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
541449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable IF route on IOE[0] */
542449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
543449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
544449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			if (ret)
545449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				goto error;
546449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		}
547449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
548449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		break;
549449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	default:
550449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		ret = 0;
551449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	}
552449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
553449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaarierror:
554449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	return ret;
555449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari}
556449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
557a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_frontend_attach(struct dvb_usb_adapter *adap)
558a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
559a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
560a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct anysee_state *state = adap->dev->priv;
561a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 hw_info[3];
56272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	u8 tmp;
56372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	struct i2c_msg msg[2] = {
56472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		{
56572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.addr = anysee_tda18212_config.i2c_address,
56672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.flags = 0,
56772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.len = 1,
56872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.buf = "\x00",
56972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		}, {
57072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.addr = anysee_tda18212_config.i2c_address,
57172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.flags = I2C_M_RD,
57272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.len = 1,
57372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			.buf = &tmp,
57472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		}
57572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	};
576a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
577449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	/* detect hardware only once */
578449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	if (adap->fe[0] == NULL) {
579449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* Check which hardware we have.
580449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		 * We must do this call two times to get reliable values (hw bug).
581449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		 */
582449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		ret = anysee_get_hw_info(adap->dev, hw_info);
583449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (ret)
584449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			goto error;
58541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
586449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		ret = anysee_get_hw_info(adap->dev, hw_info);
587449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (ret)
588449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			goto error;
589449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
590449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		/* Meaning of these info bytes are guessed. */
591449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		info("firmware version:%d.%d hardware id:%d",
592449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			hw_info[1], hw_info[2], hw_info[0]);
593a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
594449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		state->hw = hw_info[0];
595449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	}
596a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
597449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	/* set current frondend ID for devices having two frondends */
598449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	if (adap->fe[0])
599449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		state->fe_id++;
600a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
60141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	switch (state->hw) {
60205c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari	case ANYSEE_HW_507T: /* 2 */
60341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 */
604a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
605449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
606449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
607449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
60841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
609bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config,
61041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			&adap->dev->i2c_adap);
611bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		if (adap->fe[0])
61241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			break;
6130f77c3a4880f33127bc8d593e0e466f004a4addeAntti Palosaari
61441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
615bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
61641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			&adap->dev->i2c_adap);
6170f77c3a4880f33127bc8d593e0e466f004a4addeAntti Palosaari
61841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
61941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507CD: /* 6 */
62041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Plus */
621a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
622449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
623449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
624449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
62541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* enable DVB-T demod on IOD[0] */
62641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
62741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
62841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			goto error;
629a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
63041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* enable transport stream on IOA[7] */
63141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
63241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
63341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			goto error;
634a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
63541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
636449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		adap->fe[0] = dvb_attach(zl10353_attach,
637449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&anysee_zl10353_config, &adap->dev->i2c_adap);
638a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
63941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
64041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507DC: /* 10 */
64141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
64241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
643449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
644449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
645449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
64641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* enable DVB-C demod on IOD[0] */
64741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
64841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		if (ret)
64941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			goto error;
65041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
65141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach demod */
652449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		adap->fe[0] = dvb_attach(tda10023_attach,
653449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
654a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
65541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
656f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	case ANYSEE_HW_507SI: /* 11 */
657f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* E30 S2 Plus */
658f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
659449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
660449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
661449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
662f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* enable DVB-S/S2 demod on IOD[0] */
663f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
664f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		if (ret)
665f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari			goto error;
666f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
667f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* attach demod */
668bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config,
669f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari			&adap->dev->i2c_adap);
670f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
671f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		break;
67241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507FA: /* 15 */
67341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Combo Plus */
67441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
67541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
67672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* enable tuner on IOE[4] */
67772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
67872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret)
67972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			goto error;
68072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
68172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* probe TDA18212 */
68272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		tmp = 0;
68372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
68472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret == 2 && tmp == 0xc7)
68572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			deb_info("%s: TDA18212 found\n", __func__);
68672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		else
68772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			tmp = 0;
68872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
68972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* disable tuner on IOE[4] */
69072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
69172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret)
69272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			goto error;
69372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
694449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
695449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[0] */
696449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
697449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
69841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
69941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
70041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
701449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
702449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
703449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
70441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
70541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
70641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
70741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			/* attach demod */
70872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			if (tmp == 0xc7) {
70972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* TDA18212 config */
710449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				adap->fe[state->fe_id] = dvb_attach(
711449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					tda10023_attach,
712449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_tda10023_tda18212_config,
713449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap, 0x48);
71472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			} else {
71572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* PLL config */
716449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				adap->fe[state->fe_id] = dvb_attach(
717449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					tda10023_attach,
718449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_tda10023_config,
719449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap, 0x48);
72072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			}
72141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		} else {
722449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
723449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
724449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
72541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
72641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
72741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
728449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[0] */
729449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
730449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x01);
73141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			if (ret)
73241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari				goto error;
73341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
73441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			/* attach demod */
73572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			if (tmp == 0xc7) {
73672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* TDA18212 config */
737449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				adap->fe[state->fe_id] = dvb_attach(
738449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					zl10353_attach,
739449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_zl10353_tda18212_config2,
740449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap);
74172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			} else {
74272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari				/* PLL config */
743449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				adap->fe[state->fe_id] = dvb_attach(
744449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					zl10353_attach,
745449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&anysee_zl10353_config,
746449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari					&adap->dev->i2c_adap);
74772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			}
74841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		}
749e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
75041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
751a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari	case ANYSEE_HW_508TC: /* 18 */
7528439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari	case ANYSEE_HW_508PTC: /* 21 */
753a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* E7 TC */
7548439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari		/* E7 PTC */
755a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
756a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* enable transport stream on IOA[7] */
757a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
758a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		if (ret)
759a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			goto error;
760a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
761449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
762449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-T demod on IOD[6] */
763449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
764a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				0x40);
765a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
766a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
767a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
768449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-C demod on IOD[5] */
769449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
770449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x20);
771a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
772a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
773a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
774a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			/* attach demod */
775449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			adap->fe[state->fe_id] = dvb_attach(tda10023_attach,
776449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&anysee_tda10023_tda18212_config,
777449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&adap->dev->i2c_adap, 0x48);
778a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		} else {
779449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* disable DVB-C demod on IOD[5] */
780449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
781a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				0x20);
782a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
783a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
784a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
785449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			/* enable DVB-T demod on IOD[6] */
786449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
787449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				0x40);
788a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			if (ret)
789a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari				goto error;
790a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
791a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			/* attach demod */
792449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			adap->fe[state->fe_id] = dvb_attach(zl10353_attach,
793449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&anysee_zl10353_tda18212_config,
794449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari				&adap->dev->i2c_adap);
795a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		}
796e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
797a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		break;
798bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	case ANYSEE_HW_508S2: /* 19 */
799fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari	case ANYSEE_HW_508PS2: /* 22 */
800bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* E7 S2 */
801fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari		/* E7 PS2 */
802bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
803449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		if (state->fe_id)
804449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			break;
805449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari
806bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* enable transport stream on IOA[7] */
807bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
808bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		if (ret)
809bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			goto error;
810bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
811bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* enable DVB-S/S2 demod on IOE[5] */
812bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
813bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		if (ret)
814bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			goto error;
815bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
816bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* attach demod */
817bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		adap->fe[0] = dvb_attach(stv0900_attach, &anysee_stv0900_config,
818bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			&adap->dev->i2c_adap, 0);
819bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
820bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		break;
82141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	}
822a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
823bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari	if (!adap->fe[0]) {
82441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* we have no frontend :-( */
82541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		ret = -ENODEV;
826e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		err("Unsupported Anysee version. " \
827e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari			"Please report the <linux-media@vger.kernel.org>.");
82841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	}
82941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaarierror:
83041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	return ret;
831a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
832a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
833a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_tuner_attach(struct dvb_usb_adapter *adap)
834a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
835a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct anysee_state *state = adap->dev->priv;
83672ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari	struct dvb_frontend *fe;
837e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari	int ret;
838449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari	deb_info("%s: fe=%d\n", __func__, state->fe_id);
839a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
84041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	switch (state->hw) {
84105c46c05d20d9504d832dc12b2a84e9e0cc9be31Antti Palosaari	case ANYSEE_HW_507T: /* 2 */
84241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 */
84341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
84441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
845bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
8467ea03d211c055cfdef7930a29a11a54d2682f953Antti Palosaari			NULL, DVB_PLL_THOMSON_DTT7579);
847e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
848a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		break;
84941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507CD: /* 6 */
85041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Plus */
85141f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
85241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
853bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
85441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			&adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
85541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
85641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
85741f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507DC: /* 10 */
85841f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
85941f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
86041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
861bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
86241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari			&adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
863e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
86441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		break;
865f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari	case ANYSEE_HW_507SI: /* 11 */
866f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* E30 S2 Plus */
867f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
868f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		/* attach LNB controller */
869449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		fe = dvb_attach(isl6423_attach, adap->fe[0],
870449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&adap->dev->i2c_adap, &anysee_isl6423_config);
871f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari
872f0a53105edabcf3d91fabeef4fbdb574d05ab551Antti Palosaari		break;
87341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	case ANYSEE_HW_507FA: /* 15 */
87441f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 Combo Plus */
87541f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* E30 C Plus */
87641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
87772ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* Try first attach TDA18212 silicon tuner on IOE[4], if that
87872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		 * fails attach old simple PLL. */
87972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
88072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* enable tuner on IOE[4] */
88172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
88272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret)
88372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			goto error;
88472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
88572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* attach tuner */
886449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		fe = dvb_attach(tda18212_attach, adap->fe[state->fe_id],
887449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&adap->dev->i2c_adap, &anysee_tda18212_config);
88872ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (fe)
88972ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			break;
89072ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
89172ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		/* disable tuner on IOE[4] */
89272ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
89372ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari		if (ret)
89472ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari			goto error;
89572ffd2b822b4ff589432df0f56e3d2cd60c10447Antti Palosaari
89641f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari		/* attach tuner */
897449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		fe = dvb_attach(dvb_pll_attach, adap->fe[state->fe_id],
898449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			(0xc0 >> 1), &adap->dev->i2c_adap,
899449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			DVB_PLL_SAMSUNG_DTOS403IH102A);
90041f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari
901a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		break;
902a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari	case ANYSEE_HW_508TC: /* 18 */
9038439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari	case ANYSEE_HW_508PTC: /* 21 */
904a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* E7 TC */
9058439e0df9cf8e6668d5798aaa7e23ce399b66459Antti Palosaari		/* E7 PTC */
906a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
907a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* enable tuner on IOE[4] */
908a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
909a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		if (ret)
910a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari			goto error;
911a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
912a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		/* attach tuner */
913449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari		fe = dvb_attach(tda18212_attach, adap->fe[state->fe_id],
914449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			&adap->dev->i2c_adap, &anysee_tda18212_config);
915a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari
916a43be980b3cf9c72f4bac4c7ce043e52004c6d90Antti Palosaari		break;
917bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari	case ANYSEE_HW_508S2: /* 19 */
918fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari	case ANYSEE_HW_508PS2: /* 22 */
919bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* E7 S2 */
920fea3c39a2eb8401e939b368dd90c03089caa3ed9Antti Palosaari		/* E7 PS2 */
921bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
922bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		/* attach tuner */
923bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari		fe = dvb_attach(stv6110_attach, adap->fe[0],
924bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			&anysee_stv6110_config, &adap->dev->i2c_adap);
925bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
926bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		if (fe) {
927bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari			/* attach LNB controller */
928bfd4500c9abf3e70e9c563bcba5675bd302f5a4eAntti Palosaari			fe = dvb_attach(isl6423_attach, adap->fe[0],
929bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari				&adap->dev->i2c_adap, &anysee_isl6423_config);
930bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		}
931bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari
932bedbf3d1451dbecd7a46ffbc6ece28561673b748Antti Palosaari		break;
93341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	default:
934e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		fe = NULL;
935a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
936a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
937e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari	if (fe)
938e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		ret = 0;
939e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari	else
940e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari		ret = -ENODEV;
941e82eea79a3518e116f7e337fab2b5ca3072ed99cAntti Palosaari
94241f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaarierror:
94341f81f686a85af144ad9769a15ef8575b69eee38Antti Palosaari	return ret;
944a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
945a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
946a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaaristatic int anysee_rc_query(struct dvb_usb_device *d)
947a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
948a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 buf[] = {CMD_GET_IR_CODE};
949a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	u8 ircode[2];
950a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	int ret;
951a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari
952a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	/* Remote controller is basic NEC using address byte 0x08.
953a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   Anysee device RC query returns only two bytes, status and code,
954a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   address byte is dropped. Also it does not return any value for
955a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   NEC RCs having address byte other than 0x08. Due to that, we
956a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   cannot use that device as standard NEC receiver.
957a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   It could be possible make hack which reads whole code directly
958a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	   from device memory... */
959a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
960a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
961a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
962a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
963a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
964a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	if (ircode[0]) {
965a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
966ca86674b8a93ea11c4bb6f4dd0113b1adf1fa841Mauro Carvalho Chehab		rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
967a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
968a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari
969a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return 0;
970a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
971a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
972a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* DVB USB Driver stuff */
973a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct dvb_usb_device_properties anysee_properties;
974a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
975a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int anysee_probe(struct usb_interface *intf,
976a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			const struct usb_device_id *id)
977a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
978a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct dvb_usb_device *d;
979a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	struct usb_host_interface *alt;
980a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
981a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
982a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* There is one interface with two alternate settings.
983a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   Alternate setting 0 is for bulk transfer.
984a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   Alternate setting 1 is for isochronous transfer.
985a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	   We use bulk transfer (alternate setting 0). */
986a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (intf->num_altsetting < 1)
987a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -ENODEV;
988a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
9898b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	/*
9908b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
9918b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 * firmware from eeprom).  If dvb_usb_device_init() succeeds that
9928b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 * means d is a valid pointer.
9938b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	 */
994a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
995a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		adapter_nr);
996a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
997a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
998a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
999a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	alt = usb_altnum_to_altsetting(intf, 0);
1000a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (alt == NULL) {
1001a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		deb_info("%s: no alt found!\n", __func__);
1002a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return -ENODEV;
1003a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
1004a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1005a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
1006a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		alt->desc.bAlternateSetting);
1007a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
1008a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		return ret;
1009a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
10108b0d7048dc2f0d2e4344bc8aaf85b4f14196145fDan Carpenter	return anysee_init(d);
1011a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
1012a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1013ae3745f63ad28233d23f3a2f7407b95717d0dba8Antti Palosaaristatic struct usb_device_id anysee_table[] = {
1014a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	{ USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
1015a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	{ USB_DEVICE(USB_VID_AMT,     USB_PID_ANYSEE) },
1016a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	{ }		/* Terminating entry */
1017a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
1018a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_DEVICE_TABLE(usb, anysee_table);
1019a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1020a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct dvb_usb_device_properties anysee_properties = {
1021a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.caps             = DVB_USB_IS_AN_I2C_ADAPTER,
1022a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1023a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.usb_ctrl         = DEVICE_SPECIFIC,
1024a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1025a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.size_of_priv     = sizeof(struct anysee_state),
1026a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1027a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.num_adapters = 1,
1028a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.adapter = {
1029a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		{
1030449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			.num_frontends    = 2,
1031449d1a0ad1732476d394fb2b885092a5c554f983Antti Palosaari			.frontend_ctrl    = anysee_frontend_ctrl,
1032a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.streaming_ctrl   = anysee_streaming_ctrl,
1033a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.frontend_attach  = anysee_frontend_attach,
1034a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.tuner_attach     = anysee_tuner_attach,
1035a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.stream = {
1036a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.type = USB_BULK,
1037a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.count = 8,
1038a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.endpoint = 0x82,
1039a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				.u = {
1040a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari					.bulk = {
1041ab69333690c9e0f278d5ca1dab4e76015f7ecc66Antti Palosaari						.buffersize = (16*512),
1042a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari					}
1043a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				}
1044a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			},
1045a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		}
1046a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	},
1047a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1048a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari	.rc.core = {
1049a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		.rc_codes         = RC_MAP_ANYSEE,
105052b661449aecc47e652a164c0d8078b31e10aca0Mauro Carvalho Chehab		.protocol         = RC_TYPE_OTHER,
1051a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		.module_name      = "anysee",
1052f72a27b8ed4458bb9f7203408441d27382bc93f4Mauro Carvalho Chehab		.rc_query         = anysee_rc_query,
1053a84946895fa747a81c3b55a1398e03cdba4778d9Antti Palosaari		.rc_interval      = 250,  /* windows driver uses 500ms */
1054f72a27b8ed4458bb9f7203408441d27382bc93f4Mauro Carvalho Chehab	},
1055a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1056a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.i2c_algo         = &anysee_i2c_algo,
1057a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1058a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.generic_bulk_ctrl_endpoint = 1,
1059a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1060a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.num_device_descs = 1,
1061a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.devices = {
1062a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		{
1063a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.name = "Anysee DVB USB2.0",
1064a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.cold_ids = {NULL},
1065a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari			.warm_ids = {&anysee_table[0],
1066a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari				     &anysee_table[1], NULL},
1067a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		},
1068a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	}
1069a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
1070a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1071a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic struct usb_driver anysee_driver = {
1072a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.name       = "dvb_usb_anysee",
1073a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.probe      = anysee_probe,
1074a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.disconnect = dvb_usb_device_exit,
1075a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	.id_table   = anysee_table,
1076a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari};
1077a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1078a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari/* module stuff */
1079a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic int __init anysee_module_init(void)
1080a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
1081a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	int ret;
1082a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1083a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	ret = usb_register(&anysee_driver);
1084a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	if (ret)
1085a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari		err("%s: usb_register failed. Error number %d", __func__, ret);
1086a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1087a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	return ret;
1088a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
1089a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1090a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaaristatic void __exit anysee_module_exit(void)
1091a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari{
1092a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	/* deregister this driver from the USB subsystem */
1093a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari	usb_deregister(&anysee_driver);
1094a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari}
1095a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1096a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaarimodule_init(anysee_module_init);
1097a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaarimodule_exit(anysee_module_exit);
1098a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti Palosaari
1099a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1100a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1101a51e34dd6080d8d5c9e95a4e0292cd4cb889a61bAntti PalosaariMODULE_LICENSE("GPL");
1102