<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman,new york,times,serif;font-size:12pt"><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><br><br><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;">----- Original Message ----<br>From: Chaogui Zhang &lt;czhang1974@gmail.com&gt;<br>To: linux-dvb@linuxtv.org<br>Sent: Monday, January 28, 2008 11:20:10 AM<br>Subject: Re: [linux-dvb] [PATCH] XC5000 tuner improvement/clean up<br><br>
On 
Jan 
27, 
2008 
6:50 
PM, 
Chaogui 
Zhang 
&lt;<a ymailto="mailto:czhang1974@gmail.com" href="mailto:czhang1974@gmail.com">czhang1974@gmail.com</a>&gt; 
wrote:<br>&gt; <br>&gt; 
Download 
the 
newest 
v4l-dvb 
tree 
from 
<a href="http://linuxtv.org/hg/v4l-dvb" target="_blank">http://linuxtv.org/hg/v4l-dvb</a><br>&gt; 
and 
apply 
the 
patch 
against 
it.<br>&gt; <br><br>I 
just 
noticed 
that 
the 
previous 
patch 
that 
fixed 
the 
kernel 
oops 
has<br>been 
merged 
into 
the 
master 
tree, 
which 
conflicts 
with 
the 
patch 
for <br>tuner 
performance 
improvement(which 
contains 
the 
oops 
fixes 
too). 
I<br>regenerated 
the 
patch 
against 
the 
master 
tree 
and 
it 
is 
below. 
Please<br>use 
this 
one 
instead.<br><br>-- <br>Chaogui 
Zhang<br><br>Signed-off-by: 
Chaogui 
Zhang 
&lt;<a ymailto="mailto:czhang1974@gmail.com" href="mailto:czhang1974@gmail.com">czhang1974@gmail.com</a>&gt;<br><br>diff 
-r 
ed7daeb29425 
linux/drivers/media/dvb/frontends/xc5000.c<br>--- 
a/linux/drivers/media/dvb/frontends/xc5000.c&nbsp;&nbsp;&nbsp; 
Mon 
Jan 
28 
10:01:11 
2008 
-0200<br>+++ 
b/linux/drivers/media/dvb/frontends/xc5000.c&nbsp;&nbsp;&nbsp; 
Sun 
Jan 
27 
19:36:07 
2008 
-0500<br>@@ 
-3,6 
+3,7 
@@<br>&nbsp; 
*<br>&nbsp; 
*&nbsp; 
Copyright 
(c) 
2007 
Xceive 
Corporation<br>&nbsp; 
*&nbsp; 
Copyright 
(c) 
2007 
Steven 
Toth 
&lt;<a ymailto="mailto:stoth@hauppauge.com" href="mailto:stoth@hauppauge.com">stoth@hauppauge.com</a>&gt;<br>+ 
*&nbsp; 
Copyright 
(c) 
2007, 
2008 
Chaogui 
Zhang 
&lt;<a ymailto="mailto:czhang1974@gmail.com" href="mailto:czhang1974@gmail.com">czhang1974@gmail.com</a>&gt;<br>&nbsp; 
*<br>&nbsp; 
*&nbsp; 
This 
program 
is 
free 
software; 
you 
can 
redistribute 
it 
and/or 
modify<br>&nbsp; 
*&nbsp; 
it 
under 
the 
terms 
of 
the 
GNU 
General 
Public 
License 
as 
published 
by<br>@@ 
-38,6 
+39,13 
@@ 
MODULE_PARM_DESC(debug, 
"Turn 
on/off 
deb<br> <br> 
#define 
dprintk(level,fmt, 
arg...) 
if 
(debug 
&gt;= 
level) 
\<br> 
&nbsp;&nbsp;&nbsp; 
printk(KERN_INFO 
"%s: 

fmt, 
"xc5000", 
## 
arg)<br>+<br>+static 
int 
allow_shutdown;<br>+module_param(allow_shutdown, 
int, 
0644);<br>+MODULE_PARM_DESC(allow_shutdown, 
"Allow 
the 
XC5000 
tuner 
to 
be 
shutdown 
(default: 
no).");<br>+<br>+static 
LIST_HEAD(xc5000_list);<br>+static 
DEFINE_MUTEX(xc5000_list_lock);<br> <br> 
#define 
XC5000_DEFAULT_FIRMWARE 
"dvb-fe-xc5000-1.1.fw"<br> 
#define 
XC5000_DEFAULT_FIRMWARE_SIZE 
12332<br>@@ 
-179,7 
+187,6 
@@ 
XC_TV_STANDARD 
XC5000_Standard[MAX_TV_ST<br> <br> 
static 
int&nbsp; 
xc5000_writeregs(struct 
xc5000_priv 
*priv, 
u8 
*buf, 
u8 
len);<br> 
static 
int&nbsp; 
xc5000_readregs(struct 
xc5000_priv 
*priv, 
u8 
*buf, 
u8 
len);<br>-static 
void 
xc5000_TunerReset(struct 
dvb_frontend 
*fe);<br> <br> 
static 
int 
xc_send_i2c_data(struct 
xc5000_priv 
*priv, 
u8 
*buf, 
int 
len)<br> 
{<br>@@ 
-195,29 
+202,21 
@@ 
static 
int 
xc_read_i2c_data(struct 
xc500<br> <br> 
static 
int 
xc_reset(struct 
dvb_frontend 
*fe)<br> 
{<br>-&nbsp;&nbsp;&nbsp; 
xc5000_TunerReset(fe);<br>-&nbsp;&nbsp;&nbsp; 
return 
XC_RESULT_SUCCESS;<br>-}<br>-<br>-static 
void 
xc_wait(int 
wait_ms)<br>-{<br>-&nbsp;&nbsp;&nbsp; 
msleep(wait_ms);<br>-}<br>-<br>-static 
void 
xc5000_TunerReset(struct 
dvb_frontend 
*fe)<br>-{<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_priv 
*priv 

fe-&gt;tuner_priv;<br> 
&nbsp;&nbsp;&nbsp; 
int 
ret;<br> <br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"%s()\n", 
__FUNCTION__);<br> <br>-&nbsp;&nbsp;&nbsp; 
if 
(priv-&gt;cfg-&gt;tuner_callback) 
{<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

priv-&gt;cfg-&gt;tuner_callback(priv-&gt;cfg-&gt;priv,<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
XC5000_TUNER_RESET, 
0);<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
if 
(ret)<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
reset 
failed\n");<br>-&nbsp;&nbsp;&nbsp; 

else<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
no 
tuner 
reset 
callback 
function, 
fatal\n");<br>+&nbsp;&nbsp;&nbsp; 
if 
(!priv-&gt;cfg-&gt;tuner_callback) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
"xc5000: 
no 
tuner 
reset 
callback 
function, 
fatal\n");<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
XC_RESULT_RESET_FAILURE;<br>+&nbsp;&nbsp;&nbsp; 
}<br>+<br>+&nbsp;&nbsp;&nbsp; 
ret 

priv-&gt;cfg-&gt;tuner_callback(priv-&gt;cfg-&gt;priv,<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
XC5000_TUNER_RESET, 
0);<br>+&nbsp;&nbsp;&nbsp; 
if 
(ret) 
printk(KERN_ERR 
"xc5000: 
reset 
failed\n");<br>+&nbsp;&nbsp;&nbsp; 
return 
ret;<br> 
}<br> <br> 
static 
int 
xc_write_reg(struct 
xc5000_priv 
*priv, 
u16 
regAddr, 
u16 
i2cData)<br>@@ 
-245,7 
+244,7 
@@ 
static 
int 
xc_write_reg(struct 
xc5000_pr<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
/* 
busy 
flag 
cleared 
*/<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
break;<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 

else 
{<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_wait(100); 
/* 
wait 

ms 
*/<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
msleep(5); 
/* 
wait 

ms 
*/<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
WatchDogTimer--;<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
}<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
}<br>@@ 
-296,7 
+295,7 
@@ 
static 
int 
xc_load_i2c_sequence(struct 
d<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
result;<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 

else 
if 
(len 
&amp; 
0x8000) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
/* 
WAIT 
command 
*/<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_wait(len 
&amp; 
0x7FFF);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
msleep(len 
&amp; 
0x7FFF);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
index 
+= 
2;<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 

else 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
/* 
Send 
i2c 
data 
whilst 
ensuring 
individual 
transactions<br>@@ 
-352,11 
+351,10 
@@ 
static 
int 
xc_SetTVStandard(struct 
xc500<br> <br> 
static 
int 
xc_shutdown(struct 
xc5000_priv 
*priv)<br> 
{<br>-&nbsp;&nbsp;&nbsp; 
return 
0;<br>-&nbsp;&nbsp;&nbsp; 
/* 
Fixme: 
cannot 
bring 
tuner 
back 
alive 
once 
shutdown<br>-&nbsp;&nbsp;&nbsp; 
 
*&nbsp; 
&nbsp; 
&nbsp; 
&nbsp; 
without 
reloading 
the 
driver 
modules.<br>-&nbsp;&nbsp;&nbsp; 
 
*&nbsp; 
&nbsp; 
return 
xc_write_reg(priv, 
XREG_POWER_DOWN, 
0);<br>-&nbsp;&nbsp;&nbsp; 
 
*/<br>+&nbsp;&nbsp;&nbsp; 
if(allow_shutdown)<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
xc_write_reg(priv, 
XREG_POWER_DOWN, 
0);<br>+&nbsp;&nbsp;&nbsp; 
else<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
0;<br> 
}<br> <br> 
static 
int 
xc_SetSignalSource(struct 
xc5000_priv 
*priv, 
u16 
rf_mode)<br>@@ 
-496,7 
+494,7 
@@ 
static 
u16 
WaitForLock(struct 
xc5000_pri<br> 
&nbsp;&nbsp;&nbsp; 
while 
((lockState 
== 
0) 
&amp;&amp; 
(watchDogCount 
&gt; 
0)) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_get_lock_status(priv, 
&amp;lockState);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
if 
(lockState 
!= 
1) 
{<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_wait(5);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
msleep(5);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
watchDogCount--;<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
}<br> 
&nbsp;&nbsp;&nbsp; 
}<br>@@ 
-612,7 
+610,7 
@@ 
static 
void 
xc_debug_dump(struct 
xc5000_<br> 
&nbsp;&nbsp;&nbsp; 
 

Frame 
Lines 
needs 
two 
frame 
times 
after 
initial 
lock<br> 
&nbsp;&nbsp;&nbsp; 
 

before 
it 
is 
valid.<br> 
&nbsp;&nbsp;&nbsp; 
 
*/<br>-&nbsp;&nbsp;&nbsp; 
xc_wait(100);<br>+&nbsp;&nbsp;&nbsp; 
msleep(100);<br> <br> 
&nbsp;&nbsp;&nbsp; 
xc_get_ADC_Envelope(priv,&nbsp; 
&amp;adc_envelope);<br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"*** 
ADC 
envelope 
(0-1023) 

%d\n", 
adc_envelope);<br>@@ 
-640,13 
+638,32 
@@ 
static 
void 
xc_debug_dump(struct 
xc5000_<br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"*** 
Quality 
(0:&lt;8dB, 
7:&gt;56dB) 

%d\n", 
quality);<br> 
}<br> <br>+static 
int 
xc_load_fw_and_init_tuner(struct 
dvb_frontend 
*fe);<br>+<br> 
static 
int 
xc5000_set_params(struct 
dvb_frontend 
*fe,<br> 
&nbsp;&nbsp;&nbsp; 
struct 
dvb_frontend_parameters 
*params)<br> 
{<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_priv 
*priv 

fe-&gt;tuner_priv;<br>-&nbsp;&nbsp;&nbsp; 
int 
ret;<br>+&nbsp;&nbsp;&nbsp; 
int 
ret=0;<br> <br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"%s() 
frequency=%d 
(Hz)\n", 
__FUNCTION__, 
params-&gt;frequency);<br>+<br>+&nbsp;&nbsp;&nbsp; 
mutex_lock(&amp;priv-&gt;lock);<br>+<br>+&nbsp;&nbsp;&nbsp; 
if(priv-&gt;fwloaded 
== 
0) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

xc_load_fw_and_init_tuner(fe);<br>+&nbsp;&nbsp;&nbsp; 
}<br>+#if 
0<br>+&nbsp;&nbsp;&nbsp; 
else 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

xc_initialize(priv);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
msleep(100);<br>+&nbsp;&nbsp;&nbsp; 
}<br>+#endif<br>+&nbsp;&nbsp;&nbsp; 
if(ret 
!= 
XC_RESULT_SUCCESS) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
Unable 
to 
initialise 
tuner\n");<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br>+&nbsp;&nbsp;&nbsp; 
}<br> <br> 
&nbsp;&nbsp;&nbsp; 
switch(params-&gt;u.vsb.modulation) 
{<br> 
&nbsp;&nbsp;&nbsp; 
case 
VSB_8:<br>@@ 
-667,6 
+684,7 
@@ 
static 
int 
xc5000_set_params(struct 
dvb_<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;video_standard 

DTV6;<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
break;<br> 
&nbsp;&nbsp;&nbsp; 
default:<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EINVAL;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-678,6 
+696,7 
@@ 
static 
int 
xc5000_set_params(struct 
dvb_<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
"xc5000: 
xc_SetSignalSource(%d) 
failed\n",<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;rf_mode);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-686,6 
+705,7 
@@ 
static 
int 
xc5000_set_params(struct 
dvb_<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
XC5000_Standard[priv-&gt;video_standard].AudioMode);<br> 
&nbsp;&nbsp;&nbsp; 
if 
(ret 
!= 
XC_RESULT_SUCCESS) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
xc_SetTVStandard 
failed\n");<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-693,6 
+713,7 
@@ 
static 
int 
xc5000_set_params(struct 
dvb_<br> 
&nbsp;&nbsp;&nbsp; 
if 
(ret 
!= 
XC_RESULT_SUCCESS) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
xc_Set_IF_frequency(%d) 
failed\n",<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;cfg-&gt;if_khz);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EIO;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-701,22 
+722,36 
@@ 
static 
int 
xc5000_set_params(struct 
dvb_<br> 
&nbsp;&nbsp;&nbsp; 
if 
(debug)<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_debug_dump(priv);<br> <br>-&nbsp;&nbsp;&nbsp; 
return 
0;<br>-}<br>-<br>-static 
int 
xc_load_fw_and_init_tuner(struct 
dvb_frontend 
*fe);<br>+&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br>+&nbsp;&nbsp;&nbsp; 
return 
0;<br>+}<br> <br> 
static 
int 
xc5000_set_analog_params(struct 
dvb_frontend 
*fe,<br> 
&nbsp;&nbsp;&nbsp; 
struct 
analog_parameters 
*params)<br> 
{<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_priv 
*priv 

fe-&gt;tuner_priv;<br>-&nbsp;&nbsp;&nbsp; 
int 
ret;<br>-<br>-&nbsp;&nbsp;&nbsp; 
if(priv-&gt;fwloaded 
== 
0)<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_load_fw_and_init_tuner(fe);<br>+&nbsp;&nbsp;&nbsp; 
int 
ret=0;<br> <br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"%s() 
frequency=%d 
(in 
units 
of 
62.5khz)\n",<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
__FUNCTION__, 
params-&gt;frequency);<br>+<br>+&nbsp;&nbsp;&nbsp; 
mutex_lock(&amp;priv-&gt;lock);<br>+<br>+&nbsp;&nbsp;&nbsp; 
if(priv-&gt;fwloaded 
== 
0) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

xc_load_fw_and_init_tuner(fe);<br>+&nbsp;&nbsp;&nbsp; 
}<br>+#if 
0<br>+&nbsp;&nbsp;&nbsp; 
else 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

xc_initialize(priv);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
msleep(100);<br>+&nbsp;&nbsp;&nbsp; 
}<br>+#endif<br>+<br>+&nbsp;&nbsp;&nbsp; 
if(ret 
!= 
XC_RESULT_SUCCESS) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
Unable 
to 
initialise 
tuner\n");<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br>+&nbsp;&nbsp;&nbsp; 
}<br> <br> 
&nbsp;&nbsp;&nbsp; 
priv-&gt;rf_mode 

XC_RF_MODE_CABLE; 
/* 
Fix 
me: 
it 
could 
be 
air. 
*/<br> <br>@@ 
-769,9 
+804,10 
@@ 
tune_channel:<br> 
tune_channel:<br> 
&nbsp;&nbsp;&nbsp; 
ret 

xc_SetSignalSource(priv, 
priv-&gt;rf_mode);<br> 
&nbsp;&nbsp;&nbsp; 
if 
(ret 
!= 
XC_RESULT_SUCCESS) 
{<br>-&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
"xc5000: 
xc_SetSignalSource(%d) 
failed\n",<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;rf_mode);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-780,6 
+816,7 
@@ 
tune_channel:<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
XC5000_Standard[priv-&gt;video_standard].AudioMode);<br> 
&nbsp;&nbsp;&nbsp; 
if 
(ret 
!= 
XC_RESULT_SUCCESS) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
xc_SetTVStandard 
failed\n");<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-788,6 
+825,7 
@@ 
tune_channel:<br> 
&nbsp;&nbsp;&nbsp; 
if 
(debug)<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_debug_dump(priv);<br> <br>+&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
return 
0;<br> 
}<br> <br>@@ 
-827,12 
+865,11 
@@ 
static 
int 
xc_load_fw_and_init_tuner(str<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_priv 
*priv 

fe-&gt;tuner_priv;<br> 
&nbsp;&nbsp;&nbsp; 
int 
ret 

0;<br> <br>-&nbsp;&nbsp;&nbsp; 
if 
(priv-&gt;fwloaded 
== 
0) 
{<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

xc5000_fwupload(fe);<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
if 
(ret 
!= 
XC_RESULT_SUCCESS)<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
ret;<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;fwloaded 

1;<br>-&nbsp;&nbsp;&nbsp; 
}<br>+&nbsp;&nbsp;&nbsp; 
ret 

xc5000_fwupload(fe);<br>+&nbsp;&nbsp;&nbsp; 
if 
(ret 
!= 
XC_RESULT_SUCCESS) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
ret;<br>+&nbsp;&nbsp;&nbsp; 
}<br>+&nbsp;&nbsp;&nbsp; 
priv-&gt;fwloaded 

