| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * TI DaVinci EVM board support | 
|  | 3 | * | 
|  | 4 | * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> | 
|  | 5 | * | 
|  | 6 | * 2007 (c) MontaVista Software, Inc. This file is licensed under | 
|  | 7 | * the terms of the GNU General Public License version 2. This program | 
|  | 8 | * is licensed "as is" without any warranty of any kind, whether express | 
|  | 9 | * or implied. | 
|  | 10 | */ | 
|  | 11 | #include <linux/kernel.h> | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 12 | #include <linux/init.h> | 
|  | 13 | #include <linux/dma-mapping.h> | 
|  | 14 | #include <linux/platform_device.h> | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 15 | #include <linux/gpio.h> | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 16 | #include <linux/i2c.h> | 
|  | 17 | #include <linux/i2c/pcf857x.h> | 
|  | 18 | #include <linux/i2c/at24.h> | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 19 | #include <linux/mtd/mtd.h> | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 20 | #include <linux/mtd/nand.h> | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 21 | #include <linux/mtd/partitions.h> | 
|  | 22 | #include <linux/mtd/physmap.h> | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 23 | #include <linux/phy.h> | 
|  | 24 | #include <linux/clk.h> | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 25 | #include <linux/videodev2.h> | 
| Hans Verkuil | 3686408 | 2012-10-01 11:39:46 -0300 | [diff] [blame] | 26 | #include <linux/v4l2-dv-timings.h> | 
| Paul Gortmaker | dc28094 | 2011-07-31 16:17:29 -0400 | [diff] [blame] | 27 | #include <linux/export.h> | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 28 |  | 
|  | 29 | #include <media/tvp514x.h> | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 30 |  | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 31 | #include <asm/mach-types.h> | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 32 | #include <asm/mach/arch.h> | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 33 |  | 
| Russell King | a09e64f | 2008-08-05 16:14:15 +0100 | [diff] [blame] | 34 | #include <mach/common.h> | 
| Arnd Bergmann | ec2a083 | 2012-08-24 15:11:34 +0200 | [diff] [blame] | 35 | #include <linux/platform_data/i2c-davinci.h> | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 36 | #include <mach/serial.h> | 
|  | 37 | #include <mach/mux.h> | 
| Arnd Bergmann | ec2a083 | 2012-08-24 15:11:34 +0200 | [diff] [blame] | 38 | #include <linux/platform_data/mtd-davinci.h> | 
|  | 39 | #include <linux/platform_data/mmc-davinci.h> | 
|  | 40 | #include <linux/platform_data/usb-davinci.h> | 
|  | 41 | #include <linux/platform_data/mtd-davinci-aemif.h> | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 42 |  | 
| Manjunath Hadli | 39c6d2d | 2011-12-21 19:13:35 +0530 | [diff] [blame] | 43 | #include "davinci.h" | 
|  | 44 |  | 
| Sekhar Nori | f6f9758 | 2012-01-21 02:48:17 +0530 | [diff] [blame] | 45 | #define DM644X_EVM_PHY_ID		"davinci_mdio-0:01" | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 46 | #define LXT971_PHY_ID	(0x001378e2) | 
|  | 47 | #define LXT971_PHY_MASK	(0xfffffff0) | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 48 |  | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 49 | static struct mtd_partition davinci_evm_norflash_partitions[] = { | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 50 | /* bootloader (UBL, U-Boot, etc) in first 5 sectors */ | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 51 | { | 
|  | 52 | .name		= "bootloader", | 
|  | 53 | .offset		= 0, | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 54 | .size		= 5 * SZ_64K, | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 55 | .mask_flags	= MTD_WRITEABLE, /* force read-only */ | 
|  | 56 | }, | 
|  | 57 | /* bootloader params in the next 1 sectors */ | 
|  | 58 | { | 
|  | 59 | .name		= "params", | 
|  | 60 | .offset		= MTDPART_OFS_APPEND, | 
|  | 61 | .size		= SZ_64K, | 
|  | 62 | .mask_flags	= 0, | 
|  | 63 | }, | 
|  | 64 | /* kernel */ | 
|  | 65 | { | 
|  | 66 | .name		= "kernel", | 
|  | 67 | .offset		= MTDPART_OFS_APPEND, | 
|  | 68 | .size		= SZ_2M, | 
|  | 69 | .mask_flags	= 0 | 
|  | 70 | }, | 
|  | 71 | /* file system */ | 
|  | 72 | { | 
|  | 73 | .name		= "filesystem", | 
|  | 74 | .offset		= MTDPART_OFS_APPEND, | 
|  | 75 | .size		= MTDPART_SIZ_FULL, | 
|  | 76 | .mask_flags	= 0 | 
|  | 77 | } | 
|  | 78 | }; | 
|  | 79 |  | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 80 | static struct physmap_flash_data davinci_evm_norflash_data = { | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 81 | .width		= 2, | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 82 | .parts		= davinci_evm_norflash_partitions, | 
|  | 83 | .nr_parts	= ARRAY_SIZE(davinci_evm_norflash_partitions), | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 84 | }; | 
|  | 85 |  | 
|  | 86 | /* NOTE: CFI probe will correctly detect flash part as 32M, but EMIF | 
|  | 87 | * limits addresses to 16M, so using addresses past 16M will wrap */ | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 88 | static struct resource davinci_evm_norflash_resource = { | 
| Sergei Shtylyov | 7034217 | 2010-04-16 21:29:11 +0400 | [diff] [blame] | 89 | .start		= DM644X_ASYNC_EMIF_DATA_CE0_BASE, | 
|  | 90 | .end		= DM644X_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1, | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 91 | .flags		= IORESOURCE_MEM, | 
|  | 92 | }; | 
|  | 93 |  | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 94 | static struct platform_device davinci_evm_norflash_device = { | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 95 | .name		= "physmap-flash", | 
|  | 96 | .id		= 0, | 
|  | 97 | .dev		= { | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 98 | .platform_data	= &davinci_evm_norflash_data, | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 99 | }, | 
|  | 100 | .num_resources	= 1, | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 101 | .resource	= &davinci_evm_norflash_resource, | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 102 | }; | 
|  | 103 |  | 
| David Brownell | 3e9c18e | 2009-04-15 14:19:21 -0500 | [diff] [blame] | 104 | /* DM644x EVM includes a 64 MByte small-page NAND flash (16K blocks). | 
|  | 105 | * It may used instead of the (default) NOR chip to boot, using TI's | 
|  | 106 | * tools to install the secondary boot loader (UBL) and U-Boot. | 
|  | 107 | */ | 
| Kevin Hilman | 28552c2 | 2010-02-25 15:36:38 -0800 | [diff] [blame] | 108 | static struct mtd_partition davinci_evm_nandflash_partition[] = { | 
| David Brownell | 3e9c18e | 2009-04-15 14:19:21 -0500 | [diff] [blame] | 109 | /* Bootloader layout depends on whose u-boot is installed, but we | 
|  | 110 | * can hide all the details. | 
|  | 111 | *  - block 0 for u-boot environment ... in mainline u-boot | 
|  | 112 | *  - block 1 for UBL (plus up to four backup copies in blocks 2..5) | 
|  | 113 | *  - blocks 6...? for u-boot | 
|  | 114 | *  - blocks 16..23 for u-boot environment ... in TI's u-boot | 
|  | 115 | */ | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 116 | { | 
| David Brownell | 3e9c18e | 2009-04-15 14:19:21 -0500 | [diff] [blame] | 117 | .name		= "bootloader", | 
|  | 118 | .offset		= 0, | 
|  | 119 | .size		= SZ_256K + SZ_128K, | 
|  | 120 | .mask_flags	= MTD_WRITEABLE,	/* force read-only */ | 
|  | 121 | }, | 
|  | 122 | /* Kernel */ | 
|  | 123 | { | 
|  | 124 | .name		= "kernel", | 
|  | 125 | .offset		= MTDPART_OFS_APPEND, | 
|  | 126 | .size		= SZ_4M, | 
|  | 127 | .mask_flags	= 0, | 
|  | 128 | }, | 
|  | 129 | /* File system (older GIT kernels started this on the 5MB mark) */ | 
|  | 130 | { | 
|  | 131 | .name		= "filesystem", | 
|  | 132 | .offset		= MTDPART_OFS_APPEND, | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 133 | .size		= MTDPART_SIZ_FULL, | 
|  | 134 | .mask_flags	= 0, | 
|  | 135 | } | 
| David Brownell | 3e9c18e | 2009-04-15 14:19:21 -0500 | [diff] [blame] | 136 | /* A few blocks at end hold a flash BBT ... created by TI's CCS | 
|  | 137 | * using flashwriter_nand.out, but ignored by TI's versions of | 
|  | 138 | * Linux and u-boot.  We boot faster by using them. | 
|  | 139 | */ | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 140 | }; | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 141 |  | 
| Sekhar Nori | fe69c82 | 2010-08-09 15:46:37 +0530 | [diff] [blame] | 142 | static struct davinci_aemif_timing davinci_evm_nandflash_timing = { | 
|  | 143 | .wsetup		= 20, | 
|  | 144 | .wstrobe	= 40, | 
|  | 145 | .whold		= 20, | 
|  | 146 | .rsetup		= 10, | 
|  | 147 | .rstrobe	= 40, | 
|  | 148 | .rhold		= 10, | 
|  | 149 | .ta		= 40, | 
|  | 150 | }; | 
|  | 151 |  | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 152 | static struct davinci_nand_pdata davinci_evm_nandflash_data = { | 
|  | 153 | .parts		= davinci_evm_nandflash_partition, | 
|  | 154 | .nr_parts	= ARRAY_SIZE(davinci_evm_nandflash_partition), | 
|  | 155 | .ecc_mode	= NAND_ECC_HW, | 
| Brian Norris | bb9ebd4 | 2011-05-31 16:31:23 -0700 | [diff] [blame] | 156 | .bbt_options	= NAND_BBT_USE_FLASH, | 
| Sekhar Nori | fe69c82 | 2010-08-09 15:46:37 +0530 | [diff] [blame] | 157 | .timing		= &davinci_evm_nandflash_timing, | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 158 | }; | 
|  | 159 |  | 
|  | 160 | static struct resource davinci_evm_nandflash_resource[] = { | 
|  | 161 | { | 
| Sergei Shtylyov | 7034217 | 2010-04-16 21:29:11 +0400 | [diff] [blame] | 162 | .start		= DM644X_ASYNC_EMIF_DATA_CE0_BASE, | 
|  | 163 | .end		= DM644X_ASYNC_EMIF_DATA_CE0_BASE + SZ_16M - 1, | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 164 | .flags		= IORESOURCE_MEM, | 
|  | 165 | }, { | 
| Sergei Shtylyov | 7034217 | 2010-04-16 21:29:11 +0400 | [diff] [blame] | 166 | .start		= DM644X_ASYNC_EMIF_CONTROL_BASE, | 
|  | 167 | .end		= DM644X_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1, | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 168 | .flags		= IORESOURCE_MEM, | 
|  | 169 | }, | 
|  | 170 | }; | 
|  | 171 |  | 
|  | 172 | static struct platform_device davinci_evm_nandflash_device = { | 
|  | 173 | .name		= "davinci_nand", | 
|  | 174 | .id		= 0, | 
|  | 175 | .dev		= { | 
|  | 176 | .platform_data	= &davinci_evm_nandflash_data, | 
|  | 177 | }, | 
|  | 178 | .num_resources	= ARRAY_SIZE(davinci_evm_nandflash_resource), | 
|  | 179 | .resource	= davinci_evm_nandflash_resource, | 
|  | 180 | }; | 
|  | 181 |  | 
| David Brownell | 3e9c18e | 2009-04-15 14:19:21 -0500 | [diff] [blame] | 182 | static u64 davinci_fb_dma_mask = DMA_BIT_MASK(32); | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 183 |  | 
|  | 184 | static struct platform_device davinci_fb_device = { | 
|  | 185 | .name		= "davincifb", | 
|  | 186 | .id		= -1, | 
|  | 187 | .dev = { | 
|  | 188 | .dma_mask		= &davinci_fb_dma_mask, | 
| David Brownell | 3e9c18e | 2009-04-15 14:19:21 -0500 | [diff] [blame] | 189 | .coherent_dma_mask      = DMA_BIT_MASK(32), | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 190 | }, | 
|  | 191 | .num_resources = 0, | 
|  | 192 | }; | 
|  | 193 |  | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 194 | static struct tvp514x_platform_data dm644xevm_tvp5146_pdata = { | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 195 | .clk_polarity = 0, | 
|  | 196 | .hs_polarity = 1, | 
|  | 197 | .vs_polarity = 1 | 
|  | 198 | }; | 
|  | 199 |  | 
|  | 200 | #define TVP514X_STD_ALL	(V4L2_STD_NTSC | V4L2_STD_PAL) | 
|  | 201 | /* Inputs available at the TVP5146 */ | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 202 | static struct v4l2_input dm644xevm_tvp5146_inputs[] = { | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 203 | { | 
|  | 204 | .index = 0, | 
|  | 205 | .name = "Composite", | 
|  | 206 | .type = V4L2_INPUT_TYPE_CAMERA, | 
|  | 207 | .std = TVP514X_STD_ALL, | 
|  | 208 | }, | 
|  | 209 | { | 
|  | 210 | .index = 1, | 
|  | 211 | .name = "S-Video", | 
|  | 212 | .type = V4L2_INPUT_TYPE_CAMERA, | 
|  | 213 | .std = TVP514X_STD_ALL, | 
|  | 214 | }, | 
|  | 215 | }; | 
|  | 216 |  | 
|  | 217 | /* | 
|  | 218 | * this is the route info for connecting each input to decoder | 
|  | 219 | * ouput that goes to vpfe. There is a one to one correspondence | 
|  | 220 | * with tvp5146_inputs | 
|  | 221 | */ | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 222 | static struct vpfe_route dm644xevm_tvp5146_routes[] = { | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 223 | { | 
|  | 224 | .input = INPUT_CVBS_VI2B, | 
|  | 225 | .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, | 
|  | 226 | }, | 
|  | 227 | { | 
|  | 228 | .input = INPUT_SVIDEO_VI2C_VI1C, | 
|  | 229 | .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, | 
|  | 230 | }, | 
|  | 231 | }; | 
|  | 232 |  | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 233 | static struct vpfe_subdev_info dm644xevm_vpfe_sub_devs[] = { | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 234 | { | 
|  | 235 | .name = "tvp5146", | 
|  | 236 | .grp_id = 0, | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 237 | .num_inputs = ARRAY_SIZE(dm644xevm_tvp5146_inputs), | 
|  | 238 | .inputs = dm644xevm_tvp5146_inputs, | 
|  | 239 | .routes = dm644xevm_tvp5146_routes, | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 240 | .can_route = 1, | 
|  | 241 | .ccdc_if_params = { | 
|  | 242 | .if_type = VPFE_BT656, | 
|  | 243 | .hdpol = VPFE_PINPOL_POSITIVE, | 
|  | 244 | .vdpol = VPFE_PINPOL_POSITIVE, | 
|  | 245 | }, | 
|  | 246 | .board_info = { | 
|  | 247 | I2C_BOARD_INFO("tvp5146", 0x5d), | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 248 | .platform_data = &dm644xevm_tvp5146_pdata, | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 249 | }, | 
|  | 250 | }, | 
|  | 251 | }; | 
|  | 252 |  | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 253 | static struct vpfe_config dm644xevm_capture_cfg = { | 
|  | 254 | .num_subdevs = ARRAY_SIZE(dm644xevm_vpfe_sub_devs), | 
| Vaibhav Hiremath | 077639f | 2009-10-13 15:08:54 +0000 | [diff] [blame] | 255 | .i2c_adapter_id = 1, | 
| Manjunath Hadli | 314d738 | 2011-12-21 19:13:38 +0530 | [diff] [blame] | 256 | .sub_devs = dm644xevm_vpfe_sub_devs, | 
| Muralidharan Karicheri | ab8e8df | 2009-09-16 11:53:18 -0400 | [diff] [blame] | 257 | .card_name = "DM6446 EVM", | 
|  | 258 | .ccdc = "DM6446 CCDC", | 
|  | 259 | }; | 
|  | 260 |  | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 261 | static struct platform_device rtc_dev = { | 
|  | 262 | .name           = "rtc_davinci_evm", | 
|  | 263 | .id             = -1, | 
|  | 264 | }; | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 265 |  | 
| Kevin Hilman | 61aa073 | 2009-07-15 08:47:48 -0700 | [diff] [blame] | 266 | static struct snd_platform_data dm644x_evm_snd_data; | 
| Chaithrika U S | 25acf55 | 2009-06-05 06:28:08 -0400 | [diff] [blame] | 267 |  | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 268 | /*----------------------------------------------------------------------*/ | 
|  | 269 |  | 
|  | 270 | /* | 
|  | 271 | * I2C GPIO expanders | 
|  | 272 | */ | 
|  | 273 |  | 
|  | 274 | #define PCF_Uxx_BASE(x)	(DAVINCI_N_GPIO + ((x) * 8)) | 
|  | 275 |  | 
|  | 276 |  | 
|  | 277 | /* U2 -- LEDs */ | 
|  | 278 |  | 
|  | 279 | static struct gpio_led evm_leds[] = { | 
|  | 280 | { .name = "DS8", .active_low = 1, | 
|  | 281 | .default_trigger = "heartbeat", }, | 
|  | 282 | { .name = "DS7", .active_low = 1, }, | 
|  | 283 | { .name = "DS6", .active_low = 1, }, | 
|  | 284 | { .name = "DS5", .active_low = 1, }, | 
|  | 285 | { .name = "DS4", .active_low = 1, }, | 
|  | 286 | { .name = "DS3", .active_low = 1, }, | 
|  | 287 | { .name = "DS2", .active_low = 1, | 
|  | 288 | .default_trigger = "mmc0", }, | 
|  | 289 | { .name = "DS1", .active_low = 1, | 
|  | 290 | .default_trigger = "ide-disk", }, | 
|  | 291 | }; | 
|  | 292 |  | 
|  | 293 | static const struct gpio_led_platform_data evm_led_data = { | 
|  | 294 | .num_leds	= ARRAY_SIZE(evm_leds), | 
|  | 295 | .leds		= evm_leds, | 
|  | 296 | }; | 
|  | 297 |  | 
|  | 298 | static struct platform_device *evm_led_dev; | 
|  | 299 |  | 
|  | 300 | static int | 
|  | 301 | evm_led_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) | 
|  | 302 | { | 
|  | 303 | struct gpio_led *leds = evm_leds; | 
|  | 304 | int status; | 
|  | 305 |  | 
|  | 306 | while (ngpio--) { | 
|  | 307 | leds->gpio = gpio++; | 
|  | 308 | leds++; | 
|  | 309 | } | 
|  | 310 |  | 
|  | 311 | /* what an extremely annoying way to be forced to handle | 
|  | 312 | * device unregistration ... | 
|  | 313 | */ | 
|  | 314 | evm_led_dev = platform_device_alloc("leds-gpio", 0); | 
|  | 315 | platform_device_add_data(evm_led_dev, | 
|  | 316 | &evm_led_data, sizeof evm_led_data); | 
|  | 317 |  | 
|  | 318 | evm_led_dev->dev.parent = &client->dev; | 
|  | 319 | status = platform_device_add(evm_led_dev); | 
|  | 320 | if (status < 0) { | 
|  | 321 | platform_device_put(evm_led_dev); | 
|  | 322 | evm_led_dev = NULL; | 
|  | 323 | } | 
|  | 324 | return status; | 
|  | 325 | } | 
|  | 326 |  | 
|  | 327 | static int | 
|  | 328 | evm_led_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) | 
|  | 329 | { | 
|  | 330 | if (evm_led_dev) { | 
|  | 331 | platform_device_unregister(evm_led_dev); | 
|  | 332 | evm_led_dev = NULL; | 
|  | 333 | } | 
|  | 334 | return 0; | 
|  | 335 | } | 
|  | 336 |  | 
|  | 337 | static struct pcf857x_platform_data pcf_data_u2 = { | 
|  | 338 | .gpio_base	= PCF_Uxx_BASE(0), | 
|  | 339 | .setup		= evm_led_setup, | 
|  | 340 | .teardown	= evm_led_teardown, | 
|  | 341 | }; | 
|  | 342 |  | 
|  | 343 |  | 
|  | 344 | /* U18 - A/V clock generator and user switch */ | 
|  | 345 |  | 
|  | 346 | static int sw_gpio; | 
|  | 347 |  | 
|  | 348 | static ssize_t | 
|  | 349 | sw_show(struct device *d, struct device_attribute *a, char *buf) | 
|  | 350 | { | 
|  | 351 | char *s = gpio_get_value_cansleep(sw_gpio) ? "on\n" : "off\n"; | 
|  | 352 |  | 
|  | 353 | strcpy(buf, s); | 
|  | 354 | return strlen(s); | 
|  | 355 | } | 
|  | 356 |  | 
|  | 357 | static DEVICE_ATTR(user_sw, S_IRUGO, sw_show, NULL); | 
|  | 358 |  | 
|  | 359 | static int | 
|  | 360 | evm_u18_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) | 
|  | 361 | { | 
|  | 362 | int	status; | 
|  | 363 |  | 
|  | 364 | /* export dip switch option */ | 
|  | 365 | sw_gpio = gpio + 7; | 
|  | 366 | status = gpio_request(sw_gpio, "user_sw"); | 
|  | 367 | if (status == 0) | 
|  | 368 | status = gpio_direction_input(sw_gpio); | 
|  | 369 | if (status == 0) | 
|  | 370 | status = device_create_file(&client->dev, &dev_attr_user_sw); | 
|  | 371 | else | 
|  | 372 | gpio_free(sw_gpio); | 
|  | 373 | if (status != 0) | 
|  | 374 | sw_gpio = -EINVAL; | 
|  | 375 |  | 
|  | 376 | /* audio PLL:  48 kHz (vs 44.1 or 32), single rate (vs double) */ | 
|  | 377 | gpio_request(gpio + 3, "pll_fs2"); | 
|  | 378 | gpio_direction_output(gpio + 3, 0); | 
|  | 379 |  | 
|  | 380 | gpio_request(gpio + 2, "pll_fs1"); | 
|  | 381 | gpio_direction_output(gpio + 2, 0); | 
|  | 382 |  | 
|  | 383 | gpio_request(gpio + 1, "pll_sr"); | 
|  | 384 | gpio_direction_output(gpio + 1, 0); | 
|  | 385 |  | 
|  | 386 | return 0; | 
|  | 387 | } | 
|  | 388 |  | 
|  | 389 | static int | 
|  | 390 | evm_u18_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) | 
|  | 391 | { | 
|  | 392 | gpio_free(gpio + 1); | 
|  | 393 | gpio_free(gpio + 2); | 
|  | 394 | gpio_free(gpio + 3); | 
|  | 395 |  | 
|  | 396 | if (sw_gpio > 0) { | 
|  | 397 | device_remove_file(&client->dev, &dev_attr_user_sw); | 
|  | 398 | gpio_free(sw_gpio); | 
|  | 399 | } | 
|  | 400 | return 0; | 
|  | 401 | } | 
|  | 402 |  | 
|  | 403 | static struct pcf857x_platform_data pcf_data_u18 = { | 
|  | 404 | .gpio_base	= PCF_Uxx_BASE(1), | 
|  | 405 | .n_latch	= (1 << 3) | (1 << 2) | (1 << 1), | 
|  | 406 | .setup		= evm_u18_setup, | 
|  | 407 | .teardown	= evm_u18_teardown, | 
|  | 408 | }; | 
|  | 409 |  | 
|  | 410 |  | 
|  | 411 | /* U35 - various I/O signals used to manage USB, CF, ATA, etc */ | 
|  | 412 |  | 
|  | 413 | static int | 
|  | 414 | evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c) | 
|  | 415 | { | 
|  | 416 | /* p0 = nDRV_VBUS (initial:  don't supply it) */ | 
|  | 417 | gpio_request(gpio + 0, "nDRV_VBUS"); | 
|  | 418 | gpio_direction_output(gpio + 0, 1); | 
|  | 419 |  | 
|  | 420 | /* p1 = VDDIMX_EN */ | 
|  | 421 | gpio_request(gpio + 1, "VDDIMX_EN"); | 
|  | 422 | gpio_direction_output(gpio + 1, 1); | 
|  | 423 |  | 
|  | 424 | /* p2 = VLYNQ_EN */ | 
|  | 425 | gpio_request(gpio + 2, "VLYNQ_EN"); | 
|  | 426 | gpio_direction_output(gpio + 2, 1); | 
|  | 427 |  | 
|  | 428 | /* p3 = n3V3_CF_RESET (initial: stay in reset) */ | 
|  | 429 | gpio_request(gpio + 3, "nCF_RESET"); | 
|  | 430 | gpio_direction_output(gpio + 3, 0); | 
|  | 431 |  | 
|  | 432 | /* (p4 unused) */ | 
|  | 433 |  | 
|  | 434 | /* p5 = 1V8_WLAN_RESET (initial: stay in reset) */ | 
|  | 435 | gpio_request(gpio + 5, "WLAN_RESET"); | 
|  | 436 | gpio_direction_output(gpio + 5, 1); | 
|  | 437 |  | 
|  | 438 | /* p6 = nATA_SEL (initial: select) */ | 
|  | 439 | gpio_request(gpio + 6, "nATA_SEL"); | 
|  | 440 | gpio_direction_output(gpio + 6, 0); | 
|  | 441 |  | 
|  | 442 | /* p7 = nCF_SEL (initial: deselect) */ | 
|  | 443 | gpio_request(gpio + 7, "nCF_SEL"); | 
|  | 444 | gpio_direction_output(gpio + 7, 1); | 
|  | 445 |  | 
|  | 446 | return 0; | 
|  | 447 | } | 
|  | 448 |  | 
|  | 449 | static int | 
|  | 450 | evm_u35_teardown(struct i2c_client *client, int gpio, unsigned ngpio, void *c) | 
|  | 451 | { | 
|  | 452 | gpio_free(gpio + 7); | 
|  | 453 | gpio_free(gpio + 6); | 
|  | 454 | gpio_free(gpio + 5); | 
|  | 455 | gpio_free(gpio + 3); | 
|  | 456 | gpio_free(gpio + 2); | 
|  | 457 | gpio_free(gpio + 1); | 
|  | 458 | gpio_free(gpio + 0); | 
|  | 459 | return 0; | 
|  | 460 | } | 
|  | 461 |  | 
|  | 462 | static struct pcf857x_platform_data pcf_data_u35 = { | 
|  | 463 | .gpio_base	= PCF_Uxx_BASE(2), | 
|  | 464 | .setup		= evm_u35_setup, | 
|  | 465 | .teardown	= evm_u35_teardown, | 
|  | 466 | }; | 
|  | 467 |  | 
|  | 468 | /*----------------------------------------------------------------------*/ | 
|  | 469 |  | 
|  | 470 | /* Most of this EEPROM is unused, but U-Boot uses some data: | 
|  | 471 | *  - 0x7f00, 6 bytes Ethernet Address | 
|  | 472 | *  - 0x0039, 1 byte NTSC vs PAL (bit 0x80 == PAL) | 
|  | 473 | *  - ... newer boards may have more | 
|  | 474 | */ | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 475 |  | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 476 | static struct at24_platform_data eeprom_info = { | 
|  | 477 | .byte_len	= (256*1024) / 8, | 
|  | 478 | .page_size	= 64, | 
|  | 479 | .flags		= AT24_FLAG_ADDR16, | 
| Mark A. Greer | b14dc0f | 2009-04-15 12:41:27 -0700 | [diff] [blame] | 480 | .setup          = davinci_get_mac_addr, | 
|  | 481 | .context	= (void *)0x7f00, | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 482 | }; | 
|  | 483 |  | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 484 | /* | 
|  | 485 | * MSP430 supports RTC, card detection, input from IR remote, and | 
|  | 486 | * a bit more.  It triggers interrupts on GPIO(7) from pressing | 
|  | 487 | * buttons on the IR remote, and for card detect switches. | 
|  | 488 | */ | 
|  | 489 | static struct i2c_client *dm6446evm_msp; | 
|  | 490 |  | 
|  | 491 | static int dm6446evm_msp_probe(struct i2c_client *client, | 
|  | 492 | const struct i2c_device_id *id) | 
|  | 493 | { | 
|  | 494 | dm6446evm_msp = client; | 
|  | 495 | return 0; | 
|  | 496 | } | 
|  | 497 |  | 
|  | 498 | static int dm6446evm_msp_remove(struct i2c_client *client) | 
|  | 499 | { | 
|  | 500 | dm6446evm_msp = NULL; | 
|  | 501 | return 0; | 
|  | 502 | } | 
|  | 503 |  | 
|  | 504 | static const struct i2c_device_id dm6446evm_msp_ids[] = { | 
|  | 505 | { "dm6446evm_msp", 0, }, | 
|  | 506 | { /* end of list */ }, | 
|  | 507 | }; | 
|  | 508 |  | 
|  | 509 | static struct i2c_driver dm6446evm_msp_driver = { | 
|  | 510 | .driver.name	= "dm6446evm_msp", | 
|  | 511 | .id_table	= dm6446evm_msp_ids, | 
|  | 512 | .probe		= dm6446evm_msp_probe, | 
|  | 513 | .remove		= dm6446evm_msp_remove, | 
|  | 514 | }; | 
|  | 515 |  | 
|  | 516 | static int dm6444evm_msp430_get_pins(void) | 
|  | 517 | { | 
|  | 518 | static const char txbuf[2] = { 2, 4, }; | 
|  | 519 | char buf[4]; | 
|  | 520 | struct i2c_msg msg[2] = { | 
|  | 521 | { | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 522 | .flags = 0, | 
|  | 523 | .len = 2, | 
|  | 524 | .buf = (void __force *)txbuf, | 
|  | 525 | }, | 
|  | 526 | { | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 527 | .flags = I2C_M_RD, | 
|  | 528 | .len = 4, | 
|  | 529 | .buf = buf, | 
|  | 530 | }, | 
|  | 531 | }; | 
|  | 532 | int status; | 
|  | 533 |  | 
|  | 534 | if (!dm6446evm_msp) | 
|  | 535 | return -ENXIO; | 
|  | 536 |  | 
| Wei Yongjun | 9ad9023 | 2012-09-10 04:49:23 +0000 | [diff] [blame] | 537 | msg[0].addr = dm6446evm_msp->addr; | 
|  | 538 | msg[1].addr = dm6446evm_msp->addr; | 
|  | 539 |  | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 540 | /* Command 4 == get input state, returns port 2 and port3 data | 
|  | 541 | *   S Addr W [A] len=2 [A] cmd=4 [A] | 
|  | 542 | *   RS Addr R [A] [len=4] A [cmd=4] A [port2] A [port3] N P | 
|  | 543 | */ | 
|  | 544 | status = i2c_transfer(dm6446evm_msp->adapter, msg, 2); | 
|  | 545 | if (status < 0) | 
|  | 546 | return status; | 
|  | 547 |  | 
|  | 548 | dev_dbg(&dm6446evm_msp->dev, | 
|  | 549 | "PINS: %02x %02x %02x %02x\n", | 
|  | 550 | buf[0], buf[1], buf[2], buf[3]); | 
|  | 551 |  | 
|  | 552 | return (buf[3] << 8) | buf[2]; | 
|  | 553 | } | 
|  | 554 |  | 
| Kevin Hilman | 2dbf56ae | 2009-05-11 15:55:03 -0700 | [diff] [blame] | 555 | static int dm6444evm_mmc_get_cd(int module) | 
|  | 556 | { | 
|  | 557 | int status = dm6444evm_msp430_get_pins(); | 
|  | 558 |  | 
|  | 559 | return (status < 0) ? status : !(status & BIT(1)); | 
|  | 560 | } | 
|  | 561 |  | 
|  | 562 | static int dm6444evm_mmc_get_ro(int module) | 
|  | 563 | { | 
|  | 564 | int status = dm6444evm_msp430_get_pins(); | 
|  | 565 |  | 
|  | 566 | return (status < 0) ? status : status & BIT(6 + 8); | 
|  | 567 | } | 
|  | 568 |  | 
|  | 569 | static struct davinci_mmc_config dm6446evm_mmc_config = { | 
|  | 570 | .get_cd		= dm6444evm_mmc_get_cd, | 
|  | 571 | .get_ro		= dm6444evm_mmc_get_ro, | 
|  | 572 | .wires		= 4, | 
|  | 573 | .version	= MMC_CTLR_VERSION_1 | 
|  | 574 | }; | 
|  | 575 |  | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 576 | static struct i2c_board_info __initdata i2c_info[] =  { | 
|  | 577 | { | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 578 | I2C_BOARD_INFO("dm6446evm_msp", 0x23), | 
|  | 579 | }, | 
|  | 580 | { | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 581 | I2C_BOARD_INFO("pcf8574", 0x38), | 
|  | 582 | .platform_data	= &pcf_data_u2, | 
|  | 583 | }, | 
|  | 584 | { | 
|  | 585 | I2C_BOARD_INFO("pcf8574", 0x39), | 
|  | 586 | .platform_data	= &pcf_data_u18, | 
|  | 587 | }, | 
|  | 588 | { | 
|  | 589 | I2C_BOARD_INFO("pcf8574", 0x3a), | 
|  | 590 | .platform_data	= &pcf_data_u35, | 
|  | 591 | }, | 
|  | 592 | { | 
|  | 593 | I2C_BOARD_INFO("24c256", 0x50), | 
|  | 594 | .platform_data	= &eeprom_info, | 
|  | 595 | }, | 
| Chaithrika U S | 1a7ff8f | 2009-08-25 15:20:05 +0300 | [diff] [blame] | 596 | { | 
|  | 597 | I2C_BOARD_INFO("tlv320aic33", 0x1b), | 
|  | 598 | }, | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 599 | }; | 
|  | 600 |  | 
|  | 601 | /* The msp430 uses a slow bitbanged I2C implementation (ergo 20 KHz), | 
|  | 602 | * which requires 100 usec of idle bus after i2c writes sent to it. | 
|  | 603 | */ | 
|  | 604 | static struct davinci_i2c_platform_data i2c_pdata = { | 
|  | 605 | .bus_freq	= 20 /* kHz */, | 
|  | 606 | .bus_delay	= 100 /* usec */, | 
| Philby John | 00642f6 | 2010-01-11 15:53:31 +0530 | [diff] [blame] | 607 | .sda_pin        = 44, | 
|  | 608 | .scl_pin        = 43, | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 609 | }; | 
|  | 610 |  | 
|  | 611 | static void __init evm_init_i2c(void) | 
|  | 612 | { | 
|  | 613 | davinci_init_i2c(&i2c_pdata); | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 614 | i2c_add_driver(&dm6446evm_msp_driver); | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 615 | i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info)); | 
|  | 616 | } | 
|  | 617 |  | 
| Manjunath Hadli | d5be5f5 | 2012-02-23 15:17:46 +0530 | [diff] [blame] | 618 | #define VENC_STD_ALL	(V4L2_STD_NTSC | V4L2_STD_PAL) | 
|  | 619 |  | 
|  | 620 | /* venc standard timings */ | 
|  | 621 | static struct vpbe_enc_mode_info dm644xevm_enc_std_timing[] = { | 
|  | 622 | { | 
|  | 623 | .name		= "ntsc", | 
|  | 624 | .timings_type	= VPBE_ENC_STD, | 
| Hans Verkuil | 3686408 | 2012-10-01 11:39:46 -0300 | [diff] [blame] | 625 | .std_id		= V4L2_STD_525_60, | 
| Manjunath Hadli | d5be5f5 | 2012-02-23 15:17:46 +0530 | [diff] [blame] | 626 | .interlaced	= 1, | 
|  | 627 | .xres		= 720, | 
|  | 628 | .yres		= 480, | 
|  | 629 | .aspect		= {11, 10}, | 
|  | 630 | .fps		= {30000, 1001}, | 
|  | 631 | .left_margin	= 0x79, | 
|  | 632 | .upper_margin	= 0x10, | 
|  | 633 | }, | 
|  | 634 | { | 
|  | 635 | .name		= "pal", | 
|  | 636 | .timings_type	= VPBE_ENC_STD, | 
| Hans Verkuil | 3686408 | 2012-10-01 11:39:46 -0300 | [diff] [blame] | 637 | .std_id		= V4L2_STD_625_50, | 
| Manjunath Hadli | d5be5f5 | 2012-02-23 15:17:46 +0530 | [diff] [blame] | 638 | .interlaced	= 1, | 
|  | 639 | .xres		= 720, | 
|  | 640 | .yres		= 576, | 
|  | 641 | .aspect		= {54, 59}, | 
|  | 642 | .fps		= {25, 1}, | 
|  | 643 | .left_margin	= 0x7e, | 
|  | 644 | .upper_margin	= 0x16, | 
|  | 645 | }, | 
|  | 646 | }; | 
|  | 647 |  | 
|  | 648 | /* venc dv preset timings */ | 
|  | 649 | static struct vpbe_enc_mode_info dm644xevm_enc_preset_timing[] = { | 
|  | 650 | { | 
|  | 651 | .name		= "480p59_94", | 
| Hans Verkuil | 3686408 | 2012-10-01 11:39:46 -0300 | [diff] [blame] | 652 | .timings_type	= VPBE_ENC_CUSTOM_TIMINGS, | 
|  | 653 | .dv_timings	= V4L2_DV_BT_CEA_720X480P59_94, | 
| Manjunath Hadli | d5be5f5 | 2012-02-23 15:17:46 +0530 | [diff] [blame] | 654 | .interlaced	= 0, | 
|  | 655 | .xres		= 720, | 
|  | 656 | .yres		= 480, | 
|  | 657 | .aspect		= {1, 1}, | 
|  | 658 | .fps		= {5994, 100}, | 
|  | 659 | .left_margin	= 0x80, | 
|  | 660 | .upper_margin	= 0x20, | 
|  | 661 | }, | 
|  | 662 | { | 
|  | 663 | .name		= "576p50", | 
| Hans Verkuil | 3686408 | 2012-10-01 11:39:46 -0300 | [diff] [blame] | 664 | .timings_type	= VPBE_ENC_CUSTOM_TIMINGS, | 
|  | 665 | .dv_timings	= V4L2_DV_BT_CEA_720X576P50, | 
| Manjunath Hadli | d5be5f5 | 2012-02-23 15:17:46 +0530 | [diff] [blame] | 666 | .interlaced	= 0, | 
|  | 667 | .xres		= 720, | 
|  | 668 | .yres		= 576, | 
|  | 669 | .aspect		= {1, 1}, | 
|  | 670 | .fps		= {50, 1}, | 
|  | 671 | .left_margin	= 0x7e, | 
|  | 672 | .upper_margin	= 0x30, | 
|  | 673 | }, | 
|  | 674 | }; | 
|  | 675 |  | 
|  | 676 | /* | 
|  | 677 | * The outputs available from VPBE + encoders. Keep the order same | 
|  | 678 | * as that of encoders. First those from venc followed by that from | 
|  | 679 | * encoders. Index in the output refers to index on a particular encoder. | 
|  | 680 | * Driver uses this index to pass it to encoder when it supports more | 
|  | 681 | * than one output. Userspace applications use index of the array to | 
|  | 682 | * set an output. | 
|  | 683 | */ | 
|  | 684 | static struct vpbe_output dm644xevm_vpbe_outputs[] = { | 
|  | 685 | { | 
|  | 686 | .output		= { | 
|  | 687 | .index		= 0, | 
|  | 688 | .name		= "Composite", | 
|  | 689 | .type		= V4L2_OUTPUT_TYPE_ANALOG, | 
|  | 690 | .std		= VENC_STD_ALL, | 
|  | 691 | .capabilities	= V4L2_OUT_CAP_STD, | 
|  | 692 | }, | 
|  | 693 | .subdev_name	= VPBE_VENC_SUBDEV_NAME, | 
|  | 694 | .default_mode	= "ntsc", | 
|  | 695 | .num_modes	= ARRAY_SIZE(dm644xevm_enc_std_timing), | 
|  | 696 | .modes		= dm644xevm_enc_std_timing, | 
|  | 697 | }, | 
|  | 698 | { | 
|  | 699 | .output		= { | 
|  | 700 | .index		= 1, | 
|  | 701 | .name		= "Component", | 
|  | 702 | .type		= V4L2_OUTPUT_TYPE_ANALOG, | 
| Lad, Prabhakar | e32087b | 2012-10-03 02:25:42 -0300 | [diff] [blame] | 703 | .capabilities	= V4L2_OUT_CAP_DV_TIMINGS, | 
| Manjunath Hadli | d5be5f5 | 2012-02-23 15:17:46 +0530 | [diff] [blame] | 704 | }, | 
|  | 705 | .subdev_name	= VPBE_VENC_SUBDEV_NAME, | 
|  | 706 | .default_mode	= "480p59_94", | 
|  | 707 | .num_modes	= ARRAY_SIZE(dm644xevm_enc_preset_timing), | 
|  | 708 | .modes		= dm644xevm_enc_preset_timing, | 
|  | 709 | }, | 
|  | 710 | }; | 
|  | 711 |  | 
|  | 712 | static struct vpbe_config dm644xevm_display_cfg = { | 
|  | 713 | .module_name	= "dm644x-vpbe-display", | 
|  | 714 | .i2c_adapter_id	= 1, | 
|  | 715 | .osd		= { | 
|  | 716 | .module_name	= VPBE_OSD_SUBDEV_NAME, | 
|  | 717 | }, | 
|  | 718 | .venc		= { | 
|  | 719 | .module_name	= VPBE_VENC_SUBDEV_NAME, | 
|  | 720 | }, | 
|  | 721 | .num_outputs	= ARRAY_SIZE(dm644xevm_vpbe_outputs), | 
|  | 722 | .outputs	= dm644xevm_vpbe_outputs, | 
|  | 723 | }; | 
|  | 724 |  | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 725 | static struct platform_device *davinci_evm_devices[] __initdata = { | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 726 | &davinci_fb_device, | 
|  | 727 | &rtc_dev, | 
|  | 728 | }; | 
|  | 729 |  | 
|  | 730 | static struct davinci_uart_config uart_config __initdata = { | 
|  | 731 | .enabled_uarts = (1 << 0), | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 732 | }; | 
|  | 733 |  | 
|  | 734 | static void __init | 
|  | 735 | davinci_evm_map_io(void) | 
|  | 736 | { | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 737 | dm644x_init(); | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 738 | } | 
|  | 739 |  | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 740 | static int davinci_phy_fixup(struct phy_device *phydev) | 
|  | 741 | { | 
|  | 742 | unsigned int control; | 
|  | 743 | /* CRITICAL: Fix for increasing PHY signal drive strength for | 
|  | 744 | * TX lockup issue. On DaVinci EVM, the Intel LXT971 PHY | 
|  | 745 | * signal strength was low causing  TX to fail randomly. The | 
|  | 746 | * fix is to Set bit 11 (Increased MII drive strength) of PHY | 
|  | 747 | * register 26 (Digital Config register) on this phy. */ | 
|  | 748 | control = phy_read(phydev, 26); | 
|  | 749 | phy_write(phydev, 26, (control | 0x800)); | 
|  | 750 | return 0; | 
|  | 751 | } | 
|  | 752 |  | 
|  | 753 | #if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \ | 
|  | 754 | defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE) | 
|  | 755 | #define HAS_ATA 1 | 
|  | 756 | #else | 
|  | 757 | #define HAS_ATA 0 | 
|  | 758 | #endif | 
|  | 759 |  | 
|  | 760 | #if defined(CONFIG_MTD_PHYSMAP) || \ | 
|  | 761 | defined(CONFIG_MTD_PHYSMAP_MODULE) | 
|  | 762 | #define HAS_NOR 1 | 
|  | 763 | #else | 
|  | 764 | #define HAS_NOR 0 | 
|  | 765 | #endif | 
|  | 766 |  | 
|  | 767 | #if defined(CONFIG_MTD_NAND_DAVINCI) || \ | 
|  | 768 | defined(CONFIG_MTD_NAND_DAVINCI_MODULE) | 
|  | 769 | #define HAS_NAND 1 | 
|  | 770 | #else | 
|  | 771 | #define HAS_NAND 0 | 
|  | 772 | #endif | 
|  | 773 |  | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 774 | static __init void davinci_evm_init(void) | 
|  | 775 | { | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 776 | struct clk *aemif_clk; | 
| Mark A. Greer | 972412b | 2009-04-15 12:40:56 -0700 | [diff] [blame] | 777 | struct davinci_soc_info *soc_info = &davinci_soc_info; | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 778 |  | 
|  | 779 | aemif_clk = clk_get(NULL, "aemif"); | 
| m-karicheri2@ti.com | b6f1ffe | 2012-08-02 16:53:48 +0000 | [diff] [blame] | 780 | clk_prepare_enable(aemif_clk); | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 781 |  | 
|  | 782 | if (HAS_ATA) { | 
|  | 783 | if (HAS_NAND || HAS_NOR) | 
|  | 784 | pr_warning("WARNING: both IDE and Flash are " | 
|  | 785 | "enabled, but they share AEMIF pins.\n" | 
|  | 786 | "\tDisable IDE for NAND/NOR support.\n"); | 
| Sergei Shtylyov | 7a9978a | 2010-04-21 18:11:33 +0400 | [diff] [blame] | 787 | davinci_init_ide(); | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 788 | } else if (HAS_NAND || HAS_NOR) { | 
|  | 789 | davinci_cfg_reg(DM644X_HPIEN_DISABLE); | 
|  | 790 | davinci_cfg_reg(DM644X_ATAEN_DISABLE); | 
|  | 791 |  | 
|  | 792 | /* only one device will be jumpered and detected */ | 
|  | 793 | if (HAS_NAND) { | 
|  | 794 | platform_device_register(&davinci_evm_nandflash_device); | 
|  | 795 | evm_leds[7].default_trigger = "nand-disk"; | 
|  | 796 | if (HAS_NOR) | 
|  | 797 | pr_warning("WARNING: both NAND and NOR flash " | 
|  | 798 | "are enabled; disable one of them.\n"); | 
|  | 799 | } else if (HAS_NOR) | 
|  | 800 | platform_device_register(&davinci_evm_norflash_device); | 
|  | 801 | } | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 802 |  | 
|  | 803 | platform_add_devices(davinci_evm_devices, | 
|  | 804 | ARRAY_SIZE(davinci_evm_devices)); | 
| David Brownell | 7bff3c4 | 2008-09-07 23:43:02 -0700 | [diff] [blame] | 805 | evm_init_i2c(); | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 806 |  | 
| Kevin Hilman | 2dbf56ae | 2009-05-11 15:55:03 -0700 | [diff] [blame] | 807 | davinci_setup_mmc(0, &dm6446evm_mmc_config); | 
| Manjunath Hadli | d5be5f5 | 2012-02-23 15:17:46 +0530 | [diff] [blame] | 808 | dm644x_init_video(&dm644xevm_capture_cfg, &dm644xevm_display_cfg); | 
| Kevin Hilman | 2dbf56ae | 2009-05-11 15:55:03 -0700 | [diff] [blame] | 809 |  | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 810 | davinci_serial_init(&uart_config); | 
| Chaithrika U S | 25acf55 | 2009-06-05 06:28:08 -0400 | [diff] [blame] | 811 | dm644x_init_asp(&dm644x_evm_snd_data); | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 812 |  | 
| Sergei Shtylyov | 60d97a8 | 2011-03-13 20:06:59 +0000 | [diff] [blame] | 813 | /* irlml6401 switches over 1A, in under 8 msec */ | 
|  | 814 | davinci_setup_usb(1000, 8); | 
|  | 815 |  | 
| Cyril Chemparathy | 782f2d7 | 2010-09-15 10:11:25 -0400 | [diff] [blame] | 816 | soc_info->emac_pdata->phy_id = DM644X_EVM_PHY_ID; | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 817 | /* Register the fixup for PHY on DaVinci */ | 
|  | 818 | phy_register_fixup_for_uid(LXT971_PHY_ID, LXT971_PHY_MASK, | 
|  | 819 | davinci_phy_fixup); | 
|  | 820 |  | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 821 | } | 
|  | 822 |  | 
| Kevin Hilman | d0e47fb | 2009-04-14 11:30:11 -0500 | [diff] [blame] | 823 | MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM") | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 824 | /* Maintainer: MontaVista Software <source@mvista.com> */ | 
| Nicolas Pitre | e7e5601 | 2011-07-05 22:38:11 -0400 | [diff] [blame] | 825 | .atag_offset  = 0x100, | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 826 | .map_io	      = davinci_evm_map_io, | 
| Cyril Chemparathy | bd80894 | 2010-05-07 17:06:37 -0400 | [diff] [blame] | 827 | .init_irq     = davinci_irq_init, | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 828 | .timer	      = &davinci_timer, | 
|  | 829 | .init_machine = davinci_evm_init, | 
| Shawn Guo | 3aa3e84 | 2012-04-26 09:45:39 +0800 | [diff] [blame] | 830 | .init_late	= davinci_init_late, | 
| Nicolas Pitre | f68deab | 2011-07-05 22:28:08 -0400 | [diff] [blame] | 831 | .dma_zone_size	= SZ_128M, | 
| Sekhar Nori | c6121dd | 2011-12-05 11:29:46 +0100 | [diff] [blame] | 832 | .restart	= davinci_restart, | 
| Kevin Hilman | 7c6337e | 2007-04-30 19:37:19 +0100 | [diff] [blame] | 833 | MACHINE_END |