2 * Driver for DVBSky USB2.0 receiver
4 * Copyright (C) 2013 Max nibble <nibble.max@gmail.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "m88ds3103.h"
23 #include "m88ts2022.h"
25 #define DVBSKY_MSG_DELAY 0/*2000*/
26 #define DVBSKY_BUF_LEN 64
28 static int dvb_usb_dvbsky_disable_rc;
29 module_param_named(disable_rc, dvb_usb_dvbsky_disable_rc, int, 0644);
30 MODULE_PARM_DESC(disable_rc, "Disable inbuilt IR receiver.");
32 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
35 struct mutex stream_mutex;
36 u8 ibuf[DVBSKY_BUF_LEN];
37 u8 obuf[DVBSKY_BUF_LEN];
39 struct i2c_client *i2c_client_tuner;
41 /* fe hook functions*/
42 int (*fe_set_voltage)(struct dvb_frontend *fe,
43 fe_sec_voltage_t voltage);
44 int (*fe_read_status)(struct dvb_frontend *fe,
48 static int dvbsky_usb_generic_rw(struct dvb_usb_device *d,
49 u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
52 struct dvbsky_state *state = d_to_priv(d);
54 mutex_lock(&d->usb_mutex);
56 memcpy(state->obuf, wbuf, wlen);
58 ret = dvb_usbv2_generic_rw_locked(d, state->obuf, wlen,
61 if (!ret && (rlen != 0))
62 memcpy(rbuf, state->ibuf, rlen);
64 mutex_unlock(&d->usb_mutex);
68 static int dvbsky_stream_ctrl(struct dvb_usb_device *d, u8 onoff)
70 struct dvbsky_state *state = d_to_priv(d);
72 u8 obuf_pre[3] = { 0x37, 0, 0 };
73 u8 obuf_post[3] = { 0x36, 3, 0 };
75 mutex_lock(&state->stream_mutex);
76 ret = dvbsky_usb_generic_rw(d, obuf_pre, 3, NULL, 0);
79 ret = dvbsky_usb_generic_rw(d, obuf_post, 3, NULL, 0);
81 mutex_unlock(&state->stream_mutex);
85 static int dvbsky_streaming_ctrl(struct dvb_frontend *fe, int onoff)
87 struct dvb_usb_device *d = fe_to_d(fe);
89 return dvbsky_stream_ctrl(d, (onoff == 0) ? 0 : 1);
93 static int dvbsky_gpio_ctrl(struct dvb_usb_device *d, u8 gport, u8 value)
101 ret = dvbsky_usb_generic_rw(d, obuf, 3, ibuf, 1);
103 dev_err(&d->udev->dev, "failed=%d\n", ret);
108 static int dvbsky_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
111 struct dvb_usb_device *d = i2c_get_adapdata(adap);
113 u8 ibuf[64], obuf[64];
115 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
119 dev_err(&d->udev->dev,
120 "too many i2c messages[%d], max 2.", num);
126 if (msg[0].len > 60) {
127 dev_err(&d->udev->dev,
128 "too many i2c bytes[%d], max 60.",
133 if (msg[0].flags & I2C_M_RD) {
137 obuf[2] = msg[0].len;
138 obuf[3] = msg[0].addr;
139 ret = dvbsky_usb_generic_rw(d, obuf, 4,
140 ibuf, msg[0].len + 1);
142 dev_err(&d->udev->dev, "failed=%d\n", ret);
144 memcpy(msg[0].buf, &ibuf[1], msg[0].len);
148 obuf[1] = msg[0].addr;
149 obuf[2] = msg[0].len;
150 memcpy(&obuf[3], msg[0].buf, msg[0].len);
151 ret = dvbsky_usb_generic_rw(d, obuf,
152 msg[0].len + 3, ibuf, 1);
154 dev_err(&d->udev->dev, "failed=%d\n", ret);
157 if ((msg[0].len > 60) || (msg[1].len > 60)) {
158 dev_err(&d->udev->dev,
159 "too many i2c bytes[w-%d][r-%d], max 60.",
160 msg[0].len, msg[1].len);
164 /* write then read */
166 obuf[1] = msg[0].len;
167 obuf[2] = msg[1].len;
168 obuf[3] = msg[0].addr;
169 memcpy(&obuf[4], msg[0].buf, msg[0].len);
170 ret = dvbsky_usb_generic_rw(d, obuf,
171 msg[0].len + 4, ibuf, msg[1].len + 1);
173 dev_err(&d->udev->dev, "failed=%d\n", ret);
176 memcpy(msg[1].buf, &ibuf[1], msg[1].len);
179 mutex_unlock(&d->i2c_mutex);
180 return (ret) ? ret : num;
183 static u32 dvbsky_i2c_func(struct i2c_adapter *adapter)
188 static struct i2c_algorithm dvbsky_i2c_algo = {
189 .master_xfer = dvbsky_i2c_xfer,
190 .functionality = dvbsky_i2c_func,
193 #if IS_ENABLED(CONFIG_RC_CORE)
194 static int dvbsky_rc_query(struct dvb_usb_device *d)
196 u32 code = 0xffff, scancode;
197 u8 rc5_command, rc5_system;
198 u8 obuf[2], ibuf[2], toggle;
202 ret = dvbsky_usb_generic_rw(d, obuf, 1, ibuf, 2);
204 dev_err(&d->udev->dev, "failed=%d\n", ret);
206 code = (ibuf[0] << 8) | ibuf[1];
207 if (code != 0xffff) {
208 dev_dbg(&d->udev->dev, "rc code: %x\n", code);
209 rc5_command = code & 0x3F;
210 rc5_system = (code & 0x7C0) >> 6;
211 toggle = (code & 0x800) ? 1 : 0;
212 scancode = rc5_system << 8 | rc5_command;
213 rc_keydown(d->rc_dev, RC_TYPE_RC5, scancode, toggle);
218 static int dvbsky_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
220 if (dvb_usb_dvbsky_disable_rc) {
225 rc->allowed_protos = RC_BIT_RC5;
226 rc->query = dvbsky_rc_query;
231 #define dvbsky_get_rc_config NULL
234 static int dvbsky_usb_set_voltage(struct dvb_frontend *fe,
235 fe_sec_voltage_t voltage)
237 struct dvb_usb_device *d = fe_to_d(fe);
238 struct dvbsky_state *state = d_to_priv(d);
241 if (voltage == SEC_VOLTAGE_OFF)
245 dvbsky_gpio_ctrl(d, 0x80, value);
247 return state->fe_set_voltage(fe, voltage);
250 static int dvbsky_read_mac_addr(struct dvb_usb_adapter *adap, u8 mac[6])
252 struct dvb_usb_device *d = adap_to_d(adap);
253 u8 obuf[] = { 0x1e, 0x00 };
255 struct i2c_msg msg[] = {
269 if (i2c_transfer(&d->i2c_adap, msg, 2) == 2)
270 memcpy(mac, ibuf, 6);
275 static int dvbsky_usb_read_status(struct dvb_frontend *fe, fe_status_t *status)
277 struct dvb_usb_device *d = fe_to_d(fe);
278 struct dvbsky_state *state = d_to_priv(d);
281 ret = state->fe_read_status(fe, status);
283 /* it need resync slave fifo when signal change from unlock to lock.*/
284 if ((*status & FE_HAS_LOCK) && (!state->last_lock))
285 dvbsky_stream_ctrl(d, 1);
287 state->last_lock = (*status & FE_HAS_LOCK) ? 1 : 0;
291 static const struct m88ds3103_config dvbsky_s960_m88ds3103_config = {
296 .ts_mode = M88DS3103_TS_CI,
304 static int dvbsky_s960_attach(struct dvb_usb_adapter *adap)
306 struct dvbsky_state *state = adap_to_priv(adap);
307 struct dvb_usb_device *d = adap_to_d(adap);
309 /* demod I2C adapter */
310 struct i2c_adapter *i2c_adapter;
311 struct i2c_client *client;
312 struct i2c_board_info info;
313 struct m88ts2022_config m88ts2022_config = {
316 memset(&info, 0, sizeof(struct i2c_board_info));
319 adap->fe[0] = dvb_attach(m88ds3103_attach,
320 &dvbsky_s960_m88ds3103_config,
324 dev_err(&d->udev->dev, "dvbsky_s960_attach fail.\n");
330 m88ts2022_config.fe = adap->fe[0];
331 strlcpy(info.type, "m88ts2022", I2C_NAME_SIZE);
333 info.platform_data = &m88ts2022_config;
334 request_module("m88ts2022");
335 client = i2c_new_device(i2c_adapter, &info);
336 if (client == NULL || client->dev.driver == NULL) {
337 dvb_frontend_detach(adap->fe[0]);
342 if (!try_module_get(client->dev.driver->owner)) {
343 i2c_unregister_device(client);
344 dvb_frontend_detach(adap->fe[0]);
349 /* delegate signal strength measurement to tuner */
350 adap->fe[0]->ops.read_signal_strength =
351 adap->fe[0]->ops.tuner_ops.get_rf_strength;
353 /* hook fe: need to resync the slave fifo when signal locks. */
354 state->fe_read_status = adap->fe[0]->ops.read_status;
355 adap->fe[0]->ops.read_status = dvbsky_usb_read_status;
357 /* hook fe: LNB off/on is control by Cypress usb chip. */
358 state->fe_set_voltage = adap->fe[0]->ops.set_voltage;
359 adap->fe[0]->ops.set_voltage = dvbsky_usb_set_voltage;
361 state->i2c_client_tuner = client;
367 static int dvbsky_identify_state(struct dvb_usb_device *d, const char **name)
369 dvbsky_gpio_ctrl(d, 0x04, 1);
371 dvbsky_gpio_ctrl(d, 0x83, 0);
372 dvbsky_gpio_ctrl(d, 0xc0, 1);
374 dvbsky_gpio_ctrl(d, 0x83, 1);
375 dvbsky_gpio_ctrl(d, 0xc0, 0);
381 static int dvbsky_init(struct dvb_usb_device *d)
383 struct dvbsky_state *state = d_to_priv(d);
385 /* use default interface */
387 ret = usb_set_interface(d->udev, 0, 0);
391 mutex_init(&state->stream_mutex);
393 state->last_lock = 0;
398 static void dvbsky_exit(struct dvb_usb_device *d)
400 struct dvbsky_state *state = d_to_priv(d);
401 struct i2c_client *client;
403 client = state->i2c_client_tuner;
404 /* remove I2C tuner */
406 module_put(client->dev.driver->owner);
407 i2c_unregister_device(client);
411 /* DVB USB Driver stuff */
412 static struct dvb_usb_device_properties dvbsky_s960_props = {
413 .driver_name = KBUILD_MODNAME,
414 .owner = THIS_MODULE,
415 .adapter_nr = adapter_nr,
416 .size_of_priv = sizeof(struct dvbsky_state),
418 .generic_bulk_ctrl_endpoint = 0x01,
419 .generic_bulk_ctrl_endpoint_response = 0x81,
420 .generic_bulk_ctrl_delay = DVBSKY_MSG_DELAY,
422 .i2c_algo = &dvbsky_i2c_algo,
423 .frontend_attach = dvbsky_s960_attach,
425 .get_rc_config = dvbsky_get_rc_config,
426 .streaming_ctrl = dvbsky_streaming_ctrl,
427 .identify_state = dvbsky_identify_state,
429 .read_mac_address = dvbsky_read_mac_addr,
434 .stream = DVB_USB_STREAM_BULK(0x82, 8, 4096),
439 static const struct usb_device_id dvbsky_id_table[] = {
440 { DVB_USB_DEVICE(0x0572, 0x6831,
441 &dvbsky_s960_props, "DVBSky S960/S860", RC_MAP_DVBSKY) },
444 MODULE_DEVICE_TABLE(usb, dvbsky_id_table);
446 static struct usb_driver dvbsky_usb_driver = {
447 .name = KBUILD_MODNAME,
448 .id_table = dvbsky_id_table,
449 .probe = dvb_usbv2_probe,
450 .disconnect = dvb_usbv2_disconnect,
451 .suspend = dvb_usbv2_suspend,
452 .resume = dvb_usbv2_resume,
453 .reset_resume = dvb_usbv2_reset_resume,
458 module_usb_driver(dvbsky_usb_driver);
460 MODULE_AUTHOR("Max nibble <nibble.max@gmail.com>");
461 MODULE_DESCRIPTION("Driver for DVBSky USB");
462 MODULE_LICENSE("GPL");