2019-05-27 09:55:06 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2008-09-19 07:48:31 +04:00
/*
* TerraTec Cinergy T2 / qanu USB2 DVB - T adapter .
*
* Copyright ( C ) 2007 Tomi Orava ( tomimo @ ncircle . nullnet . fi )
*
* Based on the dvb - usb - framework code and the
* original Terratec Cinergy T2 driver by :
*
* Copyright ( C ) 2004 Daniel Mack < daniel @ qanu . de > and
* Holger Waechtler < holger @ qanu . de >
*
* Protocol Spec published on http : //qanu.de/specs/terratec_cinergyT2.pdf
*/
# include "cinergyT2.h"
/* debug */
int dvb_usb_cinergyt2_debug ;
module_param_named ( debug , dvb_usb_cinergyt2_debug , int , 0644 ) ;
[media] dvb-usb: don't break long lines
Due to the 80-cols restrictions, and latter due to checkpatch
warnings, several strings were broken into multiple lines. This
is not considered a good practice anymore, as it makes harder
to grep for strings at the source code.
As we're right now fixing other drivers due to KERN_CONT, we need
to be able to identify what printk strings don't end with a "\n".
It is a way easier to detect those if we don't break long lines.
So, join those continuation lines.
The patch was generated via the script below, and manually
adjusted if needed.
</script>
use Text::Tabs;
while (<>) {
if ($next ne "") {
$c=$_;
if ($c =~ /^\s+\"(.*)/) {
$c2=$1;
$next =~ s/\"\n$//;
$n = expand($next);
$funpos = index($n, '(');
$pos = index($c2, '",');
if ($funpos && $pos > 0) {
$s1 = substr $c2, 0, $pos + 2;
$s2 = ' ' x ($funpos + 1) . substr $c2, $pos + 2;
$s2 =~ s/^\s+//;
$s2 = ' ' x ($funpos + 1) . $s2 if ($s2 ne "");
print unexpand("$next$s1\n");
print unexpand("$s2\n") if ($s2 ne "");
} else {
print "$next$c2\n";
}
$next="";
next;
} else {
print $next;
}
$next="";
} else {
if (m/\"$/) {
if (!m/\\n\"$/) {
$next=$_;
next;
}
}
}
print $_;
}
</script>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-10-18 22:44:15 +03:00
MODULE_PARM_DESC ( debug , " set debugging level (1=info, xfer=2, rc=4 (or-able)). " ) ;
2008-09-19 07:48:31 +04:00
DVB_DEFINE_MOD_OPT_ADAPTER_NR ( adapter_nr ) ;
2008-09-19 07:24:51 +04:00
struct cinergyt2_state {
u8 rc_counter ;
2016-10-05 12:02:19 +03:00
unsigned char data [ 64 ] ;
2008-09-19 07:24:51 +04:00
} ;
2008-09-19 07:48:31 +04:00
2021-06-01 14:07:46 +03:00
/* Forward declaration */
static const struct dvb_usb_device_properties cinergyt2_properties ;
2008-09-19 07:48:31 +04:00
static int cinergyt2_streaming_ctrl ( struct dvb_usb_adapter * adap , int enable )
{
2016-10-05 12:02:19 +03:00
struct dvb_usb_device * d = adap - > dev ;
struct cinergyt2_state * st = d - > priv ;
int ret ;
2016-11-12 17:46:26 +03:00
mutex_lock ( & d - > data_mutex ) ;
2016-10-05 12:02:19 +03:00
st - > data [ 0 ] = CINERGYT2_EP1_CONTROL_STREAM_TRANSFER ;
st - > data [ 1 ] = enable ? 1 : 0 ;
ret = dvb_usb_generic_rw ( d , st - > data , 2 , st - > data , 64 , 0 ) ;
2016-11-12 17:46:26 +03:00
mutex_unlock ( & d - > data_mutex ) ;
2016-10-05 12:02:19 +03:00
return ret ;
2008-09-19 07:48:31 +04:00
}
static int cinergyt2_power_ctrl ( struct dvb_usb_device * d , int enable )
{
2016-10-05 12:02:19 +03:00
struct cinergyt2_state * st = d - > priv ;
int ret ;
2016-11-12 17:46:26 +03:00
mutex_lock ( & d - > data_mutex ) ;
2016-10-05 12:02:19 +03:00
st - > data [ 0 ] = CINERGYT2_EP1_SLEEP_MODE ;
st - > data [ 1 ] = enable ? 0 : 1 ;
ret = dvb_usb_generic_rw ( d , st - > data , 2 , st - > data , 3 , 0 ) ;
2016-11-12 17:46:26 +03:00
mutex_unlock ( & d - > data_mutex ) ;
2016-10-05 12:02:19 +03:00
return ret ;
2008-09-19 07:48:31 +04:00
}
static int cinergyt2_frontend_attach ( struct dvb_usb_adapter * adap )
{
2016-10-05 12:02:19 +03:00
struct dvb_usb_device * d = adap - > dev ;
struct cinergyt2_state * st = d - > priv ;
2008-09-19 07:48:31 +04:00
int ret ;
2011-09-06 16:31:57 +04:00
adap - > fe_adap [ 0 ] . fe = cinergyt2_fe_attach ( adap - > dev ) ;
2008-09-19 07:48:31 +04:00
2016-11-12 17:46:26 +03:00
mutex_lock ( & d - > data_mutex ) ;
2016-10-05 12:02:19 +03:00
st - > data [ 0 ] = CINERGYT2_EP1_GET_FIRMWARE_VERSION ;
ret = dvb_usb_generic_rw ( d , st - > data , 1 , st - > data , 3 , 0 ) ;
2008-09-19 07:48:31 +04:00
if ( ret < 0 ) {
2021-05-25 16:06:52 +03:00
if ( adap - > fe_adap [ 0 ] . fe )
adap - > fe_adap [ 0 ] . fe - > ops . release ( adap - > fe_adap [ 0 ] . fe ) ;
[media] dvb-usb: don't break long lines
Due to the 80-cols restrictions, and latter due to checkpatch
warnings, several strings were broken into multiple lines. This
is not considered a good practice anymore, as it makes harder
to grep for strings at the source code.
As we're right now fixing other drivers due to KERN_CONT, we need
to be able to identify what printk strings don't end with a "\n".
It is a way easier to detect those if we don't break long lines.
So, join those continuation lines.
The patch was generated via the script below, and manually
adjusted if needed.
</script>
use Text::Tabs;
while (<>) {
if ($next ne "") {
$c=$_;
if ($c =~ /^\s+\"(.*)/) {
$c2=$1;
$next =~ s/\"\n$//;
$n = expand($next);
$funpos = index($n, '(');
$pos = index($c2, '",');
if ($funpos && $pos > 0) {
$s1 = substr $c2, 0, $pos + 2;
$s2 = ' ' x ($funpos + 1) . substr $c2, $pos + 2;
$s2 =~ s/^\s+//;
$s2 = ' ' x ($funpos + 1) . $s2 if ($s2 ne "");
print unexpand("$next$s1\n");
print unexpand("$s2\n") if ($s2 ne "");
} else {
print "$next$c2\n";
}
$next="";
next;
} else {
print $next;
}
$next="";
} else {
if (m/\"$/) {
if (!m/\\n\"$/) {
$next=$_;
next;
}
}
}
print $_;
}
</script>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-10-18 22:44:15 +03:00
deb_rc ( " cinergyt2_power_ctrl() Failed to retrieve sleep state info \n " ) ;
2008-09-19 07:48:31 +04:00
}
2016-11-12 17:46:26 +03:00
mutex_unlock ( & d - > data_mutex ) ;
2008-09-19 07:48:31 +04:00
2016-10-07 19:54:33 +03:00
return ret ;
2008-09-19 07:48:31 +04:00
}
[media] rc: Name RC keymap tables as rc_map_table
Remote keytables had different names all over the place. Part of the fault
is due to a bad naming when rc subsystem was created, but there were lots
of old names that were still here.
Use a common standard for everything.
Patch generated by this script:
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_scancode,rc_map_table,g <$i >a && mv a $i; done
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_codes_,rc_map_,g <$i >a && mv a $i; done
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,rc_key_map,rc_map_table,g <$i >a && mv a $i; done
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,rc_map_table_size,rc_map_size,g <$i >a && mv a $i; done
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-11-17 21:46:09 +03:00
static struct rc_map_table rc_map_cinergyt2_table [ ] = {
2009-08-29 22:19:31 +04:00
{ 0x0401 , KEY_POWER } ,
{ 0x0402 , KEY_1 } ,
{ 0x0403 , KEY_2 } ,
{ 0x0404 , KEY_3 } ,
{ 0x0405 , KEY_4 } ,
{ 0x0406 , KEY_5 } ,
{ 0x0407 , KEY_6 } ,
{ 0x0408 , KEY_7 } ,
{ 0x0409 , KEY_8 } ,
{ 0x040a , KEY_9 } ,
{ 0x040c , KEY_0 } ,
{ 0x040b , KEY_VIDEO } ,
{ 0x040d , KEY_REFRESH } ,
{ 0x040e , KEY_SELECT } ,
{ 0x040f , KEY_EPG } ,
{ 0x0410 , KEY_UP } ,
{ 0x0414 , KEY_DOWN } ,
{ 0x0411 , KEY_LEFT } ,
{ 0x0413 , KEY_RIGHT } ,
{ 0x0412 , KEY_OK } ,
{ 0x0415 , KEY_TEXT } ,
{ 0x0416 , KEY_INFO } ,
{ 0x0417 , KEY_RED } ,
{ 0x0418 , KEY_GREEN } ,
{ 0x0419 , KEY_YELLOW } ,
{ 0x041a , KEY_BLUE } ,
{ 0x041c , KEY_VOLUMEUP } ,
{ 0x041e , KEY_VOLUMEDOWN } ,
{ 0x041d , KEY_MUTE } ,
{ 0x041b , KEY_CHANNELUP } ,
{ 0x041f , KEY_CHANNELDOWN } ,
{ 0x0440 , KEY_PAUSE } ,
{ 0x044c , KEY_PLAY } ,
{ 0x0458 , KEY_RECORD } ,
{ 0x0454 , KEY_PREVIOUS } ,
{ 0x0448 , KEY_STOP } ,
{ 0x045c , KEY_NEXT }
2008-09-19 07:48:31 +04:00
} ;
2008-09-19 07:24:51 +04:00
/* Number of keypresses to ignore before detect repeating */
# define RC_REPEAT_DELAY 3
static int repeatable_keys [ ] = {
KEY_UP ,
KEY_DOWN ,
KEY_LEFT ,
KEY_RIGHT ,
KEY_VOLUMEUP ,
KEY_VOLUMEDOWN ,
KEY_CHANNELUP ,
KEY_CHANNELDOWN
} ;
2008-09-19 07:48:31 +04:00
static int cinergyt2_rc_query ( struct dvb_usb_device * d , u32 * event , int * state )
{
2008-09-19 07:24:51 +04:00
struct cinergyt2_state * st = d - > priv ;
2016-10-07 19:54:33 +03:00
int i , ret ;
2008-09-19 07:24:51 +04:00
2008-09-19 07:48:31 +04:00
* state = REMOTE_NO_KEY_PRESSED ;
2016-11-12 17:46:26 +03:00
mutex_lock ( & d - > data_mutex ) ;
2016-10-05 12:02:19 +03:00
st - > data [ 0 ] = CINERGYT2_EP1_GET_RC_EVENTS ;
2016-10-07 19:54:33 +03:00
ret = dvb_usb_generic_rw ( d , st - > data , 1 , st - > data , 5 , 0 ) ;
if ( ret < 0 )
goto ret ;
2016-10-05 12:02:19 +03:00
if ( st - > data [ 4 ] = = 0xff ) {
2008-09-19 07:24:51 +04:00
/* key repeat */
st - > rc_counter + + ;
if ( st - > rc_counter > RC_REPEAT_DELAY ) {
for ( i = 0 ; i < ARRAY_SIZE ( repeatable_keys ) ; i + + ) {
if ( d - > last_event = = repeatable_keys [ i ] ) {
* state = REMOTE_KEY_REPEAT ;
* event = d - > last_event ;
deb_rc ( " repeat key, event %x \n " ,
* event ) ;
2016-10-05 12:02:19 +03:00
goto ret ;
2008-09-19 07:24:51 +04:00
}
}
deb_rc ( " repeated key (non repeatable) \n " ) ;
}
2016-10-05 12:02:19 +03:00
goto ret ;
2008-09-19 07:24:51 +04:00
}
2008-09-19 07:48:31 +04:00
2008-09-19 07:24:51 +04:00
/* hack to pass checksum on the custom field */
2016-10-05 12:02:19 +03:00
st - > data [ 2 ] = ~ st - > data [ 1 ] ;
dvb_usb_nec_rc_key_to_event ( d , st - > data , event , state ) ;
if ( st - > data [ 0 ] ! = 0 ) {
2008-09-19 07:24:51 +04:00
if ( * event ! = d - > last_event )
st - > rc_counter = 0 ;
2008-09-19 07:48:31 +04:00
2016-10-05 12:02:19 +03:00
deb_rc ( " key: %*ph \n " , 5 , st - > data ) ;
2008-09-19 07:24:51 +04:00
}
2016-10-05 12:02:19 +03:00
ret :
2016-11-12 17:46:26 +03:00
mutex_unlock ( & d - > data_mutex ) ;
2016-10-05 12:02:19 +03:00
return ret ;
2008-09-19 07:48:31 +04:00
}
static int cinergyt2_usb_probe ( struct usb_interface * intf ,
const struct usb_device_id * id )
{
2016-11-12 17:46:26 +03:00
return dvb_usb_device_init ( intf , & cinergyt2_properties ,
THIS_MODULE , NULL , adapter_nr ) ;
2008-09-19 07:48:31 +04:00
}
2022-03-28 23:41:20 +03:00
enum {
TERRATEC_CINERGY_T2 ,
} ;
2008-09-19 07:48:31 +04:00
static struct usb_device_id cinergyt2_usb_table [ ] = {
2022-03-28 23:41:20 +03:00
DVB_USB_DEV ( TERRATEC , TERRATEC_CINERGY_T2 ) ,
{ }
2008-09-19 07:48:31 +04:00
} ;
MODULE_DEVICE_TABLE ( usb , cinergyt2_usb_table ) ;
2021-06-01 14:07:46 +03:00
static const struct dvb_usb_device_properties cinergyt2_properties = {
2008-09-19 07:24:51 +04:00
. size_of_priv = sizeof ( struct cinergyt2_state ) ,
2008-09-19 07:48:31 +04:00
. num_adapters = 1 ,
. adapter = {
{
2011-09-06 16:31:57 +04:00
. num_frontends = 1 ,
. fe = { {
2008-09-19 07:48:31 +04:00
. streaming_ctrl = cinergyt2_streaming_ctrl ,
. frontend_attach = cinergyt2_frontend_attach ,
/* parameter for the MPEG2-data transfer */
. stream = {
. type = USB_BULK ,
. count = 5 ,
. endpoint = 0x02 ,
. u = {
. bulk = {
. buffersize = 512 ,
}
}
} ,
2011-09-06 16:31:57 +04:00
} } ,
2008-09-19 07:48:31 +04:00
}
} ,
. power_ctrl = cinergyt2_power_ctrl ,
2010-08-01 01:04:09 +04:00
. rc . legacy = {
. rc_interval = 50 ,
[media] rc: Name RC keymap tables as rc_map_table
Remote keytables had different names all over the place. Part of the fault
is due to a bad naming when rc subsystem was created, but there were lots
of old names that were still here.
Use a common standard for everything.
Patch generated by this script:
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_scancode,rc_map_table,g <$i >a && mv a $i; done
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,ir_codes_,rc_map_,g <$i >a && mv a $i; done
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,rc_key_map,rc_map_table,g <$i >a && mv a $i; done
for i in `find drivers/staging -type f -name *.[ch]` `find include/media -type f -name *.[ch]` `find drivers/media -type f -name *.[ch]`; do sed s,rc_map_table_size,rc_map_size,g <$i >a && mv a $i; done
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2010-11-17 21:46:09 +03:00
. rc_map_table = rc_map_cinergyt2_table ,
. rc_map_size = ARRAY_SIZE ( rc_map_cinergyt2_table ) ,
2010-08-01 01:04:09 +04:00
. rc_query = cinergyt2_rc_query ,
} ,
2008-09-19 07:48:31 +04:00
. generic_bulk_ctrl_endpoint = 1 ,
. num_device_descs = 1 ,
. devices = {
{ . name = " TerraTec/qanu USB2.0 Highspeed DVB-T Receiver " ,
. cold_ids = { NULL } ,
2022-03-28 23:41:20 +03:00
. warm_ids = { & cinergyt2_usb_table [ TERRATEC_CINERGY_T2 ] , NULL } ,
2008-09-19 07:48:31 +04:00
} ,
{ NULL } ,
}
} ;
static struct usb_driver cinergyt2_driver = {
. name = " cinergyT2 " ,
. probe = cinergyt2_usb_probe ,
. disconnect = dvb_usb_device_exit ,
. id_table = cinergyt2_usb_table
} ;
2011-11-18 21:46:12 +04:00
module_usb_driver ( cinergyt2_driver ) ;
2008-09-19 07:48:31 +04:00
MODULE_DESCRIPTION ( " Terratec Cinergy T2 DVB-T driver " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Tomi Orava " ) ;