1;<br> <br> 
&nbsp;&nbsp;&nbsp; 
/* 
Start 
the 
tuner 
self-calibration 
process 
*/<br> 
&nbsp;&nbsp;&nbsp; 
ret 
|= 
xc_initialize(priv);<br>@@ 
-842,7 
+879,7 
@@ 
static 
int 
xc_load_fw_and_init_tuner(str<br> 
&nbsp;&nbsp;&nbsp; 
 

I2C 
transactions 
until 
calibration 
is 
complete.&nbsp; 
This 
way 
we<br> 
&nbsp;&nbsp;&nbsp; 
 

don't 
have 
to 
rely 
on 
clock 
stretching 
working.<br> 
&nbsp;&nbsp;&nbsp; 
 
*/<br>-&nbsp;&nbsp;&nbsp; 
xc_wait( 
100 
);<br>+&nbsp;&nbsp;&nbsp; 
msleep( 
100 
);<br> <br> 
&nbsp;&nbsp;&nbsp; 
/* 
Default 
to 
"CABLE" 
mode 
*/<br> 
&nbsp;&nbsp;&nbsp; 
ret 
|= 
xc_write_reg(priv, 
XREG_SIGNALSOURCE, 
XC_RF_MODE_CABLE);<br>@@ 
-857,21 
+894,20 
@@ 
static 
int 
xc5000_sleep(struct 
dvb_front<br> <br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"%s()\n", 
__FUNCTION__);<br> <br>-&nbsp;&nbsp;&nbsp; 
/* 
On 
Pinnacle 
PCTV 
HD 
800i, 
the 
tuner 
cannot 
be 
reinitialized<br>-&nbsp;&nbsp;&nbsp; 
 

once 
shutdown 
without 
reloading 
the 
driver. 
Maybe 

am 
not<br>-&nbsp;&nbsp;&nbsp; 
 

doing 
something 
right.<br>-&nbsp;&nbsp;&nbsp; 
 
*<br>-&nbsp;&nbsp;&nbsp; 
 
*/<br>+&nbsp;&nbsp;&nbsp; 
mutex_lock(&amp;priv-&gt;lock);<br> <br> 
&nbsp;&nbsp;&nbsp; 
ret 

xc_shutdown(priv);<br> 
&nbsp;&nbsp;&nbsp; 
if(ret 
!= 
XC_RESULT_SUCCESS) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
"xc5000: 
%s() 
unable 
to 
shutdown 
tuner\n",<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
__FUNCTION__);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> 
&nbsp;&nbsp;&nbsp; 
else 
{<br>-&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
/* 
priv-&gt;fwloaded 

0; 
*/<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
if(allow_shutdown) <br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;fwloaded 

0; 
/* 
was 
indeed 
shutdown 
*/<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
XC_RESULT_SUCCESS;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> 
}<br>@@ 
-879,24 
+915,51 
@@ 
static 
int 
xc5000_init(struct 
dvb_fronte<br> 
static 
int 
xc5000_init(struct 
dvb_frontend 
*fe)<br> 
{<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_priv 
*priv 

fe-&gt;tuner_priv;<br>+&nbsp;&nbsp;&nbsp; 
int 
ret;<br>+<br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"%s()\n", 
__FUNCTION__);<br> <br>-&nbsp;&nbsp;&nbsp; 
if 
(xc_load_fw_and_init_tuner(fe) 
!= 
XC_RESULT_SUCCESS) 
{<br>+&nbsp;&nbsp;&nbsp; 
mutex_lock(&amp;priv-&gt;lock);<br>+<br>+&nbsp;&nbsp;&nbsp; 
if(priv-&gt;fwloaded 
== 
0) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

xc_load_fw_and_init_tuner(fe);<br>+&nbsp;&nbsp;&nbsp; 
}<br>+&nbsp;&nbsp;&nbsp; 
else 
{&nbsp;&nbsp;&nbsp; 
/* 
Firmware 
has 
been 
loaded 
previously, 
just 
initialize 
*/<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 

xc_initialize(priv);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
msleep(100);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
ret 
|= 
xc_write_reg(priv, 
XREG_SIGNALSOURCE, 
XC_RF_MODE_CABLE);<br>+&nbsp;&nbsp;&nbsp; 
}<br>+<br>+&nbsp;&nbsp;&nbsp; 
if(ret 
!= 
XC_RESULT_SUCCESS) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
printk(KERN_ERR 
"xc5000: 
Unable 
to 
initialise 
tuner\n");<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
-EREMOTEIO;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br> 
&nbsp;&nbsp;&nbsp; 
if 
(debug)<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
xc_debug_dump(priv);<br> <br>+&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;priv-&gt;lock);<br> 
&nbsp;&nbsp;&nbsp; 
return 
0;<br> 
}<br> <br> 
static 
int 
xc5000_release(struct 
dvb_frontend 
*fe)<br> 
{<br>+&nbsp;&nbsp;&nbsp; 
struct 
xc5000_priv 
*priv 

fe-&gt;tuner_priv;<br>+<br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"%s()\n", 
__FUNCTION__);<br>-&nbsp;&nbsp;&nbsp; 
kfree(fe-&gt;tuner_priv);<br>+<br>+&nbsp;&nbsp;&nbsp; 
mutex_lock(&amp;xc5000_list_lock);<br>+&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; 
priv-&gt;count--;<br>+&nbsp;&nbsp;&nbsp; 
if(priv-&gt;count 
== 
0) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
list_del(&amp;priv-&gt;xc5000_list);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
kfree(priv);<br>+&nbsp;&nbsp;&nbsp; 
}<br> 
&nbsp;&nbsp;&nbsp; 
fe-&gt;tuner_priv 

