/* * TI DaVinci EVM board support * * Author: Kevin Hilman, MontaVista Software, Inc. * * 2007 (c) MontaVista Software, Inc. This file is licensed under * the terms of the GNU General Public License version 2. This program * is licensed "as is" without any warranty of any kind, whether express * or implied. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "davinci.h" #define DM644X_EVM_PHY_ID "davinci_mdio-0:01" #define LXT971_PHY_ID (0x001378e2) #define LXT971_PHY_MASK (0xfffffff0) static struct mtd_partition davinci_evm_norflash_partitions[] = { /* bootloader (UBL, U-Boot, etc) in first 5 sectors */ { .name = "bootloader", .offset = 0, .size = 5 * SZ_64K, .mask_flags = MTD_WRITEABLE, /* force read-only */ }, /* bootloader params in the next 1 sectors */ { .name = "params", .offset = MTDPART_OFS_APPEND, .size = SZ_64K, .mask_flags = 0, }, /* kernel */ { .name = "kernel", .offset = MTDPART_OFS_APPEND, .size = SZ_2M, .mask_flags = 0 }, /* file system */ { .name = "filesystem", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, .mask_flags = 0 } }; static struct physmap_flash_data davinci_evm_norflash_data = { .width = 2, .parts = davinci_evm_norflash_partitions, .nr_parts = ARRAY_SIZE(davinci_evm_norflash_partitions), }; /* NOTE: CFI probe will correctly detect flash part as 32M, but EMIF * limits addresses to 16M, so using addresses past 16M will wrap */ static struct resource davinci_evm_norflash_resource = { .start = DM644X_ASYNC_EMIF_DATA_CE0_BASE, .end = DM644X_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1, .flags = IORESOURCE_MEM, }; static struct platform_device davinci_evm_norflash_device = { .name = "physmap-flash", .id = 0, .dev = { .platform_data = &davinci_evm_norflash_data, }, .num_resources = 1, .resource = &davinci_evm_norflash_resource, }; /* DM644x EVM includes a 64 MByte small-page NAND flash (16K blocks). * It may used instead of the (default) NOR chip to boot, using TI's * tools to install the secondary boot loader (UBL) and U-Boot. */ static struct mtd_partition davinci_evm_nandflash_partition[] = { /* Bootloader layout depends on whose u-boot is installed, but we * can hide all the details. * - block 0 for u-boot environment ... in mainline u-boot * - block 1 for UBL (plus up to four backup copies in blocks 2..5) * - blocks 6...? for u-boot * - blocks 16..23 for u-boot environment ... in TI's u-boot */ { .name = "bootloader", .offset = 0, .size = SZ_256K + SZ_128K, .mask_flags = MTD_WRITEABLE, /* force read-only */ }, /* Kernel */ { .name = "kernel", .offset = MTDPART_OFS_APPEND, .size = SZ_4M, .mask_flags = 0, }, /* File system (older GIT kernels started this on the 5MB mark) */ { .name = "filesystem", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, .mask_flags = 0, } /* A few blocks at end hold a flash BBT ... created by TI's CCS * using flashwriter_nand.out, but ignored by TI's versions of * Linux and u-boot. We boot faster by using them. */ }; static struct davinci_aemif_timing davinci_evm_nandflash_timing = { .wsetup = 20, .wstrobe = 40, .whold = 20, .rsetup = 10, .rstrobe = 40, .rhold = 10, .ta = 40, }; static struct davinci_nand_pdata davinci_evm_nandflash_data = { .parts = davinci_evm_nandflash_partition, .nr_parts = ARRAY_SIZE(davinci_evm_nandflash_partition), .ecc_mode = NAND_ECC_HW, .bbt_options = NAND_BBT_USE_FLASH, .timing = &davinci_evm_nandflash_timing, }; static struct resource davinci_evm_nandflash_resource[] = { { .start = DM644X_ASYNC_EMIF_DATA_CE0_BASE, .end = DM644X_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1, .flags = IORESOURCE_MEM, }, { .start = DM644X_ASYNC_EMIF_CONTROL_BASE, .end = DM644X_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, }; static struct platform_device davinci_evm_nandflash_device = { .name = "davinci_nand", .id = 0, .dev = { .platform_data = &davinci_evm_nandflash_data, }, .num_resources = ARRAY_SIZE(davinci_evm_nandflash_resource), .resource = davinci_evm_nandflash_resource, }; static u64 davinci_fb_dma_mask = DMA_BIT_MASK(32); static struct platform_device davinci_fb_device = { .name = "davincifb", .id = -1, .dev = { .dma_mask = &davinci_fb_dma_mask, .coherent_dma_mask = DMA_BIT_MASK(32), }, .num_resources = 0, }; static struct tvp514x_platform_data dm644xevm_tvp5146_pdata = { .clk_polarity = 0, .hs_polarity = 1, .vs_polarity = 1 }; #define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) /* Inputs available at the TVP5146 */ static struct v4l2_input dm644xevm_tvp5146_inputs[] = { { .index = 0, .name = "Composite", .type = V4L2_INPUT_TYPE_CAMERA, .std = TVP514X_STD_ALL, }, { .index = 1, .name = "S-Video", .type = V4L2_INPUT_TYPE_CAMERA, .std = TVP514X_STD_ALL, }, }; /* * this is the route info for connecting each input to decoder * ouput that goes to vpfe. There is a one to one correspondence * with tvp5146_inputs */ static struct vpfe_route dm644xevm_tvp5146_routes[] = { { .input = INPUT_CVBS_VI2B, .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, }, { .input = INPUT_SVIDEO_VI2C_VI1C, .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, }, }; static struct vpfe_subdev_info dm644xevm_vpfe_sub_devs[] = { { .name = "tvp5146", .grp_id = 0, .num_inputs = ARRAY_SIZE(dm644xevm_tvp5146_inputs), .inputs = dm644xevm_tvp5146_inputs, .routes = dm644xevm_tvp5146_routes, .can_route = 1, .ccdc_if_params = { .if_type = VPFE_BT656, .hdpol = VPFE_PINPOL_POSITIVE, .vdpol = VPFE_PINPOL_POSITIVE, }, .board_info = { I2C_BOARD_INFO("tvp5146", 0x5d), .platform_data = &dm644xevm_tvp5146_pdata, }, }, }; static struct vpfe_config dm644xevm_capture_cfg = { .num_subdevs = ARRAY_SIZE(dm644xevm_vpfe_sub_devs), .i2c_adapter_id = 1, .sub_devs = dm644xevm_vpfe_sub_devs, .card_name = "DM6446 EVM", .ccdc = "DM6446 CCDC", }; static struct platform_device rtc_dev = { .name = "rtc_davinci_evm", .id = -1, }; static struct snd_platform_data dm644x_evm_snd_data; /*----------------------------------------------------------------------*/ /* * I2C GPIO expanders */ #define PCF_Uxx_BASE(x) (DAVINCI_N_GPIO + ((x) * 8))