Kconfig and Makefile updates
PATCH 1/6 Kconfig and Makefile updates
Hi all,
here comes a set of 6 small patches for the DVB subsystem against 2.6.0-test2, sized between 1kB and 6kB.
They fix various aspects in different parts of
the driver. Detailed descriptions are at the top of each patch.
Please apply. Thanks!
CU
Michael.
[V4L] - make sure saa7146 module gets build for Hexium drivers [V4L] - make Hexium drivers depend on the i2c layer
[DVB] - fix typo which prevented the mt312 driver from being build (obi <=> obj)
drivers/media/common/Kconfig +3 -3
@@ -1,8 +1,8 @@ config VIDEO_SAA7146 tristate - default y if DVB_AV7110=y || DVB_BUDGET=y || DVB_BUDGET_AV=y || VIDEO_MXB=y || VIDEO_DPC=y - default m if DVB_AV7110=m || DVB_BUDGET=m || DVB_BUDGET_AV=m || VIDEO_MXB=m || VIDEO_DPC=m - depends on VIDEO_DEV && PCI + default y if DVB_AV7110=y || DVB_BUDGET=y || DVB_BUDGET_AV=y || VIDEO_MXB=y || VIDEO_DPC=y || VIDEO_HEXIUM_ORION=y || VIDEO_HEXIUM_GEMINI=y + default m if DVB_AV7110=m || DVB_BUDGET=m || DVB_BUDGET_AV=m || VIDEO_MXB=m || VIDEO_DPC=m || VIDEO_HEXIUM_ORION=m || VIDEO_HEXIUM_GEMINI=m + depends on VIDEO_DEV && PCI && I2C config VIDEO_VIDEOBUF tristate
drivers/media/dvb/frontends/Makefile +1 -1
@@ -12,6 +12,6 @@ obj-$(CONFIG_DVB_CX24110) += cx24110.o obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o -obi-$(CONFIG_DVB_MT312) += mt312.o +obj-$(CONFIG_DVB_MT312) += mt312.o obj-$(CONFIG_DVB_VES1820) += ves1820.o obj-$(CONFIG_DVB_TDA1004X) += tda1004x.o
drivers/media/video/Kconfig +2 -2
@@ -259,7 +259,7 @@ config VIDEO_HEXIUM_ORION tristate "Hexium HV-PCI6 and Orion frame grabber" - depends on VIDEO_DEV && PCI + depends on VIDEO_DEV && PCI && I2C ---help--- This is a video4linux driver for the Hexium HV-PCI6 and Orion frame grabber cards by Hexium.
@@ -271,7 +271,7 @@ config VIDEO_HEXIUM_GEMINI tristate "Hexium Gemini frame grabber" - depends on VIDEO_DEV && PCI + depends on VIDEO_DEV && PCI && I2C ---help--- This is a video4linux driver for the Hexium Gemini frame grabber card by Hexium. Please note that the Gemini Dual
PATCH 2/6 DVB core update
[DVB] - if there are multiple adapters, bend the tuning frequency only if the adapters differ
drivers/media/dvb/dvb-core/dvb_frontend.c +4 -0
@@ -134,6 +134,7 @@ {struct list_head *entry;int stepsize = this_fe->info->frequency_stepsize; +int this_fe_adap_num = this_fe->frontend.i2c->adapter->num;int frequency;if (!stepsize || recursive >10 ) {
@@ -157,6 +158,9 @@ fe = list_entry (entry, struct dvb_frontend_data, list_head); +if (fe->frontend.i2c->adapter->num != this_fe_adap_num) +continue ; + f = fe->parameters.frequency; f += fe->lnb_drift; f += fe->bending;
PATCH 3/6 mt312 DVB frontend update
[DVB] - show i2c read errors only for registered frontends
drivers/media/dvb/frontends/mt312.c +14 -3
@@ -41,6 +41,9 @@#define MT312_SYS_CLK 90000000UL/* 90 MHz */ #define MT312_PLL_CLK 10000000UL/* 10 MHz */ +/* number of active frontends */ +static int mt312_count =0 ; +static struct dvb_frontend_info mt312_info = { .name ="Zarlink MT312" , .type =FE_QPSK ,
@@ -78,7 +81,7 @@ ret = i2c->xfer (i2c, msg,2 ); -if (ret !=2 ) { +if ((ret !=2 ) && (mt312_count !=0 )) {printk (KERN_ERR "%s: ret == %d\n" , __FUNCTION__, ret);return -EREMOTEIO ; }
@@ -722,13 +725,21 @@if ((id !=ID_VP310 ) && (id !=ID_MT312 ))return -ENODEV ; -return dvb_register_frontend (mt312_ioctl, i2c, (void *) (long ) id, - &mt312_info); +if ((ret =dvb_register_frontend (mt312_ioctl, i2c, + (void *)(long )id, &mt312_info)) <0 ) +return ret; + + mt312_count++; + +return 0 ; }static void mt312_detach (struct dvb_i2c_bus *i2c) {dvb_unregister_frontend (mt312_ioctl, i2c); + +if (mt312_count) + mt312_count--; }static int __init mt312_module_init (void )
PATCH 4/6 Update MAC handling for various DVB PCI cards
[DVB] - correctly read MAC from eeprom on Technotrend and KNC1 cards
drivers/media/dvb/ttpci/ttpci-eeprom.c +63 -39
@@ -3,9 +3,6 @@ decode it and store it in the associated adapter struct for use by dvb_net.c - This code was tested on TT-Budget/WinTV-NOVA-CI PCI boards with - Atmel and ST Microelectronics EEPROMs. - This card appear to have the 24C16 write protect held to ground, thus permitting normal read/write operation. Theoretically it would be possible to write routines to burn a different (encoded)
@@ -15,6 +12,9 @@ Michael Glaum KVH Industries Holger Waechtler Convergence + Copyright (C) 2002-2003 Ralph Metzler <[email protected]> + Metzler Brothers Systementwicklung GbR + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or
@@ -40,23 +40,62 @@#include "dvb_functions.h" #if 1 -#define dprintk(x...) printk(x) +#define dprintk(x...) do { printk(x); } while (0)#else -#define dprintk(x...) +#define dprintk(x...) do { } while (0)#endif +static int check_mac_tt (u8 *buf) +{ +int i; +u16 tmp =0xffff ; + +for (i =0 ; i <8 ; i++) { + tmp = (tmp <<8 ) | ((tmp >>8 ) ^ buf[i]); + tmp ^= (tmp >>4 ) &0x0f ; + tmp ^= (tmp <<12 ) ^ ((tmp &0xff ) <<5 ); + } + tmp ^=0xffff ; +return (((tmp >>8 ) ^ buf[8 ]) | ((tmp &0xff ) ^ buf[9 ])); +} + +static int getmac_tt (u8 * decodedMAC,u8 * encodedMAC) +{ +u8 xor[20 ] = {0x72 ,0x23 ,0x68 ,0x19 ,0x5c ,0xa8 ,0x71 ,0x2c , +0x54 ,0xd3 ,0x7b ,0xf1 ,0x9E ,0x23 ,0x16 ,0xf6 , +0x1d ,0x36 ,0x64 ,0x78 }; +u8 data[20 ]; +int i; + +/* In case there is a sig check failure have the orig contents available */ +memcpy (data, encodedMAC,20 ); + +for (i =0 ; i <20 ; i++) + data[i] ^= xor[i]; +for (i =0 ; i <10 ; i++) + data[i] = ((data[2 * i +1 ] <<8 ) | data[2 * i]) + >> ((data[2 * i +1 ] >>6 ) &3 ); + +if (check_mac_tt (data)) +return -ENODEV ; + + decodedMAC[0 ] = data[2 ]; decodedMAC[1 ] = data[1 ]; decodedMAC[2 ] = data[0 ]; + decodedMAC[3 ] = data[6 ]; decodedMAC[4 ] = data[5 ]; decodedMAC[5 ] = data[4 ]; +return 0 ; +} +static int ttpci_eeprom_read_encodedMAC (struct dvb_i2c_bus *i2c,u8 * encodedMAC) {int ret; -u8 b0[] = {0xd4 }; +u8 b0[] = {0xcc };struct i2c_msg msg[] = { {.addr =0x50 ,.flags =0 ,.buf = b0,.len =1 }, - {.addr =0x50 ,.flags =I2C_M_RD ,.buf = encodedMAC,.len =6 } + { .addr =0x50 , .flags =I2C_M_RD , .buf = encodedMAC, .len =20 } }; -dprintk ("%s\n" , __FUNCTION__); +/* dprintk("%s\n", __FUNCTION__); */ ret = i2c->xfer (i2c, msg,2 );
@@ -66,34 +105,11 @@return 0 ; } -static void decodeMAC (u8 * decodedMAC,const u8 * encodedMAC) -{ -u8 ormask0[3 ] = {0x54 ,0x7B ,0x9E }; -u8 ormask1[3 ] = {0xD3 ,0xF1 ,0x23 }; -u8 low; -u8 high; -u8 shift; -int i; - - decodedMAC[0 ] =0x00 ; - decodedMAC[1 ] =0xD0 ; - decodedMAC[2 ] =0x5C ; - -for (i =0 ; i <3 ; i++) { - low = encodedMAC[2 * i] ^ ormask0[i]; - high = encodedMAC[2 * i +1 ] ^ ormask1[i]; - shift = (high >>6 ) &0x3 ; - - decodedMAC[5 - i] = ((high <<8 ) | low) >> shift; - } - -} -int ttpci_eeprom_parse_mac (struct dvb_i2c_bus *i2c) { -int ret; -u8 encodedMAC[6 ]; +int ret, i; +u8 encodedMAC[20 ];u8 decodedMAC[6 ]; ret =ttpci_eeprom_read_encodedMAC (i2c, encodedMAC);
@@ -104,16 +120,24 @@return ret; } -decodeMAC (decodedMAC, encodedMAC); -memcpy (i2c->adapter->proposed_mac, decodedMAC,6 ); + ret =getmac_tt (decodedMAC, encodedMAC); +if ( ret !=0 ) { +dprintk ("%s adapter %i failed MAC signature check\n" , + i2c->adapter->name, i2c->adapter->num); +dprintk ("encoded MAC from EEPROM was " ); +for (i=0 ; i<19 ; i++) { +dprintk ("%.2x:" , encodedMAC[i]); + } +dprintk ("%.2x\n" , encodedMAC[19 ]); +memset (i2c->adapter->proposed_mac,0 ,6 ); +return ret; + } -dprintk ("%s adapter %i has MAC addr = %02x:%02x:%02x:%02x:%02x:%02x\n" , +memcpy (i2c->adapter->proposed_mac, decodedMAC,6 ); +dprintk ("%s adapter %i has MAC addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n" , i2c->adapter->name, i2c->adapter->num, decodedMAC[0 ], decodedMAC[1 ], decodedMAC[2 ], decodedMAC[3 ], decodedMAC[4 ], decodedMAC[5 ]); -dprintk ("encoded MAC was %02x:%02x:%02x:%02x:%02x:%02x\n" , - encodedMAC[0 ], encodedMAC[1 ], encodedMAC[2 ], - encodedMAC[3 ], encodedMAC[4 ], encodedMAC[5 ]);return 0 ; }
drivers/media/dvb/ttpci/budget-av.c +24 -0
@@ -64,6 +64,19 @@return mm2[0 ]; } +static int i2c_readregs (struct dvb_i2c_bus *i2c,u8 id,u8 reg,u8 *buf,u8 len) +{ +u8 mm1[] = { reg }; +struct i2c_msg msgs[2 ] = { + { addr: id/2 , flags:0 , buf: mm1, len:1 }, + { addr: id/2 , flags:I2C_M_RD , buf: buf, len: len } + }; + +if (i2c->xfer (i2c, msgs,2 ) !=2 ) +return -EIO ; +return 0 ; +} +static int i2c_writereg (struct dvb_i2c_bus *i2c,u8 id,u8 reg,u8 val) {
@@ -177,6 +190,7 @@ {struct budget_av *budget_av;struct budget_info *bi = info->ext_priv; +u8 *mac;int err;DEB_EE (("dev: %p\n" ,dev));
@@ -243,6 +257,16 @@/* fixme: find some sane values here... */ saa7146_write (dev,PCI_BT_V1 ,0x1c00101f ); + mac = budget_av->budget.dvb_adapter->proposed_mac; +if (i2c_readregs (budget_av->budget.i2c_bus,0xa0 ,0x30 , mac,6 )) { +printk ("KNC1-%d: Could not read MAC from KNC1 card\n" , + budget_av->budget.dvb_adapter->num); +memset (mac,0 ,6 ); + } +else +printk ("KNC1-%d: MAC addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n" , + budget_av->budget.dvb_adapter->num, + mac[0 ], mac[1 ], mac[2 ], mac[3 ], mac[4 ], mac[5 ]);return 0 ; }
PATCH 5/6 TTUSB-DEC driver update
[DVB] - Hand off all processing of urb data to a tasklet
drivers/media/dvb/ttusb-dec/ttusb_dec.c +71 -23
@@ -124,14 +125,10 @@ttusb_dec_send_command (dec,0x50 ,sizeof (b), b,NULL ,NULL ); -if (!down_interruptible (&dec->pes2ts_sem)) {dvb_filter_pes2ts_init (&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO ], ttusb_dec_av_pes2ts_cb, dec->demux.feed);dvb_filter_pes2ts_init (&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO ], ttusb_dec_av_pes2ts_cb, dec->demux.feed); - -up (&dec->pes2ts_sem); - } } static int ttusb_dec_i2c_master_xfer(struct dvb_i2c_bus *i2c,
@@ -196,14 +193,8 @@memcpy (&dec->v_pes[dec->v_pes_length], &av_pes[12 ], prebytes); -if (!down_interruptible (&dec->pes2ts_sem)) { -dvb_filter_pes2ts (&dec->v_pes2ts, - dec->v_pes, - dec->v_pes_length + - prebytes); - -up (&dec->pes2ts_sem); - } +dvb_filter_pes2ts (&dec->v_pes2ts, dec->v_pes, + dec->v_pes_length + prebytes); }if (av_pes[5 ] &0x10 ) {
@@ -246,16 +237,10 @@ postbytes);memcpy (&dec->v_pes[4 ], &v_pes_payload_length,2 ); -if (postbytes ==0 ) { -if (!down_interruptible (&dec->pes2ts_sem)) { -dvb_filter_pes2ts (&dec->v_pes2ts, - dec->v_pes, +if (postbytes ==0 ) +dvb_filter_pes2ts (&dec->v_pes2ts, dec->v_pes, dec->v_pes_length); -up (&dec->pes2ts_sem); - } - } -break ; }
@@ -357,6 +342,31 @@ } } +static void ttusb_dec_process_urb_frame_list (unsigned long data) +{ +struct ttusb_dec *dec = (struct ttusb_dec *)data; +struct list_head *item; +struct urb_frame *frame; +unsigned long flags; + +while (1 ) { +spin_lock_irqsave (&dec->urb_frame_list_lock, flags); +if ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { + frame = list_entry(item, struct urb_frame, + urb_frame_list); +list_del (&frame->urb_frame_list); + }else { +spin_unlock_irqrestore (&dec->urb_frame_list_lock, + flags); +return ; + } +spin_unlock_irqrestore (&dec->urb_frame_list_lock, flags); + +ttusb_dec_process_urb_frame (dec, frame->data, frame->length); +kfree (frame); + } +} +#if LINUX_VERSION_CODE <KERNEL_VERSION (2 ,5 ,0 )static void ttusb_dec_process_urb (struct urb *urb) #else
@@ -372,12 +382,28 @@struct usb_iso_packet_descriptor *d;u8 *b;int length; +struct urb_frame *frame; d = &urb->iso_frame_desc[i]; b = urb->transfer_buffer + d->offset; length = d->actual_length; -ttusb_dec_process_urb_frame (dec, b, length); +if ((frame =kmalloc (sizeof (struct urb_frame ), +GFP_ATOMIC ))) { +unsigned long flags; + +memcpy (frame->data, b, length); + frame->length = length; + +spin_lock_irqsave (&dec->urb_frame_list_lock, + flags); +list_add_tail (&frame->urb_frame_list, + &dec->urb_frame_list); +spin_unlock_irqrestore (&dec->urb_frame_list_lock, + flags); + +tasklet_schedule (&dec->urb_tasklet); + } } }else {/* -ENOENT is expected when unlinking urbs */
@@ -653,6 +679,14 @@return 0 ; } +static void ttusb_dec_init_tasklet (struct ttusb_dec *dec) +{ + dec->urb_frame_list_lock =SPIN_LOCK_UNLOCKED ; +INIT_LIST_HEAD (&dec->urb_frame_list); +tasklet_init (&dec->urb_tasklet, ttusb_dec_process_urb_frame_list, + (unsigned long )dec); +} +static void ttusb_dec_init_v_pes (struct ttusb_dec *dec) {dprintk ("%s\n" , __FUNCTION__);
@@ -834,8 +868,6 @@return result; } -sema_init (&dec->pes2ts_sem,1 ); -dvb_net_init (dec->adapter, &dec->dvb_net, &dec->demux.dmx);return 0 ;
@@ -868,6 +900,20 @@ttusb_dec_free_iso_urbs (dec); } +static void ttusb_dec_exit_tasklet (struct ttusb_dec *dec) +{ +struct list_head *item; +struct urb_frame *frame; + +tasklet_kill (&dec->urb_tasklet); + +while ((item = dec->urb_frame_list.next) != &dec->urb_frame_list) { + frame = list_entry(item, struct urb_frame, urb_frame_list); +list_del (&frame->urb_frame_list); +kfree (frame); + } +} +#if LINUX_VERSION_CODE <KERNEL_VERSION (2 ,5 ,0 )static void *ttusb_dec_probe (struct usb_device *udev,unsigned int ifnum,const struct usb_device_id *id)
@@ -892,6 +938,7 @@ttusb_dec_init_stb (dec);ttusb_dec_init_dvb (dec);ttusb_dec_init_v_pes (dec); +ttusb_dec_init_tasklet (dec);return (void *)dec; }
@@ -919,6 +966,7 @@ttusb_dec_init_stb (dec);ttusb_dec_init_dvb (dec);ttusb_dec_init_v_pes (dec); +ttusb_dec_init_tasklet (dec);usb_set_intfdata (intf, (void *)dec);ttusb_dec_set_streaming_interface (dec);
@@ -941,6 +989,7 @@dprintk ("%s\n" , __FUNCTION__); +ttusb_dec_exit_tasklet (dec);ttusb_dec_exit_usb (dec);ttusb_dec_exit_dvb (dec);
drivers/media/dvb/ttusb-dec/ttusb_dec.h +14 -2
@@ -22,7 +22,10 @@#ifndef _TTUSB_DEC_H#define _TTUSB_DEC_H -#include "asm/semaphore.h" +#include <asm/semaphore.h> +#include <linux/interrupt.h> +#include <linux/list.h> +#include <linux/spinlock.h> #include "dmxdev.h" #include "dvb_demux.h" #include "dvb_filter.h"
@@ -77,11 +80,20 @@struct dvb_filter_pes2ts a_pes2ts;struct dvb_filter_pes2ts v_pes2ts; -struct semaphore pes2ts_sem;u8 v_pes[16 +MAX_AV_PES_LENGTH ];int v_pes_length;int v_pes_postbytes; + +struct list_head urb_frame_list; +struct tasklet_struct urb_tasklet; + spinlock_t urb_frame_list_lock; +}; + +struct urb_frame { +u8 data[ISO_FRAME_SIZE ]; +int length; +struct list_head urb_frame_list; };#endif
PATCH 6/6 Hexium saa7146 driver update
[V4L] - set debug verbosity to 0 for both Hexium drivers [V4L] - declare all local functions and variables static
drivers/media/video/hexium_gemini.c +4 -4
@@ -25,12 +25,12 @@#include <media/saa7146_vv.h> -static int debug =255 ; +static int debug =0 ;MODULE_PARM (debug,"i" );MODULE_PARM_DESC (debug,"debug verbosity" );/* global variables */ -int hexium_num =0 ; +static int hexium_num =0 ;#include "hexium_gemini.h"
@@ -388,7 +388,7 @@ .irq_func = NULL, }; -int __init hexium_init_module (void ) +static int __init hexium_init_module (void ) {if (0 !=saa7146_register_extension (&hexium_extension)) {DEB_S (("failed to register extension.\n" ));
@@ -398,7 +398,7 @@return 0 ; } -void __exit hexium_cleanup_module(void) +static void __exit hexium_cleanup_module(void) {saa7146_unregister_extension (&hexium_extension); }
drivers/media/video/hexium_orion.c +1 -1
@@ -25,7 +25,7 @@#include <media/saa7146_vv.h> -static int debug =255 ; +static int debug =0 ;MODULE_PARM (debug,"i" );MODULE_PARM_DESC (debug,"debug verbosity" );
Hi,
drivers/media/common/Kconfig line 5
Quoted 8 lines · Michael Hunold
config
VIDEO_SAA7146
tristatedrivers/media/common/Kconfig +3
-3- default y if DVB_AV7110=y || DVB_BUDGET=y || DVB_BUDGET_AV=y || VIDEO_MXB=y || VIDEO_DPC=y - default m if DVB_AV7110=m || DVB_BUDGET=m || DVB_BUDGET_AV=m || VIDEO_MXB=m || VIDEO_DPC=m - depends on VIDEO_DEV && PCI + default y if DVB_AV7110=y || DVB_BUDGET=y || DVB_BUDGET_AV=y || VIDEO_MXB=y || VIDEO_DPC=y || VIDEO_HEXIUM_ORION=y || VIDEO_HEXIUM_GEMINI=y + default m if DVB_AV7110=m || DVB_BUDGET=m || DVB_BUDGET_AV=m || VIDEO_MXB=m || VIDEO_DPC=m || VIDEO_HEXIUM_ORION=m || VIDEO_HEXIUM_GEMINI=m + depends on VIDEO_DEV && PCI && I2C
You can change this also into:
config VIDEO_SAA7146
def_tristate DVB_AV7110 || DVB_BUDGET || DVB_BUDGET_AV || \ VIDEO_MXB || VIDEO_DPC || VIDEO_HEXIUM_ORION || \ VIDEO_HEXIUM_GEMINI depends on VIDEO_DEV && PCI && I2C
bye, Roman
Hello Roman,
Quoted 7 lines
You can change this also into:
config
VIDEO_SAA7146def_tristate DVB_AV7110 || DVB_BUDGET || DVB_BUDGET_AV || \ VIDEO_MXB || VIDEO_DPC || VIDEO_HEXIUM_ORION || \ VIDEO_HEXIUM_GEMINI depends on VIDEO_DEV && PCI && I2C
Thanks! I've submitted it to our CVS, it will be in the next patchset.
Quoted 1 line
bye, Roman
CU
Michael.