| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Driver for DVBSky USB2.0 receiver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2013 Max nibble <nibble.max@gmail.com> |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 8 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 9 | | - * (at your option) any later version. |
|---|
| 10 | | - * |
|---|
| 11 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 12 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 13 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 14 | | - * GNU General Public License for more details. |
|---|
| 15 | 6 | */ |
|---|
| 16 | 7 | |
|---|
| 17 | 8 | #include "dvb_usb.h" |
|---|
| .. | .. |
|---|
| 31 | 22 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
|---|
| 32 | 23 | |
|---|
| 33 | 24 | struct dvbsky_state { |
|---|
| 34 | | - struct mutex stream_mutex; |
|---|
| 35 | 25 | u8 ibuf[DVBSKY_BUF_LEN]; |
|---|
| 36 | 26 | u8 obuf[DVBSKY_BUF_LEN]; |
|---|
| 37 | 27 | u8 last_lock; |
|---|
| .. | .. |
|---|
| 69 | 59 | static int dvbsky_stream_ctrl(struct dvb_usb_device *d, u8 onoff) |
|---|
| 70 | 60 | { |
|---|
| 71 | 61 | struct dvbsky_state *state = d_to_priv(d); |
|---|
| 62 | + static const u8 obuf_pre[3] = { 0x37, 0, 0 }; |
|---|
| 63 | + static const u8 obuf_post[3] = { 0x36, 3, 0 }; |
|---|
| 72 | 64 | int ret; |
|---|
| 73 | | - u8 obuf_pre[3] = { 0x37, 0, 0 }; |
|---|
| 74 | | - u8 obuf_post[3] = { 0x36, 3, 0 }; |
|---|
| 75 | 65 | |
|---|
| 76 | | - mutex_lock(&state->stream_mutex); |
|---|
| 77 | | - ret = dvbsky_usb_generic_rw(d, obuf_pre, 3, NULL, 0); |
|---|
| 66 | + mutex_lock(&d->usb_mutex); |
|---|
| 67 | + memcpy(state->obuf, obuf_pre, 3); |
|---|
| 68 | + ret = dvb_usbv2_generic_write_locked(d, state->obuf, 3); |
|---|
| 78 | 69 | if (!ret && onoff) { |
|---|
| 79 | 70 | msleep(20); |
|---|
| 80 | | - ret = dvbsky_usb_generic_rw(d, obuf_post, 3, NULL, 0); |
|---|
| 71 | + memcpy(state->obuf, obuf_post, 3); |
|---|
| 72 | + ret = dvb_usbv2_generic_write_locked(d, state->obuf, 3); |
|---|
| 81 | 73 | } |
|---|
| 82 | | - mutex_unlock(&state->stream_mutex); |
|---|
| 74 | + mutex_unlock(&d->usb_mutex); |
|---|
| 83 | 75 | return ret; |
|---|
| 84 | 76 | } |
|---|
| 85 | 77 | |
|---|
| .. | .. |
|---|
| 100 | 92 | obuf[1] = gport; |
|---|
| 101 | 93 | obuf[2] = value; |
|---|
| 102 | 94 | ret = dvbsky_usb_generic_rw(d, obuf, 3, ibuf, 1); |
|---|
| 103 | | - if (ret) |
|---|
| 104 | | - dev_err(&d->udev->dev, "failed=%d\n", ret); |
|---|
| 105 | 95 | return ret; |
|---|
| 106 | 96 | } |
|---|
| 107 | 97 | |
|---|
| .. | .. |
|---|
| 139 | 129 | obuf[3] = msg[0].addr; |
|---|
| 140 | 130 | ret = dvbsky_usb_generic_rw(d, obuf, 4, |
|---|
| 141 | 131 | ibuf, msg[0].len + 1); |
|---|
| 142 | | - if (ret) |
|---|
| 143 | | - dev_err(&d->udev->dev, "failed=%d\n", ret); |
|---|
| 144 | 132 | if (!ret) |
|---|
| 145 | 133 | memcpy(msg[0].buf, &ibuf[1], msg[0].len); |
|---|
| 146 | 134 | } else { |
|---|
| .. | .. |
|---|
| 151 | 139 | memcpy(&obuf[3], msg[0].buf, msg[0].len); |
|---|
| 152 | 140 | ret = dvbsky_usb_generic_rw(d, obuf, |
|---|
| 153 | 141 | msg[0].len + 3, ibuf, 1); |
|---|
| 154 | | - if (ret) |
|---|
| 155 | | - dev_err(&d->udev->dev, "failed=%d\n", ret); |
|---|
| 156 | 142 | } |
|---|
| 157 | 143 | } else { |
|---|
| 158 | 144 | if ((msg[0].len > 60) || (msg[1].len > 60)) { |
|---|
| .. | .. |
|---|
| 170 | 156 | memcpy(&obuf[4], msg[0].buf, msg[0].len); |
|---|
| 171 | 157 | ret = dvbsky_usb_generic_rw(d, obuf, |
|---|
| 172 | 158 | msg[0].len + 4, ibuf, msg[1].len + 1); |
|---|
| 173 | | - if (ret) |
|---|
| 174 | | - dev_err(&d->udev->dev, "failed=%d\n", ret); |
|---|
| 175 | | - |
|---|
| 176 | 159 | if (!ret) |
|---|
| 177 | 160 | memcpy(msg[1].buf, &ibuf[1], msg[1].len); |
|---|
| 178 | 161 | } |
|---|
| .. | .. |
|---|
| 201 | 184 | |
|---|
| 202 | 185 | obuf[0] = 0x10; |
|---|
| 203 | 186 | ret = dvbsky_usb_generic_rw(d, obuf, 1, ibuf, 2); |
|---|
| 204 | | - if (ret) |
|---|
| 205 | | - dev_err(&d->udev->dev, "failed=%d\n", ret); |
|---|
| 206 | 187 | if (ret == 0) |
|---|
| 207 | 188 | code = (ibuf[0] << 8) | ibuf[1]; |
|---|
| 208 | 189 | if (code != 0xffff) { |
|---|
| .. | .. |
|---|
| 560 | 541 | si2168_config.i2c_adapter = &i2c_adapter; |
|---|
| 561 | 542 | si2168_config.fe = &adap->fe[0]; |
|---|
| 562 | 543 | si2168_config.ts_mode = SI2168_TS_PARALLEL; |
|---|
| 544 | + if (le16_to_cpu(d->udev->descriptor.idProduct) == USB_PID_MYGICA_T230C2) |
|---|
| 545 | + si2168_config.ts_mode |= SI2168_TS_CLK_MANUAL; |
|---|
| 563 | 546 | si2168_config.ts_clock_inv = 1; |
|---|
| 564 | 547 | |
|---|
| 565 | 548 | state->i2c_client_demod = dvb_module_probe("si2168", NULL, |
|---|
| .. | .. |
|---|
| 570 | 553 | |
|---|
| 571 | 554 | /* attach tuner */ |
|---|
| 572 | 555 | si2157_config.fe = adap->fe[0]; |
|---|
| 573 | | - si2157_config.if_port = 0; |
|---|
| 574 | | - |
|---|
| 575 | | - state->i2c_client_tuner = dvb_module_probe("si2157", "si2141", |
|---|
| 576 | | - i2c_adapter, |
|---|
| 577 | | - 0x60, &si2157_config); |
|---|
| 556 | + if (le16_to_cpu(d->udev->descriptor.idProduct) == USB_PID_MYGICA_T230) { |
|---|
| 557 | + si2157_config.if_port = 1; |
|---|
| 558 | + state->i2c_client_tuner = dvb_module_probe("si2157", NULL, |
|---|
| 559 | + i2c_adapter, |
|---|
| 560 | + 0x60, |
|---|
| 561 | + &si2157_config); |
|---|
| 562 | + } else { |
|---|
| 563 | + si2157_config.if_port = 0; |
|---|
| 564 | + state->i2c_client_tuner = dvb_module_probe("si2157", "si2141", |
|---|
| 565 | + i2c_adapter, |
|---|
| 566 | + 0x60, |
|---|
| 567 | + &si2157_config); |
|---|
| 568 | + } |
|---|
| 578 | 569 | if (!state->i2c_client_tuner) { |
|---|
| 579 | 570 | dvb_module_release(state->i2c_client_demod); |
|---|
| 580 | 571 | return -ENODEV; |
|---|
| .. | .. |
|---|
| 601 | 592 | static int dvbsky_init(struct dvb_usb_device *d) |
|---|
| 602 | 593 | { |
|---|
| 603 | 594 | struct dvbsky_state *state = d_to_priv(d); |
|---|
| 604 | | - |
|---|
| 605 | | - /* use default interface */ |
|---|
| 606 | | - /* |
|---|
| 607 | | - ret = usb_set_interface(d->udev, 0, 0); |
|---|
| 608 | | - if (ret) |
|---|
| 609 | | - return ret; |
|---|
| 610 | | - */ |
|---|
| 611 | | - mutex_init(&state->stream_mutex); |
|---|
| 612 | | - |
|---|
| 613 | 595 | state->last_lock = 0; |
|---|
| 614 | | - |
|---|
| 615 | 596 | return 0; |
|---|
| 616 | 597 | } |
|---|
| 617 | 598 | |
|---|
| .. | .. |
|---|
| 796 | 777 | { DVB_USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_S2_R4, |
|---|
| 797 | 778 | &dvbsky_s960_props, "Terratec Cinergy S2 Rev.4", |
|---|
| 798 | 779 | RC_MAP_DVBSKY) }, |
|---|
| 780 | + { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230, |
|---|
| 781 | + &mygica_t230c_props, "MyGica Mini DVB-(T/T2/C) USB Stick T230", |
|---|
| 782 | + RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, |
|---|
| 799 | 783 | { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C, |
|---|
| 800 | | - &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C", |
|---|
| 784 | + &mygica_t230c_props, "MyGica Mini DVB-(T/T2/C) USB Stick T230C", |
|---|
| 785 | + RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, |
|---|
| 786 | + { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C_LITE, |
|---|
| 787 | + &mygica_t230c_props, "MyGica Mini DVB-(T/T2/C) USB Stick T230C Lite", |
|---|
| 788 | + NULL) }, |
|---|
| 789 | + { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C2, |
|---|
| 790 | + &mygica_t230c_props, "MyGica Mini DVB-(T/T2/C) USB Stick T230C v2", |
|---|
| 801 | 791 | RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, |
|---|
| 802 | 792 | { } |
|---|
| 803 | 793 | }; |
|---|