Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci-2.6.23
Commits
39f0d8af
Commit
39f0d8af
authored
Jul 22, 2008
by
邱宗炽
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
code format clean
Signed-off-by:
邱宗炽
<
tqiu@neuros.com.cn
>
parent
f4f06deb
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
328 additions
and
463 deletions
+328
-463
drivers/media/video/davinci_vpfe.c
drivers/media/video/davinci_vpfe.c
+38
-71
drivers/media/video/tvp5150.c
drivers/media/video/tvp5150.c
+290
-392
No files found.
drivers/media/video/davinci_vpfe.c
View file @
39f0d8af
...
...
@@ -156,8 +156,7 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
/* based on whether the two fields are stored interleavely */
/* or separately in memory, reconfigure the CCDC memory address */
if
(
vpfe
->
field
==
V4L2_FIELD_SEQ_TB
)
{
u32
addr
=
vpfe
->
curFrm
->
boff
+
vpfe
->
field_offset
;
u32
addr
=
vpfe
->
curFrm
->
boff
+
vpfe
->
field_offset
;
ccdc_setfbaddr
((
unsigned
long
)
addr
);
}
}
else
if
(
fid
==
1
)
{
...
...
@@ -168,17 +167,15 @@ static irqreturn_t vpfe_isr(int irq, void *dev_id)
if
(
!
list_empty
(
&
vpfe
->
dma_queue
)
&&
vpfe
->
curFrm
==
vpfe
->
nextFrm
)
{
vpfe
->
nextFrm
=
list_entry
(
vpfe
->
dma_queue
.
next
,
struct
videobuf_buffer
,
queue
);
struct
videobuf_buffer
,
queue
);
list_del
(
&
vpfe
->
nextFrm
->
queue
);
vpfe
->
nextFrm
->
state
=
STATE_ACTIVE
;
ccdc_setfbaddr
(
(
unsigned
long
)
vpfe
->
nextFrm
->
boff
);
ccdc_setfbaddr
((
unsigned
long
)
vpfe
->
nextFrm
->
boff
);
}
if
(
vpfe
->
mode_changed
)
{
ccdc_setwin
(
&
vpfe
->
ccdc_params
);
/* update the field offset */
vpfe
->
field_offset
=
(
vpfe
->
vwin
.
height
-
2
)
*
vpfe
->
vwin
.
width
;
vpfe
->
field_offset
=
(
vpfe
->
vwin
.
height
-
2
)
*
vpfe
->
vwin
.
width
;
vpfe
->
mode_changed
=
FALSE
;
}
}
...
...
@@ -348,8 +345,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
switch
(
cmd
)
{
case
VIDIOC_QUERYCAP
:
{
struct
v4l2_capability
*
cap
=
(
struct
v4l2_capability
*
)
arg
;
struct
v4l2_capability
*
cap
=
(
struct
v4l2_capability
*
)
arg
;
memset
(
cap
,
0
,
sizeof
(
*
cap
));
*
cap
=
vpfe_drvcap
;
break
;
...
...
@@ -363,13 +359,11 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
if
(
index
==
0
)
{
/* only yuv4:2:2 format is supported at this point */
fmt
->
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
strcpy
(
fmt
->
description
,
"YCbCr4:2:2 Interleaved UYUV"
);
strcpy
(
fmt
->
description
,
"YCbCr4:2:2 Interleaved UYUV"
);
fmt
->
pixelformat
=
V4L2_PIX_FMT_UYVY
;
}
else
if
(
index
==
1
)
{
fmt
->
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
strcpy
(
fmt
->
description
,
"YCbCr4:2:2 Interleaved YUYV"
);
strcpy
(
fmt
->
description
,
"YCbCr4:2:2 Interleaved YUYV"
);
fmt
->
pixelformat
=
V4L2_PIX_FMT_YUYV
;
}
else
{
ret
=
-
EINVAL
;
...
...
@@ -389,8 +383,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
pixfmt
->
field
=
vpfe
->
field
;
pixfmt
->
pixelformat
=
vpfe
->
pixelfmt
;
pixfmt
->
bytesperline
=
pixfmt
->
width
*
2
;
pixfmt
->
sizeimage
=
pixfmt
->
bytesperline
*
pixfmt
->
height
;
pixfmt
->
sizeimage
=
pixfmt
->
bytesperline
*
pixfmt
->
height
;
pixfmt
->
colorspace
=
V4L2_COLORSPACE_SMPTE170M
;
up
(
&
vpfe
->
lock
);
}
...
...
@@ -412,10 +405,8 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
up
(
&
vpfe
->
lock
);
break
;
}
if
((
pixfmt
->
width
+
vpfe
->
vwin
.
left
<=
vpfe
->
bounds
.
width
)
&
(
pixfmt
->
height
+
vpfe
->
vwin
.
top
<=
vpfe
->
bounds
.
height
))
{
if
((
pixfmt
->
width
+
vpfe
->
vwin
.
left
<=
vpfe
->
bounds
.
width
)
&
(
pixfmt
->
height
+
vpfe
->
vwin
.
top
<=
vpfe
->
bounds
.
height
))
{
/* this is the case when no scaling is supported */
/* crop window is directed modified */
vpfe
->
vwin
.
height
=
pixfmt
->
height
;
...
...
@@ -439,8 +430,8 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
up
(
&
vpfe
->
lock
);
break
;
}
if
(
pixfmt
->
field
==
V4L2_FIELD_NONE
||
pixfmt
->
field
==
V4L2_FIELD_INTERLACED
)
{
if
(
pixfmt
->
field
==
V4L2_FIELD_NONE
||
pixfmt
->
field
==
V4L2_FIELD_INTERLACED
)
{
params
->
buf_type
=
CCDC_BUFTYPE_FLD_INTERLEAVED
;
vpfe
->
field
=
pixfmt
->
field
;
}
else
if
(
pixfmt
->
field
==
V4L2_FIELD_SEQ_TB
)
{
...
...
@@ -462,11 +453,10 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
ret
=
-
EINVAL
;
}
else
{
struct
v4l2_pix_format
*
pixfmt
=
&
fmt
->
fmt
.
pix
;
if
(
pixfmt
->
width
>
vpfe
->
bounds
.
width
||
pixfmt
->
height
>
vpfe
->
bounds
.
height
||
(
pixfmt
->
pixelformat
!=
V4L2_PIX_FMT_UYVY
&&
pixfmt
->
pixelformat
!=
V4L2_PIX_FMT_YUYV
))
{
if
(
pixfmt
->
width
>
vpfe
->
bounds
.
width
||
pixfmt
->
height
>
vpfe
->
bounds
.
height
||
(
pixfmt
->
pixelformat
!=
V4L2_PIX_FMT_UYVY
&&
pixfmt
->
pixelformat
!=
V4L2_PIX_FMT_YUYV
))
{
ret
=
-
EINVAL
;
}
}
...
...
@@ -531,9 +521,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
vpfe
->
capture_params
.
mode
=
id
;
vpfe
->
capture_params
.
squarepixel
=
sqp
;
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VPFE_CMD_CONFIG_CAPTURE
,
&
vpfe
->
capture_params
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VPFE_CMD_CONFIG_CAPTURE
,
&
vpfe
->
capture_params
);
up
(
&
vpfe
->
lock
);
break
;
...
...
@@ -624,8 +612,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
}
case
VIDIOC_CROPCAP
:
{
struct
v4l2_cropcap
*
cropcap
=
(
struct
v4l2_cropcap
*
)
arg
;
struct
v4l2_cropcap
*
cropcap
=
(
struct
v4l2_cropcap
*
)
arg
;
cropcap
->
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
down_interruptible
(
&
vpfe
->
lock
);
cropcap
->
bounds
=
cropcap
->
defrect
=
vpfe
->
vwin
;
...
...
@@ -635,16 +622,13 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
}
case
VIDIOC_G_PARM
:
{
struct
v4l2_streamparm
*
parm
=
(
struct
v4l2_streamparm
*
)
arg
;
struct
v4l2_streamparm
*
parm
=
(
struct
v4l2_streamparm
*
)
arg
;
if
(
parm
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
)
{
/* only capture is supported */
ret
=
-
EINVAL
;
}
else
{
struct
v4l2_captureparm
*
capparm
=
&
parm
->
parm
.
capture
;
memset
(
capparm
,
0
,
sizeof
(
struct
v4l2_captureparm
));
struct
v4l2_captureparm
*
capparm
=
&
parm
->
parm
.
capture
;
memset
(
capparm
,
0
,
sizeof
(
struct
v4l2_captureparm
));
down_interruptible
(
&
vpfe
->
lock
);
if
(
vpfe
->
std
&
V4L2_STD_625_50
)
{
capparm
->
timeperframe
.
numerator
=
1
;
...
...
@@ -661,24 +645,21 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
case
VIDIOC_G_CTRL
:
down_interruptible
(
&
vpfe
->
lock
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_G_CTRL
,
arg
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_G_CTRL
,
arg
);
up
(
&
vpfe
->
lock
);
break
;
case
VIDIOC_S_CTRL
:
down_interruptible
(
&
vpfe
->
lock
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_S_CTRL
,
arg
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_S_CTRL
,
arg
);
up
(
&
vpfe
->
lock
);
break
;
case
VIDIOC_QUERYCTRL
:
down_interruptible
(
&
vpfe
->
lock
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_QUERYCTRL
,
arg
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_QUERYCTRL
,
arg
);
up
(
&
vpfe
->
lock
);
break
;
...
...
@@ -704,11 +685,9 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
crop
->
c
.
width
=
((
crop
->
c
.
width
+
15
)
/
16
)
*
16
;
/* make sure parameters are valid */
if
(
crop
->
type
==
V4L2_BUF_TYPE_VIDEO_CAPTURE
&&
(
crop
->
c
.
left
+
crop
->
c
.
width
<=
vpfe
->
bounds
.
left
+
vpfe
->
bounds
.
width
)
&&
(
crop
->
c
.
top
+
crop
->
c
.
height
<=
vpfe
->
bounds
.
top
+
vpfe
->
bounds
.
height
))
{
if
(
crop
->
type
==
V4L2_BUF_TYPE_VIDEO_CAPTURE
&&
(
crop
->
c
.
left
+
crop
->
c
.
width
<=
vpfe
->
bounds
.
left
+
vpfe
->
bounds
.
width
)
&&
(
crop
->
c
.
top
+
crop
->
c
.
height
<=
vpfe
->
bounds
.
top
+
vpfe
->
bounds
.
height
))
{
down_interruptible
(
&
vpfe
->
lock
);
vpfe
->
vwin
=
crop
->
c
;
...
...
@@ -724,8 +703,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
v4l2_std_id
*
id
=
(
v4l2_std_id
*
)
arg
;
down_interruptible
(
&
vpfe
->
lock
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_QUERYSTD
,
id
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VIDIOC_QUERYSTD
,
id
);
up
(
&
vpfe
->
lock
);
break
;
...
...
@@ -798,17 +776,14 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
}
debug_print
(
KERN_INFO
"cur frame %x.
\n
"
,
vpfe
->
dma_queue
.
next
);
vpfe
->
nextFrm
=
vpfe
->
curFrm
=
list_entry
(
vpfe
->
dma_queue
.
next
,
struct
videobuf_buffer
,
queue
);
vpfe
->
nextFrm
=
vpfe
->
curFrm
=
list_entry
(
vpfe
->
dma_queue
.
next
,
struct
videobuf_buffer
,
queue
);
/* remove the buffer from the queue */
list_del
(
&
vpfe
->
curFrm
->
queue
);
vpfe
->
curFrm
->
state
=
STATE_ACTIVE
;
/* sense the current video input standard */
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VPFE_CMD_CONFIG_CAPTURE
,
&
vpfe
->
capture_params
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VPFE_CMD_CONFIG_CAPTURE
,
&
vpfe
->
capture_params
);
if
(
ret
<
0
)
break
;
/* configure the ccdc and resizer as needed */
...
...
@@ -820,8 +795,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
vpfe
->
field_id
=
0
;
vpfe
->
started
=
TRUE
;
vpfe
->
mode_changed
=
FALSE
;
vpfe
->
field_offset
=
(
vpfe
->
vwin
.
height
-
2
)
*
vpfe
->
vwin
.
width
;
vpfe
->
field_offset
=
(
vpfe
->
vwin
.
height
-
2
)
*
vpfe
->
vwin
.
width
;
ccdc_enable
(
TRUE
);
up
(
&
vpfe
->
lock
);
debug_print
(
KERN_INFO
"started video streaming.
\n
"
);
...
...
@@ -860,8 +834,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
vpfe
->
vwin
=
params
->
win
;
if
(
params
->
buf_type
==
CCDC_BUFTYPE_FLD_INTERLEAVED
)
{
vpfe
->
field
=
V4L2_FIELD_INTERLACED
;
}
else
if
(
params
->
buf_type
==
CCDC_BUFTYPE_FLD_SEPARATED
)
{
}
else
if
(
params
->
buf_type
==
CCDC_BUFTYPE_FLD_SEPARATED
)
{
vpfe
->
field
=
V4L2_FIELD_SEQ_TB
;
}
if
(
params
->
pix_order
==
CCDC_PIXORDER_YCBYCR
)
{
...
...
@@ -877,8 +850,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
{
/* the settings here must be consistant with that of the CCDC's,
driver does not check the consistancy */
struct
vpfe_capture_params
*
params
=
(
struct
vpfe_capture_param
*
)
arg
;
struct
vpfe_capture_params
*
params
=
(
struct
vpfe_capture_param
*
)
arg
;
v4l2_std_id
std
=
0
;
if
(
vpfe
->
started
){
/* only allowed if streaming is not started */
...
...
@@ -906,9 +878,7 @@ static int vpfe_doioctl(struct inode *inode, struct file *file,
vpfe
->
pixelaspect
=
sp_aspect
;
}
vpfe
->
std
=
std
;
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VPFE_CMD_CONFIG_CAPTURE
,
params
);
ret
=
DEVICE_CMD
(
ACTIVE_DEVICE
(),
VPFE_CMD_CONFIG_CAPTURE
,
params
);
vpfe
->
capture_params
=
*
params
;
up
(
&
vpfe
->
lock
);
break
;
...
...
@@ -1190,8 +1160,7 @@ static int vpfe_init(void)
void
*
mem
;
/* allocate memory at initialization time to guarentee availability */
for
(
i
=
0
;
i
<
VPFE_DEFNUM_FBUFS
;
i
++
)
{
mem
=
(
void
*
)
__get_free_pages
(
GFP_KERNEL
|
GFP_DMA
,
VPFE_MAX_FBUF_ORDER
);
mem
=
(
void
*
)
__get_free_pages
(
GFP_KERNEL
|
GFP_DMA
,
VPFE_MAX_FBUF_ORDER
);
if
(
mem
)
{
unsigned
long
adr
=
(
unsigned
long
)
mem
;
u32
size
=
PAGE_SIZE
<<
VPFE_MAX_FBUF_ORDER
;
...
...
@@ -1203,15 +1172,13 @@ static int vpfe_init(void)
size
-=
PAGE_SIZE
;
}
vpfe_device
.
fbuffers
[
i
]
=
(
u8
*
)
mem
;
debug_print
(
KERN_INFO
"memory address %d
\t
%x
\n
"
,
i
,
mem
);
debug_print
(
KERN_INFO
"memory address %d
\t
%x
\n
"
,
i
,
mem
);
}
else
{
while
(
--
i
>=
0
)
{
free_pages
((
unsigned
long
)
vpfe_device
.
fbuffers
[
i
],
VPFE_MAX_FBUF_ORDER
);
}
debug_print
(
KERN_INFO
"frame buffer memory allocation failed.
\n
"
);
debug_print
(
KERN_INFO
"frame buffer memory allocation failed.
\n
"
);
return
-
ENOMEM
;
}
}
...
...
drivers/media/video/tvp5150.c
View file @
39f0d8af
...
...
@@ -50,41 +50,41 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
/* supported controls */
static
struct
v4l2_queryctrl
tvp5150_qctrl
[]
=
{
{
.
id
=
V4L2_CID_BRIGHTNESS
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Brightness"
,
.
minimum
=
0
,
.
maximum
=
255
,
.
step
=
1
,
.
default_value
=
128
,
.
flags
=
0
,
.
id
=
V4L2_CID_BRIGHTNESS
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Brightness"
,
.
minimum
=
0
,
.
maximum
=
255
,
.
step
=
1
,
.
default_value
=
128
,
.
flags
=
0
,
},
{
.
id
=
V4L2_CID_CONTRAST
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Contrast"
,
.
minimum
=
0
,
.
maximum
=
255
,
.
step
=
0x1
,
.
default_value
=
128
,
.
flags
=
0
,
.
id
=
V4L2_CID_CONTRAST
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Contrast"
,
.
minimum
=
0
,
.
maximum
=
255
,
.
step
=
0x1
,
.
default_value
=
128
,
.
flags
=
0
,
},
{
.
id
=
V4L2_CID_SATURATION
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Saturation"
,
.
minimum
=
0
,
.
maximum
=
255
,
.
step
=
0x1
,
.
default_value
=
128
,
.
flags
=
0
,
.
id
=
V4L2_CID_SATURATION
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Saturation"
,
.
minimum
=
0
,
.
maximum
=
255
,
.
step
=
0x1
,
.
default_value
=
128
,
.
flags
=
0
,
},
{
.
id
=
V4L2_CID_HUE
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Hue"
,
.
minimum
=
-
128
,
.
maximum
=
127
,
.
step
=
0x1
,
.
default_value
=
0
,
.
flags
=
0
,
.
id
=
V4L2_CID_HUE
,
.
type
=
V4L2_CTRL_TYPE_INTEGER
,
.
name
=
"Hue"
,
.
minimum
=
-
128
,
.
maximum
=
127
,
.
step
=
0x1
,
.
default_value
=
0
,
.
flags
=
0
,
}
};
...
...
@@ -136,15 +136,15 @@ static inline void tvp5150_write(struct i2c_client *c, unsigned char addr,
static
void
dump_reg_range
(
struct
i2c_client
*
c
,
char
*
s
,
u8
init
,
const
u8
end
,
int
max_line
)
{
int
i
=
0
;
int
i
=
0
;
while
(
init
!=
(
u8
)(
end
+
1
))
{
if
((
i
%
max_line
)
==
0
)
{
if
(
i
>
0
)
while
(
init
!=
(
u8
)(
end
+
1
))
{
if
((
i
%
max_line
)
==
0
)
{
if
(
i
>
0
)
printk
(
"
\n
"
);
printk
(
"tvp5150: %s reg 0x%02x = "
,
s
,
init
);
printk
(
"tvp5150: %s reg 0x%02x = "
,
s
,
init
);
}
printk
(
"%02x "
,
tvp5150_read
(
c
,
init
));
printk
(
"%02x "
,
tvp5150_read
(
c
,
init
));
init
++
;
i
++
;
...
...
@@ -155,86 +155,86 @@ static void dump_reg_range(struct i2c_client *c, char *s, u8 init, const u8 end,
static
void
dump_reg
(
struct
i2c_client
*
c
)
{
printk
(
"tvp5150: Video input source selection #1 = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_VD_IN_SRC_SEL_1
));
tvp5150_read
(
c
,
TVP5150_VD_IN_SRC_SEL_1
));
printk
(
"tvp5150: Analog channel controls = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_ANAL_CHL_CTL
));
tvp5150_read
(
c
,
TVP5150_ANAL_CHL_CTL
));
printk
(
"tvp5150: Operation mode controls = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_OP_MODE_CTL
));
tvp5150_read
(
c
,
TVP5150_OP_MODE_CTL
));
printk
(
"tvp5150: Miscellaneous controls = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_MISC_CTL
));
tvp5150_read
(
c
,
TVP5150_MISC_CTL
));
printk
(
"tvp5150: Autoswitch mask= 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_AUTOSW_MSK
));
tvp5150_read
(
c
,
TVP5150_AUTOSW_MSK
));
printk
(
"tvp5150: Color killer threshold control = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_COLOR_KIL_THSH_CTL
));
tvp5150_read
(
c
,
TVP5150_COLOR_KIL_THSH_CTL
));
printk
(
"tvp5150: Luminance processing controls #1 #2 and #3 = %02x %02x %02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_LUMA_PROC_CTL_1
),
tvp5150_read
(
c
,
TVP5150_LUMA_PROC_CTL_2
),
tvp5150_read
(
c
,
TVP5150_LUMA_PROC_CTL_3
));
tvp5150_read
(
c
,
TVP5150_LUMA_PROC_CTL_1
),
tvp5150_read
(
c
,
TVP5150_LUMA_PROC_CTL_2
),
tvp5150_read
(
c
,
TVP5150_LUMA_PROC_CTL_3
));
printk
(
"tvp5150: Brightness control = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_BRIGHT_CTL
));
tvp5150_read
(
c
,
TVP5150_BRIGHT_CTL
));
printk
(
"tvp5150: Color saturation control = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_SATURATION_CTL
));
tvp5150_read
(
c
,
TVP5150_SATURATION_CTL
));
printk
(
"tvp5150: Hue control = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_HUE_CTL
));
tvp5150_read
(
c
,
TVP5150_HUE_CTL
));
printk
(
"tvp5150: Contrast control = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_CONTRAST_CTL
));
tvp5150_read
(
c
,
TVP5150_CONTRAST_CTL
));
printk
(
"tvp5150: Outputs and data rates select = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_DATA_RATE_SEL
));
tvp5150_read
(
c
,
TVP5150_DATA_RATE_SEL
));
printk
(
"tvp5150: Configuration shared pins = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_CONF_SHARED_PIN
));
tvp5150_read
(
c
,
TVP5150_CONF_SHARED_PIN
));
printk
(
"tvp5150: Active video cropping start = 0x%02x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_ST_MSB
),
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_ST_LSB
));
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_ST_MSB
),
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_ST_LSB
));
printk
(
"tvp5150: Active video cropping stop = 0x%02x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_STP_MSB
),
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_STP_LSB
));
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_STP_MSB
),
tvp5150_read
(
c
,
TVP5150_ACT_VD_CROP_STP_LSB
));
printk
(
"tvp5150: Genlock/RTC = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_GENLOCK
));
tvp5150_read
(
c
,
TVP5150_GENLOCK
));
printk
(
"tvp5150: Horizontal sync start = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_HORIZ_SYNC_START
));
tvp5150_read
(
c
,
TVP5150_HORIZ_SYNC_START
));
printk
(
"tvp5150: Vertical blanking start = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_VERT_BLANKING_START
));
tvp5150_read
(
c
,
TVP5150_VERT_BLANKING_START
));
printk
(
"tvp5150: Vertical blanking stop = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_VERT_BLANKING_STOP
));
tvp5150_read
(
c
,
TVP5150_VERT_BLANKING_STOP
));
printk
(
"tvp5150: Chrominance processing control #1 and #2 = %02x %02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_CHROMA_PROC_CTL_1
),
tvp5150_read
(
c
,
TVP5150_CHROMA_PROC_CTL_2
));
tvp5150_read
(
c
,
TVP5150_CHROMA_PROC_CTL_1
),
tvp5150_read
(
c
,
TVP5150_CHROMA_PROC_CTL_2
));
printk
(
"tvp5150: Interrupt reset register B = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INT_RESET_REG_B
));
tvp5150_read
(
c
,
TVP5150_INT_RESET_REG_B
));
printk
(
"tvp5150: Interrupt enable register B = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INT_ENABLE_REG_B
));
tvp5150_read
(
c
,
TVP5150_INT_ENABLE_REG_B
));
printk
(
"tvp5150: Interrupt configuration register B = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INTT_CONFIG_REG_B
));
tvp5150_read
(
c
,
TVP5150_INTT_CONFIG_REG_B
));
printk
(
"tvp5150: Video standard = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_VIDEO_STD
));
tvp5150_read
(
c
,
TVP5150_VIDEO_STD
));
printk
(
"tvp5150: Chroma gain factor: Cb=0x%02x Cr=0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_CB_GAIN_FACT
),
tvp5150_read
(
c
,
TVP5150_CR_GAIN_FACTOR
));
tvp5150_read
(
c
,
TVP5150_CB_GAIN_FACT
),
tvp5150_read
(
c
,
TVP5150_CR_GAIN_FACTOR
));
printk
(
"tvp5150: Macrovision on counter = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_MACROVISION_ON_CTR
));
tvp5150_read
(
c
,
TVP5150_MACROVISION_ON_CTR
));
printk
(
"tvp5150: Macrovision off counter = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_MACROVISION_OFF_CTR
));
tvp5150_read
(
c
,
TVP5150_MACROVISION_OFF_CTR
));
printk
(
"tvp5150: ITU-R BT.656.%d timing(TVP5150AM1 only)
\n
"
,
(
tvp5150_read
(
c
,
TVP5150_REV_SELECT
)
&
1
)
?
3
:
4
);
(
tvp5150_read
(
c
,
TVP5150_REV_SELECT
)
&
1
)
?
3
:
4
);
printk
(
"tvp5150: Device ID = %02x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_MSB_DEV_ID
),
tvp5150_read
(
c
,
TVP5150_LSB_DEV_ID
));
tvp5150_read
(
c
,
TVP5150_MSB_DEV_ID
),
tvp5150_read
(
c
,
TVP5150_LSB_DEV_ID
));
printk
(
"tvp5150: ROM version = (hex) %02x.%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_ROM_MAJOR_VER
),
tvp5150_read
(
c
,
TVP5150_ROM_MINOR_VER
));
tvp5150_read
(
c
,
TVP5150_ROM_MAJOR_VER
),
tvp5150_read
(
c
,
TVP5150_ROM_MINOR_VER
));
printk
(
"tvp5150: Vertical line count = 0x%02x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_VERT_LN_COUNT_MSB
),
tvp5150_read
(
c
,
TVP5150_VERT_LN_COUNT_LSB
));
tvp5150_read
(
c
,
TVP5150_VERT_LN_COUNT_MSB
),
tvp5150_read
(
c
,
TVP5150_VERT_LN_COUNT_LSB
));
printk
(
"tvp5150: Interrupt status register B = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INT_STATUS_REG_B
));
tvp5150_read
(
c
,
TVP5150_INT_STATUS_REG_B
));
printk
(
"tvp5150: Interrupt active register B = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INT_ACTIVE_REG_B
));
tvp5150_read
(
c
,
TVP5150_INT_ACTIVE_REG_B
));
printk
(
"tvp5150: Status regs #1 to #5 = %02x %02x %02x %02x %02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_STATUS_REG_1
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_2
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_3
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_4
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_5
));
tvp5150_read
(
c
,
TVP5150_STATUS_REG_1
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_2
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_3
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_4
),
tvp5150_read
(
c
,
TVP5150_STATUS_REG_5
));
dump_reg_range
(
c
,
"Teletext filter 1"
,
TVP5150_TELETEXT_FIL1_INI
,
TVP5150_TELETEXT_FIL1_END
,
8
);
...
...
@@ -242,32 +242,32 @@ static void dump_reg(struct i2c_client *c)
TVP5150_TELETEXT_FIL2_END
,
8
);
printk
(
"tvp5150: Teletext filter enable = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_TELETEXT_FIL_ENA
));
tvp5150_read
(
c
,
TVP5150_TELETEXT_FIL_ENA
));
printk
(
"tvp5150: Interrupt status register A = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INT_STATUS_REG_A
));
tvp5150_read
(
c
,
TVP5150_INT_STATUS_REG_A
));
printk
(
"tvp5150: Interrupt enable register A = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INT_ENABLE_REG_A
));
tvp5150_read
(
c
,
TVP5150_INT_ENABLE_REG_A
));
printk
(
"tvp5150: Interrupt configuration = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_INT_CONF
));
tvp5150_read
(
c
,
TVP5150_INT_CONF
));
printk
(
"tvp5150: VDP status register = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_VDP_STATUS_REG
));
tvp5150_read
(
c
,
TVP5150_VDP_STATUS_REG
));
printk
(
"tvp5150: FIFO word count = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_FIFO_WORD_COUNT
));
tvp5150_read
(
c
,
TVP5150_FIFO_WORD_COUNT
));
printk
(
"tvp5150: FIFO interrupt threshold = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_FIFO_INT_THRESHOLD
));
tvp5150_read
(
c
,
TVP5150_FIFO_INT_THRESHOLD
));
printk
(
"tvp5150: FIFO reset = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_FIFO_RESET
));
tvp5150_read
(
c
,
TVP5150_FIFO_RESET
));
printk
(
"tvp5150: Line number interrupt = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_LINE_NUMBER_INT
));
tvp5150_read
(
c
,
TVP5150_LINE_NUMBER_INT
));
printk
(
"tvp5150: Pixel alignment register = 0x%02x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_PIX_ALIGN_REG_HIGH
),
tvp5150_read
(
c
,
TVP5150_PIX_ALIGN_REG_LOW
));
tvp5150_read
(
c
,
TVP5150_PIX_ALIGN_REG_HIGH
),
tvp5150_read
(
c
,
TVP5150_PIX_ALIGN_REG_LOW
));
printk
(
"tvp5150: FIFO output control = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_FIFO_OUT_CTRL
));
tvp5150_read
(
c
,
TVP5150_FIFO_OUT_CTRL
));
printk
(
"tvp5150: Full field enable = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_FULL_FIELD_ENA
));
tvp5150_read
(
c
,
TVP5150_FULL_FIELD_ENA
));
printk
(
"tvp5150: Full field mode register = 0x%02x
\n
"
,
tvp5150_read
(
c
,
TVP5150_FULL_FIELD_MODE_REG
));
tvp5150_read
(
c
,
TVP5150_FULL_FIELD_MODE_REG
));
dump_reg_range
(
c
,
"CC data"
,
TVP5150_CC_DATA_INI
,
TVP5150_CC_DATA_END
,
8
);
...
...
@@ -291,7 +291,7 @@ static void dump_reg(struct i2c_client *c)
static
inline
void
tvp5150_selmux
(
struct
i2c_client
*
c
)
{
int
opmode
=
0
;
int
opmode
=
0
;
struct
tvp5150
*
decoder
=
i2c_get_clientdata
(
c
);
int
input
=
0
;
...
...
@@ -311,7 +311,7 @@ static inline void tvp5150_selmux(struct i2c_client *c)
case
TVP5150_SVIDEO
:
default:
input
|=
1
;
opmode
=
0
;
/* Auto Mode */
opmode
=
0
;
/* Auto Mode */
break
;
}
...
...
@@ -331,161 +331,63 @@ struct i2c_reg_value {
/* Default values as sugested at TVP5150AM1 datasheet */
static
const
struct
i2c_reg_value
tvp5150_init_default
[]
=
{
{
/* 0x00 */
TVP5150_VD_IN_SRC_SEL_1
,
0x00
},
{
/* 0x01 */
TVP5150_ANAL_CHL_CTL
,
0x15
},
{
/* 0x02 */
TVP5150_OP_MODE_CTL
,
0x00
},
{
/* 0x03 */
TVP5150_MISC_CTL
,
0x01
},
{
/* 0x06 */
TVP5150_COLOR_KIL_THSH_CTL
,
0x10
},
{
/* 0x07 */
TVP5150_LUMA_PROC_CTL_1
,
0x60
},
{
/* 0x08 */
TVP5150_LUMA_PROC_CTL_2
,
0x00
},
{
/* 0x09 */
TVP5150_BRIGHT_CTL
,
0x80
},
{
/* 0x0a */
TVP5150_SATURATION_CTL
,
0x80
},
{
/* 0x0b */
TVP5150_HUE_CTL
,
0x00
},
{
/* 0x0c */
TVP5150_CONTRAST_CTL
,
0x80
},
{
/* 0x0d */
TVP5150_DATA_RATE_SEL
,
0x47
},
{
/* 0x0e */
TVP5150_LUMA_PROC_CTL_3
,
0x00
},
{
/* 0x0f */
TVP5150_CONF_SHARED_PIN
,
0x08
},
{
/* 0x11 */
TVP5150_ACT_VD_CROP_ST_MSB
,
0x00
},
{
/* 0x12 */
TVP5150_ACT_VD_CROP_ST_LSB
,
0x00
},
{
/* 0x13 */
TVP5150_ACT_VD_CROP_STP_MSB
,
0x00
},
{
/* 0x14 */
TVP5150_ACT_VD_CROP_STP_LSB
,
0x00
},
{
/* 0x15 */
TVP5150_GENLOCK
,
0x01
},
{
/* 0x16 */
TVP5150_HORIZ_SYNC_START
,
0x80
},
{
/* 0x18 */
TVP5150_VERT_BLANKING_START
,
0x00
},
{
/* 0x19 */
TVP5150_VERT_BLANKING_STOP
,
0x00
},
{
/* 0x1a */
TVP5150_CHROMA_PROC_CTL_1
,
0x0c
},
{
/* 0x1b */
TVP5150_CHROMA_PROC_CTL_2
,
0x14
},
{
/* 0x1c */
TVP5150_INT_RESET_REG_B
,
0x00
},
{
/* 0x1d */
TVP5150_INT_ENABLE_REG_B
,
0x00
},
{
/* 0x1e */
TVP5150_INTT_CONFIG_REG_B
,
0x00
},
{
/* 0x28 */
TVP5150_VIDEO_STD
,
0x00
},
{
/* 0x2e */
TVP5150_MACROVISION_ON_CTR
,
0x0f
},
{
/* 0x2f */
TVP5150_MACROVISION_OFF_CTR
,
0x01
},
{
/* 0xbb */
TVP5150_TELETEXT_FIL_ENA
,
0x00
},
{
/* 0xc0 */
TVP5150_INT_STATUS_REG_A
,
0x00
},
{
/* 0xc1 */
TVP5150_INT_ENABLE_REG_A
,
0x00
},
{
/* 0xc2 */
TVP5150_INT_CONF
,
0x04
},
{
/* 0xc8 */
TVP5150_FIFO_INT_THRESHOLD
,
0x80
},
{
/* 0xc9 */
TVP5150_FIFO_RESET
,
0x00
},
{
/* 0xca */
TVP5150_LINE_NUMBER_INT
,
0x00
},
{
/* 0xcb */
TVP5150_PIX_ALIGN_REG_LOW
,
0x4e
},
{
/* 0xcc */
TVP5150_PIX_ALIGN_REG_HIGH
,
0x00
},
{
/* 0xcd */
TVP5150_FIFO_OUT_CTRL
,
0x01
},
{
/* 0xcf */
TVP5150_FULL_FIELD_ENA
,
0x00
},
{
/* 0xd0 */
TVP5150_LINE_MODE_INI
,
0x00
},
{
/* 0xfc */
TVP5150_FULL_FIELD_MODE_REG
,
0x7f
},
{
/* end of data */
0xff
,
0xff
}
{
TVP5150_VD_IN_SRC_SEL_1
,
0x00
},
/* 0x00 */
{
TVP5150_ANAL_CHL_CTL
,
0x15
},
/* 0x01 */
{
TVP5150_OP_MODE_CTL
,
0x00
},
/* 0x02 */
{
TVP5150_MISC_CTL
,
0x01
},
/* 0x03 */
{
TVP5150_COLOR_KIL_THSH_CTL
,
0x10
},
/* 0x06 */
{
TVP5150_LUMA_PROC_CTL_1
,
0x60
},
/* 0x07 */
{
TVP5150_LUMA_PROC_CTL_2
,
0x00
},
/* 0x08 */
{
TVP5150_BRIGHT_CTL
,
0x80
},
/* 0x09 */
{
TVP5150_SATURATION_CTL
,
0x80
},
/* 0x0a */
{
TVP5150_HUE_CTL
,
0x00
},
/* 0x0b */
{
TVP5150_CONTRAST_CTL
,
0x80
},
/* 0x0c */
{
TVP5150_DATA_RATE_SEL
,
0x47
},
/* 0x0d */
{
TVP5150_LUMA_PROC_CTL_3
,
0x00
},
/* 0x0e */
{
TVP5150_CONF_SHARED_PIN
,
0x08
},
/* 0x0f */
{
TVP5150_ACT_VD_CROP_ST_MSB
,
0x00
},
/* 0x11 */
{
TVP5150_ACT_VD_CROP_ST_LSB
,
0x00
},
/* 0x12 */
{
TVP5150_ACT_VD_CROP_STP_MSB
,
0x00
},
/* 0x13 */
{
TVP5150_ACT_VD_CROP_STP_LSB
,
0x00
},
/* 0x14 */
{
TVP5150_GENLOCK
,
0x01
},
/* 0x15 */
{
TVP5150_HORIZ_SYNC_START
,
0x80
},
/* 0x16 */
{
TVP5150_VERT_BLANKING_START
,
0x00
},
/* 0x18 */
{
TVP5150_VERT_BLANKING_STOP
,
0x00
},
/* 0x19 */
{
TVP5150_CHROMA_PROC_CTL_1
,
0x0c
},
/* 0x1a */
{
TVP5150_CHROMA_PROC_CTL_2
,
0x14
},
/* 0x1b */
{
TVP5150_INT_RESET_REG_B
,
0x00
},
/* 0x1c */
{
TVP5150_INT_ENABLE_REG_B
,
0x00
},
/* 0x1d */
{
TVP5150_INTT_CONFIG_REG_B
,
0x00
},
/* 0x1e */
{
TVP5150_VIDEO_STD
,
0x00
},
/* 0x28 */
{
TVP5150_MACROVISION_ON_CTR
,
0x0f
},
/* 0x2e */
{
TVP5150_MACROVISION_OFF_CTR
,
0x01
},
/* 0x2f */
{
TVP5150_TELETEXT_FIL_ENA
,
0x00
},
/* 0xbb */
{
TVP5150_INT_STATUS_REG_A
,
0x00
},
/* 0xc0 */
{
TVP5150_INT_ENABLE_REG_A
,
0x00
},
/* 0xc1 */
{
TVP5150_INT_CONF
,
0x04
},
/* 0xc2 */
{
TVP5150_FIFO_INT_THRESHOLD
,
0x80
},
/* 0xc8 */
{
TVP5150_FIFO_RESET
,
0x00
},
/* 0xc9 */
{
TVP5150_LINE_NUMBER_INT
,
0x00
},
/* 0xca */
{
TVP5150_PIX_ALIGN_REG_LOW
,
0x4e
},
/* 0xcb */
{
TVP5150_PIX_ALIGN_REG_HIGH
,
0x00
},
/* 0xcc */
{
TVP5150_FIFO_OUT_CTRL
,
0x01
},
/* 0xcd */
{
TVP5150_FULL_FIELD_ENA
,
0x00
},
/* 0xcf */
{
TVP5150_LINE_MODE_INI
,
0x00
},
/* 0xd0 */
{
TVP5150_FULL_FIELD_MODE_REG
,
0x7f
},
/* 0xfc */
{
0xff
,
0xff
}
/* end of data */
};
/* Default values as sugested at TVP5150AM1 datasheet */
static
const
struct
i2c_reg_value
tvp5150_init_enable
[]
=
{
{
TVP5150_CONF_SHARED_PIN
,
2
},{
/* Automatic offset and AGC enabled */
TVP5150_ANAL_CHL_CTL
,
0x15
},{
/* Activate YCrCb output 0x9 or 0xd ? */
TVP5150_MISC_CTL
,
0x6f
},{
/* Activates video std autodetection for all standards */
TVP5150_AUTOSW_MSK
,
0x0
},{
/* Default format: 0x47. For 4:2:2: 0x40 */
TVP5150_DATA_RATE_SEL
,
0x47
},{
TVP5150_CHROMA_PROC_CTL_1
,
0x0c
},{
TVP5150_CHROMA_PROC_CTL_2
,
0x54
},{
/* Non documented, but initialized on WinTV USB2 */
0x27
,
0x20
},{
0xff
,
0xff
}
{
TVP5150_CONF_SHARED_PIN
,
2
},
{
TVP5150_ANAL_CHL_CTL
,
0x15
},
/* Automatic offset and AGC enabled */
{
TVP5150_MISC_CTL
,
0x6f
},
/* Activate YCrCb output 0x9 or 0xd ? */
{
TVP5150_AUTOSW_MSK
,
0x0
},
/* Activates video std autodetection for all standards */
{
TVP5150_DATA_RATE_SEL
,
0x47
},
/* Default format: 0x47. For 4:2:2: 0x40 */
{
TVP5150_CHROMA_PROC_CTL_1
,
0x0c
},
{
TVP5150_CHROMA_PROC_CTL_2
,
0x54
},
{
0x27
,
0x20
},
/* Non documented, but initialized on WinTV USB2 */
{
0xff
,
0xff
}
};
struct
tvp5150_vbi_type
{
...
...
@@ -590,7 +492,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
};
static
int
tvp5150_write_inittab
(
struct
i2c_client
*
c
,
const
struct
i2c_reg_value
*
regs
)
const
struct
i2c_reg_value
*
regs
)
{
while
(
regs
->
reg
!=
0xff
)
{
tvp5150_write
(
c
,
regs
->
reg
,
regs
->
value
);
...
...
@@ -600,7 +502,7 @@ static int tvp5150_write_inittab(struct i2c_client *c,
}
static
int
tvp5150_vdp_init
(
struct
i2c_client
*
c
,
const
struct
i2c_vbi_ram_value
*
regs
)
const
struct
i2c_vbi_ram_value
*
regs
)
{
unsigned
int
i
;
...
...
@@ -608,16 +510,16 @@ static int tvp5150_vdp_init(struct i2c_client *c,
tvp5150_write
(
c
,
TVP5150_FULL_FIELD_ENA
,
0
);
/* Before programming, Line mode should be at 0xff */
for
(
i
=
TVP5150_LINE_MODE_INI
;
i
<=
TVP5150_LINE_MODE_END
;
i
++
)
for
(
i
=
TVP5150_LINE_MODE_INI
;
i
<=
TVP5150_LINE_MODE_END
;
i
++
)
tvp5150_write
(
c
,
i
,
0xff
);
/* Load Ram Table */
while
(
regs
->
reg
!=
(
u16
)
-
1
)
{
tvp5150_write
(
c
,
TVP5150_CONF_RAM_ADDR_HIGH
,
regs
->
reg
>>
8
);
tvp5150_write
(
c
,
TVP5150_CONF_RAM_ADDR_LOW
,
regs
->
reg
);
tvp5150_write
(
c
,
TVP5150_CONF_RAM_ADDR_HIGH
,
regs
->
reg
>>
8
);
tvp5150_write
(
c
,
TVP5150_CONF_RAM_ADDR_LOW
,
regs
->
reg
);
for
(
i
=
0
;
i
<
16
;
i
++
)
tvp5150_write
(
c
,
TVP5150_VDP_CONF_RAM_DATA
,
regs
->
values
[
i
]);
for
(
i
=
0
;
i
<
16
;
i
++
)
tvp5150_write
(
c
,
TVP5150_VDP_CONF_RAM_DATA
,
regs
->
values
[
i
]);
regs
++
;
}
...
...
@@ -633,7 +535,7 @@ static void tvp5150_vbi_get_cap(const struct i2c_vbi_ram_value *regs,
memset
(
cap
,
0
,
sizeof
*
cap
);
while
(
regs
->
reg
!=
(
u16
)
-
1
)
{
for
(
line
=
regs
->
type
.
ini_line
;
line
<=
regs
->
type
.
end_line
;
line
++
)
{
for
(
line
=
regs
->
type
.
ini_line
;
line
<=
regs
->
type
.
end_line
;
line
++
)
{
cap
->
service_lines
[
0
][
line
]
|=
regs
->
type
.
vbi_type
;
}
cap
->
service_set
|=
regs
->
type
.
vbi_type
;
...
...
@@ -656,14 +558,14 @@ static void tvp5150_vbi_get_cap(const struct i2c_vbi_ram_value *regs,
* MSB = field2
*/
static
int
tvp5150_set_vbi
(
struct
i2c_client
*
c
,
const
struct
i2c_vbi_ram_value
*
regs
,
unsigned
int
type
,
u8
flags
,
int
line
,
const
int
fields
)
const
struct
i2c_vbi_ram_value
*
regs
,
unsigned
int
type
,
u8
flags
,
int
line
,
const
int
fields
)
{
struct
tvp5150
*
decoder
=
i2c_get_clientdata
(
c
);
v4l2_std_id
std
=
decoder
->
norm
;
v4l2_std_id
std
=
decoder
->
norm
;
u8
reg
;
int
pos
=
0
;
int
pos
=
0
;
if
(
std
==
V4L2_STD_ALL
)
{
tvp5150_err
(
"VBI can't be configured without knowing number of lines
\n
"
);
...
...
@@ -673,14 +575,14 @@ static int tvp5150_set_vbi(struct i2c_client *c,
line
+=
3
;
}
if
(
line
<
6
||
line
>
27
)
if
(
line
<
6
||
line
>
27
)
return
0
;
while
(
regs
->
reg
!=
(
u16
)
-
1
)
{
if
((
type
&
regs
->
type
.
vbi_type
)
&&
(
line
>=
regs
->
type
.
ini_line
)
&&
(
line
<=
regs
->
type
.
end_line
))
{
type
=
regs
->
type
.
vbi_type
;
(
line
>=
regs
->
type
.
ini_line
)
&&
(
line
<=
regs
->
type
.
end_line
))
{
type
=
regs
->
type
.
vbi_type
;
break
;
}
...
...
@@ -690,27 +592,27 @@ static int tvp5150_set_vbi(struct i2c_client *c,
if
(
regs
->
reg
==
(
u16
)
-
1
)
return
0
;
type
=
pos
|
(
flags
&
0xf0
);
reg
=
((
line
-
6
)
<<
1
)
+
TVP5150_LINE_MODE_INI
;
type
=
pos
|
(
flags
&
0xf0
);
reg
=
((
line
-
6
)
<<
1
)
+
TVP5150_LINE_MODE_INI
;
if
(
fields
&
1
)
{
if
(
fields
&
1
)
{
tvp5150_write
(
c
,
reg
,
type
);
}
if
(
fields
&
2
)
{
tvp5150_write
(
c
,
reg
+
1
,
type
);
if
(
fields
&
2
)
{
tvp5150_write
(
c
,
reg
+
1
,
type
);
}
return
type
;
}
static
int
tvp5150_get_vbi
(
struct
i2c_client
*
c
,
const
struct
i2c_vbi_ram_value
*
regs
,
int
line
)
const
struct
i2c_vbi_ram_value
*
regs
,
int
line
)
{
struct
tvp5150
*
decoder
=
i2c_get_clientdata
(
c
);
v4l2_std_id
std
=
decoder
->
norm
;
v4l2_std_id
std
=
decoder
->
norm
;
u8
reg
;
int
pos
,
type
=
0
;
int
pos
,
type
=
0
;
if
(
std
==
V4L2_STD_ALL
)
{
tvp5150_err
(
"VBI can't be configured without knowing number of lines
\n
"
);
...
...
@@ -720,50 +622,50 @@ static int tvp5150_get_vbi(struct i2c_client *c,
line
+=
3
;
}
if
(
line
<
6
||
line
>
27
)
if
(
line
<
6
||
line
>
27
)
return
0
;
reg
=
((
line
-
6
)
<<
1
)
+
TVP5150_LINE_MODE_INI
;
reg
=
((
line
-
6
)
<<
1
)
+
TVP5150_LINE_MODE_INI
;
pos
=
tvp5150_read
(
c
,
reg
)
&
0x0f
;
if
(
pos
<
0x0f
)
type
=
regs
[
pos
].
type
.
vbi_type
;
pos
=
tvp5150_read
(
c
,
reg
)
&
0x0f
;
if
(
pos
<
0x0f
)
type
=
regs
[
pos
].
type
.
vbi_type
;
pos
=
tvp5150_read
(
c
,
reg
+
1
)
&
0x0f
;
if
(
pos
<
0x0f
)
type
|=
regs
[
pos
].
type
.
vbi_type
;
pos
=
tvp5150_read
(
c
,
reg
+
1
)
&
0x0f
;
if
(
pos
<
0x0f
)
type
|=
regs
[
pos
].
type
.
vbi_type
;
return
type
;
}
static
int
tvp5150_set_std
(
struct
i2c_client
*
c
,
v4l2_std_id
std
)
{
struct
tvp5150
*
decoder
=
i2c_get_clientdata
(
c
);
int
fmt
=
0
;
int
fmt
=
0
;
decoder
->
norm
=
std
;
/* First tests should be against specific std */
if
(
std
==
V4L2_STD_ALL
)
{
fmt
=
0
;
/* Autodetect mode */
fmt
=
0
;
/* Autodetect mode */
}
else
if
(
std
&
V4L2_STD_NTSC_443
)
{
fmt
=
0xa
;
fmt
=
0xa
;
}
else
if
(
std
&
V4L2_STD_PAL_M
)
{
fmt
=
0x6
;
}
else
if
(
std
&
(
V4L2_STD_PAL_N
|
V4L2_STD_PAL_Nc
))
{
fmt
=
0x8
;
fmt
=
0x6
;
}
else
if
(
std
&
(
V4L2_STD_PAL_N
|
V4L2_STD_PAL_Nc
))
{
fmt
=
0x8
;
}
else
{
/* Then, test against generic ones */
if
(
std
&
V4L2_STD_NTSC
)
{
fmt
=
0x2
;
fmt
=
0x2
;
}
else
if
(
std
&
V4L2_STD_PAL
)
{
fmt
=
0x4
;
fmt
=
0x4
;
}
else
if
(
std
&
V4L2_STD_SECAM
)
{
fmt
=
0xc
;
fmt
=
0xc
;
}
}
tvp5150_dbg
(
1
,
"Set video std register to %d.
\n
"
,
fmt
);
tvp5150_dbg
(
1
,
"Set video std register to %d.
\n
"
,
fmt
);
tvp5150_write
(
c
,
TVP5150_VIDEO_STD
,
fmt
);
return
0
;
...
...
@@ -774,22 +676,22 @@ static inline void tvp5150_reset(struct i2c_client *c)
u8
msb_id
,
lsb_id
,
msb_rom
,
lsb_rom
;
struct
tvp5150
*
decoder
=
i2c_get_clientdata
(
c
);
msb_id
=
tvp5150_read
(
c
,
TVP5150_MSB_DEV_ID
);
lsb_id
=
tvp5150_read
(
c
,
TVP5150_LSB_DEV_ID
);
msb_rom
=
tvp5150_read
(
c
,
TVP5150_ROM_MAJOR_VER
);
lsb_rom
=
tvp5150_read
(
c
,
TVP5150_ROM_MINOR_VER
);
msb_id
=
tvp5150_read
(
c
,
TVP5150_MSB_DEV_ID
);
lsb_id
=
tvp5150_read
(
c
,
TVP5150_LSB_DEV_ID
);
msb_rom
=
tvp5150_read
(
c
,
TVP5150_ROM_MAJOR_VER
);
lsb_rom
=
tvp5150_read
(
c
,
TVP5150_ROM_MINOR_VER
);
if
((
msb_rom
==
4
)
&&
(
lsb_rom
==
0
))
{
/* Is TVP5150AM1 */
tvp5150_info
(
"tvp%02x%02xam1 detected.
\n
"
,
msb_id
,
lsb_id
);
if
((
msb_rom
==
4
)
&&
(
lsb_rom
==
0
))
{
/* Is TVP5150AM1 */
tvp5150_info
(
"tvp%02x%02xam1 detected.
\n
"
,
msb_id
,
lsb_id
);
/* ITU-T BT.656.4 timing */
tvp5150_write
(
c
,
TVP5150_REV_SELECT
,
0
);
tvp5150_write
(
c
,
TVP5150_REV_SELECT
,
0
);
}
else
{
if
((
msb_rom
==
3
)
||
(
lsb_rom
==
0x21
))
{
/* Is TVP5150A */
tvp5150_info
(
"tvp%02x%02xa detected.
\n
"
,
msb_id
,
lsb_id
);
if
((
msb_rom
==
3
)
||
(
lsb_rom
==
0x21
))
{
/* Is TVP5150A */
tvp5150_info
(
"tvp%02x%02xa detected.
\n
"
,
msb_id
,
lsb_id
);
}
else
{
tvp5150_info
(
"*** unknown tvp%02x%02x chip detected.
\n
"
,
msb_id
,
lsb_id
);
tvp5150_info
(
"*** Rom ver is %d.%d
\n
"
,
msb_rom
,
lsb_rom
);
tvp5150_info
(
"*** unknown tvp%02x%02x chip detected.
\n
"
,
msb_id
,
lsb_id
);
tvp5150_info
(
"*** Rom ver is %d.%d
\n
"
,
msb_rom
,
lsb_rom
);
}
}
...
...
@@ -818,7 +720,8 @@ static int tvp5150_get_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
{
/* struct tvp5150 *decoder = i2c_get_clientdata(c); */
switch
(
ctrl
->
id
)
{
switch
(
ctrl
->
id
)
{
case
V4L2_CID_BRIGHTNESS
:
ctrl
->
value
=
tvp5150_read
(
c
,
TVP5150_BRIGHT_CTL
);
return
0
;
...
...
@@ -839,7 +742,8 @@ static int tvp5150_get_std(struct i2c_client *c, v4l2_std_id *id)
{
int
fmt
=
tvp5150_read
(
c
,
TVP5150_STATUS_REG_5
);
fmt
&=
0x0F
;
switch
(
fmt
)
{
switch
(
fmt
)
{
case
0x01
:
*
id
=
V4L2_STD_NTSC
;
break
;
...
...
@@ -869,7 +773,8 @@ static int tvp5150_set_ctrl(struct i2c_client *c, struct v4l2_control *ctrl)
{
/* struct tvp5150 *decoder = i2c_get_clientdata(c); */
switch
(
ctrl
->
id
)
{
switch
(
ctrl
->
id
)
{
case
V4L2_CID_BRIGHTNESS
:
tvp5150_write
(
c
,
TVP5150_BRIGHT_CTL
,
ctrl
->
value
);
return
0
;
...
...
@@ -894,8 +799,8 @@ static int tvp5150_command(struct i2c_client *c,
{
struct
tvp5150
*
decoder
=
i2c_get_clientdata
(
c
);
switch
(
cmd
)
{
switch
(
cmd
)
{
case
0
:
case
VIDIOC_INT_RESET
:
tvp5150_reset
(
c
);
...
...
@@ -956,10 +861,9 @@ static int tvp5150_command(struct i2c_client *c,
if
(
svbi
->
service_set
!=
0
)
{
for
(
i
=
0
;
i
<=
23
;
i
++
)
{
svbi
->
service_lines
[
1
][
i
]
=
0
;
svbi
->
service_lines
[
0
][
i
]
=
tvp5150_set_vbi
(
c
,
vbi_ram_default
,
svbi
->
service_lines
[
0
][
i
],
0xf0
,
i
,
3
);
svbi
->
service_lines
[
0
][
i
]
=
tvp5150_set_vbi
(
c
,
vbi_ram_default
,
svbi
->
service_lines
[
0
][
i
],
0xf0
,
i
,
3
);
}
/* Enables FIFO */
tvp5150_write
(
c
,
TVP5150_FIFO_OUT_CTRL
,
1
);
...
...
@@ -971,7 +875,7 @@ static int tvp5150_command(struct i2c_client *c,
tvp5150_write
(
c
,
TVP5150_FULL_FIELD_ENA
,
0
);
/* Disable Line modes */
for
(
i
=
TVP5150_LINE_MODE_INI
;
i
<=
TVP5150_LINE_MODE_END
;
i
++
)
for
(
i
=
TVP5150_LINE_MODE_INI
;
i
<=
TVP5150_LINE_MODE_END
;
i
++
)
tvp5150_write
(
c
,
i
,
0xff
);
}
break
;
...
...
@@ -981,7 +885,7 @@ static int tvp5150_command(struct i2c_client *c,
struct
v4l2_format
*
fmt
;
struct
v4l2_sliced_vbi_format
*
svbi
;
int
i
,
mask
=
0
;
int
i
,
mask
=
0
;
fmt
=
arg
;
if
(
fmt
->
type
!=
V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
)
...
...
@@ -990,11 +894,10 @@ static int tvp5150_command(struct i2c_client *c,
memset
(
svbi
,
0
,
sizeof
(
*
svbi
));
for
(
i
=
0
;
i
<=
23
;
i
++
)
{
svbi
->
service_lines
[
0
][
i
]
=
tvp5150_get_vbi
(
c
,
vbi_ram_default
,
i
);
mask
|=
svbi
->
service_lines
[
0
][
i
];
svbi
->
service_lines
[
0
][
i
]
=
tvp5150_get_vbi
(
c
,
vbi_ram_default
,
i
);
mask
|=
svbi
->
service_lines
[
0
][
i
];
}
svbi
->
service_set
=
mask
;
svbi
->
service_set
=
mask
;
break
;
}
...
...
@@ -1021,79 +924,75 @@ static int tvp5150_command(struct i2c_client *c,
break
;
case
VIDIOC_G_TUNER
:
{
struct
v4l2_tuner
*
vt
=
arg
;
int
status
=
tvp5150_read
(
c
,
0x88
);
{
struct
v4l2_tuner
*
vt
=
arg
;
int
status
=
tvp5150_read
(
c
,
0x88
);
vt
->
signal
=
((
status
&
0x04
)
&&
(
status
&
0x02
))
?
0xffff
:
0x0
;
break
;
}
vt
->
signal
=
((
status
&
0x04
)
&&
(
status
&
0x02
))
?
0xffff
:
0x0
;
break
;
}
case
VIDIOC_QUERYCTRL
:
{
struct
v4l2_queryctrl
*
qc
=
arg
;
int
i
;
{
struct
v4l2_queryctrl
*
qc
=
arg
;
int
i
;
tvp5150_dbg
(
1
,
"VIDIOC_QUERYCTRL called
\n
"
);
tvp5150_dbg
(
1
,
"VIDIOC_QUERYCTRL called
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tvp5150_qctrl
);
i
++
)
if
(
qc
->
id
&&
qc
->
id
==
tvp5150_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
tvp5150_qctrl
[
i
]),
sizeof
(
*
qc
));
return
0
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tvp5150_qctrl
);
i
++
)
if
(
qc
->
id
&&
qc
->
id
==
tvp5150_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
tvp5150_qctrl
[
i
]),
sizeof
(
*
qc
));
return
0
;
}
return
-
EINVAL
;
}
return
-
EINVAL
;
}
case
VIDIOC_G_CTRL
:
{
struct
v4l2_control
*
ctrl
=
arg
;
tvp5150_dbg
(
1
,
"VIDIOC_G_CTRL called
\n
"
);
{
struct
v4l2_control
*
ctrl
=
arg
;
tvp5150_dbg
(
1
,
"VIDIOC_G_CTRL called
\n
"
);
return
tvp5150_get_ctrl
(
c
,
ctrl
);
}
return
tvp5150_get_ctrl
(
c
,
ctrl
);
}
case
VIDIOC_S_CTRL
:
{
struct
v4l2_control
*
ctrl
=
arg
;
u8
i
,
n
;
n
=
ARRAY_SIZE
(
tvp5150_qctrl
);
for
(
i
=
0
;
i
<
n
;
i
++
)
if
(
ctrl
->
id
==
tvp5150_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
tvp5150_qctrl
[
i
].
minimum
||
ctrl
->
value
>
tvp5150_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
tvp5150_dbg
(
1
,
"VIDIOC_S_CTRL: id=%d, value=%d
\n
"
,
ctrl
->
id
,
ctrl
->
value
);
return
tvp5150_set_ctrl
(
c
,
ctrl
);
}
return
-
EINVAL
;
}
{
struct
v4l2_control
*
ctrl
=
arg
;
u8
i
,
n
;
n
=
ARRAY_SIZE
(
tvp5150_qctrl
);
for
(
i
=
0
;
i
<
n
;
i
++
)
if
(
ctrl
->
id
==
tvp5150_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
tvp5150_qctrl
[
i
].
minimum
||
ctrl
->
value
>
tvp5150_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
tvp5150_dbg
(
1
,
"VIDIOC_S_CTRL: id=%d, value=%d
\n
"
,
ctrl
->
id
,
ctrl
->
value
);
return
tvp5150_set_ctrl
(
c
,
ctrl
);
}
return
-
EINVAL
;
}
case
VIDIOC_QUERYSTD
:
{
v4l2_std_id
*
id
=
(
v4l2_std_id
*
)
arg
;
tvp5150_get_std
(
c
,
id
);
break
;
}
{
v4l2_std_id
*
id
=
(
v4l2_std_id
*
)
arg
;
tvp5150_get_std
(
c
,
id
);
break
;
}
case
VPFE_CMD_CONFIG_CAPTURE
:
{
struct
vpfe_capture_params
*
params
=
(
struct
vpfe_capture_params
*
)
arg
;
if
(
params
->
amuxmode
==
VPFE_AMUX_COMPOSITE0
)
{
decoder
->
route
.
input
=
TVP5150_COMPOSITE0
;
}
else
if
(
params
->
amuxmode
==
VPFE_AMUX_COMPOSITE1
)
{
decoder
->
route
.
input
=
TVP5150_COMPOSITE1
;
}
else
{
decoder
->
route
.
input
=
TVP5150_SVIDEO
;
}
tvp5150_selmux
(
c
);
tvp5150_set_std
(
c
,
params
->
mode
);
decoder
->
norm
=
params
->
mode
;
break
;
}
{
struct
vpfe_capture_params
*
params
=
(
struct
vpfe_capture_params
*
)
arg
;
if
(
params
->
amuxmode
==
VPFE_AMUX_COMPOSITE0
)
{
decoder
->
route
.
input
=
TVP5150_COMPOSITE0
;
}
else
if
(
params
->
amuxmode
==
VPFE_AMUX_COMPOSITE1
)
{
decoder
->
route
.
input
=
TVP5150_COMPOSITE1
;
}
else
{
decoder
->
route
.
input
=
TVP5150_SVIDEO
;
}
tvp5150_selmux
(
c
);
tvp5150_set_std
(
c
,
params
->
mode
);
decoder
->
norm
=
params
->
mode
;
break
;
}
default:
return
-
EINVAL
;
}
...
...
@@ -1119,16 +1018,15 @@ static int tvp5150_detect_client(struct i2c_adapter *adapter,
if
(
debug
)
printk
(
KERN_INFO
"tvp5150.c: detecting tvp5150 client on address 0x%x
\n
"
,
address
<<
1
);
"tvp5150.c: detecting tvp5150 client on address 0x%x
\n
"
,
address
<<
1
);
client_template
.
adapter
=
adapter
;
client_template
.
addr
=
address
;
/* Check if the adapter supports the needed features */
if
(
!
i2c_check_functionality
(
adapter
,
I2C_FUNC_SMBUS_READ_BYTE
|
I2C_FUNC_SMBUS_WRITE_BYTE_DATA
))
(
adapter
,
I2C_FUNC_SMBUS_READ_BYTE
|
I2C_FUNC_SMBUS_WRITE_BYTE_DATA
))
return
0
;
tvp5150_client
=
kmalloc
(
sizeof
(
struct
i2c_client
),
GFP_KERNEL
);
...
...
@@ -1168,8 +1066,8 @@ static int tvp5150_attach_adapter(struct i2c_adapter *adapter)
{
if
(
debug
)
printk
(
KERN_INFO
"tvp5150.c: starting probe for adapter %s (0x%x)
\n
"
,
adapter
->
name
,
adapter
->
id
);
"tvp5150.c: starting probe for adapter %s (0x%x)
\n
"
,
adapter
->
name
,
adapter
->
id
);
return
i2c_probe
(
adapter
,
&
addr_data
,
&
tvp5150_detect_client
);
}
...
...
@@ -1179,8 +1077,8 @@ static int tvp5150_detach_client(struct i2c_client *c)
int
err
;
tvp5150_dbg
(
1
,
"tvp5150.c: removing tvp5150 adapter on address 0x%x
\n
"
,
c
->
addr
<<
1
);
"tvp5150.c: removing tvp5150 adapter on address 0x%x
\n
"
,
c
->
addr
<<
1
);
err
=
i2c_detach_client
(
c
);
if
(
err
)
{
...
...
@@ -1259,7 +1157,7 @@ static struct vpfe_capture_device tvp5150_device = {
static
int
__init
tvp5150_init
(
void
)
{
i2c_add_driver
(
&
driver
);
return
vpfe_capture_device_register
(
&
tvp5150_device
);
return
vpfe_capture_device_register
(
&
tvp5150_device
);
}
static
void
__exit
tvp5150_exit
(
void
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment