blob: 99a3f36259447077557da6920526716ee1e0ad96 [file] [log] [blame]
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001/* DVB USB compliant linux driver for Conexant USB reference design.
2 *
3 * The Conexant reference design I saw on their website was only for analogue
4 * capturing (using the cx25842). The box I took to write this driver (reverse
5 * engineered) is the one labeled Medion MD95700. In addition to the cx25842
6 * for analogue capturing it also has a cx22702 DVB-T demodulator on the main
7 * board. Besides it has a atiremote (X10) and a USB2.0 hub onboard.
8 *
9 * Maybe it is a little bit premature to call this driver cxusb, but I assume
10 * the USB protocol is identical or at least inherited from the reference
11 * design, so it can be reused for the "analogue-only" device (if it will
12 * appear at all).
13 *
Michael Krufky81481e92006-01-09 18:21:38 -020014 * TODO: Use the cx25840-driver for the analogue part
Patrick Boettcher22c6d932005-07-07 17:58:10 -070015 *
Patrick Boettcher99e44da2016-01-24 12:56:58 -020016 * Copyright (C) 2005 Patrick Boettcher (patrick.boettcher@posteo.de)
Michael Krufky5b9ed282006-10-15 14:51:08 -030017 * Copyright (C) 2006 Michael Krufky (mkrufky@linuxtv.org)
Chris Pascoeaeb012b2007-11-19 21:57:10 -030018 * Copyright (C) 2006, 2007 Chris Pascoe (c.pascoe@itee.uq.edu.au)
Patrick Boettcher22c6d932005-07-07 17:58:10 -070019 *
Michael Krufkyf35db232006-12-05 14:53:39 -030020 * This program is free software; you can redistribute it and/or modify it
21 * under the terms of the GNU General Public License as published by the Free
22 * Software Foundation, version 2.
Patrick Boettcher22c6d932005-07-07 17:58:10 -070023 *
24 * see Documentation/dvb/README.dvb-usb for more information
25 */
Michael Krufky827855d2008-04-22 14:46:16 -030026#include <media/tuner.h>
David Woodhousee62f89f2008-05-24 00:12:42 +010027#include <linux/vmalloc.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090028#include <linux/slab.h>
Michael Krufky827855d2008-04-22 14:46:16 -030029
Patrick Boettcher22c6d932005-07-07 17:58:10 -070030#include "cxusb.h"
31
32#include "cx22702.h"
Michael Krufkyeffee032006-01-09 15:25:47 -020033#include "lgdt330x.h"
Chris Pascoe0029ee12006-01-09 18:21:28 -020034#include "mt352.h"
35#include "mt352_priv.h"
Michael Krufkyc9ce3942006-06-11 04:24:31 -030036#include "zl10353.h"
Chris Pascoeaeb012b2007-11-19 21:57:10 -030037#include "tuner-xc2028.h"
Michael Krufky827855d2008-04-22 14:46:16 -030038#include "tuner-simple.h"
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -030039#include "mxl5005s.h"
David Wongb18bd1d2009-10-26 09:41:22 -030040#include "max2165.h"
Anton Blanchard8d798982008-08-09 12:23:15 -030041#include "dib7000p.h"
42#include "dib0070.h"
David T.L. Wong6bf1a992009-08-05 13:07:10 -030043#include "lgs8gxx.h"
David Wongb18bd1d2009-10-26 09:41:22 -030044#include "atbm8830.h"
Olli Salonen26c42b02014-07-13 10:52:22 -030045#include "si2168.h"
46#include "si2157.h"
Patrick Boettcher22c6d932005-07-07 17:58:10 -070047
48/* debug */
Adrian Bunk53133af2007-11-05 14:07:06 -030049static int dvb_usb_cxusb_debug;
Michael Krufkyf35db232006-12-05 14:53:39 -030050module_param_named(debug, dvb_usb_cxusb_debug, int, 0644);
Patrick Boettcher22c6d932005-07-07 17:58:10 -070051MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
Janne Grunau78e920062008-04-09 19:13:13 -030052
53DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
54
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -030055#define deb_info(args...) dprintk(dvb_usb_cxusb_debug, 0x03, args)
56#define deb_i2c(args...) dprintk(dvb_usb_cxusb_debug, 0x02, args)
Patrick Boettcher22c6d932005-07-07 17:58:10 -070057
58static int cxusb_ctrl_msg(struct dvb_usb_device *d,
Michael Krufkyf35db232006-12-05 14:53:39 -030059 u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
Patrick Boettcher22c6d932005-07-07 17:58:10 -070060{
Mauro Carvalho Chehab17ce0392016-10-07 06:30:27 -030061 struct cxusb_state *st = d->priv;
Stefan Brüns3f190e32017-02-05 12:57:59 -020062 int ret;
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -030063
Mauro Carvalho Chehab17ce0392016-10-07 06:30:27 -030064 if (1 + wlen > MAX_XFER_SIZE) {
65 warn("i2c wr: len=%d is too big!\n", wlen);
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -030066 return -EOPNOTSUPP;
67 }
68
Stefan Brüns3f190e32017-02-05 12:57:59 -020069 if (rlen > MAX_XFER_SIZE) {
70 warn("i2c rd: len=%d is too big!\n", rlen);
71 return -EOPNOTSUPP;
72 }
Patrick Boettcher22c6d932005-07-07 17:58:10 -070073
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -020074 mutex_lock(&d->data_mutex);
Mauro Carvalho Chehab17ce0392016-10-07 06:30:27 -030075 st->data[0] = cmd;
76 memcpy(&st->data[1], wbuf, wlen);
Stefan Brüns3f190e32017-02-05 12:57:59 -020077 ret = dvb_usb_generic_rw(d, st->data, 1 + wlen, st->data, rlen, 0);
78 if (!ret && rbuf && rlen)
79 memcpy(rbuf, st->data, rlen);
Mauro Carvalho Chehab17ce0392016-10-07 06:30:27 -030080
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -020081 mutex_unlock(&d->data_mutex);
Mauro Carvalho Chehab17ce0392016-10-07 06:30:27 -030082 return ret;
Patrick Boettcher22c6d932005-07-07 17:58:10 -070083}
84
Patrick Boettchere2efeab2005-09-09 13:02:51 -070085/* GPIO */
86static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff)
Patrick Boettcher22c6d932005-07-07 17:58:10 -070087{
88 struct cxusb_state *st = d->priv;
Michael Krufkyf35db232006-12-05 14:53:39 -030089 u8 o[2], i;
Patrick Boettcher22c6d932005-07-07 17:58:10 -070090
Patrick Boettchere2efeab2005-09-09 13:02:51 -070091 if (st->gpio_write_state[GPIO_TUNER] == onoff)
Patrick Boettcher22c6d932005-07-07 17:58:10 -070092 return;
93
Patrick Boettchere2efeab2005-09-09 13:02:51 -070094 o[0] = GPIO_TUNER;
95 o[1] = onoff;
Michael Krufkyf35db232006-12-05 14:53:39 -030096 cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
Patrick Boettcher22c6d932005-07-07 17:58:10 -070097
98 if (i != 0x01)
Patrick Boettchere2efeab2005-09-09 13:02:51 -070099 deb_info("gpio_write failed.\n");
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700100
Patrick Boettchere2efeab2005-09-09 13:02:51 -0700101 st->gpio_write_state[GPIO_TUNER] = onoff;
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700102}
103
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300104static int cxusb_bluebird_gpio_rw(struct dvb_usb_device *d, u8 changemask,
105 u8 newval)
106{
107 u8 o[2], gpio_state;
108 int rc;
109
110 o[0] = 0xff & ~changemask; /* mask of bits to keep */
111 o[1] = newval & changemask; /* new values for bits */
112
113 rc = cxusb_ctrl_msg(d, CMD_BLUEBIRD_GPIO_RW, o, 2, &gpio_state, 1);
114 if (rc < 0 || (gpio_state & changemask) != (newval & changemask))
115 deb_info("bluebird_gpio_write failed.\n");
116
117 return rc < 0 ? rc : gpio_state;
118}
119
120static void cxusb_bluebird_gpio_pulse(struct dvb_usb_device *d, u8 pin, int low)
121{
122 cxusb_bluebird_gpio_rw(d, pin, low ? 0 : pin);
123 msleep(5);
124 cxusb_bluebird_gpio_rw(d, pin, low ? pin : 0);
125}
126
Chris Pascoe5ccaf902007-11-20 01:53:31 -0300127static void cxusb_nano2_led(struct dvb_usb_device *d, int onoff)
128{
129 cxusb_bluebird_gpio_rw(d, 0x40, onoff ? 0 : 0x40);
130}
131
Timothy Leedfbdce02008-08-09 13:36:51 -0300132static int cxusb_d680_dmb_gpio_tuner(struct dvb_usb_device *d,
133 u8 addr, int onoff)
134{
135 u8 o[2] = {addr, onoff};
136 u8 i;
137 int rc;
138
139 rc = cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
140
141 if (rc < 0)
142 return rc;
143 if (i == 0x01)
144 return 0;
145 else {
146 deb_info("gpio_write failed.\n");
147 return -EIO;
148 }
149}
150
Patrick Boettchere2efeab2005-09-09 13:02:51 -0700151/* I2C */
Michael Krufkyf35db232006-12-05 14:53:39 -0300152static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
153 int num)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700154{
155 struct dvb_usb_device *d = i2c_get_adapdata(adap);
Dan Carpenter1cdbcc52013-11-22 04:55:43 -0300156 int ret;
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700157 int i;
158
Ingo Molnar3593cab2006-02-07 06:49:14 -0200159 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700160 return -EAGAIN;
161
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700162 for (i = 0; i < num; i++) {
163
Hans Verkuil41150cb92014-08-21 11:55:00 -0300164 if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_MEDION)
Michael Krufky5e805ef2006-03-23 00:01:34 -0300165 switch (msg[i].addr) {
Michael Krufkyf35db232006-12-05 14:53:39 -0300166 case 0x63:
167 cxusb_gpio_tuner(d, 0);
168 break;
169 default:
170 cxusb_gpio_tuner(d, 1);
171 break;
Michael Krufky5e805ef2006-03-23 00:01:34 -0300172 }
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700173
Chris Pascoe272479d72007-11-19 03:01:22 -0300174 if (msg[i].flags & I2C_M_RD) {
175 /* read only */
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -0300176 u8 obuf[3], ibuf[MAX_XFER_SIZE];
177
178 if (1 + msg[i].len > sizeof(ibuf)) {
179 warn("i2c rd: len=%d is too big!\n",
180 msg[i].len);
Dan Carpenter1cdbcc52013-11-22 04:55:43 -0300181 ret = -EOPNOTSUPP;
182 goto unlock;
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -0300183 }
Chris Pascoe272479d72007-11-19 03:01:22 -0300184 obuf[0] = 0;
185 obuf[1] = msg[i].len;
186 obuf[2] = msg[i].addr;
187 if (cxusb_ctrl_msg(d, CMD_I2C_READ,
188 obuf, 3,
189 ibuf, 1+msg[i].len) < 0) {
190 warn("i2c read failed");
191 break;
192 }
193 memcpy(msg[i].buf, &ibuf[1], msg[i].len);
Chris Pascoea644e4a2007-11-19 03:05:09 -0300194 } else if (i+1 < num && (msg[i+1].flags & I2C_M_RD) &&
195 msg[i].addr == msg[i+1].addr) {
196 /* write to then read from same address */
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -0300197 u8 obuf[MAX_XFER_SIZE], ibuf[MAX_XFER_SIZE];
198
199 if (3 + msg[i].len > sizeof(obuf)) {
200 warn("i2c wr: len=%d is too big!\n",
201 msg[i].len);
Dan Carpenter1cdbcc52013-11-22 04:55:43 -0300202 ret = -EOPNOTSUPP;
203 goto unlock;
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -0300204 }
205 if (1 + msg[i + 1].len > sizeof(ibuf)) {
206 warn("i2c rd: len=%d is too big!\n",
207 msg[i + 1].len);
Dan Carpenter1cdbcc52013-11-22 04:55:43 -0300208 ret = -EOPNOTSUPP;
209 goto unlock;
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -0300210 }
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700211 obuf[0] = msg[i].len;
212 obuf[1] = msg[i+1].len;
213 obuf[2] = msg[i].addr;
Michael Krufkyf35db232006-12-05 14:53:39 -0300214 memcpy(&obuf[3], msg[i].buf, msg[i].len);
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700215
216 if (cxusb_ctrl_msg(d, CMD_I2C_READ,
Michael Krufkyf35db232006-12-05 14:53:39 -0300217 obuf, 3+msg[i].len,
218 ibuf, 1+msg[i+1].len) < 0)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700219 break;
220
221 if (ibuf[0] != 0x08)
Michael Krufkyae62e3d2006-03-23 01:11:18 -0300222 deb_i2c("i2c read may have failed\n");
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700223
Michael Krufkyf35db232006-12-05 14:53:39 -0300224 memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700225
226 i++;
Chris Pascoe272479d72007-11-19 03:01:22 -0300227 } else {
228 /* write only */
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -0300229 u8 obuf[MAX_XFER_SIZE], ibuf;
230
231 if (2 + msg[i].len > sizeof(obuf)) {
232 warn("i2c wr: len=%d is too big!\n",
233 msg[i].len);
Dan Carpenter1cdbcc52013-11-22 04:55:43 -0300234 ret = -EOPNOTSUPP;
235 goto unlock;
Mauro Carvalho Chehab64f7ef82013-11-02 07:18:09 -0300236 }
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700237 obuf[0] = msg[i].addr;
238 obuf[1] = msg[i].len;
Michael Krufkyf35db232006-12-05 14:53:39 -0300239 memcpy(&obuf[2], msg[i].buf, msg[i].len);
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700240
Michael Krufkyf35db232006-12-05 14:53:39 -0300241 if (cxusb_ctrl_msg(d, CMD_I2C_WRITE, obuf,
242 2+msg[i].len, &ibuf,1) < 0)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700243 break;
244 if (ibuf != 0x08)
Michael Krufkyae62e3d2006-03-23 01:11:18 -0300245 deb_i2c("i2c write may have failed\n");
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700246 }
247 }
248
Dan Carpenter1cdbcc52013-11-22 04:55:43 -0300249 if (i == num)
250 ret = num;
251 else
252 ret = -EREMOTEIO;
253
254unlock:
Ingo Molnar3593cab2006-02-07 06:49:14 -0200255 mutex_unlock(&d->i2c_mutex);
Dan Carpenter1cdbcc52013-11-22 04:55:43 -0300256 return ret;
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700257}
258
259static u32 cxusb_i2c_func(struct i2c_adapter *adapter)
260{
261 return I2C_FUNC_I2C;
262}
263
264static struct i2c_algorithm cxusb_i2c_algo = {
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700265 .master_xfer = cxusb_i2c_xfer,
266 .functionality = cxusb_i2c_func,
267};
268
269static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
270{
Patrick Boettchere2efeab2005-09-09 13:02:51 -0700271 u8 b = 0;
272 if (onoff)
273 return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
274 else
275 return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700276}
277
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300278static int cxusb_aver_power_ctrl(struct dvb_usb_device *d, int onoff)
279{
280 int ret;
281 if (!onoff)
282 return cxusb_ctrl_msg(d, CMD_POWER_OFF, NULL, 0, NULL, 0);
283 if (d->state == DVB_USB_STATE_INIT &&
284 usb_set_interface(d->udev, 0, 0) < 0)
285 err("set interface failed");
Hans Verkuilc6eb8ea2008-09-03 17:11:54 -0300286 do {} while (!(ret = cxusb_ctrl_msg(d, CMD_POWER_ON, NULL, 0, NULL, 0)) &&
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300287 !(ret = cxusb_ctrl_msg(d, 0x15, NULL, 0, NULL, 0)) &&
288 !(ret = cxusb_ctrl_msg(d, 0x17, NULL, 0, NULL, 0)) && 0);
289 if (!ret) {
290 /* FIXME: We don't know why, but we need to configure the
291 * lgdt3303 with the register settings below on resume */
292 int i;
293 u8 buf, bufs[] = {
294 0x0e, 0x2, 0x00, 0x7f,
295 0x0e, 0x2, 0x02, 0xfe,
296 0x0e, 0x2, 0x02, 0x01,
297 0x0e, 0x2, 0x00, 0x03,
298 0x0e, 0x2, 0x0d, 0x40,
299 0x0e, 0x2, 0x0e, 0x87,
300 0x0e, 0x2, 0x0f, 0x8e,
301 0x0e, 0x2, 0x10, 0x01,
302 0x0e, 0x2, 0x14, 0xd7,
303 0x0e, 0x2, 0x47, 0x88,
304 };
305 msleep(20);
306 for (i = 0; i < sizeof(bufs)/sizeof(u8); i += 4/sizeof(u8)) {
307 ret = cxusb_ctrl_msg(d, CMD_I2C_WRITE,
308 bufs+i, 4, &buf, 1);
309 if (ret)
310 break;
311 if (buf != 0x8)
312 return -EREMOTEIO;
313 }
314 }
315 return ret;
316}
317
Michael Krufky5691c842006-04-19 20:40:01 -0300318static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
319{
320 u8 b = 0;
321 if (onoff)
322 return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
323 else
324 return 0;
325}
326
Chris Pascoe5ccaf902007-11-20 01:53:31 -0300327static int cxusb_nano2_power_ctrl(struct dvb_usb_device *d, int onoff)
328{
329 int rc = 0;
330
331 rc = cxusb_power_ctrl(d, onoff);
332 if (!onoff)
333 cxusb_nano2_led(d, 0);
334
335 return rc;
336}
337
Timothy Leedfbdce02008-08-09 13:36:51 -0300338static int cxusb_d680_dmb_power_ctrl(struct dvb_usb_device *d, int onoff)
339{
340 int ret;
341 u8 b;
342 ret = cxusb_power_ctrl(d, onoff);
343 if (!onoff)
344 return ret;
345
346 msleep(128);
347 cxusb_ctrl_msg(d, CMD_DIGITAL, NULL, 0, &b, 1);
348 msleep(100);
349 return ret;
350}
351
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300352static int cxusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700353{
Patrick Boettcher8257e8a2005-07-07 17:58:15 -0700354 u8 buf[2] = { 0x03, 0x00 };
355 if (onoff)
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300356 cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON, buf, 2, NULL, 0);
Patrick Boettcher8257e8a2005-07-07 17:58:15 -0700357 else
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300358 cxusb_ctrl_msg(adap->dev, CMD_STREAMING_OFF, NULL, 0, NULL, 0);
Patrick Boettcher8257e8a2005-07-07 17:58:15 -0700359
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700360 return 0;
361}
362
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300363static int cxusb_aver_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
364{
365 if (onoff)
366 cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_ON, NULL, 0, NULL, 0);
367 else
368 cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_OFF,
369 NULL, 0, NULL, 0);
370 return 0;
371}
372
CrazyCat5fa88152016-10-21 17:35:40 -0200373static int cxusb_read_status(struct dvb_frontend *fe,
374 enum fe_status *status)
375{
376 struct dvb_usb_adapter *adap = (struct dvb_usb_adapter *)fe->dvb->priv;
377 struct cxusb_state *state = (struct cxusb_state *)adap->dev->priv;
378 int ret;
379
380 ret = state->fe_read_status(fe, status);
381
382 /* it need resync slave fifo when signal change from unlock to lock.*/
383 if ((*status & FE_HAS_LOCK) && (!state->last_lock)) {
384 mutex_lock(&state->stream_mutex);
385 cxusb_streaming_ctrl(adap, 1);
386 mutex_unlock(&state->stream_mutex);
387 }
388
389 state->last_lock = (*status & FE_HAS_LOCK) ? 1 : 0;
390 return ret;
391}
392
Timothy Leedfbdce02008-08-09 13:36:51 -0300393static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d)
394{
395 int ep = d->props.generic_bulk_ctrl_endpoint;
396 const int timeout = 100;
397 const int junk_len = 32;
398 u8 *junk;
399 int rd_count;
400
401 /* Discard remaining data in video pipe */
402 junk = kmalloc(junk_len, GFP_KERNEL);
403 if (!junk)
404 return;
405 while (1) {
406 if (usb_bulk_msg(d->udev,
407 usb_rcvbulkpipe(d->udev, ep),
408 junk, junk_len, &rd_count, timeout) < 0)
409 break;
410 if (!rd_count)
411 break;
412 }
413 kfree(junk);
414}
415
416static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d)
417{
Michael Krufky77eed212011-09-06 09:31:57 -0300418 struct usb_data_stream_properties *p = &d->props.adapter[0].fe[0].stream;
Timothy Leedfbdce02008-08-09 13:36:51 -0300419 const int timeout = 100;
420 const int junk_len = p->u.bulk.buffersize;
421 u8 *junk;
422 int rd_count;
423
424 /* Discard remaining data in video pipe */
425 junk = kmalloc(junk_len, GFP_KERNEL);
426 if (!junk)
427 return;
428 while (1) {
429 if (usb_bulk_msg(d->udev,
430 usb_rcvbulkpipe(d->udev, p->endpoint),
431 junk, junk_len, &rd_count, timeout) < 0)
432 break;
433 if (!rd_count)
434 break;
435 }
436 kfree(junk);
437}
438
439static int cxusb_d680_dmb_streaming_ctrl(
440 struct dvb_usb_adapter *adap, int onoff)
441{
442 if (onoff) {
443 u8 buf[2] = { 0x03, 0x00 };
444 cxusb_d680_dmb_drain_video(adap->dev);
445 return cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON,
446 buf, sizeof(buf), NULL, 0);
447 } else {
448 int ret = cxusb_ctrl_msg(adap->dev,
449 CMD_STREAMING_OFF, NULL, 0, NULL, 0);
450 return ret;
451 }
452}
453
Sean Young517b5002016-11-20 07:45:52 -0200454static int cxusb_rc_query(struct dvb_usb_device *d)
Chris Pascoe7c239702006-01-09 18:21:29 -0200455{
Michael Krufkya07e6092006-01-09 18:21:31 -0200456 u8 ircode[4];
Chris Pascoe7c239702006-01-09 18:21:29 -0200457
Michael Krufkya07e6092006-01-09 18:21:31 -0200458 cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4);
Chris Pascoe7c239702006-01-09 18:21:29 -0200459
Sean Young517b5002016-11-20 07:45:52 -0200460 if (ircode[2] || ircode[3])
Sean Young207c9572017-02-04 17:00:36 -0200461 rc_keydown(d->rc_dev, RC_TYPE_NEC,
462 RC_SCANCODE_NEC(~ircode[2] & 0xff, ircode[3]), 0);
Chris Pascoe7c239702006-01-09 18:21:29 -0200463 return 0;
464}
465
Sean Young517b5002016-11-20 07:45:52 -0200466static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d)
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300467{
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300468 u8 ircode[4];
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300469 struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
470 .buf = ircode, .len = 4 };
471
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300472 if (cxusb_i2c_xfer(&d->i2c_adap, &msg, 1) != 1)
473 return 0;
474
Sean Young517b5002016-11-20 07:45:52 -0200475 if (ircode[1] || ircode[2])
Sean Young207c9572017-02-04 17:00:36 -0200476 rc_keydown(d->rc_dev, RC_TYPE_NEC,
477 RC_SCANCODE_NEC(~ircode[1] & 0xff, ircode[2]), 0);
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300478 return 0;
479}
480
Sean Young517b5002016-11-20 07:45:52 -0200481static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d)
Timothy Leedfbdce02008-08-09 13:36:51 -0300482{
Timothy Leedfbdce02008-08-09 13:36:51 -0300483 u8 ircode[2];
Timothy Leedfbdce02008-08-09 13:36:51 -0300484
485 if (cxusb_ctrl_msg(d, 0x10, NULL, 0, ircode, 2) < 0)
486 return 0;
487
Sean Young517b5002016-11-20 07:45:52 -0200488 if (ircode[0] || ircode[1])
489 rc_keydown(d->rc_dev, RC_TYPE_UNKNOWN,
490 RC_SCANCODE_RC5(ircode[0], ircode[1]), 0);
Timothy Leedfbdce02008-08-09 13:36:51 -0300491 return 0;
492}
493
Chris Pascoe0029ee12006-01-09 18:21:28 -0200494static int cxusb_dee1601_demod_init(struct dvb_frontend* fe)
495{
Chris Pascoed9ed8812006-02-07 06:49:11 -0200496 static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x28 };
Chris Pascoe0029ee12006-01-09 18:21:28 -0200497 static u8 reset [] = { RESET, 0x80 };
498 static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
499 static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0x20 };
500 static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
501 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
502
503 mt352_write(fe, clock_config, sizeof(clock_config));
504 udelay(200);
505 mt352_write(fe, reset, sizeof(reset));
506 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
507
508 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
509 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
510 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
511
512 return 0;
513}
514
Michael Krufky6f447252006-01-11 19:40:33 -0200515static int cxusb_mt352_demod_init(struct dvb_frontend* fe)
516{ /* used in both lgz201 and th7579 */
Michael Krufkyfb51fd22006-02-07 06:49:12 -0200517 static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x29 };
Michael Krufky6f447252006-01-11 19:40:33 -0200518 static u8 reset [] = { RESET, 0x80 };
519 static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
520 static u8 agc_cfg [] = { AGC_TARGET, 0x24, 0x20 };
521 static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
522 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
523
524 mt352_write(fe, clock_config, sizeof(clock_config));
525 udelay(200);
526 mt352_write(fe, reset, sizeof(reset));
527 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
528
529 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
530 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
531 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
532 return 0;
533}
534
Adrian Bunk703cb2c2006-01-23 17:11:09 -0200535static struct cx22702_config cxusb_cx22702_config = {
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700536 .demod_address = 0x63,
Patrick Boettcher8257e8a2005-07-07 17:58:15 -0700537 .output_mode = CX22702_PARALLEL_OUTPUT,
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700538};
539
Michael Krufkyfddd6322006-02-27 00:08:17 -0300540static struct lgdt330x_config cxusb_lgdt3303_config = {
Michael Krufkyeffee032006-01-09 15:25:47 -0200541 .demod_address = 0x0e,
542 .demod_chip = LGDT3303,
Michael Krufkyeffee032006-01-09 15:25:47 -0200543};
544
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300545static struct lgdt330x_config cxusb_aver_lgdt3303_config = {
546 .demod_address = 0x0e,
547 .demod_chip = LGDT3303,
548 .clock_polarity_flip = 2,
549};
550
Adrian Bunk703cb2c2006-01-23 17:11:09 -0200551static struct mt352_config cxusb_dee1601_config = {
Chris Pascoe0029ee12006-01-09 18:21:28 -0200552 .demod_address = 0x0f,
553 .demod_init = cxusb_dee1601_demod_init,
Chris Pascoe0029ee12006-01-09 18:21:28 -0200554};
555
Michael Krufkyc9ce3942006-06-11 04:24:31 -0300556static struct zl10353_config cxusb_zl10353_dee1601_config = {
557 .demod_address = 0x0f,
Chris Pascoe8fb95782006-08-10 03:17:16 -0300558 .parallel_ts = 1,
Michael Krufkyc9ce3942006-06-11 04:24:31 -0300559};
560
Adrian Bunk6fe00b02006-04-19 20:49:28 -0300561static struct mt352_config cxusb_mt352_config = {
Michael Krufky6f447252006-01-11 19:40:33 -0200562 /* used in both lgz201 and th7579 */
563 .demod_address = 0x0f,
564 .demod_init = cxusb_mt352_demod_init,
Michael Krufky6f447252006-01-11 19:40:33 -0200565};
566
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300567static struct zl10353_config cxusb_zl10353_xc3028_config = {
568 .demod_address = 0x0f,
Chris Pascoea1dcd9d2007-11-20 08:17:54 -0300569 .if2 = 45600,
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300570 .no_tuner = 1,
571 .parallel_ts = 1,
572};
573
Robert Lowery0bc35182009-11-08 00:00:11 -0300574static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = {
575 .demod_address = 0x0f,
576 .if2 = 45600,
577 .no_tuner = 1,
578 .parallel_ts = 1,
579 .disable_i2c_gate_ctrl = 1,
580};
581
Chris Pascoe702a6762007-11-20 03:34:11 -0300582static struct mt352_config cxusb_mt352_xc3028_config = {
583 .demod_address = 0x0f,
584 .if2 = 4560,
585 .no_tuner = 1,
586 .demod_init = cxusb_mt352_demod_init,
587};
588
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300589/* FIXME: needs tweaking */
590static struct mxl5005s_config aver_a868r_tuner = {
591 .i2c_address = 0x63,
592 .if_freq = 6000000UL,
593 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
594 .agc_mode = MXL_SINGLE_AGC,
595 .tracking_filter = MXL_TF_C,
596 .rssi_enable = MXL_RSSI_ENABLE,
597 .cap_select = MXL_CAP_SEL_ENABLE,
598 .div_out = MXL_DIV_OUT_4,
599 .clock_out = MXL_CLOCK_OUT_DISABLE,
600 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
601 .top = MXL5005S_TOP_25P2,
602 .mod_mode = MXL_DIGITAL_MODE,
603 .if_mode = MXL_ZERO_IF,
604 .AgcMasterByte = 0x00,
605};
606
Timothy Leedfbdce02008-08-09 13:36:51 -0300607/* FIXME: needs tweaking */
608static struct mxl5005s_config d680_dmb_tuner = {
609 .i2c_address = 0x63,
610 .if_freq = 36125000UL,
611 .xtal_freq = CRYSTAL_FREQ_16000000HZ,
612 .agc_mode = MXL_SINGLE_AGC,
613 .tracking_filter = MXL_TF_C,
614 .rssi_enable = MXL_RSSI_ENABLE,
615 .cap_select = MXL_CAP_SEL_ENABLE,
616 .div_out = MXL_DIV_OUT_4,
617 .clock_out = MXL_CLOCK_OUT_DISABLE,
618 .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
619 .top = MXL5005S_TOP_25P2,
620 .mod_mode = MXL_DIGITAL_MODE,
621 .if_mode = MXL_ZERO_IF,
622 .AgcMasterByte = 0x00,
623};
624
David Wongb18bd1d2009-10-26 09:41:22 -0300625static struct max2165_config mygica_d689_max2165_cfg = {
626 .i2c_address = 0x60,
627 .osc_clk = 20
628};
629
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700630/* Callbacks for DVB USB */
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300631static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700632{
Michael Krufky77eed212011-09-06 09:31:57 -0300633 dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
Michael Krufkycb89cd32008-04-22 14:46:16 -0300634 &adap->dev->i2c_adap, 0x61,
635 TUNER_PHILIPS_FMD1216ME_MK3);
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700636 return 0;
637}
638
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300639static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
Chris Pascoe0029ee12006-01-09 18:21:28 -0200640{
Michael Krufky77eed212011-09-06 09:31:57 -0300641 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61,
Michael Krufky47a99912007-06-12 16:10:51 -0300642 NULL, DVB_PLL_THOMSON_DTT7579);
Chris Pascoe0029ee12006-01-09 18:21:28 -0200643 return 0;
644}
645
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300646static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
Michael Krufky6f447252006-01-11 19:40:33 -0200647{
Michael Krufky77eed212011-09-06 09:31:57 -0300648 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_LG_Z201);
Michael Krufky6f447252006-01-11 19:40:33 -0200649 return 0;
650}
651
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300652static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
Michael Krufky6f447252006-01-11 19:40:33 -0200653{
Michael Krufky77eed212011-09-06 09:31:57 -0300654 dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
Michael Krufky47a99912007-06-12 16:10:51 -0300655 NULL, DVB_PLL_THOMSON_DTT7579);
Patrick Boettcher332bed52006-05-14 04:49:00 -0300656 return 0;
657}
658
Michael Krufkyf71a56c2006-10-13 21:55:57 -0300659static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
Patrick Boettcher332bed52006-05-14 04:49:00 -0300660{
Michael Krufky77eed212011-09-06 09:31:57 -0300661 dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
Michael Krufky827855d2008-04-22 14:46:16 -0300662 &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
Michael Krufky6f447252006-01-11 19:40:33 -0200663 return 0;
664}
665
Michael Krufkyd7cba042008-09-12 13:31:45 -0300666static int dvico_bluebird_xc2028_callback(void *ptr, int component,
667 int command, int arg)
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300668{
Robert Loweryd483b732008-07-30 19:43:11 -0300669 struct dvb_usb_adapter *adap = ptr;
670 struct dvb_usb_device *d = adap->dev;
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300671
672 switch (command) {
673 case XC2028_TUNER_RESET:
Harvey Harrison708bebd2008-04-08 23:20:00 -0300674 deb_info("%s: XC2028_TUNER_RESET %d\n", __func__, arg);
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300675 cxusb_bluebird_gpio_pulse(d, 0x01, 1);
676 break;
677 case XC2028_RESET_CLK:
Harvey Harrison708bebd2008-04-08 23:20:00 -0300678 deb_info("%s: XC2028_RESET_CLK %d\n", __func__, arg);
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300679 break;
680 default:
Harvey Harrison708bebd2008-04-08 23:20:00 -0300681 deb_info("%s: unknown command %d, arg %d\n", __func__,
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300682 command, arg);
683 return -EINVAL;
684 }
685
686 return 0;
687}
688
689static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
690{
691 struct dvb_frontend *fe;
692 struct xc2028_config cfg = {
693 .i2c_adap = &adap->dev->i2c_adap,
694 .i2c_addr = 0x61,
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300695 };
696 static struct xc2028_ctrl ctl = {
Michael Krufkyef80bfe2008-09-16 02:15:30 -0300697 .fname = XC2028_DEFAULT_FIRMWARE,
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300698 .max_len = 64,
Robert Loweryd483b732008-07-30 19:43:11 -0300699 .demod = XC3028_FE_ZARLINK456,
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300700 };
701
Michael Krufkyd7cba042008-09-12 13:31:45 -0300702 /* FIXME: generalize & move to common area */
Michael Krufky77eed212011-09-06 09:31:57 -0300703 adap->fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
Michael Krufkyd7cba042008-09-12 13:31:45 -0300704
Michael Krufky77eed212011-09-06 09:31:57 -0300705 fe = dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &cfg);
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300706 if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
707 return -EIO;
708
709 fe->ops.tuner_ops.set_config(fe, &ctl);
710
711 return 0;
712}
713
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300714static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
715{
Michael Krufky77eed212011-09-06 09:31:57 -0300716 dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300717 &adap->dev->i2c_adap, &aver_a868r_tuner);
718 return 0;
719}
720
Timothy Leedfbdce02008-08-09 13:36:51 -0300721static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
722{
723 struct dvb_frontend *fe;
Michael Krufky77eed212011-09-06 09:31:57 -0300724 fe = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
Timothy Leedfbdce02008-08-09 13:36:51 -0300725 &adap->dev->i2c_adap, &d680_dmb_tuner);
726 return (fe == NULL) ? -EIO : 0;
727}
728
David Wongb18bd1d2009-10-26 09:41:22 -0300729static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
730{
731 struct dvb_frontend *fe;
Michael Krufky77eed212011-09-06 09:31:57 -0300732 fe = dvb_attach(max2165_attach, adap->fe_adap[0].fe,
David Wongb18bd1d2009-10-26 09:41:22 -0300733 &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
734 return (fe == NULL) ? -EIO : 0;
735}
736
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300737static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700738{
Patrick Boettchere2efeab2005-09-09 13:02:51 -0700739 u8 b;
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300740 if (usb_set_interface(adap->dev->udev, 0, 6) < 0)
Patrick Boettcher8257e8a2005-07-07 17:58:15 -0700741 err("set interface failed");
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700742
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300743 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700744
Michael Krufky310df362011-09-17 14:22:59 -0300745 adap->fe_adap[0].fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
746 &adap->dev->i2c_adap);
747 if ((adap->fe_adap[0].fe) != NULL)
Patrick Boettcher22c6d932005-07-07 17:58:10 -0700748 return 0;
749
750 return -EIO;
751}
752
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300753static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
Michael Krufkyeffee032006-01-09 15:25:47 -0200754{
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300755 if (usb_set_interface(adap->dev->udev, 0, 7) < 0)
Michael Krufkyeffee032006-01-09 15:25:47 -0200756 err("set interface failed");
757
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300758 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
Michael Krufkyeffee032006-01-09 15:25:47 -0200759
Michael Krufky310df362011-09-17 14:22:59 -0300760 adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach,
761 &cxusb_lgdt3303_config,
762 &adap->dev->i2c_adap);
763 if ((adap->fe_adap[0].fe) != NULL)
Michael Krufkyeffee032006-01-09 15:25:47 -0200764 return 0;
765
766 return -EIO;
767}
768
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300769static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
770{
Michael Krufky77eed212011-09-06 09:31:57 -0300771 adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300772 &adap->dev->i2c_adap);
Michael Krufky77eed212011-09-06 09:31:57 -0300773 if (adap->fe_adap[0].fe != NULL)
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -0300774 return 0;
775
776 return -EIO;
777}
778
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300779static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
Chris Pascoe0029ee12006-01-09 18:21:28 -0200780{
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300781 /* used in both lgz201 and th7579 */
782 if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
Chris Pascoe0029ee12006-01-09 18:21:28 -0200783 err("set interface failed");
784
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300785 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
Chris Pascoe0029ee12006-01-09 18:21:28 -0200786
Michael Krufky310df362011-09-17 14:22:59 -0300787 adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
788 &adap->dev->i2c_adap);
789 if ((adap->fe_adap[0].fe) != NULL)
Patrick Boettcher4d43e132006-09-30 06:53:48 -0300790 return 0;
791
792 return -EIO;
793}
794
795static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
796{
797 if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
798 err("set interface failed");
799
800 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
801
Michael Krufky310df362011-09-17 14:22:59 -0300802 adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
803 &adap->dev->i2c_adap);
804 if ((adap->fe_adap[0].fe) != NULL)
805 return 0;
806
807 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
808 &cxusb_zl10353_dee1601_config,
809 &adap->dev->i2c_adap);
810 if ((adap->fe_adap[0].fe) != NULL)
Chris Pascoe0029ee12006-01-09 18:21:28 -0200811 return 0;
812
813 return -EIO;
814}
815
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300816static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
817{
818 u8 ircode[4];
819 int i;
820 struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
821 .buf = ircode, .len = 4 };
822
823 if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
824 err("set interface failed");
825
826 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
827
828 /* reset the tuner and demodulator */
829 cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
830 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
831 cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
832
Michael Krufky310df362011-09-17 14:22:59 -0300833 adap->fe_adap[0].fe =
834 dvb_attach(zl10353_attach,
835 &cxusb_zl10353_xc3028_config_no_i2c_gate,
836 &adap->dev->i2c_adap);
837 if ((adap->fe_adap[0].fe) == NULL)
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300838 return -EIO;
839
840 /* try to determine if there is no IR decoder on the I2C bus */
Sean Young517b5002016-11-20 07:45:52 -0200841 for (i = 0; adap->dev->props.rc.core.rc_codes && i < 5; i++) {
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300842 msleep(20);
843 if (cxusb_i2c_xfer(&adap->dev->i2c_adap, &msg, 1) != 1)
844 goto no_IR;
845 if (ircode[0] == 0 && ircode[1] == 0)
846 continue;
847 if (ircode[2] + ircode[3] != 0xff) {
848no_IR:
Sean Young517b5002016-11-20 07:45:52 -0200849 adap->dev->props.rc.core.rc_codes = NULL;
Chris Pascoeaeb012b2007-11-19 21:57:10 -0300850 info("No IR receiver detected on this device.");
851 break;
852 }
853 }
854
855 return 0;
856}
857
Anton Blanchard8d798982008-08-09 12:23:15 -0300858static struct dibx000_agc_config dib7070_agc_config = {
859 .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
860
861 /*
862 * P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5,
863 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
864 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0
865 */
866 .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) |
867 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
868 .inv_gain = 600,
869 .time_stabiliz = 10,
870 .alpha_level = 0,
871 .thlock = 118,
872 .wbd_inv = 0,
873 .wbd_ref = 3530,
874 .wbd_sel = 1,
875 .wbd_alpha = 5,
876 .agc1_max = 65535,
877 .agc1_min = 0,
878 .agc2_max = 65535,
879 .agc2_min = 0,
880 .agc1_pt1 = 0,
881 .agc1_pt2 = 40,
882 .agc1_pt3 = 183,
883 .agc1_slope1 = 206,
884 .agc1_slope2 = 255,
885 .agc2_pt1 = 72,
886 .agc2_pt2 = 152,
887 .agc2_slope1 = 88,
888 .agc2_slope2 = 90,
889 .alpha_mant = 17,
890 .alpha_exp = 27,
891 .beta_mant = 23,
892 .beta_exp = 51,
893 .perform_agc_softsplit = 0,
894};
895
896static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
897 .internal = 60000,
898 .sampling = 15000,
899 .pll_prediv = 1,
900 .pll_ratio = 20,
901 .pll_range = 3,
902 .pll_reset = 1,
903 .pll_bypass = 0,
904 .enable_refdiv = 0,
905 .bypclk_div = 0,
906 .IO_CLK_en_core = 1,
907 .ADClkSrc = 1,
908 .modulo = 2,
909 /* refsel, sel, freq_15k */
910 .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
911 .ifreq = (0 << 25) | 0,
912 .timf = 20452225,
913 .xtal_hz = 12000000,
914};
915
916static struct dib7000p_config cxusb_dualdig4_rev2_config = {
917 .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
918 .output_mpeg2_in_188_bytes = 1,
919
920 .agc_config_count = 1,
921 .agc = &dib7070_agc_config,
922 .bw = &dib7070_bw_config_12_mhz,
923 .tuner_is_baseband = 1,
924 .spur_protect = 1,
925
926 .gpio_dir = 0xfcef,
927 .gpio_val = 0x0110,
928
929 .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
930
931 .hostbus_diversity = 1,
932};
933
Mauro Carvalho Chehab8abe4a02014-05-29 09:20:15 -0300934struct dib0700_adapter_state {
935 int (*set_param_save)(struct dvb_frontend *);
936 struct dib7000p_ops dib7000p_ops;
937};
938
Anton Blanchard8d798982008-08-09 12:23:15 -0300939static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
940{
Mauro Carvalho Chehab8abe4a02014-05-29 09:20:15 -0300941 struct dib0700_adapter_state *state = adap->priv;
942
Anton Blanchard8d798982008-08-09 12:23:15 -0300943 if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
944 err("set interface failed");
945
946 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
947
948 cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
949
Mauro Carvalho Chehab8abe4a02014-05-29 09:20:15 -0300950 if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
951 return -ENODEV;
952
953 if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
954 &cxusb_dualdig4_rev2_config) < 0) {
Prarit Bhargavaa49ba162010-05-12 19:30:02 -0300955 printk(KERN_WARNING "Unable to enumerate dib7000p\n");
Randy Dunlap30d81bb2010-02-08 20:30:44 -0300956 return -ENODEV;
Prarit Bhargavaa49ba162010-05-12 19:30:02 -0300957 }
Anton Blanchard8d798982008-08-09 12:23:15 -0300958
Mauro Carvalho Chehab8abe4a02014-05-29 09:20:15 -0300959 adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
960 &cxusb_dualdig4_rev2_config);
Michael Krufky77eed212011-09-06 09:31:57 -0300961 if (adap->fe_adap[0].fe == NULL)
Anton Blanchard8d798982008-08-09 12:23:15 -0300962 return -EIO;
963
964 return 0;
965}
966
967static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
968{
Mauro Carvalho Chehab8abe4a02014-05-29 09:20:15 -0300969 struct dvb_usb_adapter *adap = fe->dvb->priv;
970 struct dib0700_adapter_state *state = adap->priv;
971
972 return state->dib7000p_ops.set_gpio(fe, 8, 0, !onoff);
Anton Blanchard8d798982008-08-09 12:23:15 -0300973}
974
975static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
976{
977 return 0;
978}
979
980static struct dib0070_config dib7070p_dib0070_config = {
981 .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
982 .reset = dib7070_tuner_reset,
983 .sleep = dib7070_tuner_sleep,
984 .clock_khz = 12000,
985};
986
Mauro Carvalho Chehab14d24d12011-12-24 12:24:33 -0300987static int dib7070_set_param_override(struct dvb_frontend *fe)
Anton Blanchard8d798982008-08-09 12:23:15 -0300988{
Mauro Carvalho Chehabafd2b382011-12-24 10:17:30 -0300989 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
Anton Blanchard8d798982008-08-09 12:23:15 -0300990 struct dvb_usb_adapter *adap = fe->dvb->priv;
991 struct dib0700_adapter_state *state = adap->priv;
992
993 u16 offset;
Mauro Carvalho Chehabafd2b382011-12-24 10:17:30 -0300994 u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
Anton Blanchard8d798982008-08-09 12:23:15 -0300995 switch (band) {
Michael Krufkya2dc86b2008-08-09 13:06:26 -0300996 case BAND_VHF: offset = 950; break;
997 default:
998 case BAND_UHF: offset = 550; break;
Anton Blanchard8d798982008-08-09 12:23:15 -0300999 }
1000
Mauro Carvalho Chehab8abe4a02014-05-29 09:20:15 -03001001 state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
Anton Blanchard8d798982008-08-09 12:23:15 -03001002
Mauro Carvalho Chehab14d24d12011-12-24 12:24:33 -03001003 return state->set_param_save(fe);
Anton Blanchard8d798982008-08-09 12:23:15 -03001004}
1005
1006static int cxusb_dualdig4_rev2_tuner_attach(struct dvb_usb_adapter *adap)
1007{
1008 struct dib0700_adapter_state *st = adap->priv;
Mauro Carvalho Chehab8abe4a02014-05-29 09:20:15 -03001009 struct i2c_adapter *tun_i2c;
1010
1011 /*
1012 * No need to call dvb7000p_attach here, as it was called
1013 * already, as frontend_attach method is called first, and
1014 * tuner_attach is only called on sucess.
1015 */
1016 tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
Michael Krufkya2dc86b2008-08-09 13:06:26 -03001017 DIBX000_I2C_INTERFACE_TUNER, 1);
Anton Blanchard8d798982008-08-09 12:23:15 -03001018
Michael Krufky77eed212011-09-06 09:31:57 -03001019 if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
Anton Blanchard8d798982008-08-09 12:23:15 -03001020 &dib7070p_dib0070_config) == NULL)
1021 return -ENODEV;
1022
Michael Krufky77eed212011-09-06 09:31:57 -03001023 st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1024 adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
Anton Blanchard8d798982008-08-09 12:23:15 -03001025 return 0;
1026}
1027
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001028static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
1029{
1030 if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
1031 err("set interface failed");
1032
1033 cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
1034
1035 /* reset the tuner and demodulator */
1036 cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
1037 cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
1038 cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
1039
Michael Krufky310df362011-09-17 14:22:59 -03001040 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
1041 &cxusb_zl10353_xc3028_config,
1042 &adap->dev->i2c_adap);
1043 if ((adap->fe_adap[0].fe) != NULL)
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001044 return 0;
1045
Michael Krufky310df362011-09-17 14:22:59 -03001046 adap->fe_adap[0].fe = dvb_attach(mt352_attach,
1047 &cxusb_mt352_xc3028_config,
1048 &adap->dev->i2c_adap);
1049 if ((adap->fe_adap[0].fe) != NULL)
Chris Pascoe702a6762007-11-20 03:34:11 -03001050 return 0;
1051
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001052 return -EIO;
1053}
1054
David T.L. Wong6bf1a992009-08-05 13:07:10 -03001055static struct lgs8gxx_config d680_lgs8gl5_cfg = {
1056 .prod = LGS8GXX_PROD_LGS8GL5,
Timothy Leedfbdce02008-08-09 13:36:51 -03001057 .demod_address = 0x19,
David T.L. Wong6bf1a992009-08-05 13:07:10 -03001058 .serial_ts = 0,
1059 .ts_clk_pol = 0,
1060 .ts_clk_gated = 1,
1061 .if_clk_freq = 30400, /* 30.4 MHz */
1062 .if_freq = 5725, /* 5.725 MHz */
1063 .if_neg_center = 0,
1064 .ext_adc = 0,
1065 .adc_signed = 0,
1066 .if_neg_edge = 0,
Timothy Leedfbdce02008-08-09 13:36:51 -03001067};
1068
1069static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
1070{
1071 struct dvb_usb_device *d = adap->dev;
1072 int n;
1073
1074 /* Select required USB configuration */
1075 if (usb_set_interface(d->udev, 0, 0) < 0)
1076 err("set interface failed");
1077
1078 /* Unblock all USB pipes */
1079 usb_clear_halt(d->udev,
1080 usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1081 usb_clear_halt(d->udev,
1082 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1083 usb_clear_halt(d->udev,
Michael Krufky77eed212011-09-06 09:31:57 -03001084 usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
Timothy Leedfbdce02008-08-09 13:36:51 -03001085
1086 /* Drain USB pipes to avoid hang after reboot */
1087 for (n = 0; n < 5; n++) {
1088 cxusb_d680_dmb_drain_message(d);
1089 cxusb_d680_dmb_drain_video(d);
1090 msleep(200);
1091 }
1092
1093 /* Reset the tuner */
1094 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1095 err("clear tuner gpio failed");
1096 return -EIO;
1097 }
1098 msleep(100);
1099 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1100 err("set tuner gpio failed");
1101 return -EIO;
1102 }
1103 msleep(100);
1104
1105 /* Attach frontend */
Michael Krufky77eed212011-09-06 09:31:57 -03001106 adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
1107 if (adap->fe_adap[0].fe == NULL)
Timothy Leedfbdce02008-08-09 13:36:51 -03001108 return -EIO;
1109
1110 return 0;
1111}
1112
David Wongb18bd1d2009-10-26 09:41:22 -03001113static struct atbm8830_config mygica_d689_atbm8830_cfg = {
1114 .prod = ATBM8830_PROD_8830,
1115 .demod_address = 0x40,
1116 .serial_ts = 0,
1117 .ts_sampling_edge = 1,
1118 .ts_clk_gated = 0,
1119 .osc_clk_freq = 30400, /* in kHz */
1120 .if_freq = 0, /* zero IF */
1121 .zif_swap_iq = 1,
David Wongc245c752009-11-28 08:36:31 -03001122 .agc_min = 0x2E,
1123 .agc_max = 0x90,
1124 .agc_hold_loop = 0,
David Wongb18bd1d2009-10-26 09:41:22 -03001125};
1126
1127static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
1128{
1129 struct dvb_usb_device *d = adap->dev;
David Wongb18bd1d2009-10-26 09:41:22 -03001130
1131 /* Select required USB configuration */
1132 if (usb_set_interface(d->udev, 0, 0) < 0)
1133 err("set interface failed");
1134
1135 /* Unblock all USB pipes */
1136 usb_clear_halt(d->udev,
1137 usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1138 usb_clear_halt(d->udev,
1139 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1140 usb_clear_halt(d->udev,
Michael Krufky77eed212011-09-06 09:31:57 -03001141 usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
David Wongb18bd1d2009-10-26 09:41:22 -03001142
1143
1144 /* Reset the tuner */
1145 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1146 err("clear tuner gpio failed");
1147 return -EIO;
1148 }
1149 msleep(100);
1150 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1151 err("set tuner gpio failed");
1152 return -EIO;
1153 }
1154 msleep(100);
1155
1156 /* Attach frontend */
Michael Krufky77eed212011-09-06 09:31:57 -03001157 adap->fe_adap[0].fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
David Wongb18bd1d2009-10-26 09:41:22 -03001158 &d->i2c_adap);
Michael Krufky77eed212011-09-06 09:31:57 -03001159 if (adap->fe_adap[0].fe == NULL)
David Wongb18bd1d2009-10-26 09:41:22 -03001160 return -EIO;
1161
1162 return 0;
1163}
1164
CrazyCata0f629b2014-11-14 18:24:28 -03001165static int cxusb_mygica_t230_frontend_attach(struct dvb_usb_adapter *adap)
1166{
1167 struct dvb_usb_device *d = adap->dev;
1168 struct cxusb_state *st = d->priv;
1169 struct i2c_adapter *adapter;
1170 struct i2c_client *client_demod;
1171 struct i2c_client *client_tuner;
1172 struct i2c_board_info info;
1173 struct si2168_config si2168_config;
1174 struct si2157_config si2157_config;
1175
1176 /* Select required USB configuration */
1177 if (usb_set_interface(d->udev, 0, 0) < 0)
1178 err("set interface failed");
1179
1180 /* Unblock all USB pipes */
1181 usb_clear_halt(d->udev,
1182 usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1183 usb_clear_halt(d->udev,
1184 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1185 usb_clear_halt(d->udev,
1186 usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1187
1188 /* attach frontend */
1189 si2168_config.i2c_adapter = &adapter;
1190 si2168_config.fe = &adap->fe_adap[0].fe;
1191 si2168_config.ts_mode = SI2168_TS_PARALLEL;
1192 si2168_config.ts_clock_inv = 1;
1193 memset(&info, 0, sizeof(struct i2c_board_info));
1194 strlcpy(info.type, "si2168", I2C_NAME_SIZE);
1195 info.addr = 0x64;
1196 info.platform_data = &si2168_config;
1197 request_module(info.type);
1198 client_demod = i2c_new_device(&d->i2c_adap, &info);
1199 if (client_demod == NULL || client_demod->dev.driver == NULL)
1200 return -ENODEV;
1201
1202 if (!try_module_get(client_demod->dev.driver->owner)) {
1203 i2c_unregister_device(client_demod);
1204 return -ENODEV;
1205 }
1206
1207 st->i2c_client_demod = client_demod;
1208
1209 /* attach tuner */
1210 memset(&si2157_config, 0, sizeof(si2157_config));
1211 si2157_config.fe = adap->fe_adap[0].fe;
Olli Salonenee3c3e42015-05-05 13:54:17 -03001212 si2157_config.if_port = 1;
CrazyCata0f629b2014-11-14 18:24:28 -03001213 memset(&info, 0, sizeof(struct i2c_board_info));
1214 strlcpy(info.type, "si2157", I2C_NAME_SIZE);
1215 info.addr = 0x60;
1216 info.platform_data = &si2157_config;
1217 request_module(info.type);
1218 client_tuner = i2c_new_device(adapter, &info);
1219 if (client_tuner == NULL || client_tuner->dev.driver == NULL) {
1220 module_put(client_demod->dev.driver->owner);
1221 i2c_unregister_device(client_demod);
1222 return -ENODEV;
1223 }
1224 if (!try_module_get(client_tuner->dev.driver->owner)) {
1225 i2c_unregister_device(client_tuner);
1226 module_put(client_demod->dev.driver->owner);
1227 i2c_unregister_device(client_demod);
1228 return -ENODEV;
1229 }
1230
1231 st->i2c_client_tuner = client_tuner;
1232
CrazyCat5fa88152016-10-21 17:35:40 -02001233 /* hook fe: need to resync the slave fifo when signal locks. */
1234 mutex_init(&st->stream_mutex);
1235 st->last_lock = 0;
1236 st->fe_read_status = adap->fe_adap[0].fe->ops.read_status;
1237 adap->fe_adap[0].fe->ops.read_status = cxusb_read_status;
1238
CrazyCata0f629b2014-11-14 18:24:28 -03001239 return 0;
1240}
1241
Evgeny Plehovf8585ce62017-02-07 19:37:01 -02001242static int cxusb_mygica_t230c_frontend_attach(struct dvb_usb_adapter *adap)
1243{
1244 struct dvb_usb_device *d = adap->dev;
1245 struct cxusb_state *st = d->priv;
1246 struct i2c_adapter *adapter;
1247 struct i2c_client *client_demod;
1248 struct i2c_client *client_tuner;
1249 struct i2c_board_info info;
1250 struct si2168_config si2168_config;
1251 struct si2157_config si2157_config;
1252
1253 /* Select required USB configuration */
1254 if (usb_set_interface(d->udev, 0, 0) < 0)
1255 err("set interface failed");
1256
1257 /* Unblock all USB pipes */
1258 usb_clear_halt(d->udev,
1259 usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1260 usb_clear_halt(d->udev,
1261 usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1262 usb_clear_halt(d->udev,
1263 usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1264
1265 /* attach frontend */
1266 memset(&si2168_config, 0, sizeof(si2168_config));
1267 si2168_config.i2c_adapter = &adapter;
1268 si2168_config.fe = &adap->fe_adap[0].fe;
1269 si2168_config.ts_mode = SI2168_TS_PARALLEL;
1270 si2168_config.ts_clock_inv = 1;
1271 memset(&info, 0, sizeof(struct i2c_board_info));
1272 strlcpy(info.type, "si2168", I2C_NAME_SIZE);
1273 info.addr = 0x64;
1274 info.platform_data = &si2168_config;
1275 request_module(info.type);
1276 client_demod = i2c_new_device(&d->i2c_adap, &info);
1277 if (client_demod == NULL || client_demod->dev.driver == NULL)
1278 return -ENODEV;
1279
1280 if (!try_module_get(client_demod->dev.driver->owner)) {
1281 i2c_unregister_device(client_demod);
1282 return -ENODEV;
1283 }
1284
1285 /* attach tuner */
1286 memset(&si2157_config, 0, sizeof(si2157_config));
1287 si2157_config.fe = adap->fe_adap[0].fe;
1288 memset(&info, 0, sizeof(struct i2c_board_info));
1289 strlcpy(info.type, "si2141", I2C_NAME_SIZE);
1290 info.addr = 0x60;
1291 info.platform_data = &si2157_config;
1292 request_module("si2157");
1293 client_tuner = i2c_new_device(adapter, &info);
1294 if (client_tuner == NULL || client_tuner->dev.driver == NULL) {
1295 module_put(client_demod->dev.driver->owner);
1296 i2c_unregister_device(client_demod);
1297 return -ENODEV;
1298 }
1299 if (!try_module_get(client_tuner->dev.driver->owner)) {
1300 i2c_unregister_device(client_tuner);
1301 module_put(client_demod->dev.driver->owner);
1302 i2c_unregister_device(client_demod);
1303 return -ENODEV;
1304 }
1305
1306 st->i2c_client_demod = client_demod;
1307 st->i2c_client_tuner = client_tuner;
1308
1309 /* hook fe: need to resync the slave fifo when signal locks. */
1310 mutex_init(&st->stream_mutex);
1311 st->last_lock = 0;
1312 st->fe_read_status = adap->fe_adap[0].fe->ops.read_status;
1313 adap->fe_adap[0].fe->ops.read_status = cxusb_read_status;
1314
1315 return 0;
1316}
1317
Patrick Boettcherf5373782006-01-09 18:21:38 -02001318/*
Chris Pascoe702a6762007-11-20 03:34:11 -03001319 * DViCO has shipped two devices with the same USB ID, but only one of them
1320 * needs a firmware download. Check the device class details to see if they
1321 * have non-default values to decide whether the device is actually cold or
1322 * not, and forget a match if it turns out we selected the wrong device.
1323 */
1324static int bluebird_fx2_identify_state(struct usb_device *udev,
1325 struct dvb_usb_device_properties *props,
1326 struct dvb_usb_device_description **desc,
1327 int *cold)
1328{
1329 int wascold = *cold;
1330
1331 *cold = udev->descriptor.bDeviceClass == 0xff &&
1332 udev->descriptor.bDeviceSubClass == 0xff &&
1333 udev->descriptor.bDeviceProtocol == 0xff;
1334
1335 if (*cold && !wascold)
1336 *desc = NULL;
1337
1338 return 0;
1339}
1340
1341/*
Patrick Boettcherf5373782006-01-09 18:21:38 -02001342 * DViCO bluebird firmware needs the "warm" product ID to be patched into the
1343 * firmware file before download.
1344 */
1345
Chris Pascoe702a6762007-11-20 03:34:11 -03001346static const int dvico_firmware_id_offsets[] = { 6638, 3204 };
Michael Krufkyf35db232006-12-05 14:53:39 -03001347static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
1348 const struct firmware *fw)
Patrick Boettcherf5373782006-01-09 18:21:38 -02001349{
Chris Pascoe702a6762007-11-20 03:34:11 -03001350 int pos;
Patrick Boettcherf5373782006-01-09 18:21:38 -02001351
Chris Pascoe702a6762007-11-20 03:34:11 -03001352 for (pos = 0; pos < ARRAY_SIZE(dvico_firmware_id_offsets); pos++) {
1353 int idoff = dvico_firmware_id_offsets[pos];
Patrick Boettcherf5373782006-01-09 18:21:38 -02001354
Chris Pascoe702a6762007-11-20 03:34:11 -03001355 if (fw->size < idoff + 4)
1356 continue;
Patrick Boettcherf5373782006-01-09 18:21:38 -02001357
Chris Pascoe702a6762007-11-20 03:34:11 -03001358 if (fw->data[idoff] == (USB_VID_DVICO & 0xff) &&
1359 fw->data[idoff + 1] == USB_VID_DVICO >> 8) {
David Woodhousee62f89f2008-05-24 00:12:42 +01001360 struct firmware new_fw;
1361 u8 *new_fw_data = vmalloc(fw->size);
1362 int ret;
1363
1364 if (!new_fw_data)
1365 return -ENOMEM;
1366
1367 memcpy(new_fw_data, fw->data, fw->size);
1368 new_fw.size = fw->size;
1369 new_fw.data = new_fw_data;
1370
1371 new_fw_data[idoff + 2] =
Chris Pascoe702a6762007-11-20 03:34:11 -03001372 le16_to_cpu(udev->descriptor.idProduct) + 1;
David Woodhousee62f89f2008-05-24 00:12:42 +01001373 new_fw_data[idoff + 3] =
Chris Pascoe702a6762007-11-20 03:34:11 -03001374 le16_to_cpu(udev->descriptor.idProduct) >> 8;
1375
David Woodhousee62f89f2008-05-24 00:12:42 +01001376 ret = usb_cypress_load_firmware(udev, &new_fw,
1377 CYPRESS_FX2);
1378 vfree(new_fw_data);
1379 return ret;
Chris Pascoe702a6762007-11-20 03:34:11 -03001380 }
Patrick Boettcherf5373782006-01-09 18:21:38 -02001381 }
1382
1383 return -EINVAL;
1384}
1385
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001386/* DVB USB Driver stuff */
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001387static struct dvb_usb_device_properties cxusb_medion_properties;
1388static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties;
1389static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties;
1390static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
1391static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
Chris Pascoeaeb012b2007-11-19 21:57:10 -03001392static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties;
Anton Blanchard8d798982008-08-09 12:23:15 -03001393static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties;
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001394static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties;
Chris Pascoe702a6762007-11-20 03:34:11 -03001395static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties;
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -03001396static struct dvb_usb_device_properties cxusb_aver_a868r_properties;
Timothy Leedfbdce02008-08-09 13:36:51 -03001397static struct dvb_usb_device_properties cxusb_d680_dmb_properties;
David Wongb18bd1d2009-10-26 09:41:22 -03001398static struct dvb_usb_device_properties cxusb_mygica_d689_properties;
CrazyCata0f629b2014-11-14 18:24:28 -03001399static struct dvb_usb_device_properties cxusb_mygica_t230_properties;
Evgeny Plehovf8585ce62017-02-07 19:37:01 -02001400static struct dvb_usb_device_properties cxusb_mygica_t230c_properties;
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001401
1402static int cxusb_probe(struct usb_interface *intf,
Michael Krufkyf35db232006-12-05 14:53:39 -03001403 const struct usb_device_id *id)
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001404{
Janne Grunau78e920062008-04-09 19:13:13 -03001405 if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001406 THIS_MODULE, NULL, adapter_nr) ||
Janne Grunau78e920062008-04-09 19:13:13 -03001407 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001408 THIS_MODULE, NULL, adapter_nr) ||
Janne Grunau78e920062008-04-09 19:13:13 -03001409 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001410 THIS_MODULE, NULL, adapter_nr) ||
Janne Grunau78e920062008-04-09 19:13:13 -03001411 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001412 THIS_MODULE, NULL, adapter_nr) ||
Janne Grunau78e920062008-04-09 19:13:13 -03001413 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001414 THIS_MODULE, NULL, adapter_nr) ||
Janne Grunau78e920062008-04-09 19:13:13 -03001415 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001416 THIS_MODULE, NULL, adapter_nr) ||
Janne Grunau78e920062008-04-09 19:13:13 -03001417 0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001418 THIS_MODULE, NULL, adapter_nr) ||
Janne Grunau78e920062008-04-09 19:13:13 -03001419 0 == dvb_usb_device_init(intf,
1420 &cxusb_bluebird_nano2_needsfirmware_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001421 THIS_MODULE, NULL, adapter_nr) ||
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -03001422 0 == dvb_usb_device_init(intf, &cxusb_aver_a868r_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001423 THIS_MODULE, NULL, adapter_nr) ||
Anton Blanchard8d798982008-08-09 12:23:15 -03001424 0 == dvb_usb_device_init(intf,
1425 &cxusb_bluebird_dualdig4_rev2_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001426 THIS_MODULE, NULL, adapter_nr) ||
Timothy Leedfbdce02008-08-09 13:36:51 -03001427 0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001428 THIS_MODULE, NULL, adapter_nr) ||
David Wongb18bd1d2009-10-26 09:41:22 -03001429 0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001430 THIS_MODULE, NULL, adapter_nr) ||
CrazyCata0f629b2014-11-14 18:24:28 -03001431 0 == dvb_usb_device_init(intf, &cxusb_mygica_t230_properties,
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001432 THIS_MODULE, NULL, adapter_nr) ||
Evgeny Plehovf8585ce62017-02-07 19:37:01 -02001433 0 == dvb_usb_device_init(intf, &cxusb_mygica_t230c_properties,
1434 THIS_MODULE, NULL, adapter_nr) ||
Mauro Carvalho Chehab77243252016-11-12 12:46:26 -02001435 0)
Michael Krufkyeffee032006-01-09 15:25:47 -02001436 return 0;
Michael Krufkyeffee032006-01-09 15:25:47 -02001437
1438 return -EINVAL;
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001439}
1440
Olli Salonen26c42b02014-07-13 10:52:22 -03001441static void cxusb_disconnect(struct usb_interface *intf)
1442{
1443 struct dvb_usb_device *d = usb_get_intfdata(intf);
1444 struct cxusb_state *st = d->priv;
1445 struct i2c_client *client;
1446
1447 /* remove I2C client for tuner */
1448 client = st->i2c_client_tuner;
1449 if (client) {
1450 module_put(client->dev.driver->owner);
1451 i2c_unregister_device(client);
1452 }
1453
1454 /* remove I2C client for demodulator */
1455 client = st->i2c_client_demod;
1456 if (client) {
1457 module_put(client->dev.driver->owner);
1458 i2c_unregister_device(client);
1459 }
1460
1461 dvb_usb_device_exit(intf);
1462}
1463
David Howells974e08d2015-02-17 11:30:34 -03001464enum cxusb_table_index {
1465 MEDION_MD95700,
1466 DVICO_BLUEBIRD_LG064F_COLD,
1467 DVICO_BLUEBIRD_LG064F_WARM,
1468 DVICO_BLUEBIRD_DUAL_1_COLD,
1469 DVICO_BLUEBIRD_DUAL_1_WARM,
1470 DVICO_BLUEBIRD_LGZ201_COLD,
1471 DVICO_BLUEBIRD_LGZ201_WARM,
1472 DVICO_BLUEBIRD_TH7579_COLD,
1473 DVICO_BLUEBIRD_TH7579_WARM,
1474 DIGITALNOW_BLUEBIRD_DUAL_1_COLD,
1475 DIGITALNOW_BLUEBIRD_DUAL_1_WARM,
1476 DVICO_BLUEBIRD_DUAL_2_COLD,
1477 DVICO_BLUEBIRD_DUAL_2_WARM,
1478 DVICO_BLUEBIRD_DUAL_4,
1479 DVICO_BLUEBIRD_DVB_T_NANO_2,
1480 DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM,
1481 AVERMEDIA_VOLAR_A868R,
1482 DVICO_BLUEBIRD_DUAL_4_REV_2,
1483 CONEXANT_D680_DMB,
1484 MYGICA_D689,
1485 MYGICA_T230,
Evgeny Plehovf8585ce62017-02-07 19:37:01 -02001486 MYGICA_T230C,
David Howells974e08d2015-02-17 11:30:34 -03001487 NR__cxusb_table_index
1488};
1489
1490static struct usb_device_id cxusb_table[NR__cxusb_table_index + 1] = {
1491 [MEDION_MD95700] = {
1492 USB_DEVICE(USB_VID_MEDION, USB_PID_MEDION_MD95700)
1493 },
1494 [DVICO_BLUEBIRD_LG064F_COLD] = {
1495 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_COLD)
1496 },
1497 [DVICO_BLUEBIRD_LG064F_WARM] = {
1498 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM)
1499 },
1500 [DVICO_BLUEBIRD_DUAL_1_COLD] = {
1501 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_COLD)
1502 },
1503 [DVICO_BLUEBIRD_DUAL_1_WARM] = {
1504 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_WARM)
1505 },
1506 [DVICO_BLUEBIRD_LGZ201_COLD] = {
1507 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_COLD)
1508 },
1509 [DVICO_BLUEBIRD_LGZ201_WARM] = {
1510 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_WARM)
1511 },
1512 [DVICO_BLUEBIRD_TH7579_COLD] = {
1513 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_COLD)
1514 },
1515 [DVICO_BLUEBIRD_TH7579_WARM] = {
1516 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_WARM)
1517 },
1518 [DIGITALNOW_BLUEBIRD_DUAL_1_COLD] = {
1519 USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD)
1520 },
1521 [DIGITALNOW_BLUEBIRD_DUAL_1_WARM] = {
1522 USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM)
1523 },
1524 [DVICO_BLUEBIRD_DUAL_2_COLD] = {
1525 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD)
1526 },
1527 [DVICO_BLUEBIRD_DUAL_2_WARM] = {
1528 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM)
1529 },
1530 [DVICO_BLUEBIRD_DUAL_4] = {
1531 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4)
1532 },
1533 [DVICO_BLUEBIRD_DVB_T_NANO_2] = {
1534 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2)
1535 },
1536 [DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM] = {
1537 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM)
1538 },
1539 [AVERMEDIA_VOLAR_A868R] = {
1540 USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_A868R)
1541 },
1542 [DVICO_BLUEBIRD_DUAL_4_REV_2] = {
1543 USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2)
1544 },
1545 [CONEXANT_D680_DMB] = {
1546 USB_DEVICE(USB_VID_CONEXANT, USB_PID_CONEXANT_D680_DMB)
1547 },
1548 [MYGICA_D689] = {
1549 USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_D689)
1550 },
1551 [MYGICA_T230] = {
1552 USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230)
1553 },
Evgeny Plehovf8585ce62017-02-07 19:37:01 -02001554 [MYGICA_T230C] = {
1555 USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230+1)
1556 },
Michael Krufkyf35db232006-12-05 14:53:39 -03001557 {} /* Terminating entry */
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001558};
1559MODULE_DEVICE_TABLE (usb, cxusb_table);
1560
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001561static struct dvb_usb_device_properties cxusb_medion_properties = {
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001562 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1563
1564 .usb_ctrl = CYPRESS_FX2,
1565
1566 .size_of_priv = sizeof(struct cxusb_state),
1567
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001568 .num_adapters = 1,
1569 .adapter = {
1570 {
Michael Krufky77eed212011-09-06 09:31:57 -03001571 .num_frontends = 1,
1572 .fe = {{
Patrick Boettcher01451e72006-10-13 11:34:46 -03001573 .streaming_ctrl = cxusb_streaming_ctrl,
1574 .frontend_attach = cxusb_cx22702_frontend_attach,
1575 .tuner_attach = cxusb_fmd1216me_tuner_attach,
1576 /* parameter for the MPEG2-data transfer */
1577 .stream = {
1578 .type = USB_BULK,
1579 .count = 5,
1580 .endpoint = 0x02,
1581 .u = {
1582 .bulk = {
1583 .buffersize = 8192,
1584 }
1585 }
1586 },
Michael Krufky77eed212011-09-06 09:31:57 -03001587 }},
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001588 },
1589 },
1590 .power_ctrl = cxusb_power_ctrl,
1591
1592 .i2c_algo = &cxusb_i2c_algo,
1593
1594 .generic_bulk_ctrl_endpoint = 0x01,
1595
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001596 .num_device_descs = 1,
1597 .devices = {
1598 { "Medion MD95700 (MDUSBTV-HYBRID)",
1599 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03001600 { &cxusb_table[MEDION_MD95700], NULL },
Patrick Boettcher22c6d932005-07-07 17:58:10 -07001601 },
1602 }
1603};
1604
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001605static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
Michael Krufkyeffee032006-01-09 15:25:47 -02001606 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1607
Patrick Boettcherf5373782006-01-09 18:21:38 -02001608 .usb_ctrl = DEVICE_SPECIFIC,
1609 .firmware = "dvb-usb-bluebird-01.fw",
1610 .download_firmware = bluebird_patch_dvico_firmware_download,
Michael Krufky37bdfa02006-01-09 15:25:47 -02001611 /* use usb alt setting 0 for EP4 transfer (dvb-t),
1612 use usb alt setting 7 for EP2 transfer (atsc) */
Michael Krufkyeffee032006-01-09 15:25:47 -02001613
1614 .size_of_priv = sizeof(struct cxusb_state),
1615
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001616 .num_adapters = 1,
1617 .adapter = {
1618 {
Michael Krufky77eed212011-09-06 09:31:57 -03001619 .num_frontends = 1,
1620 .fe = {{
Patrick Boettcher01451e72006-10-13 11:34:46 -03001621 .streaming_ctrl = cxusb_streaming_ctrl,
1622 .frontend_attach = cxusb_lgdt3303_frontend_attach,
Michael Krufkyf71a56c2006-10-13 21:55:57 -03001623 .tuner_attach = cxusb_lgh064f_tuner_attach,
Michael Krufkyeffee032006-01-09 15:25:47 -02001624
Patrick Boettcher01451e72006-10-13 11:34:46 -03001625 /* parameter for the MPEG2-data transfer */
1626 .stream = {
1627 .type = USB_BULK,
1628 .count = 5,
1629 .endpoint = 0x02,
1630 .u = {
1631 .bulk = {
1632 .buffersize = 8192,
1633 }
1634 }
1635 },
Michael Krufky77eed212011-09-06 09:31:57 -03001636 }},
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001637 },
1638 },
1639
1640 .power_ctrl = cxusb_bluebird_power_ctrl,
1641
Michael Krufkyeffee032006-01-09 15:25:47 -02001642 .i2c_algo = &cxusb_i2c_algo,
1643
Sean Young517b5002016-11-20 07:45:52 -02001644 .rc.core = {
1645 .rc_interval = 100,
1646 .rc_codes = RC_MAP_DVICO_PORTABLE,
1647 .module_name = KBUILD_MODNAME,
1648 .rc_query = cxusb_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02001649 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001650 },
Michael Krufkyc1501782006-03-26 05:43:36 -03001651
Michael Krufkyeffee032006-01-09 15:25:47 -02001652 .generic_bulk_ctrl_endpoint = 0x01,
Michael Krufkyeffee032006-01-09 15:25:47 -02001653
1654 .num_device_descs = 1,
1655 .devices = {
1656 { "DViCO FusionHDTV5 USB Gold",
David Howells974e08d2015-02-17 11:30:34 -03001657 { &cxusb_table[DVICO_BLUEBIRD_LG064F_COLD], NULL },
1658 { &cxusb_table[DVICO_BLUEBIRD_LG064F_WARM], NULL },
Michael Krufkyeffee032006-01-09 15:25:47 -02001659 },
1660 }
1661};
1662
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001663static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
Chris Pascoe0029ee12006-01-09 18:21:28 -02001664 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1665
Patrick Boettcherf5373782006-01-09 18:21:38 -02001666 .usb_ctrl = DEVICE_SPECIFIC,
1667 .firmware = "dvb-usb-bluebird-01.fw",
1668 .download_firmware = bluebird_patch_dvico_firmware_download,
Chris Pascoe0029ee12006-01-09 18:21:28 -02001669 /* use usb alt setting 0 for EP4 transfer (dvb-t),
1670 use usb alt setting 7 for EP2 transfer (atsc) */
1671
1672 .size_of_priv = sizeof(struct cxusb_state),
1673
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001674 .num_adapters = 1,
1675 .adapter = {
1676 {
Michael Krufky77eed212011-09-06 09:31:57 -03001677 .num_frontends = 1,
1678 .fe = {{
Patrick Boettcher01451e72006-10-13 11:34:46 -03001679 .streaming_ctrl = cxusb_streaming_ctrl,
1680 .frontend_attach = cxusb_dee1601_frontend_attach,
1681 .tuner_attach = cxusb_dee1601_tuner_attach,
1682 /* parameter for the MPEG2-data transfer */
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001683 .stream = {
1684 .type = USB_BULK,
Patrick Boettcher01451e72006-10-13 11:34:46 -03001685 .count = 5,
1686 .endpoint = 0x04,
1687 .u = {
1688 .bulk = {
1689 .buffersize = 8192,
1690 }
1691 }
1692 },
Michael Krufky77eed212011-09-06 09:31:57 -03001693 }},
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001694 },
1695 },
1696
1697 .power_ctrl = cxusb_bluebird_power_ctrl,
Chris Pascoe0029ee12006-01-09 18:21:28 -02001698
1699 .i2c_algo = &cxusb_i2c_algo,
1700
Sean Young517b5002016-11-20 07:45:52 -02001701 .rc.core = {
1702 .rc_interval = 100,
1703 .rc_codes = RC_MAP_DVICO_MCE,
1704 .module_name = KBUILD_MODNAME,
1705 .rc_query = cxusb_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02001706 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001707 },
Chris Pascoe7c239702006-01-09 18:21:29 -02001708
Chris Pascoe0029ee12006-01-09 18:21:28 -02001709 .generic_bulk_ctrl_endpoint = 0x01,
Chris Pascoe0029ee12006-01-09 18:21:28 -02001710
Michael Krufky587c03d2006-09-28 02:16:01 -03001711 .num_device_descs = 3,
Chris Pascoe0029ee12006-01-09 18:21:28 -02001712 .devices = {
1713 { "DViCO FusionHDTV DVB-T Dual USB",
David Howells974e08d2015-02-17 11:30:34 -03001714 { &cxusb_table[DVICO_BLUEBIRD_DUAL_1_COLD], NULL },
1715 { &cxusb_table[DVICO_BLUEBIRD_DUAL_1_WARM], NULL },
Chris Pascoe0029ee12006-01-09 18:21:28 -02001716 },
Michael Krufkyac9ffb92006-01-11 23:21:00 -02001717 { "DigitalNow DVB-T Dual USB",
David Howells974e08d2015-02-17 11:30:34 -03001718 { &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_COLD], NULL },
1719 { &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_WARM], NULL },
Michael Krufkyac9ffb92006-01-11 23:21:00 -02001720 },
Michael Krufky587c03d2006-09-28 02:16:01 -03001721 { "DViCO FusionHDTV DVB-T Dual Digital 2",
David Howells974e08d2015-02-17 11:30:34 -03001722 { &cxusb_table[DVICO_BLUEBIRD_DUAL_2_COLD], NULL },
1723 { &cxusb_table[DVICO_BLUEBIRD_DUAL_2_WARM], NULL },
Michael Krufky587c03d2006-09-28 02:16:01 -03001724 },
Chris Pascoe0029ee12006-01-09 18:21:28 -02001725 }
1726};
1727
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001728static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
Michael Krufky6f447252006-01-11 19:40:33 -02001729 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1730
1731 .usb_ctrl = DEVICE_SPECIFIC,
1732 .firmware = "dvb-usb-bluebird-01.fw",
1733 .download_firmware = bluebird_patch_dvico_firmware_download,
1734 /* use usb alt setting 0 for EP4 transfer (dvb-t),
1735 use usb alt setting 7 for EP2 transfer (atsc) */
1736
1737 .size_of_priv = sizeof(struct cxusb_state),
1738
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001739 .num_adapters = 2,
1740 .adapter = {
1741 {
Michael Krufky77eed212011-09-06 09:31:57 -03001742 .num_frontends = 1,
1743 .fe = {{
Patrick Boettcher01451e72006-10-13 11:34:46 -03001744 .streaming_ctrl = cxusb_streaming_ctrl,
1745 .frontend_attach = cxusb_mt352_frontend_attach,
1746 .tuner_attach = cxusb_lgz201_tuner_attach,
Michael Krufky6f447252006-01-11 19:40:33 -02001747
Patrick Boettcher01451e72006-10-13 11:34:46 -03001748 /* parameter for the MPEG2-data transfer */
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001749 .stream = {
1750 .type = USB_BULK,
Patrick Boettcher01451e72006-10-13 11:34:46 -03001751 .count = 5,
1752 .endpoint = 0x04,
1753 .u = {
1754 .bulk = {
1755 .buffersize = 8192,
1756 }
1757 }
1758 },
Michael Krufky77eed212011-09-06 09:31:57 -03001759 }},
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001760 },
1761 },
1762 .power_ctrl = cxusb_bluebird_power_ctrl,
1763
Michael Krufky6f447252006-01-11 19:40:33 -02001764 .i2c_algo = &cxusb_i2c_algo,
1765
Sean Young517b5002016-11-20 07:45:52 -02001766 .rc.core = {
1767 .rc_interval = 100,
1768 .rc_codes = RC_MAP_DVICO_PORTABLE,
1769 .module_name = KBUILD_MODNAME,
1770 .rc_query = cxusb_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02001771 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001772 },
Michael Krufkyc1501782006-03-26 05:43:36 -03001773
Michael Krufky6f447252006-01-11 19:40:33 -02001774 .generic_bulk_ctrl_endpoint = 0x01,
Michael Krufky6f447252006-01-11 19:40:33 -02001775 .num_device_descs = 1,
1776 .devices = {
1777 { "DViCO FusionHDTV DVB-T USB (LGZ201)",
David Howells974e08d2015-02-17 11:30:34 -03001778 { &cxusb_table[DVICO_BLUEBIRD_LGZ201_COLD], NULL },
1779 { &cxusb_table[DVICO_BLUEBIRD_LGZ201_WARM], NULL },
Michael Krufky6f447252006-01-11 19:40:33 -02001780 },
1781 }
1782};
1783
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001784static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
Michael Krufky6f447252006-01-11 19:40:33 -02001785 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1786
1787 .usb_ctrl = DEVICE_SPECIFIC,
1788 .firmware = "dvb-usb-bluebird-01.fw",
1789 .download_firmware = bluebird_patch_dvico_firmware_download,
1790 /* use usb alt setting 0 for EP4 transfer (dvb-t),
1791 use usb alt setting 7 for EP2 transfer (atsc) */
1792
1793 .size_of_priv = sizeof(struct cxusb_state),
1794
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001795 .num_adapters = 1,
1796 .adapter = {
1797 {
Michael Krufky77eed212011-09-06 09:31:57 -03001798 .num_frontends = 1,
1799 .fe = {{
Patrick Boettcher01451e72006-10-13 11:34:46 -03001800 .streaming_ctrl = cxusb_streaming_ctrl,
1801 .frontend_attach = cxusb_mt352_frontend_attach,
1802 .tuner_attach = cxusb_dtt7579_tuner_attach,
Michael Krufky6f447252006-01-11 19:40:33 -02001803
Patrick Boettcher01451e72006-10-13 11:34:46 -03001804 /* parameter for the MPEG2-data transfer */
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001805 .stream = {
1806 .type = USB_BULK,
Patrick Boettcher01451e72006-10-13 11:34:46 -03001807 .count = 5,
1808 .endpoint = 0x04,
1809 .u = {
1810 .bulk = {
1811 .buffersize = 8192,
1812 }
1813 }
1814 },
Michael Krufky77eed212011-09-06 09:31:57 -03001815 }},
Patrick Boettcher4d43e132006-09-30 06:53:48 -03001816 },
1817 },
1818 .power_ctrl = cxusb_bluebird_power_ctrl,
1819
Michael Krufky6f447252006-01-11 19:40:33 -02001820 .i2c_algo = &cxusb_i2c_algo,
1821
Sean Young517b5002016-11-20 07:45:52 -02001822 .rc.core = {
1823 .rc_interval = 100,
1824 .rc_codes = RC_MAP_DVICO_PORTABLE,
1825 .module_name = KBUILD_MODNAME,
1826 .rc_query = cxusb_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02001827 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001828 },
Michael Krufkyc1501782006-03-26 05:43:36 -03001829
Michael Krufky6f447252006-01-11 19:40:33 -02001830 .generic_bulk_ctrl_endpoint = 0x01,
Michael Krufky6f447252006-01-11 19:40:33 -02001831
1832 .num_device_descs = 1,
1833 .devices = {
1834 { "DViCO FusionHDTV DVB-T USB (TH7579)",
David Howells974e08d2015-02-17 11:30:34 -03001835 { &cxusb_table[DVICO_BLUEBIRD_TH7579_COLD], NULL },
1836 { &cxusb_table[DVICO_BLUEBIRD_TH7579_WARM], NULL },
Michael Krufky6f447252006-01-11 19:40:33 -02001837 },
1838 }
1839};
1840
Chris Pascoeaeb012b2007-11-19 21:57:10 -03001841static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
1842 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1843
1844 .usb_ctrl = CYPRESS_FX2,
1845
1846 .size_of_priv = sizeof(struct cxusb_state),
1847
1848 .num_adapters = 1,
1849 .adapter = {
1850 {
Michael Krufky77eed212011-09-06 09:31:57 -03001851 .num_frontends = 1,
1852 .fe = {{
Chris Pascoeaeb012b2007-11-19 21:57:10 -03001853 .streaming_ctrl = cxusb_streaming_ctrl,
1854 .frontend_attach = cxusb_dualdig4_frontend_attach,
1855 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1856 /* parameter for the MPEG2-data transfer */
1857 .stream = {
1858 .type = USB_BULK,
1859 .count = 5,
1860 .endpoint = 0x02,
1861 .u = {
1862 .bulk = {
1863 .buffersize = 8192,
1864 }
1865 }
1866 },
Michael Krufky77eed212011-09-06 09:31:57 -03001867 }},
Chris Pascoeaeb012b2007-11-19 21:57:10 -03001868 },
1869 },
1870
1871 .power_ctrl = cxusb_power_ctrl,
1872
1873 .i2c_algo = &cxusb_i2c_algo,
1874
1875 .generic_bulk_ctrl_endpoint = 0x01,
1876
Sean Young517b5002016-11-20 07:45:52 -02001877 .rc.core = {
1878 .rc_interval = 100,
1879 .rc_codes = RC_MAP_DVICO_MCE,
1880 .module_name = KBUILD_MODNAME,
1881 .rc_query = cxusb_bluebird2_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02001882 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001883 },
Chris Pascoeaeb012b2007-11-19 21:57:10 -03001884
1885 .num_device_descs = 1,
1886 .devices = {
1887 { "DViCO FusionHDTV DVB-T Dual Digital 4",
1888 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03001889 { &cxusb_table[DVICO_BLUEBIRD_DUAL_4], NULL },
Chris Pascoeaeb012b2007-11-19 21:57:10 -03001890 },
1891 }
1892};
1893
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001894static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
1895 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1896
1897 .usb_ctrl = CYPRESS_FX2,
Chris Pascoe702a6762007-11-20 03:34:11 -03001898 .identify_state = bluebird_fx2_identify_state,
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001899
1900 .size_of_priv = sizeof(struct cxusb_state),
1901
1902 .num_adapters = 1,
1903 .adapter = {
1904 {
Michael Krufky77eed212011-09-06 09:31:57 -03001905 .num_frontends = 1,
1906 .fe = {{
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001907 .streaming_ctrl = cxusb_streaming_ctrl,
1908 .frontend_attach = cxusb_nano2_frontend_attach,
1909 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1910 /* parameter for the MPEG2-data transfer */
1911 .stream = {
1912 .type = USB_BULK,
1913 .count = 5,
1914 .endpoint = 0x02,
1915 .u = {
1916 .bulk = {
1917 .buffersize = 8192,
1918 }
1919 }
1920 },
Michael Krufky77eed212011-09-06 09:31:57 -03001921 }},
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001922 },
1923 },
1924
1925 .power_ctrl = cxusb_nano2_power_ctrl,
1926
1927 .i2c_algo = &cxusb_i2c_algo,
1928
1929 .generic_bulk_ctrl_endpoint = 0x01,
1930
Sean Young517b5002016-11-20 07:45:52 -02001931 .rc.core = {
1932 .rc_interval = 100,
1933 .rc_codes = RC_MAP_DVICO_PORTABLE,
1934 .module_name = KBUILD_MODNAME,
1935 .rc_query = cxusb_bluebird2_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02001936 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001937 },
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001938
1939 .num_device_descs = 1,
1940 .devices = {
1941 { "DViCO FusionHDTV DVB-T NANO2",
1942 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03001943 { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
Chris Pascoe5ccaf902007-11-20 01:53:31 -03001944 },
1945 }
1946};
1947
Chris Pascoe702a6762007-11-20 03:34:11 -03001948static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties = {
1949 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1950
1951 .usb_ctrl = DEVICE_SPECIFIC,
1952 .firmware = "dvb-usb-bluebird-02.fw",
1953 .download_firmware = bluebird_patch_dvico_firmware_download,
1954 .identify_state = bluebird_fx2_identify_state,
1955
1956 .size_of_priv = sizeof(struct cxusb_state),
1957
1958 .num_adapters = 1,
1959 .adapter = {
1960 {
Michael Krufky77eed212011-09-06 09:31:57 -03001961 .num_frontends = 1,
1962 .fe = {{
Chris Pascoe702a6762007-11-20 03:34:11 -03001963 .streaming_ctrl = cxusb_streaming_ctrl,
1964 .frontend_attach = cxusb_nano2_frontend_attach,
1965 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1966 /* parameter for the MPEG2-data transfer */
1967 .stream = {
1968 .type = USB_BULK,
1969 .count = 5,
1970 .endpoint = 0x02,
1971 .u = {
1972 .bulk = {
1973 .buffersize = 8192,
1974 }
1975 }
1976 },
Michael Krufky77eed212011-09-06 09:31:57 -03001977 }},
Chris Pascoe702a6762007-11-20 03:34:11 -03001978 },
1979 },
1980
1981 .power_ctrl = cxusb_nano2_power_ctrl,
1982
1983 .i2c_algo = &cxusb_i2c_algo,
1984
1985 .generic_bulk_ctrl_endpoint = 0x01,
1986
Sean Young517b5002016-11-20 07:45:52 -02001987 .rc.core = {
1988 .rc_interval = 100,
1989 .rc_codes = RC_MAP_DVICO_PORTABLE,
1990 .module_name = KBUILD_MODNAME,
1991 .rc_query = cxusb_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02001992 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001993 },
Chris Pascoe702a6762007-11-20 03:34:11 -03001994
1995 .num_device_descs = 1,
1996 .devices = {
1997 { "DViCO FusionHDTV DVB-T NANO2 w/o firmware",
David Howells974e08d2015-02-17 11:30:34 -03001998 { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
1999 { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM], NULL },
Chris Pascoe702a6762007-11-20 03:34:11 -03002000 },
2001 }
2002};
2003
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -03002004static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
2005 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2006
2007 .usb_ctrl = CYPRESS_FX2,
2008
2009 .size_of_priv = sizeof(struct cxusb_state),
2010
2011 .num_adapters = 1,
2012 .adapter = {
2013 {
Michael Krufky77eed212011-09-06 09:31:57 -03002014 .num_frontends = 1,
2015 .fe = {{
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -03002016 .streaming_ctrl = cxusb_aver_streaming_ctrl,
2017 .frontend_attach = cxusb_aver_lgdt3303_frontend_attach,
2018 .tuner_attach = cxusb_mxl5003s_tuner_attach,
2019 /* parameter for the MPEG2-data transfer */
2020 .stream = {
2021 .type = USB_BULK,
2022 .count = 5,
2023 .endpoint = 0x04,
2024 .u = {
2025 .bulk = {
2026 .buffersize = 8192,
2027 }
2028 }
2029 },
Michael Krufky77eed212011-09-06 09:31:57 -03002030 }},
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -03002031 },
2032 },
2033 .power_ctrl = cxusb_aver_power_ctrl,
2034
2035 .i2c_algo = &cxusb_i2c_algo,
2036
2037 .generic_bulk_ctrl_endpoint = 0x01,
2038
2039 .num_device_descs = 1,
2040 .devices = {
2041 { "AVerMedia AVerTVHD Volar (A868R)",
2042 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03002043 { &cxusb_table[AVERMEDIA_VOLAR_A868R], NULL },
Daniel Gimpelevichf5376ad2008-06-28 05:01:30 -03002044 },
2045 }
2046};
2047
Michael Krufkya2dc86b2008-08-09 13:06:26 -03002048static
2049struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
Anton Blanchard8d798982008-08-09 12:23:15 -03002050 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2051
2052 .usb_ctrl = CYPRESS_FX2,
2053
2054 .size_of_priv = sizeof(struct cxusb_state),
2055
2056 .num_adapters = 1,
2057 .adapter = {
2058 {
Michael Krufky77eed212011-09-06 09:31:57 -03002059 .size_of_priv = sizeof(struct dib0700_adapter_state),
2060 .num_frontends = 1,
2061 .fe = {{
Michael Krufkya2dc86b2008-08-09 13:06:26 -03002062 .streaming_ctrl = cxusb_streaming_ctrl,
2063 .frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
2064 .tuner_attach = cxusb_dualdig4_rev2_tuner_attach,
Anton Blanchard8d798982008-08-09 12:23:15 -03002065 /* parameter for the MPEG2-data transfer */
2066 .stream = {
2067 .type = USB_BULK,
2068 .count = 7,
2069 .endpoint = 0x02,
2070 .u = {
2071 .bulk = {
2072 .buffersize = 4096,
2073 }
2074 }
2075 },
Michael Krufky77eed212011-09-06 09:31:57 -03002076 }},
Anton Blanchard8d798982008-08-09 12:23:15 -03002077 },
2078 },
2079
2080 .power_ctrl = cxusb_bluebird_power_ctrl,
2081
2082 .i2c_algo = &cxusb_i2c_algo,
2083
2084 .generic_bulk_ctrl_endpoint = 0x01,
2085
Sean Young517b5002016-11-20 07:45:52 -02002086 .rc.core = {
2087 .rc_interval = 100,
2088 .rc_codes = RC_MAP_DVICO_MCE,
2089 .module_name = KBUILD_MODNAME,
2090 .rc_query = cxusb_rc_query,
Sean Young207c9572017-02-04 17:00:36 -02002091 .allowed_protos = RC_BIT_NEC,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03002092 },
Anton Blanchard8d798982008-08-09 12:23:15 -03002093
2094 .num_device_descs = 1,
2095 .devices = {
2096 { "DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)",
2097 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03002098 { &cxusb_table[DVICO_BLUEBIRD_DUAL_4_REV_2], NULL },
Anton Blanchard8d798982008-08-09 12:23:15 -03002099 },
2100 }
2101};
2102
Timothy Leedfbdce02008-08-09 13:36:51 -03002103static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
2104 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2105
2106 .usb_ctrl = CYPRESS_FX2,
2107
2108 .size_of_priv = sizeof(struct cxusb_state),
2109
2110 .num_adapters = 1,
2111 .adapter = {
2112 {
Michael Krufky77eed212011-09-06 09:31:57 -03002113 .num_frontends = 1,
2114 .fe = {{
Timothy Leedfbdce02008-08-09 13:36:51 -03002115 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
2116 .frontend_attach = cxusb_d680_dmb_frontend_attach,
2117 .tuner_attach = cxusb_d680_dmb_tuner_attach,
2118
2119 /* parameter for the MPEG2-data transfer */
2120 .stream = {
2121 .type = USB_BULK,
2122 .count = 5,
2123 .endpoint = 0x02,
2124 .u = {
2125 .bulk = {
2126 .buffersize = 8192,
2127 }
2128 }
2129 },
Michael Krufky77eed212011-09-06 09:31:57 -03002130 }},
Timothy Leedfbdce02008-08-09 13:36:51 -03002131 },
2132 },
2133
2134 .power_ctrl = cxusb_d680_dmb_power_ctrl,
2135
2136 .i2c_algo = &cxusb_i2c_algo,
2137
2138 .generic_bulk_ctrl_endpoint = 0x01,
2139
Sean Young517b5002016-11-20 07:45:52 -02002140 .rc.core = {
2141 .rc_interval = 100,
2142 .rc_codes = RC_MAP_D680_DMB,
2143 .module_name = KBUILD_MODNAME,
2144 .rc_query = cxusb_d680_dmb_rc_query,
2145 .allowed_protos = RC_BIT_UNKNOWN,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03002146 },
Timothy Leedfbdce02008-08-09 13:36:51 -03002147
2148 .num_device_descs = 1,
2149 .devices = {
2150 {
2151 "Conexant DMB-TH Stick",
2152 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03002153 { &cxusb_table[CONEXANT_D680_DMB], NULL },
Timothy Leedfbdce02008-08-09 13:36:51 -03002154 },
2155 }
2156};
2157
David Wongb18bd1d2009-10-26 09:41:22 -03002158static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
2159 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2160
2161 .usb_ctrl = CYPRESS_FX2,
2162
2163 .size_of_priv = sizeof(struct cxusb_state),
2164
2165 .num_adapters = 1,
2166 .adapter = {
2167 {
Michael Krufky77eed212011-09-06 09:31:57 -03002168 .num_frontends = 1,
2169 .fe = {{
David Wongb18bd1d2009-10-26 09:41:22 -03002170 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
2171 .frontend_attach = cxusb_mygica_d689_frontend_attach,
2172 .tuner_attach = cxusb_mygica_d689_tuner_attach,
2173
2174 /* parameter for the MPEG2-data transfer */
2175 .stream = {
2176 .type = USB_BULK,
2177 .count = 5,
2178 .endpoint = 0x02,
2179 .u = {
2180 .bulk = {
2181 .buffersize = 8192,
2182 }
2183 }
2184 },
Michael Krufky77eed212011-09-06 09:31:57 -03002185 }},
David Wongb18bd1d2009-10-26 09:41:22 -03002186 },
2187 },
2188
2189 .power_ctrl = cxusb_d680_dmb_power_ctrl,
2190
2191 .i2c_algo = &cxusb_i2c_algo,
2192
2193 .generic_bulk_ctrl_endpoint = 0x01,
2194
Sean Young517b5002016-11-20 07:45:52 -02002195 .rc.core = {
2196 .rc_interval = 100,
2197 .rc_codes = RC_MAP_D680_DMB,
2198 .module_name = KBUILD_MODNAME,
2199 .rc_query = cxusb_d680_dmb_rc_query,
2200 .allowed_protos = RC_BIT_UNKNOWN,
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03002201 },
David Wongb18bd1d2009-10-26 09:41:22 -03002202
2203 .num_device_descs = 1,
2204 .devices = {
2205 {
2206 "Mygica D689 DMB-TH",
2207 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03002208 { &cxusb_table[MYGICA_D689], NULL },
David Wongb18bd1d2009-10-26 09:41:22 -03002209 },
2210 }
2211};
2212
CrazyCata0f629b2014-11-14 18:24:28 -03002213static struct dvb_usb_device_properties cxusb_mygica_t230_properties = {
2214 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2215
2216 .usb_ctrl = CYPRESS_FX2,
2217
2218 .size_of_priv = sizeof(struct cxusb_state),
2219
2220 .num_adapters = 1,
2221 .adapter = {
2222 {
2223 .num_frontends = 1,
2224 .fe = {{
2225 .streaming_ctrl = cxusb_streaming_ctrl,
2226 .frontend_attach = cxusb_mygica_t230_frontend_attach,
2227
2228 /* parameter for the MPEG2-data transfer */
2229 .stream = {
2230 .type = USB_BULK,
2231 .count = 5,
2232 .endpoint = 0x02,
2233 .u = {
2234 .bulk = {
2235 .buffersize = 8192,
2236 }
2237 }
2238 },
2239 } },
2240 },
2241 },
2242
2243 .power_ctrl = cxusb_d680_dmb_power_ctrl,
2244
2245 .i2c_algo = &cxusb_i2c_algo,
2246
2247 .generic_bulk_ctrl_endpoint = 0x01,
2248
Sean Young517b5002016-11-20 07:45:52 -02002249 .rc.core = {
2250 .rc_interval = 100,
Evgeny Plehovf8585ce62017-02-07 19:37:01 -02002251 .rc_codes = RC_MAP_TOTAL_MEDIA_IN_HAND_02,
Sean Young517b5002016-11-20 07:45:52 -02002252 .module_name = KBUILD_MODNAME,
2253 .rc_query = cxusb_d680_dmb_rc_query,
2254 .allowed_protos = RC_BIT_UNKNOWN,
CrazyCata0f629b2014-11-14 18:24:28 -03002255 },
2256
2257 .num_device_descs = 1,
2258 .devices = {
2259 {
2260 "Mygica T230 DVB-T/T2/C",
2261 { NULL },
David Howells974e08d2015-02-17 11:30:34 -03002262 { &cxusb_table[MYGICA_T230], NULL },
CrazyCata0f629b2014-11-14 18:24:28 -03002263 },
2264 }
2265};
2266
Evgeny Plehovf8585ce62017-02-07 19:37:01 -02002267static struct dvb_usb_device_properties cxusb_mygica_t230c_properties = {
2268 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2269
2270 .usb_ctrl = CYPRESS_FX2,
2271
2272 .size_of_priv = sizeof(struct cxusb_state),
2273
2274 .num_adapters = 1,
2275 .adapter = {
2276 {
2277 .num_frontends = 1,
2278 .fe = {{
2279 .streaming_ctrl = cxusb_streaming_ctrl,
2280 .frontend_attach = cxusb_mygica_t230c_frontend_attach,
2281
2282 /* parameter for the MPEG2-data transfer */
2283 .stream = {
2284 .type = USB_BULK,
2285 .count = 5,
2286 .endpoint = 0x02,
2287 .u = {
2288 .bulk = {
2289 .buffersize = 8192,
2290 }
2291 }
2292 },
2293 } },
2294 },
2295 },
2296
2297 .power_ctrl = cxusb_d680_dmb_power_ctrl,
2298
2299 .i2c_algo = &cxusb_i2c_algo,
2300
2301 .generic_bulk_ctrl_endpoint = 0x01,
2302
2303 .rc.core = {
2304 .rc_interval = 100,
2305 .rc_codes = RC_MAP_TOTAL_MEDIA_IN_HAND_02,
2306 .module_name = KBUILD_MODNAME,
2307 .rc_query = cxusb_d680_dmb_rc_query,
2308 .allowed_protos = RC_BIT_UNKNOWN,
2309 },
2310
2311 .num_device_descs = 1,
2312 .devices = {
2313 {
2314 "Mygica T230C DVB-T/T2/C",
2315 { NULL },
2316 { &cxusb_table[MYGICA_T230C], NULL },
2317 },
2318 }
2319};
2320
Patrick Boettcher22c6d932005-07-07 17:58:10 -07002321static struct usb_driver cxusb_driver = {
Patrick Boettcher63b5c1c2005-07-07 17:58:30 -07002322 .name = "dvb_usb_cxusb",
Patrick Boettcher22c6d932005-07-07 17:58:10 -07002323 .probe = cxusb_probe,
Olli Salonen26c42b02014-07-13 10:52:22 -03002324 .disconnect = cxusb_disconnect,
Patrick Boettcher22c6d932005-07-07 17:58:10 -07002325 .id_table = cxusb_table,
2326};
2327
Greg Kroah-Hartmanecb3b2b2011-11-18 09:46:12 -08002328module_usb_driver(cxusb_driver);
Patrick Boettcher22c6d932005-07-07 17:58:10 -07002329
Patrick Boettcher99e44da2016-01-24 12:56:58 -02002330MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
Michael Krufky5b9ed282006-10-15 14:51:08 -03002331MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
Michael Krufkyf4efb4d2006-01-13 14:10:25 -02002332MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
Patrick Boettcher22c6d932005-07-07 17:58:10 -07002333MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design");
2334MODULE_VERSION("1.0-alpha");
2335MODULE_LICENSE("GPL");