Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB: DaVinci - Adding platform & board changes for vpfe capture on DM365

This patch adds following changes:-
1) add sub device configuration data for TVP5146 used by vpfe capture
2) registers platform devices for vpfe_capture, isif and vpss
3) defines hardware resources for the devices listed under 2)
4) defines clock aliase for isif driver
5) adding setup_pinmux() for isif

Reviewed-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Murali Karicheri <mkaricheri@gmail.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Murali Karicheri and committed by
Mauro Carvalho Chehab
a30d6744 fb640224

+174 -1
+71
arch/arm/mach-davinci/board-dm365-evm.c
··· 37 37 #include <mach/nand.h> 38 38 #include <mach/keyscan.h> 39 39 40 + #include <media/tvp514x.h> 41 + 40 42 static inline int have_imager(void) 41 43 { 42 44 /* REVISIT when it's supported, trigger via Kconfig */ ··· 308 306 davinci_cfg_reg(DM365_SD1_DATA0); 309 307 } 310 308 309 + static struct tvp514x_platform_data tvp5146_pdata = { 310 + .clk_polarity = 0, 311 + .hs_polarity = 1, 312 + .vs_polarity = 1 313 + }; 314 + 315 + #define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) 316 + /* Inputs available at the TVP5146 */ 317 + static struct v4l2_input tvp5146_inputs[] = { 318 + { 319 + .index = 0, 320 + .name = "Composite", 321 + .type = V4L2_INPUT_TYPE_CAMERA, 322 + .std = TVP514X_STD_ALL, 323 + }, 324 + { 325 + .index = 1, 326 + .name = "S-Video", 327 + .type = V4L2_INPUT_TYPE_CAMERA, 328 + .std = TVP514X_STD_ALL, 329 + }, 330 + }; 331 + 332 + /* 333 + * this is the route info for connecting each input to decoder 334 + * ouput that goes to vpfe. There is a one to one correspondence 335 + * with tvp5146_inputs 336 + */ 337 + static struct vpfe_route tvp5146_routes[] = { 338 + { 339 + .input = INPUT_CVBS_VI2B, 340 + .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, 341 + }, 342 + { 343 + .input = INPUT_SVIDEO_VI2C_VI1C, 344 + .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, 345 + }, 346 + }; 347 + 348 + static struct vpfe_subdev_info vpfe_sub_devs[] = { 349 + { 350 + .name = "tvp5146", 351 + .grp_id = 0, 352 + .num_inputs = ARRAY_SIZE(tvp5146_inputs), 353 + .inputs = tvp5146_inputs, 354 + .routes = tvp5146_routes, 355 + .can_route = 1, 356 + .ccdc_if_params = { 357 + .if_type = VPFE_BT656, 358 + .hdpol = VPFE_PINPOL_POSITIVE, 359 + .vdpol = VPFE_PINPOL_POSITIVE, 360 + }, 361 + .board_info = { 362 + I2C_BOARD_INFO("tvp5146", 0x5d), 363 + .platform_data = &tvp5146_pdata, 364 + }, 365 + }, 366 + }; 367 + 368 + static struct vpfe_config vpfe_cfg = { 369 + .num_subdevs = ARRAY_SIZE(vpfe_sub_devs), 370 + .sub_devs = vpfe_sub_devs, 371 + .i2c_adapter_id = 1, 372 + .card_name = "DM365 EVM", 373 + .ccdc = "ISIF", 374 + }; 375 + 311 376 static void __init evm_init_i2c(void) 312 377 { 313 378 davinci_init_i2c(&i2c_pdata); ··· 566 497 567 498 static void __init dm365_evm_map_io(void) 568 499 { 500 + /* setup input configuration for VPFE input devices */ 501 + dm365_set_vpfe_config(&vpfe_cfg); 569 502 dm365_init(); 570 503 } 571 504
+101 -1
arch/arm/mach-davinci/dm365.c
··· 1008 1008 davinci_common_init(&davinci_soc_info_dm365); 1009 1009 } 1010 1010 1011 + static struct resource dm365_vpss_resources[] = { 1012 + { 1013 + /* VPSS ISP5 Base address */ 1014 + .name = "isp5", 1015 + .start = 0x01c70000, 1016 + .end = 0x01c70000 + 0xff, 1017 + .flags = IORESOURCE_MEM, 1018 + }, 1019 + { 1020 + /* VPSS CLK Base address */ 1021 + .name = "vpss", 1022 + .start = 0x01c70200, 1023 + .end = 0x01c70200 + 0xff, 1024 + .flags = IORESOURCE_MEM, 1025 + }, 1026 + }; 1027 + 1028 + static struct platform_device dm365_vpss_device = { 1029 + .name = "vpss", 1030 + .id = -1, 1031 + .dev.platform_data = "dm365_vpss", 1032 + .num_resources = ARRAY_SIZE(dm365_vpss_resources), 1033 + .resource = dm365_vpss_resources, 1034 + }; 1035 + 1036 + static struct resource vpfe_resources[] = { 1037 + { 1038 + .start = IRQ_VDINT0, 1039 + .end = IRQ_VDINT0, 1040 + .flags = IORESOURCE_IRQ, 1041 + }, 1042 + { 1043 + .start = IRQ_VDINT1, 1044 + .end = IRQ_VDINT1, 1045 + .flags = IORESOURCE_IRQ, 1046 + }, 1047 + }; 1048 + 1049 + static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32); 1050 + static struct platform_device vpfe_capture_dev = { 1051 + .name = CAPTURE_DRV_NAME, 1052 + .id = -1, 1053 + .num_resources = ARRAY_SIZE(vpfe_resources), 1054 + .resource = vpfe_resources, 1055 + .dev = { 1056 + .dma_mask = &vpfe_capture_dma_mask, 1057 + .coherent_dma_mask = DMA_BIT_MASK(32), 1058 + }, 1059 + }; 1060 + 1061 + static void dm365_isif_setup_pinmux(void) 1062 + { 1063 + davinci_cfg_reg(DM365_VIN_CAM_WEN); 1064 + davinci_cfg_reg(DM365_VIN_CAM_VD); 1065 + davinci_cfg_reg(DM365_VIN_CAM_HD); 1066 + davinci_cfg_reg(DM365_VIN_YIN4_7_EN); 1067 + davinci_cfg_reg(DM365_VIN_YIN0_3_EN); 1068 + } 1069 + 1070 + static struct resource isif_resource[] = { 1071 + /* ISIF Base address */ 1072 + { 1073 + .start = 0x01c71000, 1074 + .end = 0x01c71000 + 0x1ff, 1075 + .flags = IORESOURCE_MEM, 1076 + }, 1077 + /* ISIF Linearization table 0 */ 1078 + { 1079 + .start = 0x1C7C000, 1080 + .end = 0x1C7C000 + 0x2ff, 1081 + .flags = IORESOURCE_MEM, 1082 + }, 1083 + /* ISIF Linearization table 1 */ 1084 + { 1085 + .start = 0x1C7C400, 1086 + .end = 0x1C7C400 + 0x2ff, 1087 + .flags = IORESOURCE_MEM, 1088 + }, 1089 + }; 1090 + static struct platform_device dm365_isif_dev = { 1091 + .name = "isif", 1092 + .id = -1, 1093 + .num_resources = ARRAY_SIZE(isif_resource), 1094 + .resource = isif_resource, 1095 + .dev = { 1096 + .dma_mask = &vpfe_capture_dma_mask, 1097 + .coherent_dma_mask = DMA_BIT_MASK(32), 1098 + .platform_data = dm365_isif_setup_pinmux, 1099 + }, 1100 + }; 1101 + 1011 1102 static int __init dm365_init_devices(void) 1012 1103 { 1013 1104 if (!cpu_is_davinci_dm365()) ··· 1107 1016 davinci_cfg_reg(DM365_INT_EDMA_CC); 1108 1017 platform_device_register(&dm365_edma_device); 1109 1018 platform_device_register(&dm365_emac_device); 1110 - 1019 + /* Add isif clock alias */ 1020 + clk_add_alias("master", dm365_isif_dev.name, "vpss_master", NULL); 1021 + platform_device_register(&dm365_vpss_device); 1022 + platform_device_register(&dm365_isif_dev); 1023 + platform_device_register(&vpfe_capture_dev); 1111 1024 return 0; 1112 1025 } 1113 1026 postcore_initcall(dm365_init_devices); 1027 + 1028 + void dm365_set_vpfe_config(struct vpfe_config *cfg) 1029 + { 1030 + vpfe_capture_dev.dev.platform_data = cfg; 1031 + }
+2
arch/arm/mach-davinci/include/mach/dm365.h
··· 18 18 #include <mach/emac.h> 19 19 #include <mach/asp.h> 20 20 #include <mach/keyscan.h> 21 + #include <media/davinci/vpfe_capture.h> 21 22 22 23 #define DM365_EMAC_BASE (0x01D07000) 23 24 #define DM365_EMAC_CNTRL_OFFSET (0x0000) ··· 37 36 void __init dm365_init_ks(struct davinci_ks_platform_data *pdata); 38 37 void __init dm365_init_rtc(void); 39 38 39 + void dm365_set_vpfe_config(struct vpfe_config *cfg); 40 40 #endif /* __ASM_ARCH_DM365_H */