NULL;<br>+<br>+&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;xc5000_list_lock);<br>+<br> 
&nbsp;&nbsp;&nbsp; 
return 
0;<br> 
}<br> <br>@@ 
-924,23 
+987,49 
@@ 
struct 
dvb_frontend 

xc5000_attach(stru<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_config 
*cfg)<br> 
{<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_priv 
*priv 

NULL;<br>+&nbsp;&nbsp;&nbsp; 
void 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp; 
 
*cfg_priv;<br> 
&nbsp;&nbsp;&nbsp; 
u16 
id 

0;<br> <br> 
&nbsp;&nbsp;&nbsp; 
dprintk(1, 
"%s()\n", 
__FUNCTION__);<br> <br>-&nbsp;&nbsp;&nbsp; 
priv 

kzalloc(sizeof(struct 
xc5000_priv), 
GFP_KERNEL);<br>-&nbsp;&nbsp;&nbsp; 
if 
(priv 
== 
NULL)<br>+&nbsp;&nbsp;&nbsp; 
if 
(NULL 
== 
cfg 
|| 
NULL 
== 
cfg-&gt;priv 
|| 
NULL 
== 
fe)<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
NULL;<br> <br>-&nbsp;&nbsp;&nbsp; 
priv-&gt;cfg 

cfg;<br>-&nbsp;&nbsp;&nbsp; 
priv-&gt;bandwidth 

BANDWIDTH_6_MHZ;<br>-&nbsp;&nbsp;&nbsp; 
priv-&gt;i2c 

i2c;<br>+&nbsp;&nbsp;&nbsp; 
cfg_priv 

cfg-&gt;priv;<br>+<br>+&nbsp;&nbsp;&nbsp; 
mutex_lock(&amp;xc5000_list_lock);<br>+<br>+&nbsp;&nbsp;&nbsp; 
list_for_each_entry(priv, 
&amp;xc5000_list, 
xc5000_list) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
if 
(priv-&gt;cfg-&gt;priv 
== 
cfg-&gt;priv) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
cfg_priv 

NULL;<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
break;<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
}<br>+&nbsp;&nbsp;&nbsp; 
}<br>+<br>+&nbsp;&nbsp;&nbsp; 
if(cfg_priv) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv 

