17c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman/* 27c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * TI DaVinci EVM board support 37c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * 47c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> 57c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * 67c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * 2007 (c) MontaVista Software, Inc. This file is licensed under 77c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * the terms of the GNU General Public License version 2. This program 87c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * is licensed "as is" without any warranty of any kind, whether express 97c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * or implied. 107c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman */ 117c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <linux/kernel.h> 127c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <linux/init.h> 137c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <linux/dma-mapping.h> 147c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <linux/platform_device.h> 157bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell#include <linux/gpio.h> 167bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell#include <linux/i2c.h> 177bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell#include <linux/i2c/pcf857x.h> 1825f73ed5c67d17ecf8cefd560f55211cce726086Vivien Didelot#include <linux/platform_data/at24.h> 197c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <linux/mtd/mtd.h> 20d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman#include <linux/mtd/nand.h> 217c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <linux/mtd/partitions.h> 227c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <linux/mtd/physmap.h> 23d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman#include <linux/phy.h> 24d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman#include <linux/clk.h> 25ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri#include <linux/videodev2.h> 26368640827c0be2582d836cd74ae2cff03e6bfc02Hans Verkuil#include <linux/v4l2-dv-timings.h> 27dc28094b905a872f8884f1f1c48ca86b3b78583aPaul Gortmaker#include <linux/export.h> 28ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri 29ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri#include <media/tvp514x.h> 307c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 317c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <asm/mach-types.h> 327c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman#include <asm/mach/arch.h> 337c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 34a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/common.h> 35ec2a0833e5157fab6cac5f57a49b2f31eb418a39Arnd Bergmann#include <linux/platform_data/i2c-davinci.h> 36d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman#include <mach/serial.h> 37d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman#include <mach/mux.h> 38ec2a0833e5157fab6cac5f57a49b2f31eb418a39Arnd Bergmann#include <linux/platform_data/mtd-davinci.h> 39ec2a0833e5157fab6cac5f57a49b2f31eb418a39Arnd Bergmann#include <linux/platform_data/mmc-davinci.h> 40ec2a0833e5157fab6cac5f57a49b2f31eb418a39Arnd Bergmann#include <linux/platform_data/usb-davinci.h> 41ec2a0833e5157fab6cac5f57a49b2f31eb418a39Arnd Bergmann#include <linux/platform_data/mtd-davinci-aemif.h> 42d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 4339c6d2d1d743b8c925abae7043acc35e6cdc0051Manjunath Hadli#include "davinci.h" 4439c6d2d1d743b8c925abae7043acc35e6cdc0051Manjunath Hadli 45f6f97588a42373a0181215a5f70958756f2492c2Sekhar Nori#define DM644X_EVM_PHY_ID "davinci_mdio-0:01" 46d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman#define LXT971_PHY_ID (0x001378e2) 47d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman#define LXT971_PHY_MASK (0xfffffff0) 487c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 497bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct mtd_partition davinci_evm_norflash_partitions[] = { 50d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman /* bootloader (UBL, U-Boot, etc) in first 5 sectors */ 517c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman { 527c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .name = "bootloader", 537c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .offset = 0, 54d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .size = 5 * SZ_64K, 557c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .mask_flags = MTD_WRITEABLE, /* force read-only */ 567c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman }, 577c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman /* bootloader params in the next 1 sectors */ 587c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman { 597c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .name = "params", 607c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .offset = MTDPART_OFS_APPEND, 617c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .size = SZ_64K, 627c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .mask_flags = 0, 637c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman }, 647c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman /* kernel */ 657c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman { 667c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .name = "kernel", 677c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .offset = MTDPART_OFS_APPEND, 687c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .size = SZ_2M, 697c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .mask_flags = 0 707c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman }, 717c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman /* file system */ 727c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman { 737c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .name = "filesystem", 747c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .offset = MTDPART_OFS_APPEND, 757c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .size = MTDPART_SIZ_FULL, 767c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .mask_flags = 0 777c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman } 787c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman}; 797c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 807bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct physmap_flash_data davinci_evm_norflash_data = { 817c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .width = 2, 827bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .parts = davinci_evm_norflash_partitions, 837bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .nr_parts = ARRAY_SIZE(davinci_evm_norflash_partitions), 847c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman}; 857c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 867c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman/* NOTE: CFI probe will correctly detect flash part as 32M, but EMIF 877c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman * limits addresses to 16M, so using addresses past 16M will wrap */ 887bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct resource davinci_evm_norflash_resource = { 897034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .start = DM644X_ASYNC_EMIF_DATA_CE0_BASE, 907034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .end = DM644X_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1, 917c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .flags = IORESOURCE_MEM, 927c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman}; 937c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 947bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct platform_device davinci_evm_norflash_device = { 957c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .name = "physmap-flash", 967c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .id = 0, 977c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .dev = { 987bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .platform_data = &davinci_evm_norflash_data, 997c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman }, 1007c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .num_resources = 1, 1017bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .resource = &davinci_evm_norflash_resource, 1027bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 1037bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 1043e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell/* DM644x EVM includes a 64 MByte small-page NAND flash (16K blocks). 1053e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * It may used instead of the (default) NOR chip to boot, using TI's 1063e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * tools to install the secondary boot loader (UBL) and U-Boot. 1073e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell */ 10828552c2eae472a0a52d1cdb02eb32766c7f690e1Kevin Hilmanstatic struct mtd_partition davinci_evm_nandflash_partition[] = { 1093e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell /* Bootloader layout depends on whose u-boot is installed, but we 1103e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * can hide all the details. 1113e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * - block 0 for u-boot environment ... in mainline u-boot 1123e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * - block 1 for UBL (plus up to four backup copies in blocks 2..5) 1133e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * - blocks 6...? for u-boot 1143e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * - blocks 16..23 for u-boot environment ... in TI's u-boot 1153e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell */ 1163e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell { 1173e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .name = "bootloader", 1183e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .offset = 0, 1193e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .size = SZ_256K + SZ_128K, 1203e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .mask_flags = MTD_WRITEABLE, /* force read-only */ 1213e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell }, 1223e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell /* Kernel */ 123d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman { 1243e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .name = "kernel", 1253e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .offset = MTDPART_OFS_APPEND, 1263e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .size = SZ_4M, 1273e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .mask_flags = 0, 1283e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell }, 1293e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell /* File system (older GIT kernels started this on the 5MB mark) */ 1303e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell { 1313e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .name = "filesystem", 1323e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .offset = MTDPART_OFS_APPEND, 133d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .size = MTDPART_SIZ_FULL, 134d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .mask_flags = 0, 135d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman } 1363e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell /* A few blocks at end hold a flash BBT ... created by TI's CCS 1373e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * using flashwriter_nand.out, but ignored by TI's versions of 1383e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell * Linux and u-boot. We boot faster by using them. 1393e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell */ 140d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 1417bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 142fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Noristatic struct davinci_aemif_timing davinci_evm_nandflash_timing = { 143fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .wsetup = 20, 144fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .wstrobe = 40, 145fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .whold = 20, 146fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .rsetup = 10, 147fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .rstrobe = 40, 148fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .rhold = 10, 149fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .ta = 40, 150fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori}; 151fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori 152d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic struct davinci_nand_pdata davinci_evm_nandflash_data = { 153d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .parts = davinci_evm_nandflash_partition, 154d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .nr_parts = ARRAY_SIZE(davinci_evm_nandflash_partition), 155d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .ecc_mode = NAND_ECC_HW, 156acd36357edc08649e85ff15dc4ed62353c912effSekhar Nori .ecc_bits = 1, 157bb9ebd4e714385a2592a482845865ef2d58b2868Brian Norris .bbt_options = NAND_BBT_USE_FLASH, 158fe69c82d0862f54b1a5aa5ece046468b4e76b40cSekhar Nori .timing = &davinci_evm_nandflash_timing, 159d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 160d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 161d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic struct resource davinci_evm_nandflash_resource[] = { 162d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman { 1637034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .start = DM644X_ASYNC_EMIF_DATA_CE0_BASE, 1647034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .end = DM644X_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1, 165d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .flags = IORESOURCE_MEM, 166d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }, { 1677034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .start = DM644X_ASYNC_EMIF_CONTROL_BASE, 1687034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .end = DM644X_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1, 169d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .flags = IORESOURCE_MEM, 170d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }, 171d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 172d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 173d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic struct platform_device davinci_evm_nandflash_device = { 174d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .name = "davinci_nand", 175d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .id = 0, 176d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .dev = { 177d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .platform_data = &davinci_evm_nandflash_data, 178d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }, 179d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .num_resources = ARRAY_SIZE(davinci_evm_nandflash_resource), 180d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .resource = davinci_evm_nandflash_resource, 181d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 182d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 1833e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownellstatic u64 davinci_fb_dma_mask = DMA_BIT_MASK(32); 184d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 185d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic struct platform_device davinci_fb_device = { 186d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .name = "davincifb", 187d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .id = -1, 188d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .dev = { 189d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .dma_mask = &davinci_fb_dma_mask, 1903e9c18e1dc71b9a0fac302e2defe99d850ad3d79David Brownell .coherent_dma_mask = DMA_BIT_MASK(32), 191d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }, 192d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .num_resources = 0, 193d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 194d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 195314d7389608831202f5b445d9154e30161935630Manjunath Hadlistatic struct tvp514x_platform_data dm644xevm_tvp5146_pdata = { 196ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .clk_polarity = 0, 197ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .hs_polarity = 1, 198ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .vs_polarity = 1 199ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri}; 200ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri 201ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) 202ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri/* Inputs available at the TVP5146 */ 203314d7389608831202f5b445d9154e30161935630Manjunath Hadlistatic struct v4l2_input dm644xevm_tvp5146_inputs[] = { 204ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri { 205ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .index = 0, 206ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .name = "Composite", 207ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .type = V4L2_INPUT_TYPE_CAMERA, 208ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .std = TVP514X_STD_ALL, 209ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri }, 210ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri { 211ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .index = 1, 212ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .name = "S-Video", 213ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .type = V4L2_INPUT_TYPE_CAMERA, 214ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .std = TVP514X_STD_ALL, 215ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri }, 216ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri}; 217ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri 218ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri/* 219ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri * this is the route info for connecting each input to decoder 220ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri * ouput that goes to vpfe. There is a one to one correspondence 221ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri * with tvp5146_inputs 222ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri */ 223314d7389608831202f5b445d9154e30161935630Manjunath Hadlistatic struct vpfe_route dm644xevm_tvp5146_routes[] = { 224ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri { 225ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .input = INPUT_CVBS_VI2B, 226ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, 227ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri }, 228ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri { 229ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .input = INPUT_SVIDEO_VI2C_VI1C, 230ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, 231ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri }, 232ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri}; 233ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri 234314d7389608831202f5b445d9154e30161935630Manjunath Hadlistatic struct vpfe_subdev_info dm644xevm_vpfe_sub_devs[] = { 235ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri { 236ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .name = "tvp5146", 237ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .grp_id = 0, 238314d7389608831202f5b445d9154e30161935630Manjunath Hadli .num_inputs = ARRAY_SIZE(dm644xevm_tvp5146_inputs), 239314d7389608831202f5b445d9154e30161935630Manjunath Hadli .inputs = dm644xevm_tvp5146_inputs, 240314d7389608831202f5b445d9154e30161935630Manjunath Hadli .routes = dm644xevm_tvp5146_routes, 241ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .can_route = 1, 242ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .ccdc_if_params = { 243ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .if_type = VPFE_BT656, 244ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .hdpol = VPFE_PINPOL_POSITIVE, 245ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .vdpol = VPFE_PINPOL_POSITIVE, 246ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri }, 247ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .board_info = { 248ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri I2C_BOARD_INFO("tvp5146", 0x5d), 249314d7389608831202f5b445d9154e30161935630Manjunath Hadli .platform_data = &dm644xevm_tvp5146_pdata, 250ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri }, 251ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri }, 252ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri}; 253ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri 254314d7389608831202f5b445d9154e30161935630Manjunath Hadlistatic struct vpfe_config dm644xevm_capture_cfg = { 255314d7389608831202f5b445d9154e30161935630Manjunath Hadli .num_subdevs = ARRAY_SIZE(dm644xevm_vpfe_sub_devs), 256077639f443294a25b16e4040ca06a1611700a4aeVaibhav Hiremath .i2c_adapter_id = 1, 257314d7389608831202f5b445d9154e30161935630Manjunath Hadli .sub_devs = dm644xevm_vpfe_sub_devs, 258ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .card_name = "DM6446 EVM", 259ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri .ccdc = "DM6446 CCDC", 260ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri}; 261ab8e8df87421574fe053bf1770353af5b24a2bbbMuralidharan Karicheri 262d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic struct platform_device rtc_dev = { 263d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .name = "rtc_davinci_evm", 264d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .id = -1, 265d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 2667bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 26761aa07328d8e70d95a1e2325288df52a1e92a694Kevin Hilmanstatic struct snd_platform_data dm644x_evm_snd_data; 26825acf553aeed86f93f2cf39227b59fc6eb3e8c78Chaithrika U S 2697bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/*----------------------------------------------------------------------*/ 2707bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 2717bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/* 2727bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell * I2C GPIO expanders 2737bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell */ 2747bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 2757bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell#define PCF_Uxx_BASE(x) (DAVINCI_N_GPIO + ((x) * 8)) 2767bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 2777bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 2787bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/* U2 -- LEDs */ 2797bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 2807bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct gpio_led evm_leds[] = { 2817bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS8", .active_low = 1, 2827bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .default_trigger = "heartbeat", }, 2837bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS7", .active_low = 1, }, 2847bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS6", .active_low = 1, }, 2857bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS5", .active_low = 1, }, 2867bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS4", .active_low = 1, }, 2877bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS3", .active_low = 1, }, 2887bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS2", .active_low = 1, 2897bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .default_trigger = "mmc0", }, 2907bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { .name = "DS1", .active_low = 1, 2917bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .default_trigger = "ide-disk", }, 2927bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 2937bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 2947bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic const struct gpio_led_platform_data evm_led_data = { 2957bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .num_leds = ARRAY_SIZE(evm_leds), 2967bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .leds = evm_leds, 2977bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 2987bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 2997bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct platform_device *evm_led_dev; 3007bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3017bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic int 3027bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellevm_led_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) 3037bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 3047bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell struct gpio_led *leds = evm_leds; 3057bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell int status; 3067bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3077bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell while (ngpio--) { 3087bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell leds->gpio = gpio++; 3097bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell leds++; 3107bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell } 3117bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3127bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* what an extremely annoying way to be forced to handle 3137bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell * device unregistration ... 3147bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell */ 3157bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell evm_led_dev = platform_device_alloc("leds-gpio", 0); 3167bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell platform_device_add_data(evm_led_dev, 3177bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell &evm_led_data, sizeof evm_led_data); 3187bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3197bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell evm_led_dev->dev.parent = &client->dev; 3207bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell status = platform_device_add(evm_led_dev); 3217bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell if (status < 0) { 3227bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell platform_device_put(evm_led_dev); 3237bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell evm_led_dev = NULL; 3247bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell } 3257bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell return status; 3267bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 3277bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3287bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic int 3297bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellevm_led_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) 3307bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 3317bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell if (evm_led_dev) { 3327bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell platform_device_unregister(evm_led_dev); 3337bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell evm_led_dev = NULL; 3347bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell } 3357bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell return 0; 3367bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 3377bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3387bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct pcf857x_platform_data pcf_data_u2 = { 3397bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .gpio_base = PCF_Uxx_BASE(0), 3407bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .setup = evm_led_setup, 3417bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .teardown = evm_led_teardown, 3427bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 3437bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3447bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3457bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/* U18 - A/V clock generator and user switch */ 3467bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3477bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic int sw_gpio; 3487bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3497bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic ssize_t 3507bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellsw_show(struct device *d, struct device_attribute *a, char *buf) 3517bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 3527bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell char *s = gpio_get_value_cansleep(sw_gpio) ? "on\n" : "off\n"; 3537bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3547bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell strcpy(buf, s); 3557bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell return strlen(s); 3567bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 3577bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3587bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic DEVICE_ATTR(user_sw, S_IRUGO, sw_show, NULL); 3597bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3607bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic int 3617bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellevm_u18_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) 3627bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 3637bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell int status; 3647bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3657bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* export dip switch option */ 3667bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell sw_gpio = gpio + 7; 3677bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell status = gpio_request(sw_gpio, "user_sw"); 3687bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell if (status == 0) 3697bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell status = gpio_direction_input(sw_gpio); 3707bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell if (status == 0) 3717bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell status = device_create_file(&client->dev, &dev_attr_user_sw); 3727bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell else 3737bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(sw_gpio); 3747bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell if (status != 0) 3757bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell sw_gpio = -EINVAL; 3767bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3777bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* audio PLL: 48 kHz (vs 44.1 or 32), single rate (vs double) */ 3787bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 3, "pll_fs2"); 3797bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 3, 0); 3807bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3817bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 2, "pll_fs1"); 3827bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 2, 0); 3837bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3847bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 1, "pll_sr"); 3857bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 1, 0); 3867bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3877bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell return 0; 3887bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 3897bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3907bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic int 3917bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellevm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) 3927bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 3937bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 1); 3947bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 2); 3957bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 3); 3967bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 3977bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell if (sw_gpio > 0) { 3987bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell device_remove_file(&client->dev, &dev_attr_user_sw); 3997bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(sw_gpio); 4007bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell } 4017bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell return 0; 4027bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 4037bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4047bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct pcf857x_platform_data pcf_data_u18 = { 4057bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .gpio_base = PCF_Uxx_BASE(1), 4067bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .n_latch = (1 << 3) | (1 << 2) | (1 << 1), 4077bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .setup = evm_u18_setup, 4087bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .teardown = evm_u18_teardown, 4097c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman}; 4107c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 4117bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4127bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/* U35 - various I/O signals used to manage USB, CF, ATA, etc */ 4137bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4147bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic int 4157bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellevm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) 4167bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 4177bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* p0 = nDRV_VBUS (initial: don't supply it) */ 4187bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 0, "nDRV_VBUS"); 4197bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 0, 1); 4207bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4217bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* p1 = VDDIMX_EN */ 4227bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 1, "VDDIMX_EN"); 4237bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 1, 1); 4247bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4257bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* p2 = VLYNQ_EN */ 4267bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 2, "VLYNQ_EN"); 4277bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 2, 1); 4287bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4297bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* p3 = n3V3_CF_RESET (initial: stay in reset) */ 4307bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 3, "nCF_RESET"); 4317bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 3, 0); 4327bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4337bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* (p4 unused) */ 4347bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4357bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* p5 = 1V8_WLAN_RESET (initial: stay in reset) */ 4367bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 5, "WLAN_RESET"); 4377bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 5, 1); 4387bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4397bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* p6 = nATA_SEL (initial: select) */ 4407bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 6, "nATA_SEL"); 4417bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 6, 0); 4427bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4437bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell /* p7 = nCF_SEL (initial: deselect) */ 4447bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_request(gpio + 7, "nCF_SEL"); 4457bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_direction_output(gpio + 7, 1); 4467bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4477bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell return 0; 4487bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 4497bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4507bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic int 4517bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellevm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) 4527bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 4537bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 7); 4547bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 6); 4557bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 5); 4567bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 3); 4577bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 2); 4587bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 1); 4597bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell gpio_free(gpio + 0); 4607bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell return 0; 4617bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 4627bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4637bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct pcf857x_platform_data pcf_data_u35 = { 4647bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .gpio_base = PCF_Uxx_BASE(2), 4657bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .setup = evm_u35_setup, 4667bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .teardown = evm_u35_teardown, 4677bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 4687bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4697bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/*----------------------------------------------------------------------*/ 4707bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 4717bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/* Most of this EEPROM is unused, but U-Boot uses some data: 4727bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell * - 0x7f00, 6 bytes Ethernet Address 4737bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell * - 0x0039, 1 byte NTSC vs PAL (bit 0x80 == PAL) 4747bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell * - ... newer boards may have more 4757bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell */ 476d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 4777bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct at24_platform_data eeprom_info = { 4787bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .byte_len = (256*1024) / 8, 4797bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .page_size = 64, 4807bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .flags = AT24_FLAG_ADDR16, 481b14dc0f9942a9c318c6c49f29511d88b3642e2d0Mark A. Greer .setup = davinci_get_mac_addr, 482b14dc0f9942a9c318c6c49f29511d88b3642e2d0Mark A. Greer .context = (void *)0x7f00, 483d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 484d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 485d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman/* 486d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * MSP430 supports RTC, card detection, input from IR remote, and 487d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * a bit more. It triggers interrupts on GPIO(7) from pressing 488d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * buttons on the IR remote, and for card detect switches. 489d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman */ 490d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic struct i2c_client *dm6446evm_msp; 491d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 492d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic int dm6446evm_msp_probe(struct i2c_client *client, 493d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman const struct i2c_device_id *id) 494d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman{ 495d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman dm6446evm_msp = client; 496d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman return 0; 497d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman} 498d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 499d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic int dm6446evm_msp_remove(struct i2c_client *client) 500d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman{ 501d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman dm6446evm_msp = NULL; 502d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman return 0; 503d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman} 504d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 505d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic const struct i2c_device_id dm6446evm_msp_ids[] = { 506d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman { "dm6446evm_msp", 0, }, 507d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman { /* end of list */ }, 508d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 509d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 510d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic struct i2c_driver dm6446evm_msp_driver = { 511d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .driver.name = "dm6446evm_msp", 512d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .id_table = dm6446evm_msp_ids, 513d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .probe = dm6446evm_msp_probe, 514d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .remove = dm6446evm_msp_remove, 5157bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 5167bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 517d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic int dm6444evm_msp430_get_pins(void) 518d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman{ 519d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman static const char txbuf[2] = { 2, 4, }; 520d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman char buf[4]; 521d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman struct i2c_msg msg[2] = { 522d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman { 523d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .flags = 0, 524d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .len = 2, 525d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .buf = (void __force *)txbuf, 526d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }, 527d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman { 528d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .flags = I2C_M_RD, 529d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .len = 4, 530d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman .buf = buf, 531d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }, 532d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }; 533d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman int status; 534d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 535d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman if (!dm6446evm_msp) 536d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman return -ENXIO; 537d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 5389ad90238bf4faa488680cf6dddf0d2b137960cc8Wei Yongjun msg[0].addr = dm6446evm_msp->addr; 5399ad90238bf4faa488680cf6dddf0d2b137960cc8Wei Yongjun msg[1].addr = dm6446evm_msp->addr; 5409ad90238bf4faa488680cf6dddf0d2b137960cc8Wei Yongjun 541d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman /* Command 4 == get input state, returns port 2 and port3 data 542d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * S Addr W [A] len=2 [A] cmd=4 [A] 543d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * RS Addr R [A] [len=4] A [cmd=4] A [port2] A [port3] N P 544d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman */ 545d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman status = i2c_transfer(dm6446evm_msp->adapter, msg, 2); 546d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman if (status < 0) 547d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman return status; 548d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 549d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman dev_dbg(&dm6446evm_msp->dev, 550d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman "PINS: %02x %02x %02x %02x\n", 551d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman buf[0], buf[1], buf[2], buf[3]); 552d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 553d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman return (buf[3] << 8) | buf[2]; 554d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman} 555d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 5562dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilmanstatic int dm6444evm_mmc_get_cd(int module) 5572dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman{ 5582dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman int status = dm6444evm_msp430_get_pins(); 5592dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 5602dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman return (status < 0) ? status : !(status & BIT(1)); 5612dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman} 5622dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 5632dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilmanstatic int dm6444evm_mmc_get_ro(int module) 5642dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman{ 5652dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman int status = dm6444evm_msp430_get_pins(); 5662dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 5672dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman return (status < 0) ? status : status & BIT(6 + 8); 5682dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman} 5692dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 5702dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilmanstatic struct davinci_mmc_config dm6446evm_mmc_config = { 5712dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .get_cd = dm6444evm_mmc_get_cd, 5722dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .get_ro = dm6444evm_mmc_get_ro, 5732dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .wires = 4, 5742dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman}; 5752dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 5767bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct i2c_board_info __initdata i2c_info[] = { 5777bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { 578d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman I2C_BOARD_INFO("dm6446evm_msp", 0x23), 579d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman }, 580d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman { 5817bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell I2C_BOARD_INFO("pcf8574", 0x38), 5827bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .platform_data = &pcf_data_u2, 5837bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell }, 5847bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { 5857bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell I2C_BOARD_INFO("pcf8574", 0x39), 5867bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .platform_data = &pcf_data_u18, 5877bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell }, 5887bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { 5897bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell I2C_BOARD_INFO("pcf8574", 0x3a), 5907bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .platform_data = &pcf_data_u35, 5917bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell }, 5927bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell { 5937bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell I2C_BOARD_INFO("24c256", 0x50), 5947bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .platform_data = &eeprom_info, 5957bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell }, 5961a7ff8ff6eebfa732ca2abe00a0878136bfb2d01Chaithrika U S { 5971a7ff8ff6eebfa732ca2abe00a0878136bfb2d01Chaithrika U S I2C_BOARD_INFO("tlv320aic33", 0x1b), 5981a7ff8ff6eebfa732ca2abe00a0878136bfb2d01Chaithrika U S }, 5997bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 6007bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 6017bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell/* The msp430 uses a slow bitbanged I2C implementation (ergo 20 KHz), 6027bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell * which requires 100 usec of idle bus after i2c writes sent to it. 6037bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell */ 6047bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic struct davinci_i2c_platform_data i2c_pdata = { 6057bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .bus_freq = 20 /* kHz */, 6067bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell .bus_delay = 100 /* usec */, 60700642f6616a0d1893ab1dcfec4d833210f310e95Philby John .sda_pin = 44, 60800642f6616a0d1893ab1dcfec4d833210f310e95Philby John .scl_pin = 43, 6097bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell}; 6107bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 6117bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownellstatic void __init evm_init_i2c(void) 6127bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell{ 6137bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell davinci_init_i2c(&i2c_pdata); 614d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman i2c_add_driver(&dm6446evm_msp_driver); 6157bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info)); 6167bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell} 6177bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell 618d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli#define VENC_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) 619d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli 620d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli/* venc standard timings */ 621d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadlistatic struct vpbe_enc_mode_info dm644xevm_enc_std_timing[] = { 622d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli { 623d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .name = "ntsc", 624d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .timings_type = VPBE_ENC_STD, 62589cdbba84157a41404ee2de30142d839596eece9Lad, Prabhakar .std_id = V4L2_STD_NTSC, 626d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .interlaced = 1, 627d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .xres = 720, 628d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .yres = 480, 629d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .aspect = {11, 10}, 630d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .fps = {30000, 1001}, 631d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .left_margin = 0x79, 632d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .upper_margin = 0x10, 633d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 634d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli { 635d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .name = "pal", 636d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .timings_type = VPBE_ENC_STD, 63789cdbba84157a41404ee2de30142d839596eece9Lad, Prabhakar .std_id = V4L2_STD_PAL, 638d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .interlaced = 1, 639d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .xres = 720, 640d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .yres = 576, 641d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .aspect = {54, 59}, 642d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .fps = {25, 1}, 643d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .left_margin = 0x7e, 644d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .upper_margin = 0x16, 645d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 646d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli}; 647d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli 648d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli/* venc dv preset timings */ 649d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadlistatic struct vpbe_enc_mode_info dm644xevm_enc_preset_timing[] = { 650d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli { 651d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .name = "480p59_94", 652ef2d41b19b8100ce63eabba9ee87953aa685921aHans Verkuil .timings_type = VPBE_ENC_DV_TIMINGS, 653368640827c0be2582d836cd74ae2cff03e6bfc02Hans Verkuil .dv_timings = V4L2_DV_BT_CEA_720X480P59_94, 654d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .interlaced = 0, 655d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .xres = 720, 656d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .yres = 480, 657d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .aspect = {1, 1}, 658d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .fps = {5994, 100}, 659d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .left_margin = 0x80, 660d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .upper_margin = 0x20, 661d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 662d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli { 663d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .name = "576p50", 664ef2d41b19b8100ce63eabba9ee87953aa685921aHans Verkuil .timings_type = VPBE_ENC_DV_TIMINGS, 665368640827c0be2582d836cd74ae2cff03e6bfc02Hans Verkuil .dv_timings = V4L2_DV_BT_CEA_720X576P50, 666d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .interlaced = 0, 667d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .xres = 720, 668d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .yres = 576, 669d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .aspect = {1, 1}, 670d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .fps = {50, 1}, 671d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .left_margin = 0x7e, 672d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .upper_margin = 0x30, 673d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 674d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli}; 675d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli 676d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli/* 677d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli * The outputs available from VPBE + encoders. Keep the order same 678d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli * as that of encoders. First those from venc followed by that from 679d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli * encoders. Index in the output refers to index on a particular encoder. 680d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli * Driver uses this index to pass it to encoder when it supports more 681d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli * than one output. Userspace applications use index of the array to 682d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli * set an output. 683d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli */ 684d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadlistatic struct vpbe_output dm644xevm_vpbe_outputs[] = { 685d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli { 686d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .output = { 687d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .index = 0, 688d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .name = "Composite", 689d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .type = V4L2_OUTPUT_TYPE_ANALOG, 690d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .std = VENC_STD_ALL, 691d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .capabilities = V4L2_OUT_CAP_STD, 692d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 693caff80c35f923806b7e5ef312dce41663b5e99b9Lad, Prabhakar .subdev_name = DM644X_VPBE_VENC_SUBDEV_NAME, 694d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .default_mode = "ntsc", 695d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .num_modes = ARRAY_SIZE(dm644xevm_enc_std_timing), 696d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .modes = dm644xevm_enc_std_timing, 697d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 698d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli { 699d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .output = { 700d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .index = 1, 701d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .name = "Component", 702d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .type = V4L2_OUTPUT_TYPE_ANALOG, 703e32087bcc4daa29fd30cf7742ef9b522625a1690Lad, Prabhakar .capabilities = V4L2_OUT_CAP_DV_TIMINGS, 704d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 705caff80c35f923806b7e5ef312dce41663b5e99b9Lad, Prabhakar .subdev_name = DM644X_VPBE_VENC_SUBDEV_NAME, 706d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .default_mode = "480p59_94", 707d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .num_modes = ARRAY_SIZE(dm644xevm_enc_preset_timing), 708d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .modes = dm644xevm_enc_preset_timing, 709d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 710d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli}; 711d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli 712d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadlistatic struct vpbe_config dm644xevm_display_cfg = { 713d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .module_name = "dm644x-vpbe-display", 714d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .i2c_adapter_id = 1, 715d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .osd = { 716caff80c35f923806b7e5ef312dce41663b5e99b9Lad, Prabhakar .module_name = DM644X_VPBE_OSD_SUBDEV_NAME, 717d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 718d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .venc = { 719caff80c35f923806b7e5ef312dce41663b5e99b9Lad, Prabhakar .module_name = DM644X_VPBE_VENC_SUBDEV_NAME, 720d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli }, 721d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .num_outputs = ARRAY_SIZE(dm644xevm_vpbe_outputs), 722d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli .outputs = dm644xevm_vpbe_outputs, 723d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli}; 724d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli 7257c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilmanstatic struct platform_device *davinci_evm_devices[] __initdata = { 726d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman &davinci_fb_device, 727d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman &rtc_dev, 728d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman}; 729d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 7307c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilmanstatic void __init 7317c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilmandavinci_evm_map_io(void) 7327c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman{ 733d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman dm644x_init(); 7347c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman} 7357c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 736d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic int davinci_phy_fixup(struct phy_device *phydev) 7377c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman{ 738d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman unsigned int control; 739d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman /* CRITICAL: Fix for increasing PHY signal drive strength for 740d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * TX lockup issue. On DaVinci EVM, the Intel LXT971 PHY 741d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * signal strength was low causing TX to fail randomly. The 742d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * fix is to Set bit 11 (Increased MII drive strength) of PHY 743d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman * register 26 (Digital Config register) on this phy. */ 744d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman control = phy_read(phydev, 26); 745d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman phy_write(phydev, 26, (control | 0x800)); 746d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman return 0; 747d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman} 748d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 749a0a56db9771f57667daff41cfa2546dad1abe6d9Lad, Prabhakar#define HAS_ATA IS_ENABLED(CONFIG_BLK_DEV_PALMCHIP_BK3710) 750a0a56db9771f57667daff41cfa2546dad1abe6d9Lad, Prabhakar 751a0a56db9771f57667daff41cfa2546dad1abe6d9Lad, Prabhakar#define HAS_NOR IS_ENABLED(CONFIG_MTD_PHYSMAP) 752a0a56db9771f57667daff41cfa2546dad1abe6d9Lad, Prabhakar 753a0a56db9771f57667daff41cfa2546dad1abe6d9Lad, Prabhakar#define HAS_NAND IS_ENABLED(CONFIG_MTD_NAND_DAVINCI) 7547c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 755d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilmanstatic __init void davinci_evm_init(void) 756d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman{ 757834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash int ret; 758d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman struct clk *aemif_clk; 759972412b648dcf0c4303dca7e515d5c24ce3cd1d5Mark A. Greer struct davinci_soc_info *soc_info = &davinci_soc_info; 760d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 761834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash ret = dm644x_gpio_register(); 762834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash if (ret) 763834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash pr_warn("%s: GPIO init failed: %d\n", __func__, ret); 764834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash 765d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman aemif_clk = clk_get(NULL, "aemif"); 766b6f1ffed9d8a830ab94fd3fc6182e2fc8c77cba0m-karicheri clk_prepare_enable(aemif_clk); 767d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 768d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman if (HAS_ATA) { 769d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman if (HAS_NAND || HAS_NOR) 770d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman pr_warning("WARNING: both IDE and Flash are " 771d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman "enabled, but they share AEMIF pins.\n" 772d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman "\tDisable IDE for NAND/NOR support.\n"); 7737a9978a1e2225507025a8b90b4289d506a416bd9Sergei Shtylyov davinci_init_ide(); 774d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman } else if (HAS_NAND || HAS_NOR) { 775d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman davinci_cfg_reg(DM644X_HPIEN_DISABLE); 776d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman davinci_cfg_reg(DM644X_ATAEN_DISABLE); 777d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 778d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman /* only one device will be jumpered and detected */ 779d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman if (HAS_NAND) { 780d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman platform_device_register(&davinci_evm_nandflash_device); 78167f5185cad24b3c3d9ab07508dfcab55cdab02deIvan Khoronzhuk 78267f5185cad24b3c3d9ab07508dfcab55cdab02deIvan Khoronzhuk if (davinci_aemif_setup(&davinci_evm_nandflash_device)) 78367f5185cad24b3c3d9ab07508dfcab55cdab02deIvan Khoronzhuk pr_warn("%s: Cannot configure AEMIF.\n", 78467f5185cad24b3c3d9ab07508dfcab55cdab02deIvan Khoronzhuk __func__); 78567f5185cad24b3c3d9ab07508dfcab55cdab02deIvan Khoronzhuk 786d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman evm_leds[7].default_trigger = "nand-disk"; 787d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman if (HAS_NOR) 788d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman pr_warning("WARNING: both NAND and NOR flash " 789d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman "are enabled; disable one of them.\n"); 790d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman } else if (HAS_NOR) 791d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman platform_device_register(&davinci_evm_norflash_device); 792d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman } 793d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 7947c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman platform_add_devices(davinci_evm_devices, 7957c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman ARRAY_SIZE(davinci_evm_devices)); 7967bff3c4ce44ea48f50dc47a5994454984bd08c59David Brownell evm_init_i2c(); 797d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 7982dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman davinci_setup_mmc(0, &dm6446evm_mmc_config); 799d5be5f549c9d619fe3e16160c453a72f718284deManjunath Hadli dm644x_init_video(&dm644xevm_capture_cfg, &dm644xevm_display_cfg); 8002dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 801fcf7157ba3b50e57653544421250ebbe81a33d81Manjunathappa, Prakash davinci_serial_init(dm644x_serial_device); 80225acf553aeed86f93f2cf39227b59fc6eb3e8c78Chaithrika U S dm644x_init_asp(&dm644x_evm_snd_data); 803d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin Hilman 80460d97a840175d3becb2e6de36537a5cdfc0ec3a9Sergei Shtylyov /* irlml6401 switches over 1A, in under 8 msec */ 80560d97a840175d3becb2e6de36537a5cdfc0ec3a9Sergei Shtylyov davinci_setup_usb(1000, 8); 80660d97a840175d3becb2e6de36537a5cdfc0ec3a9Sergei Shtylyov 8074bbef1da789cbd89f57734975e6a211a42b382f5Arnd Bergmann if (IS_BUILTIN(CONFIG_PHYLIB)) { 8084bbef1da789cbd89f57734975e6a211a42b382f5Arnd Bergmann soc_info->emac_pdata->phy_id = DM644X_EVM_PHY_ID; 8094bbef1da789cbd89f57734975e6a211a42b382f5Arnd Bergmann /* Register the fixup for PHY on DaVinci */ 8104bbef1da789cbd89f57734975e6a211a42b382f5Arnd Bergmann phy_register_fixup_for_uid(LXT971_PHY_ID, LXT971_PHY_MASK, 8114bbef1da789cbd89f57734975e6a211a42b382f5Arnd Bergmann davinci_phy_fixup); 8124bbef1da789cbd89f57734975e6a211a42b382f5Arnd Bergmann } 8137c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman} 8147c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman 815d0e47fba054a55e0066c6ae2c807d98d086af5a9Kevin HilmanMACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM") 8167c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman /* Maintainer: MontaVista Software <source@mvista.com> */ 817e7e5601458a49fdcb1b49b4696e7530c25f86f25Nicolas Pitre .atag_offset = 0x100, 8187c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .map_io = davinci_evm_map_io, 819bd808947040ba53b2b0e52dde598a9414fb27bbaCyril Chemparathy .init_irq = davinci_irq_init, 8206bb27d7349db51b50c40534710fe164ca0d58902Stephen Warren .init_time = davinci_timer_init, 8217c6337e225364870e9bf02a3ae277d9fdea483f8Kevin Hilman .init_machine = davinci_evm_init, 8223aa3e8407ae9023c5ff59bf5c81fc2553c31eb70Shawn Guo .init_late = davinci_init_late, 823f68deabf3dc6c13fb80ec28575d0153c59f7ecceNicolas Pitre .dma_zone_size = SZ_128M, 824c6121ddd1f75278ab77504af2914d07831558672Sekhar Nori .restart = davinci_restart, 8257c6337e225364870e9bf02a3ae277d9fdea483f8Kevin HilmanMACHINE_END 826