diff options
author | Lad, Prabhakar <prabhakar.csengg@gmail.com> | 2013-03-19 06:34:36 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-04-14 19:09:26 -0400 |
commit | 120c66046cc8931259867ac1cdc6de0d0e742fb5 (patch) | |
tree | 277ff6303e9e8692e867ae6ba7912965cca0b5f3 /arch/arm/mach-davinci | |
parent | 54d5e4beb8fdbf5d762ffe4cb67a53b55a74309e (diff) |
[media] ARM: davinci: dm365: add support for v4l2 video display
Create platform devices for various video modules like venc,osd,
vpbe and v4l2 driver for dm365.
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/arm/mach-davinci')
-rw-r--r-- | arch/arm/mach-davinci/board-dm365-evm.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-davinci/davinci.h | 8 | ||||
-rw-r--r-- | arch/arm/mach-davinci/dm365.c | 184 |
3 files changed, 179 insertions, 17 deletions
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index c2d4958a0cb6..cf77c465b98e 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c | |||
@@ -564,8 +564,6 @@ static struct davinci_uart_config uart_config __initdata = { | |||
564 | 564 | ||
565 | static void __init dm365_evm_map_io(void) | 565 | static void __init dm365_evm_map_io(void) |
566 | { | 566 | { |
567 | /* setup input configuration for VPFE input devices */ | ||
568 | dm365_set_vpfe_config(&vpfe_cfg); | ||
569 | dm365_init(); | 567 | dm365_init(); |
570 | } | 568 | } |
571 | 569 | ||
@@ -597,6 +595,8 @@ static __init void dm365_evm_init(void) | |||
597 | 595 | ||
598 | davinci_setup_mmc(0, &dm365evm_mmc_config); | 596 | davinci_setup_mmc(0, &dm365evm_mmc_config); |
599 | 597 | ||
598 | dm365_init_video(&vpfe_cfg, NULL); | ||
599 | |||
600 | /* maybe setup mmc1/etc ... _after_ mmc0 */ | 600 | /* maybe setup mmc1/etc ... _after_ mmc0 */ |
601 | evm_init_cpld(); | 601 | evm_init_cpld(); |
602 | 602 | ||
diff --git a/arch/arm/mach-davinci/davinci.h b/arch/arm/mach-davinci/davinci.h index 12d544befcfa..c8b1e0bebcfb 100644 --- a/arch/arm/mach-davinci/davinci.h +++ b/arch/arm/mach-davinci/davinci.h | |||
@@ -36,12 +36,18 @@ | |||
36 | #include <media/davinci/vpbe_osd.h> | 36 | #include <media/davinci/vpbe_osd.h> |
37 | 37 | ||
38 | #define DAVINCI_SYSTEM_MODULE_BASE 0x01c40000 | 38 | #define DAVINCI_SYSTEM_MODULE_BASE 0x01c40000 |
39 | #define SYSMOD_VDAC_CONFIG 0x2c | ||
39 | #define SYSMOD_VIDCLKCTL 0x38 | 40 | #define SYSMOD_VIDCLKCTL 0x38 |
40 | #define SYSMOD_VPSS_CLKCTL 0x44 | 41 | #define SYSMOD_VPSS_CLKCTL 0x44 |
41 | #define SYSMOD_VDD3P3VPWDN 0x48 | 42 | #define SYSMOD_VDD3P3VPWDN 0x48 |
42 | #define SYSMOD_VSCLKDIS 0x6c | 43 | #define SYSMOD_VSCLKDIS 0x6c |
43 | #define SYSMOD_PUPDCTL1 0x7c | 44 | #define SYSMOD_PUPDCTL1 0x7c |
44 | 45 | ||
46 | /* VPSS CLKCTL bit definitions */ | ||
47 | #define VPSS_VENCCLKEN_ENABLE BIT(3) | ||
48 | #define VPSS_DACCLKEN_ENABLE BIT(4) | ||
49 | #define VPSS_PLLC2SYSCLK5_ENABLE BIT(5) | ||
50 | |||
45 | extern void __iomem *davinci_sysmod_base; | 51 | extern void __iomem *davinci_sysmod_base; |
46 | #define DAVINCI_SYSMOD_VIRT(x) (davinci_sysmod_base + (x)) | 52 | #define DAVINCI_SYSMOD_VIRT(x) (davinci_sysmod_base + (x)) |
47 | void davinci_map_sysmod(void); | 53 | void davinci_map_sysmod(void); |
@@ -84,7 +90,7 @@ void __init dm365_init_ks(struct davinci_ks_platform_data *pdata); | |||
84 | void __init dm365_init_rtc(void); | 90 | void __init dm365_init_rtc(void); |
85 | void dm365_init_spi0(unsigned chipselect_mask, | 91 | void dm365_init_spi0(unsigned chipselect_mask, |
86 | const struct spi_board_info *info, unsigned len); | 92 | const struct spi_board_info *info, unsigned len); |
87 | void dm365_set_vpfe_config(struct vpfe_config *cfg); | 93 | int dm365_init_video(struct vpfe_config *, struct vpbe_config *); |
88 | 94 | ||
89 | /* DM644x function declarations */ | 95 | /* DM644x function declarations */ |
90 | void __init dm644x_init(void); | 96 | void __init dm644x_init(void); |
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index c61dd94daadc..ff771ceac3f1 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c | |||
@@ -39,16 +39,13 @@ | |||
39 | #include "asp.h" | 39 | #include "asp.h" |
40 | 40 | ||
41 | #define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */ | 41 | #define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */ |
42 | |||
43 | /* Base of key scan register bank */ | ||
44 | #define DM365_KEYSCAN_BASE 0x01c69400 | ||
45 | |||
46 | #define DM365_RTC_BASE 0x01c69000 | 42 | #define DM365_RTC_BASE 0x01c69000 |
47 | 43 | #define DM365_KEYSCAN_BASE 0x01c69400 | |
44 | #define DM365_OSD_BASE 0x01c71c00 | ||
45 | #define DM365_VENC_BASE 0x01c71e00 | ||
48 | #define DAVINCI_DM365_VC_BASE 0x01d0c000 | 46 | #define DAVINCI_DM365_VC_BASE 0x01d0c000 |
49 | #define DAVINCI_DMA_VC_TX 2 | 47 | #define DAVINCI_DMA_VC_TX 2 |
50 | #define DAVINCI_DMA_VC_RX 3 | 48 | #define DAVINCI_DMA_VC_RX 3 |
51 | |||
52 | #define DM365_EMAC_BASE 0x01d07000 | 49 | #define DM365_EMAC_BASE 0x01d07000 |
53 | #define DM365_EMAC_MDIO_BASE (DM365_EMAC_BASE + 0x4000) | 50 | #define DM365_EMAC_MDIO_BASE (DM365_EMAC_BASE + 0x4000) |
54 | #define DM365_EMAC_CNTRL_OFFSET 0x0000 | 51 | #define DM365_EMAC_CNTRL_OFFSET 0x0000 |
@@ -1233,6 +1230,173 @@ static struct platform_device dm365_isif_dev = { | |||
1233 | }, | 1230 | }, |
1234 | }; | 1231 | }; |
1235 | 1232 | ||
1233 | static struct resource dm365_osd_resources[] = { | ||
1234 | { | ||
1235 | .start = DM365_OSD_BASE, | ||
1236 | .end = DM365_OSD_BASE + 0xff, | ||
1237 | .flags = IORESOURCE_MEM, | ||
1238 | }, | ||
1239 | }; | ||
1240 | |||
1241 | static u64 dm365_video_dma_mask = DMA_BIT_MASK(32); | ||
1242 | |||
1243 | static struct platform_device dm365_osd_dev = { | ||
1244 | .name = DM365_VPBE_OSD_SUBDEV_NAME, | ||
1245 | .id = -1, | ||
1246 | .num_resources = ARRAY_SIZE(dm365_osd_resources), | ||
1247 | .resource = dm365_osd_resources, | ||
1248 | .dev = { | ||
1249 | .dma_mask = &dm365_video_dma_mask, | ||
1250 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1251 | }, | ||
1252 | }; | ||
1253 | |||
1254 | static struct resource dm365_venc_resources[] = { | ||
1255 | { | ||
1256 | .start = IRQ_VENCINT, | ||
1257 | .end = IRQ_VENCINT, | ||
1258 | .flags = IORESOURCE_IRQ, | ||
1259 | }, | ||
1260 | /* venc registers io space */ | ||
1261 | { | ||
1262 | .start = DM365_VENC_BASE, | ||
1263 | .end = DM365_VENC_BASE + 0x177, | ||
1264 | .flags = IORESOURCE_MEM, | ||
1265 | }, | ||
1266 | /* vdaccfg registers io space */ | ||
1267 | { | ||
1268 | .start = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG, | ||
1269 | .end = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG + 3, | ||
1270 | .flags = IORESOURCE_MEM, | ||
1271 | }, | ||
1272 | }; | ||
1273 | |||
1274 | static struct resource dm365_v4l2_disp_resources[] = { | ||
1275 | { | ||
1276 | .start = IRQ_VENCINT, | ||
1277 | .end = IRQ_VENCINT, | ||
1278 | .flags = IORESOURCE_IRQ, | ||
1279 | }, | ||
1280 | /* venc registers io space */ | ||
1281 | { | ||
1282 | .start = DM365_VENC_BASE, | ||
1283 | .end = DM365_VENC_BASE + 0x177, | ||
1284 | .flags = IORESOURCE_MEM, | ||
1285 | }, | ||
1286 | }; | ||
1287 | |||
1288 | static int dm365_vpbe_setup_pinmux(enum v4l2_mbus_pixelcode if_type, | ||
1289 | int field) | ||
1290 | { | ||
1291 | switch (if_type) { | ||
1292 | case V4L2_MBUS_FMT_SGRBG8_1X8: | ||
1293 | davinci_cfg_reg(DM365_VOUT_FIELD_G81); | ||
1294 | davinci_cfg_reg(DM365_VOUT_COUTL_EN); | ||
1295 | davinci_cfg_reg(DM365_VOUT_COUTH_EN); | ||
1296 | break; | ||
1297 | case V4L2_MBUS_FMT_YUYV10_1X20: | ||
1298 | if (field) | ||
1299 | davinci_cfg_reg(DM365_VOUT_FIELD); | ||
1300 | else | ||
1301 | davinci_cfg_reg(DM365_VOUT_FIELD_G81); | ||
1302 | davinci_cfg_reg(DM365_VOUT_COUTL_EN); | ||
1303 | davinci_cfg_reg(DM365_VOUT_COUTH_EN); | ||
1304 | break; | ||
1305 | default: | ||
1306 | return -EINVAL; | ||
1307 | } | ||
1308 | |||
1309 | return 0; | ||
1310 | } | ||
1311 | |||
1312 | static int dm365_venc_setup_clock(enum vpbe_enc_timings_type type, | ||
1313 | unsigned int pclock) | ||
1314 | { | ||
1315 | void __iomem *vpss_clkctl_reg; | ||
1316 | u32 val; | ||
1317 | |||
1318 | vpss_clkctl_reg = DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL); | ||
1319 | |||
1320 | switch (type) { | ||
1321 | case VPBE_ENC_STD: | ||
1322 | val = VPSS_VENCCLKEN_ENABLE | VPSS_DACCLKEN_ENABLE; | ||
1323 | break; | ||
1324 | case VPBE_ENC_DV_TIMINGS: | ||
1325 | if (pclock <= 27000000) { | ||
1326 | val = VPSS_VENCCLKEN_ENABLE | VPSS_DACCLKEN_ENABLE; | ||
1327 | } else { | ||
1328 | /* set sysclk4 to output 74.25 MHz from pll1 */ | ||
1329 | val = VPSS_PLLC2SYSCLK5_ENABLE | VPSS_DACCLKEN_ENABLE | | ||
1330 | VPSS_VENCCLKEN_ENABLE; | ||
1331 | } | ||
1332 | break; | ||
1333 | default: | ||
1334 | return -EINVAL; | ||
1335 | } | ||
1336 | writel(val, vpss_clkctl_reg); | ||
1337 | |||
1338 | return 0; | ||
1339 | } | ||
1340 | |||
1341 | static struct platform_device dm365_vpbe_display = { | ||
1342 | .name = "vpbe-v4l2", | ||
1343 | .id = -1, | ||
1344 | .num_resources = ARRAY_SIZE(dm365_v4l2_disp_resources), | ||
1345 | .resource = dm365_v4l2_disp_resources, | ||
1346 | .dev = { | ||
1347 | .dma_mask = &dm365_video_dma_mask, | ||
1348 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1349 | }, | ||
1350 | }; | ||
1351 | |||
1352 | struct venc_platform_data dm365_venc_pdata = { | ||
1353 | .setup_pinmux = dm365_vpbe_setup_pinmux, | ||
1354 | .setup_clock = dm365_venc_setup_clock, | ||
1355 | }; | ||
1356 | |||
1357 | static struct platform_device dm365_venc_dev = { | ||
1358 | .name = DM365_VPBE_VENC_SUBDEV_NAME, | ||
1359 | .id = -1, | ||
1360 | .num_resources = ARRAY_SIZE(dm365_venc_resources), | ||
1361 | .resource = dm365_venc_resources, | ||
1362 | .dev = { | ||
1363 | .dma_mask = &dm365_video_dma_mask, | ||
1364 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1365 | .platform_data = (void *)&dm365_venc_pdata, | ||
1366 | }, | ||
1367 | }; | ||
1368 | |||
1369 | static struct platform_device dm365_vpbe_dev = { | ||
1370 | .name = "vpbe_controller", | ||
1371 | .id = -1, | ||
1372 | .dev = { | ||
1373 | .dma_mask = &dm365_video_dma_mask, | ||
1374 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1375 | }, | ||
1376 | }; | ||
1377 | |||
1378 | int __init dm365_init_video(struct vpfe_config *vpfe_cfg, | ||
1379 | struct vpbe_config *vpbe_cfg) | ||
1380 | { | ||
1381 | if (vpfe_cfg || vpbe_cfg) | ||
1382 | platform_device_register(&dm365_vpss_device); | ||
1383 | |||
1384 | if (vpfe_cfg) { | ||
1385 | vpfe_capture_dev.dev.platform_data = vpfe_cfg; | ||
1386 | platform_device_register(&dm365_isif_dev); | ||
1387 | platform_device_register(&vpfe_capture_dev); | ||
1388 | } | ||
1389 | if (vpbe_cfg) { | ||
1390 | dm365_vpbe_dev.dev.platform_data = vpbe_cfg; | ||
1391 | platform_device_register(&dm365_osd_dev); | ||
1392 | platform_device_register(&dm365_venc_dev); | ||
1393 | platform_device_register(&dm365_vpbe_dev); | ||
1394 | platform_device_register(&dm365_vpbe_display); | ||
1395 | } | ||
1396 | |||
1397 | return 0; | ||
1398 | } | ||
1399 | |||
1236 | static int __init dm365_init_devices(void) | 1400 | static int __init dm365_init_devices(void) |
1237 | { | 1401 | { |
1238 | if (!cpu_is_davinci_dm365()) | 1402 | if (!cpu_is_davinci_dm365()) |
@@ -1246,14 +1410,6 @@ static int __init dm365_init_devices(void) | |||
1246 | clk_add_alias(NULL, dev_name(&dm365_mdio_device.dev), | 1410 | clk_add_alias(NULL, dev_name(&dm365_mdio_device.dev), |
1247 | NULL, &dm365_emac_device.dev); | 1411 | NULL, &dm365_emac_device.dev); |
1248 | 1412 | ||
1249 | platform_device_register(&dm365_vpss_device); | ||
1250 | platform_device_register(&dm365_isif_dev); | ||
1251 | platform_device_register(&vpfe_capture_dev); | ||
1252 | return 0; | 1413 | return 0; |
1253 | } | 1414 | } |
1254 | postcore_initcall(dm365_init_devices); | 1415 | postcore_initcall(dm365_init_devices); |
1255 | |||
1256 | void dm365_set_vpfe_config(struct vpfe_config *cfg) | ||
1257 | { | ||
1258 | vpfe_capture_dev.dev.platform_data = cfg; | ||
1259 | } | ||