kzalloc(sizeof(struct 
xc5000_priv), 
GFP_KERNEL);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
if 
(priv 
== 
NULL) 
{<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;xc5000_list_lock);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
NULL;<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
}<br>+<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;cfg 

cfg;<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;bandwidth 

BANDWIDTH_6_MHZ;<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;i2c 

i2c;<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;fwloaded 

0;<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
priv-&gt;count 

0;<br>+<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_init(&amp;priv-&gt;lock);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
list_add_tail(&amp;priv-&gt;xc5000_list, 
&amp;xc5000_list);<br>+&nbsp;&nbsp;&nbsp; 
}<br>+<br> <br> 
&nbsp;&nbsp;&nbsp; 
/* 
Check 
if 
firmware 
has 
been 
loaded. 
It 
is 
possible 
that 
another<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp; 
 
instance 
of 
the 
driver 
has 
loaded 
the 
firmware.<br> 
&nbsp;&nbsp;&nbsp; 
 
*/<br> 
&nbsp;&nbsp;&nbsp; 
if 
(xc5000_readreg(priv, 
XREG_PRODUCT_ID, 
&amp;id) 
!= 
0) 
{<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
kfree(priv);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;xc5000_list_lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
NULL;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-966,6 
+1055,7 
@@ 
struct 
dvb_frontend 

xc5000_attach(stru<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
"xc5000: 
Device 
not 
found 
at 
addr 
0x%02x 
(0x%x)\n",<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
cfg-&gt;i2c_address, 
id);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
kfree(priv);<br>+&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;xc5000_list_lock);<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
return 
NULL;<br> 
&nbsp;&nbsp;&nbsp; 
}<br> <br>@@ 
-973,11 
+1063,14 
@@ 
struct 
dvb_frontend 

