diff options
author | Lad, Prabhakar <prabhakar.csengg@gmail.com> | 2013-04-09 09:35:05 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-04-14 19:10:13 -0400 |
commit | 62a2d6cd56a4db3ab59322ad6c95f762a842d7ab (patch) | |
tree | a8b25614b774cc0442759fa5b751a6f7c4bf576c /arch | |
parent | 542b5bd226b0f5d5e9190cb96e6d96a912394795 (diff) |
[media] ARM: davinci: dm355: add support for v4l2 video display
Create platform devices for various video modules like venc,osd,
vpbe and v4l2 driver for dm355.
Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com>
Acked-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-davinci/board-dm355-evm.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-davinci/davinci.h | 3 | ||||
-rw-r--r-- | arch/arm/mach-davinci/dm355.c | 167 |
3 files changed, 166 insertions, 8 deletions
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c index 147b8e1a4407..37d12cc202af 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c | |||
@@ -253,8 +253,6 @@ static struct davinci_uart_config uart_config __initdata = { | |||
253 | 253 | ||
254 | static void __init dm355_evm_map_io(void) | 254 | static void __init dm355_evm_map_io(void) |
255 | { | 255 | { |
256 | /* setup input configuration for VPFE input devices */ | ||
257 | dm355_set_vpfe_config(&vpfe_cfg); | ||
258 | dm355_init(); | 256 | dm355_init(); |
259 | } | 257 | } |
260 | 258 | ||
@@ -344,6 +342,8 @@ static __init void dm355_evm_init(void) | |||
344 | davinci_setup_mmc(0, &dm355evm_mmc_config); | 342 | davinci_setup_mmc(0, &dm355evm_mmc_config); |
345 | davinci_setup_mmc(1, &dm355evm_mmc_config); | 343 | davinci_setup_mmc(1, &dm355evm_mmc_config); |
346 | 344 | ||
345 | dm355_init_video(&vpfe_cfg, NULL); | ||
346 | |||
347 | dm355_init_spi0(BIT(0), dm355_evm_spi_info, | 347 | dm355_init_spi0(BIT(0), dm355_evm_spi_info, |
348 | ARRAY_SIZE(dm355_evm_spi_info)); | 348 | ARRAY_SIZE(dm355_evm_spi_info)); |
349 | 349 | ||
diff --git a/arch/arm/mach-davinci/davinci.h b/arch/arm/mach-davinci/davinci.h index c8b1e0bebcfb..1ab3df423dac 100644 --- a/arch/arm/mach-davinci/davinci.h +++ b/arch/arm/mach-davinci/davinci.h | |||
@@ -44,6 +44,7 @@ | |||
44 | #define SYSMOD_PUPDCTL1 0x7c | 44 | #define SYSMOD_PUPDCTL1 0x7c |
45 | 45 | ||
46 | /* VPSS CLKCTL bit definitions */ | 46 | /* VPSS CLKCTL bit definitions */ |
47 | #define VPSS_MUXSEL_EXTCLK_ENABLE BIT(1) | ||
47 | #define VPSS_VENCCLKEN_ENABLE BIT(3) | 48 | #define VPSS_VENCCLKEN_ENABLE BIT(3) |
48 | #define VPSS_DACCLKEN_ENABLE BIT(4) | 49 | #define VPSS_DACCLKEN_ENABLE BIT(4) |
49 | #define VPSS_PLLC2SYSCLK5_ENABLE BIT(5) | 50 | #define VPSS_PLLC2SYSCLK5_ENABLE BIT(5) |
@@ -80,7 +81,7 @@ void __init dm355_init(void); | |||
80 | void dm355_init_spi0(unsigned chipselect_mask, | 81 | void dm355_init_spi0(unsigned chipselect_mask, |
81 | const struct spi_board_info *info, unsigned len); | 82 | const struct spi_board_info *info, unsigned len); |
82 | void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata); | 83 | void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata); |
83 | void dm355_set_vpfe_config(struct vpfe_config *cfg); | 84 | int dm355_init_video(struct vpfe_config *, struct vpbe_config *); |
84 | 85 | ||
85 | /* DM365 function declarations */ | 86 | /* DM365 function declarations */ |
86 | void __init dm365_init(void); | 87 | void __init dm365_init(void); |
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index 8e98bb06b1c1..bf9a9d4ad9f5 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include "asp.h" | 35 | #include "asp.h" |
36 | 36 | ||
37 | #define DM355_UART2_BASE (IO_PHYS + 0x206000) | 37 | #define DM355_UART2_BASE (IO_PHYS + 0x206000) |
38 | #define DM355_OSD_BASE (IO_PHYS + 0x70200) | ||
39 | #define DM355_VENC_BASE (IO_PHYS + 0x70400) | ||
38 | 40 | ||
39 | /* | 41 | /* |
40 | * Device specific clocks | 42 | * Device specific clocks |
@@ -744,11 +746,146 @@ static struct platform_device vpfe_capture_dev = { | |||
744 | }, | 746 | }, |
745 | }; | 747 | }; |
746 | 748 | ||
747 | void dm355_set_vpfe_config(struct vpfe_config *cfg) | 749 | static struct resource dm355_osd_resources[] = { |
750 | { | ||
751 | .start = DM355_OSD_BASE, | ||
752 | .end = DM355_OSD_BASE + 0x17f, | ||
753 | .flags = IORESOURCE_MEM, | ||
754 | }, | ||
755 | }; | ||
756 | |||
757 | static struct platform_device dm355_osd_dev = { | ||
758 | .name = DM355_VPBE_OSD_SUBDEV_NAME, | ||
759 | .id = -1, | ||
760 | .num_resources = ARRAY_SIZE(dm355_osd_resources), | ||
761 | .resource = dm355_osd_resources, | ||
762 | .dev = { | ||
763 | .dma_mask = &vpfe_capture_dma_mask, | ||
764 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
765 | }, | ||
766 | }; | ||
767 | |||
768 | static struct resource dm355_venc_resources[] = { | ||
769 | { | ||
770 | .start = IRQ_VENCINT, | ||
771 | .end = IRQ_VENCINT, | ||
772 | .flags = IORESOURCE_IRQ, | ||
773 | }, | ||
774 | /* venc registers io space */ | ||
775 | { | ||
776 | .start = DM355_VENC_BASE, | ||
777 | .end = DM355_VENC_BASE + 0x17f, | ||
778 | .flags = IORESOURCE_MEM, | ||
779 | }, | ||
780 | /* VDAC config register io space */ | ||
781 | { | ||
782 | .start = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG, | ||
783 | .end = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG + 3, | ||
784 | .flags = IORESOURCE_MEM, | ||
785 | }, | ||
786 | }; | ||
787 | |||
788 | static struct resource dm355_v4l2_disp_resources[] = { | ||
789 | { | ||
790 | .start = IRQ_VENCINT, | ||
791 | .end = IRQ_VENCINT, | ||
792 | .flags = IORESOURCE_IRQ, | ||
793 | }, | ||
794 | /* venc registers io space */ | ||
795 | { | ||
796 | .start = DM355_VENC_BASE, | ||
797 | .end = DM355_VENC_BASE + 0x17f, | ||
798 | .flags = IORESOURCE_MEM, | ||
799 | }, | ||
800 | }; | ||
801 | |||
802 | static int dm355_vpbe_setup_pinmux(enum v4l2_mbus_pixelcode if_type, | ||
803 | int field) | ||
804 | { | ||
805 | switch (if_type) { | ||
806 | case V4L2_MBUS_FMT_SGRBG8_1X8: | ||
807 | davinci_cfg_reg(DM355_VOUT_FIELD_G70); | ||
808 | break; | ||
809 | case V4L2_MBUS_FMT_YUYV10_1X20: | ||
810 | if (field) | ||
811 | davinci_cfg_reg(DM355_VOUT_FIELD); | ||
812 | else | ||
813 | davinci_cfg_reg(DM355_VOUT_FIELD_G70); | ||
814 | break; | ||
815 | default: | ||
816 | return -EINVAL; | ||
817 | } | ||
818 | |||
819 | davinci_cfg_reg(DM355_VOUT_COUTL_EN); | ||
820 | davinci_cfg_reg(DM355_VOUT_COUTH_EN); | ||
821 | |||
822 | return 0; | ||
823 | } | ||
824 | |||
825 | static int dm355_venc_setup_clock(enum vpbe_enc_timings_type type, | ||
826 | unsigned int pclock) | ||
748 | { | 827 | { |
749 | vpfe_capture_dev.dev.platform_data = cfg; | 828 | void __iomem *vpss_clk_ctrl_reg; |
829 | |||
830 | vpss_clk_ctrl_reg = DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL); | ||
831 | |||
832 | switch (type) { | ||
833 | case VPBE_ENC_STD: | ||
834 | writel(VPSS_DACCLKEN_ENABLE | VPSS_VENCCLKEN_ENABLE, | ||
835 | vpss_clk_ctrl_reg); | ||
836 | break; | ||
837 | case VPBE_ENC_DV_TIMINGS: | ||
838 | if (pclock > 27000000) | ||
839 | /* | ||
840 | * For HD, use external clock source since we cannot | ||
841 | * support HD mode with internal clocks. | ||
842 | */ | ||
843 | writel(VPSS_MUXSEL_EXTCLK_ENABLE, vpss_clk_ctrl_reg); | ||
844 | break; | ||
845 | default: | ||
846 | return -EINVAL; | ||
847 | } | ||
848 | |||
849 | return 0; | ||
750 | } | 850 | } |
751 | 851 | ||
852 | static struct platform_device dm355_vpbe_display = { | ||
853 | .name = "vpbe-v4l2", | ||
854 | .id = -1, | ||
855 | .num_resources = ARRAY_SIZE(dm355_v4l2_disp_resources), | ||
856 | .resource = dm355_v4l2_disp_resources, | ||
857 | .dev = { | ||
858 | .dma_mask = &vpfe_capture_dma_mask, | ||
859 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
860 | }, | ||
861 | }; | ||
862 | |||
863 | struct venc_platform_data dm355_venc_pdata = { | ||
864 | .setup_pinmux = dm355_vpbe_setup_pinmux, | ||
865 | .setup_clock = dm355_venc_setup_clock, | ||
866 | }; | ||
867 | |||
868 | static struct platform_device dm355_venc_dev = { | ||
869 | .name = DM355_VPBE_VENC_SUBDEV_NAME, | ||
870 | .id = -1, | ||
871 | .num_resources = ARRAY_SIZE(dm355_venc_resources), | ||
872 | .resource = dm355_venc_resources, | ||
873 | .dev = { | ||
874 | .dma_mask = &vpfe_capture_dma_mask, | ||
875 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
876 | .platform_data = (void *)&dm355_venc_pdata, | ||
877 | }, | ||
878 | }; | ||
879 | |||
880 | static struct platform_device dm355_vpbe_dev = { | ||
881 | .name = "vpbe_controller", | ||
882 | .id = -1, | ||
883 | .dev = { | ||
884 | .dma_mask = &vpfe_capture_dma_mask, | ||
885 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
886 | }, | ||
887 | }; | ||
888 | |||
752 | /*----------------------------------------------------------------------*/ | 889 | /*----------------------------------------------------------------------*/ |
753 | 890 | ||
754 | static struct map_desc dm355_io_desc[] = { | 891 | static struct map_desc dm355_io_desc[] = { |
@@ -868,6 +1005,29 @@ void __init dm355_init(void) | |||
868 | davinci_map_sysmod(); | 1005 | davinci_map_sysmod(); |
869 | } | 1006 | } |
870 | 1007 | ||
1008 | int __init dm355_init_video(struct vpfe_config *vpfe_cfg, | ||
1009 | struct vpbe_config *vpbe_cfg) | ||
1010 | { | ||
1011 | if (vpfe_cfg || vpbe_cfg) | ||
1012 | platform_device_register(&dm355_vpss_device); | ||
1013 | |||
1014 | if (vpfe_cfg) { | ||
1015 | vpfe_capture_dev.dev.platform_data = vpfe_cfg; | ||
1016 | platform_device_register(&dm355_ccdc_dev); | ||
1017 | platform_device_register(&vpfe_capture_dev); | ||
1018 | } | ||
1019 | |||
1020 | if (vpbe_cfg) { | ||
1021 | dm355_vpbe_dev.dev.platform_data = vpbe_cfg; | ||
1022 | platform_device_register(&dm355_osd_dev); | ||
1023 | platform_device_register(&dm355_venc_dev); | ||
1024 | platform_device_register(&dm355_vpbe_dev); | ||
1025 | platform_device_register(&dm355_vpbe_display); | ||
1026 | } | ||
1027 | |||
1028 | return 0; | ||
1029 | } | ||
1030 | |||
871 | static int __init dm355_init_devices(void) | 1031 | static int __init dm355_init_devices(void) |
872 | { | 1032 | { |
873 | if (!cpu_is_davinci_dm355()) | 1033 | if (!cpu_is_davinci_dm355()) |
@@ -875,9 +1035,6 @@ static int __init dm355_init_devices(void) | |||
875 | 1035 | ||
876 | davinci_cfg_reg(DM355_INT_EDMA_CC); | 1036 | davinci_cfg_reg(DM355_INT_EDMA_CC); |
877 | platform_device_register(&dm355_edma_device); | 1037 | platform_device_register(&dm355_edma_device); |
878 | platform_device_register(&dm355_vpss_device); | ||
879 | platform_device_register(&dm355_ccdc_dev); | ||
880 | platform_device_register(&vpfe_capture_dev); | ||
881 | 1038 | ||
882 | return 0; | 1039 | return 0; |
883 | } | 1040 | } |