Part Number: TMDXEVM8148
Hi Everyone,
I'm trying to hook up the tvp5147 with the v4l2 capture driver and now i have an issue with i2c:
tvp514x 1-005c: Write: retry --- 0
tvp514x 1-005c: Write: retry --- 1
tvp514x 1-005c: Write: retry --- 2
tvp514x 1-005c: Write: retry --- 3
tvp514x 1-005c: Write: retry --- 4
tvp514x 1-005c: Write failed. Err[-121]
tvp514x 1-005c: Unable to turn on decoder !!!!!!
tvp514x 1-005c: Read: retry ... 0
tvp514x 1-005c: Read: retry ... 1
tvp514x 1-005c: Read: retry ... 2
tvp514x 1-005c: Read: retry ... 3
tvp514x 1-005c: Read: retry ... 4
tvp514x 1-005c: Unable to query std
Board: TMDXEVM8148 with expansion board
SDK: EZSDK 5 05 02 00
i2c addr of tvp5147 0x05c on bus 1
What i did:
modification of ti81xx_vpss.c / ti81xxvin_main.c / tvp51x.c following the important part of the patch found in this thread
Add tvp514x decoder support into the kernel with menuconfig
Compile the kernel and modules with a script: run.sh (see bellow or attached files)
Put modules on the board
Start the board
Connect with SSH
Launch a script that configure and execute saLoopBack (see script.sh)
I go the issue before the execution of saLoopBack, see bellow or attached files for the dmesg output (it got a lot of printk because i needed to know where the code goes wrong )
I read this http://processors.wiki.ti.com/index.php/DM81xx_AM38xx_Adding_External_Decoders_to_V4L2_Capture_Driver and also checked that every structures were filled.
I also look into every possible thread talking about tvp514x and dm81x8
After trying so much things, I suspect a configuration issue but i have no idea of what it could be :(
Can you please tell me what to change in order to make it work ?
Many thanks in advance,
BR,
Marc
Files:
run.sh
#!/bin/sh
PATH_TO_TOOLCHAIN=/home/hieg/Sourcery/Sourcery_G++_Lite
make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- ti8148_evm_defconfig
make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- uImage
#make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- menuconfig
make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- modules
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/arch/arm/boot/uImage /srv/tftp/
cd /srv/tftp
sudo chmod 777 uImage
#modules
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/video/ti81xx/ti81xxfb/ti81xxfb.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/video/ti81xx/ti81xxfb/
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/video/ti81xx/ti81xxhdmi/ti81xxhdmi.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/video/ti81xx/ti81xxhdmi/
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/ti81xx/ti81xxvin.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/ti81xx/
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/ti81xx/ti81xxvo.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/ti81xx/
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/tvp514x.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/tvp7002.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/
sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/video/ti81xx/vpss/vpss.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/video/ti81xx/vpss/
**************************************************************************************************
script.sh
#!/bin/sh
cd /home/root/VideoCapture
/etc/init.d/matrix-gui-e stop
/etc/init.d/pvr-init stop
/etc/init.d/load-hd-firmware.sh stop
insmod /lib/modules/2.6.37/kernel/drivers/media/video/tvp514x.ko debug=1
/usr/share/ti/ti-media-controller-utils/load-hd-v4l2-firmware.sh start
./saMarc
dmesg
lsmod
./saLoopBack
**************************************************************************************************
Dmesg
PM: Removing info for No Bus:bccat0
PM: Removing info for No Bus:pvrsrvkm
PM: Removing info for platform:pvrsrvkm
PM: Removing info for No Bus:tlc59108-bl
hdmi: Enter DSS_HDMI_CORE_SW_RESET_ASSERT ()
hdmi: Enter HDMI_W1_StopVideoFrame()
hdmi: *** Set PHY power mode to 0
hdmi: *** Set PHY power mode to 0
PM: Removing info for No Bus:TI81XX_HDMI
PM: Removing info for No Bus:fb0
PM: Removing info for No Bus:fb1
PM: Removing info for No Bus:fb2
PM: Removing info for No Bus:syslinkipc_MessageQ
PM: Removing info for No Bus:syslinkipc_GateMP
PM: Removing info for No Bus:syslinkipc_ListMP
PM: Removing info for No Bus:syslinkipc_HeapMemMP
PM: Removing info for No Bus:syslinkipc_HeapBufMP
PM: Removing info for No Bus:syslinkipc_SharedRegion
PM: Removing info for No Bus:syslinkipc_NameServer
PM: Removing info for No Bus:syslinkipc_MultiProc
PM: Removing info for No Bus:syslinkipc_Notify
PM: Removing info for No Bus:syslinkipc_FrameQ
PM: Removing info for No Bus:syslinkipc_FrameQBufMgr
PM: Removing info for No Bus:syslinkipc_RingIO
PM: Removing info for No Bus:syslinkipc_RingIOShm
PM: Removing info for No Bus:syslinkipc_ClientNotifyMgr
PM: Removing info for No Bus:syslinkipc_SyslinkMemMgr
PM: Removing info for No Bus:syslinkipc_ProcMgr
PM: Removing info for No Bus:syslinkipc_Ipc
PM: Removing info for No Bus:syslinkipc_Osal
Removed syslink kernel module
SysLink version : 2.20.02.20
SysLink module created on Date:Dec 26 2012 Time:18:39:49
PM: Adding info for No Bus:syslinkipc_Osal
PM: Adding info for No Bus:syslinkipc_Ipc
PM: Adding info for No Bus:syslinkipc_ProcMgr
PM: Adding info for No Bus:syslinkipc_Notify
PM: Adding info for No Bus:syslinkipc_MultiProc
PM: Adding info for No Bus:syslinkipc_NameServer
PM: Adding info for No Bus:syslinkipc_SharedRegion
PM: Adding info for No Bus:syslinkipc_HeapBufMP
PM: Adding info for No Bus:syslinkipc_HeapMemMP
PM: Adding info for No Bus:syslinkipc_ListMP
PM: Adding info for No Bus:syslinkipc_GateMP
PM: Adding info for No Bus:syslinkipc_MessageQ
PM: Adding info for No Bus:syslinkipc_SyslinkMemMgr
PM: Adding info for No Bus:syslinkipc_ClientNotifyMgr
PM: Adding info for No Bus:syslinkipc_FrameQBufMgr
PM: Adding info for No Bus:syslinkipc_FrameQ
PM: Adding info for No Bus:syslinkipc_RingIO
PM: Adding info for No Bus:syslinkipc_RingIOShm
VPSS_FVID2: M3 firmware version 0x1000145 is newer,driver may not work properly.
TI81XXFB : ti81xxfb_init
TI81XXFB : create 3 fbs
TI81XXFB : fb_infos(3) allocated.
TI81XXFB : vram 0:40M,1:1M,2:1M
TI81XXFB : fb 0 size 41943040
TI81XXFB : fb 1 size 1048576
TI81XXFB : fb 2 size 1048576
TI81XXFB : allocating 41943040 bytes for fb 0
TI81XXFB : allocated VRAM paddr 8ce00000, vaddr d1000000
TI81XXFB : allocating 1048576 bytes for fb 1
TI81XXFB : allocated VRAM paddr 8f600000, vaddr d3800000
TI81XXFB : allocating 1048576 bytes for fb 2
TI81XXFB : allocated VRAM paddr 8f700000, vaddr d3900000
TI81XXFB : region0 phys 8ce00000 virt d1000000 size=41943040
TI81XXFB : region1 phys 8f600000 virt d3800000 size=1048576
TI81XXFB : region2 phys 8f700000 virt d3900000 size=1048576
TI81XXFB : fb memory allocated.
TI81XXFB : clut mem allocated.
TI81XXFB : check_fb_var
TI81XXFB : xres = 1920, yres = 1080, vxres = 1920, vyres = 1080,xoffset = 0, yoffset = 0
TI81XXFB : set_fb_fix
TI81XXFB : check_fb_var
TI81XXFB : can't fit fb memory, reducing y
TI81XXFB : xres = 1920, yres = 136, vxres = 1920, vyres = 136,xoffset = 0, yoffset = 0
TI81XXFB : set_fb_fix
TI81XXFB : check_fb_var
TI81XXFB : can't fit fb memory, reducing y
TI81XXFB : xres = 720, yres = 364, vxres = 720, vyres = 364,xoffset = 0, yoffset = 0
TI81XXFB : set_fb_fix
TI81XXFB : fb_infos initialized
PM: Adding info for No Bus:fb0
PM: Adding info for No Bus:fb1
PM: Adding info for No Bus:fb2
TI81XXFB : framebuffers registered
TI81XXFB : fbs sysfs created
TI81XXFB : Opening fb0
TI81XXFB : check_var(0)
TI81XXFB : check_fb_var
TI81XXFB : xres = 800, yres = 480, vxres = 800, vyres = 480,xoffset = 0, yoffset = 0
TI81XXFB : set_var(0)
TI81XXFB : set_fb_fix
TI81XXFB : pan_display(0)
TI81XXFB : setcamp(0)
TI81XXFB : clut not same ,set
TI81XXFB : Closing fb0
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT0: buf0: va: 0xc4800000 pa: 0x84800000 size 0x400000
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT0: buf1: va: 0xc4400000 pa: 0x84400000 size 0x400000
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT0: buf2: va: 0xc4000000 pa: 0x84000000 size 0x400000
PM: Adding info for No Bus:video1
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_init
t81xx_vidout t81xx_vidout: VIDOUT0: init video
drivers/media/video/ti81xx/ti81xxvid_main.c video_mode_to_vpss_mode
t81xx_vidout t81xx_vidout: VIDOUT0: data format 1
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_setup_video
t81xx_vidout t81xx_vidout: VIDOUT0: enable=0 width=1920
height=1080 color_mode=1
pos=0x0 out_width=1920 out_height=1080 screen_width=3840 crop=0
t81xx_vidout t81xx_vidout: VIDOUT0: apply_changes failed
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT1: buf0: va: 0xc3c00000 pa: 0x83c00000 size 0x400000
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT1: buf1: va: 0xc3800000 pa: 0x83800000 size 0x400000
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT1: buf2: va: 0xc3400000 pa: 0x83400000 size 0x400000
PM: Adding info for No Bus:video2
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_init
t81xx_vidout t81xx_vidout: VIDOUT1: init video
drivers/media/video/ti81xx/ti81xxvid_main.c video_mode_to_vpss_mode
t81xx_vidout t81xx_vidout: VIDOUT1: data format 1
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_setup_video
t81xx_vidout t81xx_vidout: VIDOUT1: enable=0 width=800
height=480 color_mode=1
pos=0x0 out_width=800 out_height=480 screen_width=1600 crop=0
t81xx_vidout t81xx_vidout: VIDOUT1: apply_changes failed
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT2: buf0: va: 0xca500000 pa: 0x8a500000 size 0xca800
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT2: buf1: va: 0xca700000 pa: 0x8a700000 size 0xca800
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs
t81xx_vidout t81xx_vidout: VIDOUT2: buf2: va: 0xc3000000 pa: 0x83000000 size 0xca800
PM: Adding info for No Bus:video3
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_init
t81xx_vidout t81xx_vidout: VIDOUT2: init video
drivers/media/video/ti81xx/ti81xxvid_main.c video_mode_to_vpss_mode
t81xx_vidout t81xx_vidout: VIDOUT2: data format 1
drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_setup_video
t81xx_vidout t81xx_vidout: VIDOUT2: enable=0 width=720
height=480 color_mode=1
pos=0x0 out_width=720 out_height=480 screen_width=1440 crop=0
t81xx_vidout t81xx_vidout: VIDOUT2: apply_changes failed
drivers/media/video/ti81xx/ti81xxvin_main.c, ti81xxvin_probe
PM: Adding info for No Bus:video0
PM: Adding info for No Bus:video4
PM: Adding info for No Bus:video5
PM: Adding info for No Bus:video6
tvp514x
drivers/media/video/v4l2-common.c, v4l2_i2c_new_subdev_board
PM: Adding info for i2c:1-005c
drivers/media/video/tvp514x.c, tvp514x_probe
drivers/media/video/tvp514x.c tvp514x_probe
tvp514x 1-005c: tvp514x 1-005c decoder driver registered
drivers/media/video/tvp514x.c, tvp514x_s_config
drivers/media/video/tvp514x.c, tvp514x_s_stream
0 3 1
drivers/media/video/tvp514x.c tvp514x_write_reg
tvp514x 1-005c: Write: retry --- 0
drivers/media/video/tvp514x.c tvp514x_write_reg
tvp514x 1-005c: Write: retry --- 1
drivers/media/video/tvp514x.c tvp514x_write_reg
tvp514x 1-005c: Write: retry --- 2
drivers/media/video/tvp514x.c tvp514x_write_reg
tvp514x 1-005c: Write: retry --- 3
drivers/media/video/tvp514x.c tvp514x_write_reg
tvp514x 1-005c: Write: retry --- 4
drivers/media/video/tvp514x.c tvp514x_write_regs
tvp514x 1-005c: Write failed. Err[-121]
drivers/media/video/tvp514x.c tvp514x_s_stream
tvp514x 1-005c: Unable to turn on decoder !!!!!!
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 0
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 1
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 2
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 3
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 4
drivers/media/video/tvp514x.c tvp514x_s_config
tvp514x 1-005c: Unable to query std
drivers/media/video/ti81xx/ti81xxvin_main.c ti81xxvin_probe
ti81xxvin ti81xxvin: registered sub device tvp5147m1
drivers/media/video/ti81xx/ti81xxvin_main.c ti81xxvin_probe
ti81xxvin ti81xxvin: TI81xx HDVPSS Capture driver initialized
FIN de ti81xxvin_probe
TI81XXFB : Opening fb0
TI81XXFB : check_var(0)
TI81XXFB : check_fb_var
TI81XXFB : xres = 800, yres = 480, vxres = 800, vyres = 480,xoffset = 0, yoffset = 0
TI81XXFB : set_var(0)
TI81XXFB : set_fb_fix
TI81XXFB : pan_display(0)
TI81XXFB : setcamp(0)
TI81XXFB : Closing fb0
HDMI W1 rev 4.0
HDMI CEC Spec version 1.2
PM: Adding info for No Bus:TI81XX_HDMI
hdmi: Enter HDMI_W1_StopVideoFrame()
hdmi: *** Set PHY power mode to 1
hdmi: *** Set PHY power mode to 2
I2C No Ack
hdmi: Enter HDMI_W1_GlobalInitVars()
hdmi: Enter HDMI_Core_GlobalInitVars()
hdmi: Enter HDMI_W1_ConfigVideoResolutionTiming()
hdmi: Enter HDMI_W1_ConfigVideoInterface()
hdmi: HDMI_WP_AUDIO_CFG = 0x1030006
hdmi: HDMI_WP_AUDIO_CFG2 = 0x20c0
hdmi: HDMI_WP_AUDIO_CTRL = 0x20
hdmi: Enter DSS_HDMI_CORE_SW_RESET_ASSERT ()
hdmi: Enter DSS_HDMI_CORE_POWER_DOWN_DISABLE()
hdmi: Enter DSS_HDMI_CORE_SW_RESET_RELEASE()
hdmi: Enter HDMI_W1_StartVideoFrame ()
hdmi: Irqenable 60000011
hdmi: 40 hpd
PM: Adding info for No Bus:tlc59108-bl
ti81xxvin ti81xxvin: ti81xxvin_open
ti81xxvin ti81xxvin: ti81xxvin_open
drivers/media/video/ti81xx/ti81xxvin_main.c vidioc_enum_input
ti81xxvin ti81xxvin: Invalid input index
ti81xxvin ti81xxvin: ti81xxvin_open
ti81xxvin ti81xxvin: ti81xxvin_open
drivers/media/video/ti81xx/ti81xxvin_main.c vidioc_enum_input
ti81xxvin ti81xxvin: Invalid input index
ti81xxvin ti81xxvin: ti81xxvin_release
ti81xxvin ti81xxvin: Failed to del timer
ti81xxvin ti81xxvin: ti81xxvin_release
ti81xxvin ti81xxvin: Failed to del timer
ti81xxvin ti81xxvin: ti81xxvin_release
ti81xxvin ti81xxvin: Failed to del timer
ti81xxvin ti81xxvin: ti81xxvin_release
ti81xxvin ti81xxvin: Failed to del timer
ti81xxvin ti81xxvin: ti81xxvin_open
hdmi: Enter DSS_HDMI_CORE_SW_RESET_ASSERT ()
hdmi: Enter HDMI_W1_StopVideoFrame()
hdmi: *** Set PHY power mode to 0
hdmi: *** Set PHY power mode to 0
drivers/media/video/ti81xx/ti81xxvin_main.c, vidioc_query_dv_preset
ti81xxvin ti81xxvin: vidioc_query_dv_preset
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 0
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 1
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 2
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 3
drivers/media/video/tvp514x.c tvp514x_read_reg
tvp514x 1-005c: Read: retry ... 4
TVP514x: unkown video standard: -121
drivers/media/video/ti81xx/ti81xxvin_main.c vidioc_query_dv_preset
ti81xxvin ti81xxvin: Failed to set dv format for sub devices
ti81xxvin ti81xxvin: ti81xxvin_release
ti81xxvin ti81xxvin: Failed to del timer
/* * * Framebuffer device registration for TI TI816x platforms * * Copyright (C) 2009 Texas Instruments Inc. * Author: Yihe Hu <yihehu@ti.com> * * Some code and ideas taken from TI OMAP2 Platforms * by Tomi Valkeinen. * * 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 (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/bootmem.h> #include <linux/io.h> #include <linux/vps_capture.h> #include <linux/ti81xxfb.h> #include <linux/ti81xx.h> #include <mach/hardware.h> #include <mach/board-ti814x.h> #include <mach/board-ti816x.h> #include <asm/mach/map.h> #if defined(CONFIG_TI81XX_VPSS) || defined(CONFIG_TI81XX_VPSS_MODULE) static u64 ti81xx_dma_mask = ~(u32)0; static struct platform_device vpss_device = { .name = "vpss", .id = -1, .dev = { .platform_data = NULL, }, }; static struct vps_platform_data vps_pdata; static int __init ti81xx_vpss_init(void) { /*FIXME add platform data here*/ int r; if (cpu_is_ti816x() || cpu_is_dm385()) { if (cpu_is_dm385()) vps_pdata.cpu = CPU_DM813X; else vps_pdata.cpu = CPU_DM816X; vps_pdata.numvencs = 4; vps_pdata.vencmask = (1 << VPS_DC_MAX_VENC) - 1; } else if (cpu_is_ti814x()) { vps_pdata.cpu = CPU_DM814X; vps_pdata.numvencs = 3; vps_pdata.vencmask = (1 << VPS_DC_MAX_VENC) - 1 \ - VPS_DC_VENC_HDCOMP; } vpss_device.dev.platform_data = &vps_pdata; r = platform_device_register(&vpss_device); if (r) printk(KERN_ERR "unable to register ti81xx_vpss device\n"); else printk(KERN_INFO "registered ti81xx_vpss device\n"); return r; } #if defined(CONFIG_TI81XX_HDMI_MODULE) || defined(CONFIG_TI81XX_HDMI) static struct platform_device ti81xx_hdmi_plat_device = { .name = "TI81XX_HDMI", .id = -1, .num_resources = 0, .dev = { /*.release = ti81xx_hdmi_platform_release,*/ .platform_data = NULL, } }; static int __init ti81xx_hdmi_init(void) { int r; /*FIXME add platform data here*/ r = platform_device_register(&ti81xx_hdmi_plat_device); if (r) printk(KERN_ERR "Unable to register ti81xx onchip-HDMI device\n"); else printk(KERN_INFO "registered ti81xx on-chip HDMI device\n"); return r; } #else static int __init ti81xx_hdmi_init(void) { return 0; } #endif #if defined(CONFIG_VIDEO_TI81XX_VIDIN_MODULE) || \ defined(CONFIG_VIDEO_TI81XX_VIDIN) #define HDVPSS_CAPTURE_INST0_BASE 0x48105500 #define HDVPSS_CAPTURE_INST0_SIZE 1024u #define HDVPSS_CAPTURE_INST2_BASE 0x48105A00 #define HDVPSS_CAPTURE_INST2_SIZE 1024u u8 ti81xx_card_name[] = "TI81xx_catalogue"; struct ti81xxvin_interface tvp7002_pdata = { .clk_polarity = 0, .hs_polarity = 0, .vs_polarity = 1, .fid_polarity = 0, .sog_polarity = 0, }; struct ti81xxvin_interface tvp514x_pdata = { .clk_polarity = 0, .hs_polarity = 0, .vs_polarity = 1, .fid_polarity = 0, .sog_polarity = 0, }; static struct ti81xxvin_subdev_info hdvpss_capture_sdev_info[] = { #if 0 { .name = TVP7002_INST0, .board_info = { /* TODO Find the correct address of the TVP7002 connected */ I2C_BOARD_INFO("tvp7002", 0x5d), .platform_data = &tvp7002_pdata, }, .vip_port_cfg = { .ctrlChanSel = VPS_VIP_CTRL_CHAN_SEL_15_8, .ancChSel8b = VPS_VIP_ANC_CH_SEL_DONT_CARE, .pixClkEdgePol = VPS_VIP_PIX_CLK_EDGE_POL_RISING, .invertFidPol = 0, .embConfig = { .errCorrEnable = 1, .srcNumPos = VPS_VIP_SRC_NUM_POS_DONT_CARE, .isMaxChan3Bits = 0, }, .disConfig = { .fidSkewPostCnt = 0, .fidSkewPreCnt = 0, .lineCaptureStyle = VPS_VIP_LINE_CAPTURE_STYLE_DONT_CARE, .fidDetectMode = VPS_VIP_FID_DETECT_MODE_DONT_CARE, .actvidPol = VPS_VIP_POLARITY_DONT_CARE, .vsyncPol = VPS_VIP_POLARITY_DONT_CARE, .hsyncPol = VPS_VIP_POLARITY_DONT_CARE, } }, .video_capture_mode = VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC, .video_if_mode = VPS_CAPT_VIDEO_IF_MODE_16BIT, .input_data_format = FVID2_DF_YUV422P, }, { .name = TVP7002_INST1, .board_info = { I2C_BOARD_INFO("tvp7002", 0x5c), .platform_data = &tvp514x_pdata, }, .vip_port_cfg = { .ctrlChanSel = VPS_VIP_CTRL_CHAN_SEL_15_8, .ancChSel8b = VPS_VIP_ANC_CH_SEL_DONT_CARE, .pixClkEdgePol = VPS_VIP_PIX_CLK_EDGE_POL_RISING, .invertFidPol = 0, .embConfig = { .errCorrEnable = 1, .srcNumPos = VPS_VIP_SRC_NUM_POS_DONT_CARE, .isMaxChan3Bits = 0, }, .disConfig = { .fidSkewPostCnt = 0, .fidSkewPreCnt = 0, .lineCaptureStyle = VPS_VIP_LINE_CAPTURE_STYLE_DONT_CARE, .fidDetectMode = VPS_VIP_FID_DETECT_MODE_DONT_CARE, .actvidPol = VPS_VIP_POLARITY_DONT_CARE, .vsyncPol = VPS_VIP_POLARITY_DONT_CARE, .hsyncPol = VPS_VIP_POLARITY_DONT_CARE, } }, .video_capture_mode = VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC, .video_if_mode = VPS_CAPT_VIDEO_IF_MODE_16BIT, .input_data_format = FVID2_DF_YUV422P, }, { .name = "tvp5147",//TVP7002_INST1, .board_info = { I2C_BOARD_INFO("tvp5147", 0x5d), .platform_data = &tvp514x_pdata, }, .vip_port_cfg = { .ctrlChanSel = VPS_VIP_CTRL_CHAN_SEL_15_8, .ancChSel8b = VPS_VIP_ANC_CH_SEL_DONT_CARE, .pixClkEdgePol = VPS_VIP_PIX_CLK_EDGE_POL_RISING, .invertFidPol = 1,//0, .embConfig = { .errCorrEnable = 1, .srcNumPos = VPS_VIP_SRC_NUM_POS_DONT_CARE, .isMaxChan3Bits = 0, }, .disConfig = { .fidSkewPostCnt = 0, .fidSkewPreCnt = 0, .lineCaptureStyle = VPS_VIP_LINE_CAPTURE_STYLE_DONT_CARE, .fidDetectMode = VPS_VIP_FID_DETECT_MODE_DONT_CARE, .actvidPol = VPS_VIP_POLARITY_DONT_CARE, .vsyncPol = VPS_VIP_POLARITY_DONT_CARE, .hsyncPol = VPS_VIP_POLARITY_DONT_CARE, } }, .video_capture_mode = VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC, .video_if_mode = VPS_CAPT_VIDEO_IF_MODE_8BIT,//VPS_CAPT_VIDEO_IF_MODE_16BIT, .input_data_format = FVID2_DF_YUV422I_UYVY,//FVID2_DF_YUV422P, }, #endif { .name = "tvp5147m1",//TVP7002_INST1, .board_info = { I2C_BOARD_INFO("tvp5147m1", 0x5c), .platform_data = &tvp514x_pdata, }, .vip_port_cfg = { .ctrlChanSel = VPS_VIP_CTRL_CHAN_SEL_15_8, .ancChSel8b = VPS_VIP_ANC_CH_SEL_DONT_CARE, .pixClkEdgePol = VPS_VIP_PIX_CLK_EDGE_POL_RISING, .invertFidPol = 1,//0, .embConfig = { .errCorrEnable = 1, .srcNumPos = VPS_VIP_SRC_NUM_POS_DONT_CARE, .isMaxChan3Bits = 0, }, .disConfig = { .fidSkewPostCnt = 0, .fidSkewPreCnt = 0, .lineCaptureStyle = VPS_VIP_LINE_CAPTURE_STYLE_DONT_CARE, .fidDetectMode = VPS_VIP_FID_DETECT_MODE_DONT_CARE, .actvidPol = VPS_VIP_POLARITY_DONT_CARE, .vsyncPol = VPS_VIP_POLARITY_DONT_CARE, .hsyncPol = VPS_VIP_POLARITY_DONT_CARE, } }, .video_capture_mode = VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC, .video_if_mode = VPS_CAPT_VIDEO_IF_MODE_16BIT,//VPS_CAPT_VIDEO_IF_MODE_8BIT, .input_data_format = FVID2_DF_YUV422I_UYVY,//FVID2_DF_YUV422P, }, }; static const struct v4l2_dv_preset hdvpss_inst0_inp0_presets[] = { #if 0 { .preset = V4L2_DV_720P60, }, { .preset = V4L2_DV_1080I60, }, { .preset = V4L2_DV_1080P60, }, { .preset = V4L2_DV_1080P30, }, #endif { .preset = V4L2_DV_576P50, }, { .preset = V4L2_DV_480P59_94, }, }; static const struct v4l2_dv_preset hdvpss_inst2_inp0_presets[] = { #if 0 { .preset = V4L2_DV_720P60, }, { .preset = V4L2_DV_1080I60, }, { .preset = V4L2_DV_1080P60, }, { .preset = V4L2_DV_1080P30, }, #endif { .preset = V4L2_DV_576P50, }, { .preset = V4L2_DV_480P59_94, }, }; static const struct ti81xxvin_input hdvpss_inst0_inputs[] = { { .input = { .index = 0, .name = "Composite", .type = V4L2_INPUT_TYPE_CAMERA, .std = V4L2_STD_ALL,//V4L2_STD_UNKNOWN, .capabilities = V4L2_OUT_CAP_PRESETS, }, .subdev_name = "tv5147m1",//TVP7002_INST0, .dv_presets = hdvpss_inst0_inp0_presets, .num_dv_presets = ARRAY_SIZE(hdvpss_inst0_inp0_presets), }, }; static const struct ti81xxvin_input hdvpss_inst1_inputs[] = { { .input = { .index = 0, .name = "Composite", .type = V4L2_INPUT_TYPE_CAMERA, .std = V4L2_STD_ALL,//V4L2_STD_UNKNOWN, .capabilities = V4L2_IN_CAP_STD//V4L2_OUT_CAP_PRESETS, }, .subdev_name = "tv5147m1",//TVP7002_INST1, .dv_presets = hdvpss_inst2_inp0_presets, .num_dv_presets = ARRAY_SIZE(hdvpss_inst2_inp0_presets), }, }; /* 16 bit decoders are present on the Port A of VIP0 and VIP1 instances. Which represents the VIP0 and VIP2 instances in software. While Port B of VIP0 and VIP1 are represented by VIP1 and VIP3 instances. On these two instances no decoders are present. */ static struct ti81xxvin_config ti81xx_hsvpss_capture_cfg = { .subdev_info = hdvpss_capture_sdev_info, .subdev_count = ARRAY_SIZE(hdvpss_capture_sdev_info), .card_name = ti81xx_card_name, .inst_config[0] = { .inputs = hdvpss_inst0_inputs, .input_count = ARRAY_SIZE(hdvpss_inst0_inputs), }, .inst_config[1] = { .inputs = hdvpss_inst0_inputs, .input_count = 0, }, .inst_config[2] = { .inputs = hdvpss_inst1_inputs, .input_count = ARRAY_SIZE(hdvpss_inst1_inputs), }, .inst_config[3] = { .inputs = hdvpss_inst1_inputs, .input_count = 0, }, }; static struct resource ti81xx_hdvpss_capture_resource[] = { [0] = { .start = HDVPSS_CAPTURE_INST0_BASE, .end = (HDVPSS_CAPTURE_INST0_BASE + HDVPSS_CAPTURE_INST0_SIZE - 1), .flags = IORESOURCE_MEM, }, [1] = { .start = HDVPSS_CAPTURE_INST2_BASE, .end = (HDVPSS_CAPTURE_INST2_BASE + HDVPSS_CAPTURE_INST2_SIZE - 1), .flags = IORESOURCE_MEM, }, }; static struct platform_device hdvpss_capture_dev = { .name = "ti81xxvin", .id = -1, .dev = { .dma_mask = &ti81xx_dma_mask, .coherent_dma_mask = ~(u32)0, }, .num_resources = 2, .resource = ti81xx_hdvpss_capture_resource, }; static int __init ti81xx_vin_init(void) { int r; printk("%s, %s\n",__FILE__,__FUNCTION__); hdvpss_capture_dev.dev.platform_data = &ti81xx_hsvpss_capture_cfg; if (cpu_is_ti814x()) { hdvpss_capture_sdev_info[0].ti81xxvin_select_decoder =NULL; //vps_ti814x_select_video_decoder; hdvpss_capture_sdev_info[0].ti81xxvin_set_mode =NULL; //vps_ti814x_set_tvp7002_filter; hdvpss_capture_sdev_info[0].decoder_id = 0; hdvpss_capture_sdev_info[1].ti81xxvin_select_decoder = NULL; hdvpss_capture_sdev_info[1].ti81xxvin_set_mode = NULL; hdvpss_capture_sdev_info[1].decoder_id = 0; } else { hdvpss_capture_sdev_info[0].ti81xxvin_select_decoder = //vps_ti816x_select_video_decoder; NULL; hdvpss_capture_sdev_info[0].ti81xxvin_set_mode = //vps_ti816x_set_tvp7002_filter; NULL; hdvpss_capture_sdev_info[0].decoder_id = 0; hdvpss_capture_sdev_info[1].ti81xxvin_select_decoder = NULL; hdvpss_capture_sdev_info[1].ti81xxvin_set_mode = NULL; hdvpss_capture_sdev_info[1].decoder_id = 0; } r = platform_device_register(&hdvpss_capture_dev); if (r) printk(KERN_ERR "unable to register ti81xx_vin device\n"); else printk(KERN_INFO "registered ti81xx_vin device\n"); return r; } #else static int __init ti81xx_vin_init(void) { return 0; } #endif #if defined(CONFIG_FB_TI81XX_MODULE) || defined(CONFIG_FB_TI81XX) static struct ti81xxfb_platform_data ti81xxfb_config; static struct platform_device ti81xx_fb_device = { .name = "ti81xxfb", .id = -1, .dev = { .dma_mask = &ti81xx_dma_mask, .coherent_dma_mask = ~(u32)0, .platform_data = &ti81xxfb_config, }, .num_resources = 0, }; void ti81xxfb_set_platform_data(struct ti81xxfb_platform_data *data) { ti81xxfb_config = *data; } static int __init ti81xx_fb_init(void) { int r; r = platform_device_register(&ti81xx_fb_device); if (r) printk(KERN_ERR "unable to register ti81xx_fb device\n"); else printk(KERN_INFO "registered ti81xx_fb device\n"); return r; } #else static int __init ti81xx_fb_init(void) { return 0; } void ti81xxfb_set_platform_data(struct ti81xxfb_platform_data *data) { } #endif #if defined(CONFIG_VIDEO_TI81XX_VIDOUT_MODULE) || \ defined(CONFIG_VIDEO_TI81XX_VIDOUT) static struct resource ti81xx_vidout_resource[VPS_DISPLAY_INST_MAX] = { }; static struct platform_device ti81xx_vidout_device = { .name = "t81xx_vidout", .num_resources = ARRAY_SIZE(ti81xx_vidout_resource), .resource = &ti81xx_vidout_resource[0], .id = -1, }; static int __init ti81xx_init_vout(void) { int r; r = platform_device_register(&ti81xx_vidout_device); if (r) printk(KERN_ERR "Unable to register ti81xx_vidout device\n"); else printk(KERN_INFO "registered ti81xx_vidout device\n"); return r; } #else static int __init ti81xx_init_vout(void) { return 0; } #endif static int __init ti81xx_init_vpss(void) { int retval = 0; printk("%s, %s\n",__FILE__,__FUNCTION__); /*if vpss failed to register, none of the below could works*/ if (ti81xx_vpss_init()) return -1; retval = ti81xx_init_vout(); retval += ti81xx_hdmi_init(); retval += ti81xx_fb_init(); retval += ti81xx_vin_init(); return retval; } arch_initcall(ti81xx_init_vpss); #endif
/* Texas Instruments Triple 8-/10-BIT 165-/110-MSPS Video and Graphics * Digitizer with Horizontal PLL registers * * Copyright (C) 2009 Texas Instruments Inc * Author: Santiago Nunez-Corrales <santiago.nunez@ridgerun.com> * * This code is partially based upon the TVP5150 driver * written by Mauro Carvalho Chehab (mchehab@infradead.org), * the TVP514x driver written by Vaibhav Hiremath <hvaibhav@ti.com> * and the TVP5147 driver in the TI LSP 2.10.00.14. Revisions by * Muralidharan Karicheri and Snehaprabha Narnakaje (TI). * * 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 * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <linux/delay.h> #include <linux/i2c.h> #include <linux/slab.h> #include <linux/videodev2.h> #include <media/tvp5147.h> #include <media/v4l2-device.h> #include <media/v4l2-chip-ident.h> #include <media/v4l2-common.h> #include "tvp5147_reg.h" MODULE_DESCRIPTION("TI TVP5147 Video and Graphics Digitizer driver"); MODULE_AUTHOR("Santiago Nunez-Corrales <santiago.nunez@ridgerun.com>"); MODULE_LICENSE("GPL"); /* Module Name */ #define TVP5147_MODULE_NAME "tvp5147" /* I2C retry attempts */ #define I2C_RETRY_COUNT (4) /* End of registers */ #define TVP5147_EOR 0xf8 /* Read write definition for registers */ #define TVP5147_READ 0 #define TVP5147_WRITE 1 #define TVP5147_RESERVED 2 /* Interlaced vs progressive mask and shift */ #define TVP5147_IP_SHIFT 5 #define TVP5147_INPR_MASK (0x01 << TVP5147_IP_SHIFT) /* Shift for CPL and LPF registers */ #define TVP5147_CL_SHIFT 8 #define TVP5147_CL_MASK 0x0f /* Debug functions */ static int debug; module_param(debug, bool, 0644); MODULE_PARM_DESC(debug, "Debug level (0-1)"); /* Structure for register values */ struct i2c_reg_value { u8 reg; u8 value; u8 type; }; /* Preset definition for handling device operation */ struct tvp5147_preset_definition { // Ajout char name[50]; u32 preset; const struct i2c_reg_value *p_settings; enum v4l2_colorspace color_space; enum v4l2_field scanmode; u16 progressive; u16 lines_per_frame; u16 cpl_min; u16 cpl_max; }; /* * Register default values (according to tvp5147 datasheet) * In the case of read-only registers, the value (0xff) is * never written. R/W functionality is controlled by the * writable bit in the register struct definition. */ static const struct i2c_reg_value tvp5147_init_default[] = { { 0X00, 0x00, TVP5147_WRITE }, { 0X01, 0x0F, TVP5147_WRITE }, { 0X02, 0x00, TVP5147_WRITE }, { 0X03, 0x00, TVP5147_WRITE }, { 0X04, 0x23, TVP5147_WRITE }, { 0X05, 0x10, TVP5147_WRITE }, { 0X06, 0x00, TVP5147_WRITE }, { 0X07, 0x00, TVP5147_WRITE }, { 0X08, 0x00, TVP5147_WRITE }, { 0X09, 0x02, TVP5147_WRITE }, { 0X0A, 0x80, TVP5147_WRITE }, { 0X0B, 0x80, TVP5147_WRITE }, { 0X0C, 0x00, TVP5147_WRITE }, { 0X0D, 0x00, TVP5147_WRITE }, { 0X0E, 0x0E, TVP5147_WRITE }, //RESERVED 0X0F - 0X15 { 0X17, 0x55, TVP5147_WRITE }, { 0X16, 0x00, TVP5147_WRITE }, { 0X19, 0x25, TVP5147_WRITE }, { 0X18, 0x03, TVP5147_WRITE }, { 0X1A, 0x00, TVP5147_WRITE }, { 0X1B, 0x00, TVP5147_WRITE }, { 0X1C, 0x00, TVP5147_WRITE }, { 0X1D, 0x40, TVP5147_WRITE }, { 0X1E, 0x00, TVP5147_WRITE }, { 0X1F, 0x04, TVP5147_WRITE }, { 0X20, 0x00, TVP5147_WRITE }, { 0X21, 0x07, TVP5147_WRITE }, { 0X22, 0x00, TVP5147_WRITE }, { 0X23, 0x01, TVP5147_WRITE }, { 0X24, 0x00, TVP5147_WRITE }, { 0X25, 0x15, TVP5147_WRITE }, //RESERVED 0X26-0X2A { 0X2B, 0x00, TVP5147_WRITE }, //RESERVED 0X2C { 0X2D, 0x00, TVP5147_WRITE }, { 0X2E, 0x00, TVP5147_WRITE }, //RESERVED 0X2F-0X30 { 0X31, 0x05, TVP5147_WRITE }, { 0X32, 0x00, TVP5147_WRITE }, { 0X33, 0x40, TVP5147_WRITE }, { 0X34, 0x00, TVP5147_WRITE }, { 0X35, 0xFF, TVP5147_WRITE }, { 0X36, 0xFF, TVP5147_WRITE }, { 0X37, 0xFF, TVP5147_WRITE }, { 0X38, 0xFF, TVP5147_WRITE }, { 0X39, 0x00, TVP5147_WRITE }, { 0X46 , 0x20, TVP5147_WRITE }, { 0X47 , 0x20, TVP5147_WRITE }, { 0X48 , 0x20, TVP5147_WRITE }, { 0X49 , 0x20, TVP5147_WRITE }, { 0X4A , 0x90, TVP5147_WRITE }, { 0X4B , 0x00, TVP5147_WRITE }, { 0X4C , 0x90, TVP5147_WRITE }, { 0X4D , 0x00, TVP5147_WRITE }, { 0X4E , 0x90, TVP5147_WRITE }, { 0X4F , 0x00, TVP5147_WRITE }, { 0X50 , 0x90, TVP5147_WRITE }, { 0X51 , 0x00, TVP5147_WRITE }, { 0X57 , 0x00, TVP5147_WRITE }, { 0X74 , 0x00, TVP5147_WRITE }, { 0X75 , 0x12, TVP5147_WRITE }, { 0X76 , 0x8A, TVP5147_WRITE }, { 0X77 , 0x64, TVP5147_WRITE }, { 0X78 , 0x05, TVP5147_WRITE }, { 0X79 , 0x1E, TVP5147_WRITE }, { 0X7F , 0x00, TVP5147_WRITE }, { 0X80 , 0x51, TVP5147_READ }, { 0X81 , 0x47, TVP5147_READ}, { 0XB1 , 0x00, TVP5147_WRITE }, { 0XB2 , 0x00, TVP5147_WRITE }, { 0XB3 , 0x00, TVP5147_WRITE }, { 0XB4 , 0x00, TVP5147_WRITE }, { 0XB5 , 0x00, TVP5147_WRITE }, { 0XB6 , 0x00, TVP5147_WRITE }, { 0XB7 , 0x00, TVP5147_WRITE }, { 0XB8 , 0x00, TVP5147_WRITE }, { 0XB9 , 0x00, TVP5147_WRITE }, { 0XBA , 0x00, TVP5147_WRITE }, { 0XBB , 0x00, TVP5147_WRITE }, { 0XBD , 0x80, TVP5147_WRITE }, { 0XBF , 0x00, TVP5147_WRITE }, { 0XC0 , 0x00, TVP5147_WRITE }, { 0XC1 , 0x00, TVP5147_WRITE }, { 0XC2 , 0x00, TVP5147_WRITE }, { 0XC3 , 0x1E, TVP5147_WRITE }, { 0XD6 , 0x06, TVP5147_WRITE }, { 0XD7 , 0x1B, TVP5147_WRITE }, { 0XD8 , 0xFF, TVP5147_WRITE }, { 0XD9 , 0x00, TVP5147_WRITE }, { 0XDA , 0xFF, TVP5147_WRITE }, { 0XE0 , 0x00, TVP5147_WRITE }, { 0XE1 , 0x00, TVP5147_WRITE }, { 0XE8 , 0x00, TVP5147_WRITE }, { 0XE9 , 0x00, TVP5147_WRITE }, { 0XEA , 0x00, TVP5147_WRITE }, { 0XF4 , 0x00, TVP5147_WRITE }, { 0XF5 , 0x00, TVP5147_WRITE }, { 0XF6 , 0x00, TVP5147_WRITE }, { 0XF7 , 0x00, TVP5147_WRITE }, /* This signals end of register values */ { TVP5147_EOR, 0xf8, TVP5147_RESERVED } }; #if 0 /* Register parameters for 480P */ static const struct i2c_reg_value tvp5147_parms_480P[] = { { TVP5147_HPLL_FDBK_DIV_MSBS, 0x35, TVP5147_WRITE }, { TVP5147_HPLL_FDBK_DIV_LSBS, 0xa0, TVP5147_WRITE }, { TVP5147_HPLL_CRTL, 0x02, TVP5147_WRITE }, { TVP5147_HPLL_PHASE_SEL, 0x14, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_LSBS, 0x91, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_MSBS, 0x00, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_LSBS, 0x0B, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_MSBS, 0x00, TVP5147_WRITE }, { TVP5147_VBLK_F_0_START_L_OFF, 0x03, TVP5147_WRITE }, { TVP5147_VBLK_F_1_START_L_OFF, 0x01, TVP5147_WRITE }, { TVP5147_VBLK_F_0_DURATION, 0x13, TVP5147_WRITE }, { TVP5147_VBLK_F_1_DURATION, 0x13, TVP5147_WRITE }, { TVP5147_ALC_PLACEMENT, 0x18, TVP5147_WRITE }, { TVP5147_CLAMP_START, 0x06, TVP5147_WRITE }, { TVP5147_CLAMP_W, 0x10, TVP5147_WRITE }, { TVP5147_HPLL_PRE_COAST, 0x03, TVP5147_WRITE }, { TVP5147_HPLL_POST_COAST, 0x03, TVP5147_WRITE }, { TVP5147_EOR, 0xff, TVP5147_RESERVED } }; /* Register parameters for 576P */ static const struct i2c_reg_value tvp5147_parms_576P[] = { { TVP5147_HPLL_FDBK_DIV_MSBS, 0x36, TVP5147_WRITE }, { TVP5147_HPLL_FDBK_DIV_LSBS, 0x00, TVP5147_WRITE }, { TVP5147_HPLL_CRTL, 0x18, TVP5147_WRITE }, { TVP5147_HPLL_PHASE_SEL, 0x14, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_LSBS, 0x9B, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_MSBS, 0x00, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_LSBS, 0x0F, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_MSBS, 0x00, TVP5147_WRITE }, { TVP5147_VBLK_F_0_START_L_OFF, 0x00, TVP5147_WRITE }, { TVP5147_VBLK_F_1_START_L_OFF, 0x00, TVP5147_WRITE }, { TVP5147_VBLK_F_0_DURATION, 0x2D, TVP5147_WRITE }, { TVP5147_VBLK_F_1_DURATION, 0x00, TVP5147_WRITE }, { TVP5147_ALC_PLACEMENT, 0x18, TVP5147_WRITE }, { TVP5147_CLAMP_START, 0x06, TVP5147_WRITE }, { TVP5147_CLAMP_W, 0x10, TVP5147_WRITE }, { TVP5147_HPLL_PRE_COAST, 0x03, TVP5147_WRITE }, { TVP5147_HPLL_POST_COAST, 0x03, TVP5147_WRITE }, { TVP5147_EOR, 0xff, TVP5147_RESERVED } }; /* Register parameters for 1080I60 */ static const struct i2c_reg_value tvp5147_parms_1080I60[] = { { TVP5147_HPLL_FDBK_DIV_MSBS, 0x89, TVP5147_WRITE }, { TVP5147_HPLL_FDBK_DIV_LSBS, 0x80, TVP5147_WRITE }, { TVP5147_HPLL_CRTL, 0x98, TVP5147_WRITE }, { TVP5147_HPLL_PHASE_SEL, 0x14, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_LSBS, 0x06, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_MSBS, 0x01, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_LSBS, 0x8a, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_MSBS, 0x08, TVP5147_WRITE }, { TVP5147_VBLK_F_0_START_L_OFF, 0x02, TVP5147_WRITE }, { TVP5147_VBLK_F_1_START_L_OFF, 0x02, TVP5147_WRITE }, { TVP5147_VBLK_F_0_DURATION, 0x16, TVP5147_WRITE }, { TVP5147_VBLK_F_1_DURATION, 0x17, TVP5147_WRITE }, { TVP5147_ALC_PLACEMENT, 0x5a, TVP5147_WRITE }, { TVP5147_CLAMP_START, 0x32, TVP5147_WRITE }, { TVP5147_CLAMP_W, 0x20, TVP5147_WRITE }, { TVP5147_HPLL_PRE_COAST, 0x01, TVP5147_WRITE }, { TVP5147_HPLL_POST_COAST, 0x00, TVP5147_WRITE }, { TVP5147_EOR, 0xff, TVP5147_RESERVED } }; /* Register parameters for 1080P60 */ static const struct i2c_reg_value tvp5147_parms_1080P60[] = { { TVP5147_HPLL_FDBK_DIV_MSBS, 0x89, TVP5147_WRITE }, { TVP5147_HPLL_FDBK_DIV_LSBS, 0x80, TVP5147_WRITE }, { TVP5147_HPLL_CRTL, 0xE0, TVP5147_WRITE }, { TVP5147_HPLL_PHASE_SEL, 0xA0, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_LSBS, 0x00, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_MSBS, 0x01, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_LSBS, 0x84, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_MSBS, 0x08, TVP5147_WRITE }, { TVP5147_VBLK_F_0_START_L_OFF, 0x05, TVP5147_WRITE }, { TVP5147_VBLK_F_1_START_L_OFF, 0x00, TVP5147_WRITE }, { TVP5147_VBLK_F_0_DURATION, 0x2d, TVP5147_WRITE }, { TVP5147_VBLK_F_1_DURATION, 0x0, TVP5147_WRITE }, { TVP5147_ALC_PLACEMENT, 0x5a, TVP5147_WRITE }, { TVP5147_CLAMP_START, 0x32, TVP5147_WRITE }, { TVP5147_CLAMP_W, 0x20, TVP5147_WRITE }, { TVP5147_HPLL_PRE_COAST, 0x01, TVP5147_WRITE }, { TVP5147_HPLL_POST_COAST, 0x00, TVP5147_WRITE }, { TVP5147_EOR, 0xff, TVP5147_RESERVED } }; /* Register parameters for 1080I50 */ static const struct i2c_reg_value tvp5147_parms_1080I50[] = { { TVP5147_HPLL_FDBK_DIV_MSBS, 0xa5, TVP5147_WRITE }, { TVP5147_HPLL_FDBK_DIV_LSBS, 0x00, TVP5147_WRITE }, { TVP5147_HPLL_CRTL, 0x98, TVP5147_WRITE }, { TVP5147_HPLL_PHASE_SEL, 0x14, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_LSBS, 0x06, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_MSBS, 0x01, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_LSBS, 0x8a, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_MSBS, 0x08, TVP5147_WRITE }, { TVP5147_VBLK_F_0_START_L_OFF, 0x02, TVP5147_WRITE }, { TVP5147_VBLK_F_1_START_L_OFF, 0x02, TVP5147_WRITE }, { TVP5147_VBLK_F_0_DURATION, 0x16, TVP5147_WRITE }, { TVP5147_VBLK_F_1_DURATION, 0x17, TVP5147_WRITE }, { TVP5147_ALC_PLACEMENT, 0x5a, TVP5147_WRITE }, { TVP5147_CLAMP_START, 0x32, TVP5147_WRITE }, { TVP5147_CLAMP_W, 0x20, TVP5147_WRITE }, { TVP5147_HPLL_PRE_COAST, 0x01, TVP5147_WRITE }, { TVP5147_HPLL_POST_COAST, 0x00, TVP5147_WRITE }, { TVP5147_EOR, 0xff, TVP5147_RESERVED } }; /* Register parameters for 720P60 */ static const struct i2c_reg_value tvp5147_parms_720P60[] = { { TVP5147_HPLL_FDBK_DIV_MSBS, 0x67, TVP5147_WRITE }, { TVP5147_HPLL_FDBK_DIV_LSBS, 0x20, TVP5147_WRITE }, { TVP5147_HPLL_CRTL, 0xa0, TVP5147_WRITE }, { TVP5147_HPLL_PHASE_SEL, 0x16, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_LSBS, 0x47, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_MSBS, 0x01, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_LSBS, 0x4B, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_MSBS, 0x06, TVP5147_WRITE }, { TVP5147_VBLK_F_0_START_L_OFF, 0x05, TVP5147_WRITE }, { TVP5147_VBLK_F_1_START_L_OFF, 0x00, TVP5147_WRITE }, { TVP5147_VBLK_F_0_DURATION, 0x1E, TVP5147_WRITE }, { TVP5147_VBLK_F_1_DURATION, 0x00, TVP5147_WRITE }, { TVP5147_ALC_PLACEMENT, 0x5a, TVP5147_WRITE }, { TVP5147_CLAMP_START, 0x32, TVP5147_WRITE }, { TVP5147_CLAMP_W, 0x20, TVP5147_WRITE }, { TVP5147_HPLL_PRE_COAST, 0x00, TVP5147_WRITE }, { TVP5147_HPLL_POST_COAST, 0x00, TVP5147_WRITE }, { TVP5147_EOR, 0xff, TVP5147_RESERVED } }; /* Register parameters for 720P50 */ static const struct i2c_reg_value tvp5147_parms_720P50[] = { { TVP5147_HPLL_FDBK_DIV_MSBS, 0x7b, TVP5147_WRITE }, { TVP5147_HPLL_FDBK_DIV_LSBS, 0xc0, TVP5147_WRITE }, { TVP5147_HPLL_CRTL, 0x98, TVP5147_WRITE }, { TVP5147_HPLL_PHASE_SEL, 0x16, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_LSBS, 0x47, TVP5147_WRITE }, { TVP5147_AVID_START_PIXEL_MSBS, 0x01, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_LSBS, 0x4B, TVP5147_WRITE }, { TVP5147_AVID_STOP_PIXEL_MSBS, 0x06, TVP5147_WRITE }, { TVP5147_VBLK_F_0_START_L_OFF, 0x05, TVP5147_WRITE }, { TVP5147_VBLK_F_1_START_L_OFF, 0x00, TVP5147_WRITE }, { TVP5147_VBLK_F_0_DURATION, 0x2D, TVP5147_WRITE }, { TVP5147_VBLK_F_1_DURATION, 0x00, TVP5147_WRITE }, { TVP5147_ALC_PLACEMENT, 0x5a, TVP5147_WRITE }, { TVP5147_CLAMP_START, 0x32, TVP5147_WRITE }, { TVP5147_CLAMP_W, 0x20, TVP5147_WRITE }, { TVP5147_HPLL_PRE_COAST, 0x01, TVP5147_WRITE }, { TVP5147_HPLL_POST_COAST, 0x00, TVP5147_WRITE }, { TVP5147_EOR, 0xff, TVP5147_RESERVED } }; #endif /* Preset definition for handling device operation */ struct tvp5147_preset_definition { u32 preset; const struct i2c_reg_value *p_settings; enum v4l2_colorspace color_space; enum v4l2_field scanmode; u16 progressive; u16 lines_per_frame; u16 cpl_min; u16 cpl_max; }; /* Struct list for digital video presets */ static const struct tvp5147_preset_definition tvp5147_presets[] = {/*TODO*/ { V4L2_DV_720P60, tvp5147_parms_720P60, V4L2_COLORSPACE_REC709, V4L2_FIELD_NONE, 1, 0x2EE, 135, 153 }, { V4L2_DV_1080I60, tvp5147_parms_1080I60, V4L2_COLORSPACE_REC709, V4L2_FIELD_INTERLACED, 0, 0x465, 181, 205 }, { V4L2_DV_1080I50, tvp5147_parms_1080I50, V4L2_COLORSPACE_REC709, V4L2_FIELD_INTERLACED, 0, 0x465, 217, 245 }, { V4L2_DV_720P50, tvp5147_parms_720P50, V4L2_COLORSPACE_REC709, V4L2_FIELD_NONE, 1, 0x2EE, 163, 183 }, { V4L2_DV_1080P60, tvp5147_parms_1080P60, V4L2_COLORSPACE_REC709, V4L2_FIELD_NONE, 1, 0x465, 90, 102 }, { V4L2_DV_480P59_94, tvp5147_parms_480P, V4L2_COLORSPACE_SMPTE170M, V4L2_FIELD_NONE, 1, 0x20D, 0xffff, 0xffff }, { V4L2_DV_576P50, tvp5147_parms_576P, V4L2_COLORSPACE_SMPTE170M, V4L2_FIELD_NONE, 1, 0x271, 0xffff, 0xffff } }; #define NUM_PRESETS ARRAY_SIZE(tvp5147_presets) /* Device definition */ struct tvp5147 { struct v4l2_subdev sd; const struct tvp5147_config *pdata; int ver; int streaming; const struct tvp5147_preset_definition *current_preset; u8 gain; }; /* * to_tvp5147 - Obtain device handler TVP5147 * @sd: ptr to v4l2_subdev struct * * Returns device handler tvp5147. */ static inline struct tvp5147 *to_tvp5147(struct v4l2_subdev *sd) { return container_of(sd, struct tvp5147, sd); } /* * tvp5147_read - Read a value from a register in an TVP5147 * @sd: ptr to v4l2_subdev struct * @addr: TVP5147 register address * @dst: pointer to 8-bit destination * * Returns value read if successful, or non-zero (-1) otherwise. */ static int tvp5147_read(struct v4l2_subdev *sd, u8 addr, u8 *dst) { struct i2c_client *c = v4l2_get_subdevdata(sd); int retry; int error; for (retry = 0; retry < I2C_RETRY_COUNT; retry++) { error = i2c_smbus_read_byte_data(c, addr); if (error >= 0) { *dst = (u8)error; return 0; } msleep_interruptible(10); } v4l2_err(sd, "TVP5147 read error %d\n", error); return error; } /* * tvp5147_read_err() - Read a register value with error code * @sd: pointer to standard V4L2 sub-device structure * @reg: destination register * @val: value to be read * @err: pointer to error value * * Read a value in a register and save error value in pointer. * Also update the register table if successful */ static inline void tvp5147_read_err(struct v4l2_subdev *sd, u8 reg, u8 *dst, int *err) { if (!*err) *err = tvp5147_read(sd, reg, dst); } /* * tvp5147_write() - Write a value to a register in TVP5147 * @sd: ptr to v4l2_subdev struct * @addr: TVP5147 register address * @value: value to be written to the register * * Write a value to a register in an TVP5147 decoder device. * Returns zero if successful, or non-zero otherwise. */ static int tvp5147_write(struct v4l2_subdev *sd, u8 addr, u8 value) { struct i2c_client *c; int retry; int error; c = v4l2_get_subdevdata(sd); for (retry = 0; retry < I2C_RETRY_COUNT; retry++) { error = i2c_smbus_write_byte_data(c, addr, value); if (error >= 0) return 0; v4l2_warn(sd, "Write: retry !!! %d\n", retry); msleep_interruptible(10); } v4l2_err(sd, "TVP5147 write error %d\n", error); return error; } /* * tvp5147_write_err() - Write a register value with error code * @sd: pointer to standard V4L2 sub-device structure * @reg: destination register * @val: value to be written * @err: pointer to error value * * Write a value in a register and save error value in pointer. * Also update the register table if successful */ static inline void tvp5147_write_err(struct v4l2_subdev *sd, u8 reg, u8 val, int *err) { if (!*err) *err = tvp5147_write(sd, reg, val); } /* * tvp5147_g_chip_ident() - Get chip identification number * @sd: ptr to v4l2_subdev struct * @chip: ptr to v4l2_dbg_chip_ident struct * * Obtains the chip's identification number. * Returns zero or -EINVAL if read operation fails. */ #if 0 static int tvp5147_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip) { u8 rev; int error; struct i2c_client *client = v4l2_get_subdevdata(sd); error = tvp5147_read(sd, TVP5147_CHIP_REV, &rev); if (error < 0) return error; return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_TVP5147, rev); } #else /* -------------------------------------------------------------------------- * V4L2 subdev core operations */ static int tvp5147_g_chip_ident(struct v4l2_subdev *subdev, struct v4l2_dbg_chip_ident *chip) { struct i2c_client *client = v4l2_get_subdevdata(subdev); return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_TVP5147, 0); } #endif /* * tvp5147_write_inittab() - Write initialization values * @sd: ptr to v4l2_subdev struct * @regs: ptr to i2c_reg_value struct * * Write initialization values. * Returns zero or -EINVAL if read operation fails. */ static int tvp5147_write_inittab(struct v4l2_subdev *sd, const struct i2c_reg_value *regs) { int error = 0; /* Initialize the first (defined) registers */ while (TVP5147_EOR != regs->reg) { if (TVP5147_WRITE == regs->type) tvp5147_write_err(sd, regs->reg, regs->value, &error); regs++; } return error; } /* * tvp5147_s_dv_preset() - Set digital video preset * @sd: ptr to v4l2_subdev struct * @dv_preset: ptr to v4l2_dv_preset struct * * Set the digital video preset for a TVP5147 decoder device. * Returns zero when successful or -EINVAL if register access fails. */ static int tvp5147_s_dv_preset(struct v4l2_subdev *sd, struct v4l2_dv_preset *dv_preset) { struct tvp5147 *device = to_tvp5147(sd); u32 preset; int i; for (i = 0; i < NUM_PRESETS; i++) { preset = tvp5147_presets[i].preset; v4l2_info(sd, "-preset[%d] ------------------------------\n", i); v4l2_info(sd, "preset = %s\n", tvp5158_presets[i].name); v4l2_info(sd, "reg=0x%X val=0x%X\n", tvp5158_presets[i].p_settings->reg, tvp5158_presets[i].p_settings->value); v4l2_info(sd, "color_space = %d\n", tvp5158_presets[i].color_space); v4l2_info(sd, "scanmode = %d\n", tvp5158_presets[i].scanmode); v4l2_info(sd, "progressive = %d\n", tvp5158_presets[i].progressive); v4l2_info(sd, "lines_per_frame= %d\n", tvp5158_presets[i].lines_per_frame); v4l2_info(sd, "cpl_min = %d\n", tvp5158_presets[i].cpl_min); v4l2_info(sd, "cpl_max = %d\n", tvp5158_presets[i].cpl_max); if (preset == dv_preset->preset) { device->current_preset = &tvp5147_presets[i]; return tvp5147_write_inittab(sd, tvp5147_presets[i].p_settings); } } /*encore boucle for ??????????*/ return -EINVAL; } /* * tvp5147_g_ctrl() - Get a control * @sd: ptr to v4l2_subdev struct * @ctrl: ptr to v4l2_control struct * * Get a control for a TVP5147 decoder device. * Returns zero when successful or -EINVAL if register access fails. */ static int tvp5147_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) { struct tvp5147 *device = to_tvp5147(sd); switch (ctrl->id) { case V4L2_CID_GAIN: ctrl->value = device->gain; return 0; default: return -EINVAL; } } /* * tvp5147_s_ctrl() - Set a control * @sd: ptr to v4l2_subdev struct * @ctrl: ptr to v4l2_control struct * * Set a control in TVP5147 decoder device. * Returns zero when successful or -EINVAL if register access fails. */ static int tvp5147_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl) { struct tvp5147 *device = to_tvp5147(sd); int error = 0; switch (ctrl->id) { case V4L2_CID_GAIN: tvp5147_write_err(sd, TVP5147_R_FINE_GAIN, ctrl->value & 0xff, &error); tvp5147_write_err(sd, TVP5147_G_FINE_GAIN, ctrl->value & 0xff, &error); tvp5147_write_err(sd, TVP5147_B_FINE_GAIN, ctrl->value & 0xff, &error); if (error < 0) return error; /* Set only after knowing there is no error */ device->gain = ctrl->value & 0xff; return 0; default: return -EINVAL; } } /* * tvp5147_queryctrl() - Query a control * @sd: ptr to v4l2_subdev struct * @qc: ptr to v4l2_queryctrl struct * * Query a control of a TVP5147 decoder device. * Returns zero when successful or -EINVAL if register read fails. */ static int tvp5147_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc) { switch (qc->id) { case V4L2_CID_GAIN: /* * Gain is supported [0-255, default=0, step=1] */ return v4l2_ctrl_query_fill(qc, 0, 255, 1, 0); default: return -EINVAL; } } /* * tvp5147_mbus_fmt() - V4L2 decoder interface handler for try/s/g_mbus_fmt * @sd: pointer to standard V4L2 sub-device structure * @f: pointer to mediabus format structure * * Negotiate the image capture size and mediabus format. * There is only one possible format, so this single function works for * get, set and try. */ static int tvp5147_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)/*TODO*/ { struct tvp5147 *device = to_tvp5147(sd); struct v4l2_dv_enum_preset e_preset; int error; /* Calculate height and width based on current standard */ error = v4l_fill_dv_preset_info(device->current_preset->preset, &e_preset); if (error) return error; f->width = e_preset.width; f->height = e_preset.height; f->code = V4L2_MBUS_FMT_YUYV10_1X20; f->field = device->current_preset->scanmode; f->colorspace = device->current_preset->color_space; v4l2_dbg(1, debug, sd, "MBUS_FMT: Width - %d, Height - %d", f->width, f->height); return 0; } /* * tvp5147_query_dv_preset() - query DV preset * @sd: pointer to standard V4L2 sub-device structure * @qpreset: standard V4L2 v4l2_dv_preset structure * * Returns the current DV preset by TVP5147. If no active input is * detected, returns -EINVAL */ static int tvp5147_query_dv_preset(struct v4l2_subdev *sd, struct v4l2_dv_preset *qpreset) { const struct tvp5147_preset_definition *presets = tvp5147_presets; struct tvp5147 *device; u8 progressive; u32 lpfr; u32 cpln; int error = 0; u8 lpf_lsb; u8 lpf_msb; u8 cpl_lsb; u8 cpl_msb; int index; v4l2_info(sd, "pass %s(%d)\n", __func__, __LINE__); device = to_tvp5147(sd); /* Read standards from device registers */ tvp5147_read_err(sd, TVP5147_L_FRAME_STAT_LSBS, &lpf_lsb, &error); tvp5147_read_err(sd, TVP5147_L_FRAME_STAT_MSBS, &lpf_msb, &error); if (error < 0) return error; tvp5147_read_err(sd, TVP5147_CLK_L_STAT_LSBS, &cpl_lsb, &error); tvp5147_read_err(sd, TVP5147_CLK_L_STAT_MSBS, &cpl_msb, &error); if (error < 0) return error; /* Get lines per frame, clocks per line and interlaced/progresive */ lpfr = lpf_lsb | ((TVP5147_CL_MASK & lpf_msb) << TVP5147_CL_SHIFT); cpln = cpl_lsb | ((TVP5147_CL_MASK & cpl_msb) << TVP5147_CL_SHIFT); progressive = (lpf_msb & TVP5147_INPR_MASK) >> TVP5147_IP_SHIFT; /* Do checking of video modes */ for (index = 0; index < NUM_PRESETS; index++, presets++) if (lpfr == presets->lines_per_frame && progressive == presets->progressive) { if (presets->cpl_min == 0xffff) break; if (cpln >= presets->cpl_min && cpln <= presets->cpl_max) break; } if (index == NUM_PRESETS) { v4l2_dbg(1, debug, sd, "detection failed: lpf = %x, cpl = %x\n", lpfr, cpln); /* Could not detect a signal, so return the 'invalid' preset */ qpreset->preset = V4L2_DV_INVALID; return 0; } /* Set values in found preset */ qpreset->preset = presets->preset; /* Update lines per frame and clocks per line info */ v4l2_dbg(1, debug, sd, "detected preset: %d\n", presets->preset); return 0; } #ifdef CONFIG_VIDEO_ADV_DEBUG /* * tvp5147_g_register() - Get the value of a register * @sd: ptr to v4l2_subdev struct * @reg: ptr to v4l2_dbg_register struct * * Get the value of a TVP5147 decoder device register. * Returns zero when successful, -EINVAL if register read fails or * access to I2C client fails, -EPERM if the call is not allowed * by diabled CAP_SYS_ADMIN. */ static int tvp5147_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg) { struct i2c_client *client = v4l2_get_subdevdata(sd); u8 val; int ret; if (!v4l2_chip_match_i2c_client(client, ®->match)) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EPERM; ret = tvp5147_read(sd, reg->reg & 0xff, &val); reg->val = val; return ret; } /* * tvp5147_s_register() - set a control * @sd: ptr to v4l2_subdev struct * @reg: ptr to v4l2_dbg_register struct * * Get the value of a TVP5147 decoder device register. * Returns zero when successful, -EINVAL if register read fails or * -EPERM if call not allowed. */ static int tvp5147_s_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg) { struct i2c_client *client = v4l2_get_subdevdata(sd); if (!v4l2_chip_match_i2c_client(client, ®->match)) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EPERM; return tvp5147_write(sd, reg->reg & 0xff, reg->val & 0xff); } #endif /* * tvp5147_enum_mbus_fmt() - Enum supported mediabus formats * @sd: pointer to standard V4L2 sub-device structure * @index: format index * @code: pointer to mediabus format * * Enumerate supported mediabus formats. */ static int tvp5147_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index, enum v4l2_mbus_pixelcode *code) { /* Check requested format index is within range */ if (index) return -EINVAL; *code = V4L2_MBUS_FMT_YUYV10_1X20; return 0; } /* * tvp5147_s_stream() - V4L2 decoder i/f handler for s_stream * @sd: pointer to standard V4L2 sub-device structure * @enable: streaming enable or disable * * Sets streaming to enable or disable, if possible. */ static int tvp5147_s_stream(struct v4l2_subdev *sd, int enable) { struct tvp5147 *device = to_tvp5147(sd); int error = 0; if (device->streaming == enable) return 0; if (enable) { /* Set output state on (low impedance means stream on) */ error = tvp5147_write(sd, TVP5147_MISC_CTL_2, 0x00); device->streaming = enable; } else { /* Set output state off (high impedance means stream off) */ error = tvp5147_write(sd, TVP5147_MISC_CTL_2, 0x03); if (error) v4l2_dbg(1, debug, sd, "Unable to stop streaming\n"); device->streaming = enable; } return error; } /* * tvp5147_log_status() - Print information about register settings * @sd: ptr to v4l2_subdev struct * * Log register values of a TVP5147 decoder device. * Returns zero or -EINVAL if read operation fails. */ static int tvp5147_log_status(struct v4l2_subdev *sd) { const struct tvp5147_preset_definition *presets = tvp5147_presets; struct tvp5147 *device = to_tvp5147(sd); struct v4l2_dv_enum_preset e_preset; struct v4l2_dv_preset detected; int i; detected.preset = V4L2_DV_INVALID; /* Find my current standard*/ tvp5147_query_dv_preset(sd, &detected); /* Print standard related code values */ for (i = 0; i < NUM_PRESETS; i++, presets++) if (presets->preset == detected.preset) break; if (v4l_fill_dv_preset_info(device->current_preset->preset, &e_preset)) return -EINVAL; v4l2_info(sd, "Selected DV Preset: %s\n", e_preset.name); v4l2_info(sd, " Pixels per line: %u\n", e_preset.width); v4l2_info(sd, " Lines per frame: %u\n\n", e_preset.height); if (i == NUM_PRESETS) { v4l2_info(sd, "Detected DV Preset: None\n"); } else { if (v4l_fill_dv_preset_info(presets->preset, &e_preset)) return -EINVAL; v4l2_info(sd, "Detected DV Preset: %s\n", e_preset.name); v4l2_info(sd, " Pixels per line: %u\n", e_preset.width); v4l2_info(sd, " Lines per frame: %u\n\n", e_preset.height); } v4l2_info(sd, "Streaming enabled: %s\n", device->streaming ? "yes" : "no"); /* Print the current value of the gain control */ v4l2_info(sd, "Gain: %u\n", device->gain); return 0; } /* * tvp5147_enum_dv_presets() - Enum supported digital video formats * @sd: pointer to standard V4L2 sub-device structure * @preset: pointer to format struct * * Enumerate supported digital video formats. */ static int tvp5147_enum_dv_presets(struct v4l2_subdev *sd, struct v4l2_dv_enum_preset *preset) { /* Check requested format index is within range */ if (preset->index >= NUM_PRESETS) return -EINVAL; return v4l_fill_dv_preset_info(tvp5147_presets[preset->index].preset, preset); } /* V4L2 core operation handlers */ static const struct v4l2_subdev_core_ops tvp5147_core_ops = { //.g_chip_ident = tvp5147_g_chip_ident, .log_status = tvp5147_log_status, .g_ctrl = tvp5147_g_ctrl, .s_ctrl = tvp5147_s_ctrl, .queryctrl = tvp5147_queryctrl, #ifdef CONFIG_VIDEO_ADV_DEBUG .g_register = tvp5147_g_register, .s_register = tvp5147_s_register, #endif }; /* Specific video subsystem operation handlers */ static const struct v4l2_subdev_video_ops tvp5147_video_ops = { .enum_dv_presets = tvp5147_enum_dv_presets, .s_dv_preset = tvp5147_s_dv_preset, .query_dv_preset = tvp5147_query_dv_preset, .s_stream = tvp5147_s_stream, .g_mbus_fmt = tvp5147_mbus_fmt, .try_mbus_fmt = tvp5147_mbus_fmt, .s_mbus_fmt = tvp5147_mbus_fmt, .enum_mbus_fmt = tvp5147_enum_mbus_fmt, }; /* V4L2 top level operation handlers */ static const struct v4l2_subdev_ops tvp5147_ops = { .core = &tvp5147_core_ops, .video = &tvp5147_video_ops, }; static struct tvp5147 tvp5147_dev = { .streaming = 0, .current_preset = tvp5147_presets, .gain = 0, }; /* * tvp5147_probe - Probe a TVP5147 device * @c: ptr to i2c_client struct * @id: ptr to i2c_device_id struct * * Initialize the TVP5147 device * Returns zero when successful, -EINVAL if register read fails or * -EIO if i2c access is not available. */ static int tvp5147_probe(struct i2c_client *c, const struct i2c_device_id *id) { struct v4l2_subdev *sd; struct tvp5147 *device; struct v4l2_dv_preset preset; int polarity_a; int polarity_b; u8 revision; int error; /* Check if the adapter supports the needed features */ if (!i2c_check_functionality(c->adapter, I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) return -EIO; if (!c->dev.platform_data) { v4l_err(c, "No platform data!!\n"); return -ENODEV; } device = kmalloc(sizeof(struct tvp5147), GFP_KERNEL); if (!device) return -ENOMEM; *device = tvp5147_dev; sd = &device->sd; device->pdata = c->dev.platform_data; /* Tell v4l2 the device is ready */ v4l2_i2c_subdev_init(sd, c, &tvp5147_ops); v4l_info(c, "tvp5147 found @ 0x%02x (%s)\n", c->addr, c->adapter->name); error = tvp5147_read(sd, TVP5147_CHIP_REV, &revision); if (error < 0) goto found_error; /* Get revision number */ v4l2_info(sd, "Rev. %02x detected.\n", revision); if (revision != 0x02) v4l2_info(sd, "Unknown revision detected.\n"); /* Initializes TVP5147 to its default values */ error = tvp5147_write_inittab(sd, tvp5147_init_default); if (error < 0) goto found_error; /* Set polarity information after registers have been set */ polarity_a = 0x20 | device->pdata->hs_polarity << 5 | device->pdata->vs_polarity << 2; error = tvp5147_write(sd, TVP5147_SYNC_CTL_1, polarity_a); if (error < 0) goto found_error; polarity_b = device->pdata->fid_polarity << 2 | device->pdata->sog_polarity << 1 | device->pdata->clk_polarity; error = tvp5147_write(sd, TVP5147_MISC_CTL_3, polarity_b); if (error < 0) goto found_error; /* Set registers according to default video mode */ preset.preset = device->current_preset->preset; error = tvp5147_s_dv_preset(sd, &preset); found_error: if (error < 0) kfree(device); return error; } /* * tvp5147_remove - Remove TVP5147 device support * @c: ptr to i2c_client struct * * Reset the TVP5147 device * Returns zero. */ static int tvp5147_remove(struct i2c_client *c) { struct v4l2_subdev *sd = i2c_get_clientdata(c); struct tvp5147 *device = to_tvp5147(sd); v4l2_dbg(1, debug, sd, "Removing tvp5147 adapter" "on address 0x%x\n", c->addr); v4l2_device_unregister_subdev(sd); kfree(device); return 0; } /* I2C Device ID table */ static const struct i2c_device_id tvp5147_id[] = { { "tvp5147", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, tvp5147_id); /* I2C driver data */ static struct i2c_driver tvp5147_driver = { .driver = { .owner = THIS_MODULE, .name = TVP5147_MODULE_NAME, }, .probe = tvp5147_probe, .remove = tvp5147_remove, .id_table = tvp5147_id, }; /* * tvp5147_init - Initialize driver via I2C interface * * Register the TVP5147 driver. * Return 0 on success or error code on failure. */ static int __init tvp5147_init(void) { return i2c_add_driver(&tvp5147_driver); } /* * tvp5147_exit - Remove driver via I2C interface * * Unregister the TVP5147 driver. * Returns nothing. */ static void __exit tvp5147_exit(void) { i2c_del_driver(&tvp5147_driver); } module_init(tvp5147_init); module_exit(tvp5147_exit);
#!/bin/sh PATH_TO_TOOLCHAIN=/home/hieg/Sourcery/Sourcery_G++_Lite make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- ti8148_evm_defconfig make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- uImage #make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- menuconfig make ARCH=arm CROSS_COMPILE=${PATH_TO_TOOLCHAIN}/bin/arm-none-linux-gnueabi- modules sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/arch/arm/boot/uImage /srv/tftp/ cd /srv/tftp sudo chmod 777 uImage #modules sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/video/ti81xx/ti81xxfb/ti81xxfb.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/video/ti81xx/ti81xxfb/ sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/video/ti81xx/ti81xxhdmi/ti81xxhdmi.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/video/ti81xx/ti81xxhdmi/ sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/ti81xx/ti81xxvin.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/ti81xx/ sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/ti81xx/ti81xxvo.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/ti81xx/ sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/tvp514x.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/ sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/media/video/tvp7002.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/media/video/ sudo cp /home/hieg/ti-ezsdk_dm814x-evm_5_05_02_00/board-support/linux-2.6.37-psp04.04.00.01/drivers/video/ti81xx/vpss/vpss.ko /home/hieg/targetfs/lib/modules/2.6.37/kernel/drivers/video/ti81xx/vpss/
#!/bin/sh cd /home/root/VideoCapture /etc/init.d/matrix-gui-e stop /etc/init.d/pvr-init stop /etc/init.d/load-hd-firmware.sh stop insmod /lib/modules/2.6.37/kernel/drivers/media/video/tvp514x.ko debug=1 /usr/share/ti/ti-media-controller-utils/load-hd-v4l2-firmware.sh start ./saMarc dmesg lsmod ./saLoopBack
PM: Removing info for No Bus:bccat0 PM: Removing info for No Bus:pvrsrvkm PM: Removing info for platform:pvrsrvkm PM: Removing info for No Bus:tlc59108-bl hdmi: Enter DSS_HDMI_CORE_SW_RESET_ASSERT () hdmi: Enter HDMI_W1_StopVideoFrame() hdmi: *** Set PHY power mode to 0 hdmi: *** Set PHY power mode to 0 PM: Removing info for No Bus:TI81XX_HDMI PM: Removing info for No Bus:fb0 PM: Removing info for No Bus:fb1 PM: Removing info for No Bus:fb2 PM: Removing info for No Bus:syslinkipc_MessageQ PM: Removing info for No Bus:syslinkipc_GateMP PM: Removing info for No Bus:syslinkipc_ListMP PM: Removing info for No Bus:syslinkipc_HeapMemMP PM: Removing info for No Bus:syslinkipc_HeapBufMP PM: Removing info for No Bus:syslinkipc_SharedRegion PM: Removing info for No Bus:syslinkipc_NameServer PM: Removing info for No Bus:syslinkipc_MultiProc PM: Removing info for No Bus:syslinkipc_Notify PM: Removing info for No Bus:syslinkipc_FrameQ PM: Removing info for No Bus:syslinkipc_FrameQBufMgr PM: Removing info for No Bus:syslinkipc_RingIO PM: Removing info for No Bus:syslinkipc_RingIOShm PM: Removing info for No Bus:syslinkipc_ClientNotifyMgr PM: Removing info for No Bus:syslinkipc_SyslinkMemMgr PM: Removing info for No Bus:syslinkipc_ProcMgr PM: Removing info for No Bus:syslinkipc_Ipc PM: Removing info for No Bus:syslinkipc_Osal Removed syslink kernel module SysLink version : 2.20.02.20 SysLink module created on Date:Dec 26 2012 Time:18:39:49 PM: Adding info for No Bus:syslinkipc_Osal PM: Adding info for No Bus:syslinkipc_Ipc PM: Adding info for No Bus:syslinkipc_ProcMgr PM: Adding info for No Bus:syslinkipc_Notify PM: Adding info for No Bus:syslinkipc_MultiProc PM: Adding info for No Bus:syslinkipc_NameServer PM: Adding info for No Bus:syslinkipc_SharedRegion PM: Adding info for No Bus:syslinkipc_HeapBufMP PM: Adding info for No Bus:syslinkipc_HeapMemMP PM: Adding info for No Bus:syslinkipc_ListMP PM: Adding info for No Bus:syslinkipc_GateMP PM: Adding info for No Bus:syslinkipc_MessageQ PM: Adding info for No Bus:syslinkipc_SyslinkMemMgr PM: Adding info for No Bus:syslinkipc_ClientNotifyMgr PM: Adding info for No Bus:syslinkipc_FrameQBufMgr PM: Adding info for No Bus:syslinkipc_FrameQ PM: Adding info for No Bus:syslinkipc_RingIO PM: Adding info for No Bus:syslinkipc_RingIOShm VPSS_FVID2: M3 firmware version 0x1000145 is newer,driver may not work properly. TI81XXFB : ti81xxfb_init TI81XXFB : create 3 fbs TI81XXFB : fb_infos(3) allocated. TI81XXFB : vram 0:40M,1:1M,2:1M TI81XXFB : fb 0 size 41943040 TI81XXFB : fb 1 size 1048576 TI81XXFB : fb 2 size 1048576 TI81XXFB : allocating 41943040 bytes for fb 0 TI81XXFB : allocated VRAM paddr 8ce00000, vaddr d1000000 TI81XXFB : allocating 1048576 bytes for fb 1 TI81XXFB : allocated VRAM paddr 8f600000, vaddr d3800000 TI81XXFB : allocating 1048576 bytes for fb 2 TI81XXFB : allocated VRAM paddr 8f700000, vaddr d3900000 TI81XXFB : region0 phys 8ce00000 virt d1000000 size=41943040 TI81XXFB : region1 phys 8f600000 virt d3800000 size=1048576 TI81XXFB : region2 phys 8f700000 virt d3900000 size=1048576 TI81XXFB : fb memory allocated. TI81XXFB : clut mem allocated. TI81XXFB : check_fb_var TI81XXFB : xres = 1920, yres = 1080, vxres = 1920, vyres = 1080,xoffset = 0, yoffset = 0 TI81XXFB : set_fb_fix TI81XXFB : check_fb_var TI81XXFB : can't fit fb memory, reducing y TI81XXFB : xres = 1920, yres = 136, vxres = 1920, vyres = 136,xoffset = 0, yoffset = 0 TI81XXFB : set_fb_fix TI81XXFB : check_fb_var TI81XXFB : can't fit fb memory, reducing y TI81XXFB : xres = 720, yres = 364, vxres = 720, vyres = 364,xoffset = 0, yoffset = 0 TI81XXFB : set_fb_fix TI81XXFB : fb_infos initialized PM: Adding info for No Bus:fb0 PM: Adding info for No Bus:fb1 PM: Adding info for No Bus:fb2 TI81XXFB : framebuffers registered TI81XXFB : fbs sysfs created TI81XXFB : Opening fb0 TI81XXFB : check_var(0) TI81XXFB : check_fb_var TI81XXFB : xres = 800, yres = 480, vxres = 800, vyres = 480,xoffset = 0, yoffset = 0 TI81XXFB : set_var(0) TI81XXFB : set_fb_fix TI81XXFB : pan_display(0) TI81XXFB : setcamp(0) TI81XXFB : clut not same ,set TI81XXFB : Closing fb0 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT0: buf0: va: 0xc4800000 pa: 0x84800000 size 0x400000 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT0: buf1: va: 0xc4400000 pa: 0x84400000 size 0x400000 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT0: buf2: va: 0xc4000000 pa: 0x84000000 size 0x400000 PM: Adding info for No Bus:video1 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_init t81xx_vidout t81xx_vidout: VIDOUT0: init video drivers/media/video/ti81xx/ti81xxvid_main.c video_mode_to_vpss_mode t81xx_vidout t81xx_vidout: VIDOUT0: data format 1 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_setup_video t81xx_vidout t81xx_vidout: VIDOUT0: enable=0 width=1920 height=1080 color_mode=1 pos=0x0 out_width=1920 out_height=1080 screen_width=3840 crop=0 t81xx_vidout t81xx_vidout: VIDOUT0: apply_changes failed drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT1: buf0: va: 0xc3c00000 pa: 0x83c00000 size 0x400000 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT1: buf1: va: 0xc3800000 pa: 0x83800000 size 0x400000 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT1: buf2: va: 0xc3400000 pa: 0x83400000 size 0x400000 PM: Adding info for No Bus:video2 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_init t81xx_vidout t81xx_vidout: VIDOUT1: init video drivers/media/video/ti81xx/ti81xxvid_main.c video_mode_to_vpss_mode t81xx_vidout t81xx_vidout: VIDOUT1: data format 1 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_setup_video t81xx_vidout t81xx_vidout: VIDOUT1: enable=0 width=800 height=480 color_mode=1 pos=0x0 out_width=800 out_height=480 screen_width=1600 crop=0 t81xx_vidout t81xx_vidout: VIDOUT1: apply_changes failed drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT2: buf0: va: 0xca500000 pa: 0x8a500000 size 0xca800 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT2: buf1: va: 0xca700000 pa: 0x8a700000 size 0xca800 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xx_vidout_setup_video_bufs t81xx_vidout t81xx_vidout: VIDOUT2: buf2: va: 0xc3000000 pa: 0x83000000 size 0xca800 PM: Adding info for No Bus:video3 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_init t81xx_vidout t81xx_vidout: VIDOUT2: init video drivers/media/video/ti81xx/ti81xxvid_main.c video_mode_to_vpss_mode t81xx_vidout t81xx_vidout: VIDOUT2: data format 1 drivers/media/video/ti81xx/ti81xxvid_main.c ti81xxvid_setup_video t81xx_vidout t81xx_vidout: VIDOUT2: enable=0 width=720 height=480 color_mode=1 pos=0x0 out_width=720 out_height=480 screen_width=1440 crop=0 t81xx_vidout t81xx_vidout: VIDOUT2: apply_changes failed drivers/media/video/ti81xx/ti81xxvin_main.c, ti81xxvin_probe PM: Adding info for No Bus:video0 PM: Adding info for No Bus:video4 PM: Adding info for No Bus:video5 PM: Adding info for No Bus:video6 tvp514x drivers/media/video/v4l2-common.c, v4l2_i2c_new_subdev_board PM: Adding info for i2c:1-005c drivers/media/video/tvp514x.c, tvp514x_probe drivers/media/video/tvp514x.c tvp514x_probe tvp514x 1-005c: tvp514x 1-005c decoder driver registered drivers/media/video/tvp514x.c, tvp514x_s_config drivers/media/video/tvp514x.c, tvp514x_s_stream 0 3 1 drivers/media/video/tvp514x.c tvp514x_write_reg tvp514x 1-005c: Write: retry --- 0 drivers/media/video/tvp514x.c tvp514x_write_reg tvp514x 1-005c: Write: retry --- 1 drivers/media/video/tvp514x.c tvp514x_write_reg tvp514x 1-005c: Write: retry --- 2 drivers/media/video/tvp514x.c tvp514x_write_reg tvp514x 1-005c: Write: retry --- 3 drivers/media/video/tvp514x.c tvp514x_write_reg tvp514x 1-005c: Write: retry --- 4 drivers/media/video/tvp514x.c tvp514x_write_regs tvp514x 1-005c: Write failed. Err[-121] drivers/media/video/tvp514x.c tvp514x_s_stream tvp514x 1-005c: Unable to turn on decoder !!!!!! drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 0 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 1 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 2 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 3 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 4 drivers/media/video/tvp514x.c tvp514x_s_config tvp514x 1-005c: Unable to query std drivers/media/video/ti81xx/ti81xxvin_main.c ti81xxvin_probe ti81xxvin ti81xxvin: registered sub device tvp5147m1 drivers/media/video/ti81xx/ti81xxvin_main.c ti81xxvin_probe ti81xxvin ti81xxvin: TI81xx HDVPSS Capture driver initialized FIN de ti81xxvin_probe TI81XXFB : Opening fb0 TI81XXFB : check_var(0) TI81XXFB : check_fb_var TI81XXFB : xres = 800, yres = 480, vxres = 800, vyres = 480,xoffset = 0, yoffset = 0 TI81XXFB : set_var(0) TI81XXFB : set_fb_fix TI81XXFB : pan_display(0) TI81XXFB : setcamp(0) TI81XXFB : Closing fb0 HDMI W1 rev 4.0 HDMI CEC Spec version 1.2 PM: Adding info for No Bus:TI81XX_HDMI hdmi: Enter HDMI_W1_StopVideoFrame() hdmi: *** Set PHY power mode to 1 hdmi: *** Set PHY power mode to 2 I2C No Ack hdmi: Enter HDMI_W1_GlobalInitVars() hdmi: Enter HDMI_Core_GlobalInitVars() hdmi: Enter HDMI_W1_ConfigVideoResolutionTiming() hdmi: Enter HDMI_W1_ConfigVideoInterface() hdmi: HDMI_WP_AUDIO_CFG = 0x1030006 hdmi: HDMI_WP_AUDIO_CFG2 = 0x20c0 hdmi: HDMI_WP_AUDIO_CTRL = 0x20 hdmi: Enter DSS_HDMI_CORE_SW_RESET_ASSERT () hdmi: Enter DSS_HDMI_CORE_POWER_DOWN_DISABLE() hdmi: Enter DSS_HDMI_CORE_SW_RESET_RELEASE() hdmi: Enter HDMI_W1_StartVideoFrame () hdmi: Irqenable 60000011 hdmi: 40 hpd PM: Adding info for No Bus:tlc59108-bl ti81xxvin ti81xxvin: ti81xxvin_open ti81xxvin ti81xxvin: ti81xxvin_open drivers/media/video/ti81xx/ti81xxvin_main.c vidioc_enum_input ti81xxvin ti81xxvin: Invalid input index ti81xxvin ti81xxvin: ti81xxvin_open ti81xxvin ti81xxvin: ti81xxvin_open drivers/media/video/ti81xx/ti81xxvin_main.c vidioc_enum_input ti81xxvin ti81xxvin: Invalid input index ti81xxvin ti81xxvin: ti81xxvin_release ti81xxvin ti81xxvin: Failed to del timer ti81xxvin ti81xxvin: ti81xxvin_release ti81xxvin ti81xxvin: Failed to del timer ti81xxvin ti81xxvin: ti81xxvin_release ti81xxvin ti81xxvin: Failed to del timer ti81xxvin ti81xxvin: ti81xxvin_release ti81xxvin ti81xxvin: Failed to del timer ti81xxvin ti81xxvin: ti81xxvin_open hdmi: Enter DSS_HDMI_CORE_SW_RESET_ASSERT () hdmi: Enter HDMI_W1_StopVideoFrame() hdmi: *** Set PHY power mode to 0 hdmi: *** Set PHY power mode to 0 drivers/media/video/ti81xx/ti81xxvin_main.c, vidioc_query_dv_preset ti81xxvin ti81xxvin: vidioc_query_dv_preset drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 0 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 1 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 2 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 3 drivers/media/video/tvp514x.c tvp514x_read_reg tvp514x 1-005c: Read: retry ... 4 TVP514x: unkown video standard: -121 drivers/media/video/ti81xx/ti81xxvin_main.c vidioc_query_dv_preset ti81xxvin ti81xxvin: Failed to set dv format for sub devices ti81xxvin ti81xxvin: ti81xxvin_release ti81xxvin ti81xxvin: Failed to del timer