xc5000_attach(stru<br> 
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; 
sizeof(struct 
dvb_tuner_ops));<br> <br> 
&nbsp;&nbsp;&nbsp; 
fe-&gt;tuner_priv 

priv;<br>-<br>+&nbsp;&nbsp;&nbsp; 
priv-&gt;count++;<br>+<br>+&nbsp;&nbsp;&nbsp; 
mutex_unlock(&amp;xc5000_list_lock);<br> 
&nbsp;&nbsp;&nbsp; 
return 
fe;<br> 
}<br> 
EXPORT_SYMBOL(xc5000_attach);<br> <br> 
MODULE_AUTHOR("Steven 
Toth");<br>+MODULE_AUTHOR("Chaogui 
Zhang");<br> 
MODULE_DESCRIPTION("Xceive 
xc5000 
silicon 
tuner 
driver");<br> 
MODULE_LICENSE("GPL");<br>diff 
-r 
ed7daeb29425 
linux/drivers/media/dvb/frontends/xc5000_priv.h<br>--- 
a/linux/drivers/media/dvb/frontends/xc5000_priv.h&nbsp;&nbsp;&nbsp; 
Mon 
Jan 
28 
10:01:11 
2008 
-0200<br>+++ 
b/linux/drivers/media/dvb/frontends/xc5000_priv.h&nbsp;&nbsp;&nbsp; 
Fri 
Jan 
25 
11:46:34 
2008 
-0500<br>@@ 
-23,6 
+23,7 
@@<br> 
#define 
XC5000_PRIV_H<br> <br> 
struct 
xc5000_priv 
{<br>+&nbsp;&nbsp;&nbsp; 
struct 
list_head&nbsp; 
&nbsp; 
 
xc5000_list;<br> 
&nbsp;&nbsp;&nbsp; 
struct 
xc5000_config 
*cfg;<br> 
&nbsp;&nbsp;&nbsp; 
struct 
i2c_adapter&nbsp; 
 
*i2c;<br> <br>@@ 
-31,6 
+32,14 
@@ 
struct 
xc5000_priv 
{<br> 
&nbsp;&nbsp;&nbsp; 
u8&nbsp; 
video_standard;<br> 
&nbsp;&nbsp;&nbsp; 
u8&nbsp; 
rf_mode;<br> 
&nbsp;&nbsp;&nbsp; 
u8&nbsp; 
fwloaded;<br>+<br>+&nbsp;&nbsp;&nbsp; 
int 
count;<br>+<br>+#if 
LINUX_VERSION_CODE 
&gt;= 
KERNEL_VERSION(2, 
6, 
16)<br>+&nbsp;&nbsp;&nbsp; 
struct 
mutex 
lock;<br>+#else<br>+&nbsp;&nbsp;&nbsp; 
struct 
semaphore 
lock;<br>+#endif<br> 
};<br> <br> 
#endif<br><br>Greeting Chaogui,<br>I have been reading about the patch clean up for the xc5000 tuner.&nbsp; I am still new to the whole driver making and the like.&nbsp; My question is how do I apply this clean up?&nbsp; I have a pinnicale 800i card, and had to get this in order to get my tuner card working.&nbsp; Any assistance would be greatly appreciated.<br>Thanks,<br>Ed<br>_______________________________________________<br>linux-dvb 
mailing 
list<br><a ymailto="mailto:linux-dvb@linuxtv.org" href="mailto:linux-dvb@linuxtv.org">linux-dvb@linuxtv.org</a><br><a href="http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb" target="_blank">http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb</a><br></div><br></div></div><br>
      <hr size=1>Looking for last minute shopping deals? <a href="http://us.rd.yahoo.com/evt=51734/*http://tools.search.yahoo.com/newsearch/category.php?category=shopping"> 
Find them fast with Yahoo! Search.</a></body></html>