.. | .. |
---|
| 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 | }; |
---|