18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * TI DA850/OMAP-L138 EVM board
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 2009 Texas Instruments Incorporated - https://www.ti.com/
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Derived from: arch/arm/mach-davinci/board-da830-evm.c
78c2ecf20Sopenharmony_ci * Original Copyrights follow:
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
108c2ecf20Sopenharmony_ci * the terms of the GNU General Public License version 2. This program
118c2ecf20Sopenharmony_ci * is licensed "as is" without any warranty of any kind, whether express
128c2ecf20Sopenharmony_ci * or implied.
138c2ecf20Sopenharmony_ci */
148c2ecf20Sopenharmony_ci#include <linux/console.h>
158c2ecf20Sopenharmony_ci#include <linux/delay.h>
168c2ecf20Sopenharmony_ci#include <linux/gpio.h>
178c2ecf20Sopenharmony_ci#include <linux/gpio_keys.h>
188c2ecf20Sopenharmony_ci#include <linux/gpio/machine.h>
198c2ecf20Sopenharmony_ci#include <linux/init.h>
208c2ecf20Sopenharmony_ci#include <linux/kernel.h>
218c2ecf20Sopenharmony_ci#include <linux/leds.h>
228c2ecf20Sopenharmony_ci#include <linux/i2c.h>
238c2ecf20Sopenharmony_ci#include <linux/platform_data/pca953x.h>
248c2ecf20Sopenharmony_ci#include <linux/input.h>
258c2ecf20Sopenharmony_ci#include <linux/input/tps6507x-ts.h>
268c2ecf20Sopenharmony_ci#include <linux/mfd/tps6507x.h>
278c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h>
288c2ecf20Sopenharmony_ci#include <linux/mtd/rawnand.h>
298c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h>
308c2ecf20Sopenharmony_ci#include <linux/nvmem-provider.h>
318c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h>
328c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
338c2ecf20Sopenharmony_ci#include <linux/platform_data/gpio-davinci.h>
348c2ecf20Sopenharmony_ci#include <linux/platform_data/mtd-davinci.h>
358c2ecf20Sopenharmony_ci#include <linux/platform_data/mtd-davinci-aemif.h>
368c2ecf20Sopenharmony_ci#include <linux/platform_data/ti-aemif.h>
378c2ecf20Sopenharmony_ci#include <linux/platform_data/spi-davinci.h>
388c2ecf20Sopenharmony_ci#include <linux/platform_data/uio_pruss.h>
398c2ecf20Sopenharmony_ci#include <linux/property.h>
408c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h>
418c2ecf20Sopenharmony_ci#include <linux/regulator/tps6507x.h>
428c2ecf20Sopenharmony_ci#include <linux/regulator/fixed.h>
438c2ecf20Sopenharmony_ci#include <linux/spi/spi.h>
448c2ecf20Sopenharmony_ci#include <linux/spi/flash.h>
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#include <mach/common.h>
478c2ecf20Sopenharmony_ci#include <mach/da8xx.h>
488c2ecf20Sopenharmony_ci#include <mach/mux.h>
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci#include "irqs.h"
518c2ecf20Sopenharmony_ci#include "sram.h"
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#include <asm/mach-types.h>
548c2ecf20Sopenharmony_ci#include <asm/mach/arch.h>
558c2ecf20Sopenharmony_ci#include <asm/system_info.h>
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#include <media/i2c/tvp514x.h>
588c2ecf20Sopenharmony_ci#include <media/i2c/adv7343.h>
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#define DA850_EVM_PHY_ID		"davinci_mdio-0:00"
618c2ecf20Sopenharmony_ci#define DA850_LCD_PWR_PIN		GPIO_TO_PIN(2, 8)
628c2ecf20Sopenharmony_ci#define DA850_LCD_BL_PIN		GPIO_TO_PIN(2, 15)
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#define DA850_MII_MDIO_CLKEN_PIN	GPIO_TO_PIN(2, 6)
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cistatic struct mtd_partition da850evm_spiflash_part[] = {
678c2ecf20Sopenharmony_ci	[0] = {
688c2ecf20Sopenharmony_ci		.name = "UBL",
698c2ecf20Sopenharmony_ci		.offset = 0,
708c2ecf20Sopenharmony_ci		.size = SZ_64K,
718c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,
728c2ecf20Sopenharmony_ci	},
738c2ecf20Sopenharmony_ci	[1] = {
748c2ecf20Sopenharmony_ci		.name = "U-Boot",
758c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
768c2ecf20Sopenharmony_ci		.size = SZ_512K,
778c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,
788c2ecf20Sopenharmony_ci	},
798c2ecf20Sopenharmony_ci	[2] = {
808c2ecf20Sopenharmony_ci		.name = "U-Boot-Env",
818c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
828c2ecf20Sopenharmony_ci		.size = SZ_64K,
838c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,
848c2ecf20Sopenharmony_ci	},
858c2ecf20Sopenharmony_ci	[3] = {
868c2ecf20Sopenharmony_ci		.name = "Kernel",
878c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
888c2ecf20Sopenharmony_ci		.size = SZ_2M + SZ_512K,
898c2ecf20Sopenharmony_ci		.mask_flags = 0,
908c2ecf20Sopenharmony_ci	},
918c2ecf20Sopenharmony_ci	[4] = {
928c2ecf20Sopenharmony_ci		.name = "Filesystem",
938c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
948c2ecf20Sopenharmony_ci		.size = SZ_4M,
958c2ecf20Sopenharmony_ci		.mask_flags = 0,
968c2ecf20Sopenharmony_ci	},
978c2ecf20Sopenharmony_ci	[5] = {
988c2ecf20Sopenharmony_ci		.name = "MAC-Address",
998c2ecf20Sopenharmony_ci		.offset = SZ_8M - SZ_64K,
1008c2ecf20Sopenharmony_ci		.size = SZ_64K,
1018c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,
1028c2ecf20Sopenharmony_ci	},
1038c2ecf20Sopenharmony_ci};
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistatic struct nvmem_cell_info da850evm_nvmem_cells[] = {
1068c2ecf20Sopenharmony_ci	{
1078c2ecf20Sopenharmony_ci		.name		= "macaddr",
1088c2ecf20Sopenharmony_ci		.offset		= 0x0,
1098c2ecf20Sopenharmony_ci		.bytes		= ETH_ALEN,
1108c2ecf20Sopenharmony_ci	}
1118c2ecf20Sopenharmony_ci};
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_cistatic struct nvmem_cell_table da850evm_nvmem_cell_table = {
1148c2ecf20Sopenharmony_ci	/*
1158c2ecf20Sopenharmony_ci	 * The nvmem name differs from the partition name because of the
1168c2ecf20Sopenharmony_ci	 * internal works of the nvmem framework.
1178c2ecf20Sopenharmony_ci	 */
1188c2ecf20Sopenharmony_ci	.nvmem_name	= "MAC-Address0",
1198c2ecf20Sopenharmony_ci	.cells		= da850evm_nvmem_cells,
1208c2ecf20Sopenharmony_ci	.ncells		= ARRAY_SIZE(da850evm_nvmem_cells),
1218c2ecf20Sopenharmony_ci};
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_cistatic struct nvmem_cell_lookup da850evm_nvmem_cell_lookup = {
1248c2ecf20Sopenharmony_ci	.nvmem_name	= "MAC-Address0",
1258c2ecf20Sopenharmony_ci	.cell_name	= "macaddr",
1268c2ecf20Sopenharmony_ci	.dev_id		= "davinci_emac.1",
1278c2ecf20Sopenharmony_ci	.con_id		= "mac-address",
1288c2ecf20Sopenharmony_ci};
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_cistatic struct flash_platform_data da850evm_spiflash_data = {
1318c2ecf20Sopenharmony_ci	.name		= "m25p80",
1328c2ecf20Sopenharmony_ci	.parts		= da850evm_spiflash_part,
1338c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(da850evm_spiflash_part),
1348c2ecf20Sopenharmony_ci	.type		= "m25p64",
1358c2ecf20Sopenharmony_ci};
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cistatic struct davinci_spi_config da850evm_spiflash_cfg = {
1388c2ecf20Sopenharmony_ci	.io_type	= SPI_IO_TYPE_DMA,
1398c2ecf20Sopenharmony_ci	.c2tdelay	= 8,
1408c2ecf20Sopenharmony_ci	.t2cdelay	= 8,
1418c2ecf20Sopenharmony_ci};
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_cistatic struct spi_board_info da850evm_spi_info[] = {
1448c2ecf20Sopenharmony_ci	{
1458c2ecf20Sopenharmony_ci		.modalias		= "m25p80",
1468c2ecf20Sopenharmony_ci		.platform_data		= &da850evm_spiflash_data,
1478c2ecf20Sopenharmony_ci		.controller_data	= &da850evm_spiflash_cfg,
1488c2ecf20Sopenharmony_ci		.mode			= SPI_MODE_0,
1498c2ecf20Sopenharmony_ci		.max_speed_hz		= 30000000,
1508c2ecf20Sopenharmony_ci		.bus_num		= 1,
1518c2ecf20Sopenharmony_ci		.chip_select		= 0,
1528c2ecf20Sopenharmony_ci	},
1538c2ecf20Sopenharmony_ci};
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_cistatic struct mtd_partition da850_evm_norflash_partition[] = {
1568c2ecf20Sopenharmony_ci	{
1578c2ecf20Sopenharmony_ci		.name           = "bootloaders + env",
1588c2ecf20Sopenharmony_ci		.offset         = 0,
1598c2ecf20Sopenharmony_ci		.size           = SZ_512K,
1608c2ecf20Sopenharmony_ci		.mask_flags     = MTD_WRITEABLE,
1618c2ecf20Sopenharmony_ci	},
1628c2ecf20Sopenharmony_ci	{
1638c2ecf20Sopenharmony_ci		.name           = "kernel",
1648c2ecf20Sopenharmony_ci		.offset         = MTDPART_OFS_APPEND,
1658c2ecf20Sopenharmony_ci		.size           = SZ_2M,
1668c2ecf20Sopenharmony_ci		.mask_flags     = 0,
1678c2ecf20Sopenharmony_ci	},
1688c2ecf20Sopenharmony_ci	{
1698c2ecf20Sopenharmony_ci		.name           = "filesystem",
1708c2ecf20Sopenharmony_ci		.offset         = MTDPART_OFS_APPEND,
1718c2ecf20Sopenharmony_ci		.size           = MTDPART_SIZ_FULL,
1728c2ecf20Sopenharmony_ci		.mask_flags     = 0,
1738c2ecf20Sopenharmony_ci	},
1748c2ecf20Sopenharmony_ci};
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_cistatic struct physmap_flash_data da850_evm_norflash_data = {
1778c2ecf20Sopenharmony_ci	.width		= 2,
1788c2ecf20Sopenharmony_ci	.parts		= da850_evm_norflash_partition,
1798c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(da850_evm_norflash_partition),
1808c2ecf20Sopenharmony_ci};
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_cistatic struct resource da850_evm_norflash_resource[] = {
1838c2ecf20Sopenharmony_ci	{
1848c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CS2_BASE,
1858c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CS2_BASE + SZ_32M - 1,
1868c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
1878c2ecf20Sopenharmony_ci	},
1888c2ecf20Sopenharmony_ci};
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ci/* DA850/OMAP-L138 EVM includes a 512 MByte large-page NAND flash
1918c2ecf20Sopenharmony_ci * (128K blocks). It may be used instead of the (default) SPI flash
1928c2ecf20Sopenharmony_ci * to boot, using TI's tools to install the secondary boot loader
1938c2ecf20Sopenharmony_ci * (UBL) and U-Boot.
1948c2ecf20Sopenharmony_ci */
1958c2ecf20Sopenharmony_cistatic struct mtd_partition da850_evm_nandflash_partition[] = {
1968c2ecf20Sopenharmony_ci	{
1978c2ecf20Sopenharmony_ci		.name		= "u-boot env",
1988c2ecf20Sopenharmony_ci		.offset		= 0,
1998c2ecf20Sopenharmony_ci		.size		= SZ_128K,
2008c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,
2018c2ecf20Sopenharmony_ci	 },
2028c2ecf20Sopenharmony_ci	{
2038c2ecf20Sopenharmony_ci		.name		= "UBL",
2048c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
2058c2ecf20Sopenharmony_ci		.size		= SZ_128K,
2068c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,
2078c2ecf20Sopenharmony_ci	},
2088c2ecf20Sopenharmony_ci	{
2098c2ecf20Sopenharmony_ci		.name		= "u-boot",
2108c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
2118c2ecf20Sopenharmony_ci		.size		= 4 * SZ_128K,
2128c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,
2138c2ecf20Sopenharmony_ci	},
2148c2ecf20Sopenharmony_ci	{
2158c2ecf20Sopenharmony_ci		.name		= "kernel",
2168c2ecf20Sopenharmony_ci		.offset		= 0x200000,
2178c2ecf20Sopenharmony_ci		.size		= SZ_2M,
2188c2ecf20Sopenharmony_ci		.mask_flags	= 0,
2198c2ecf20Sopenharmony_ci	},
2208c2ecf20Sopenharmony_ci	{
2218c2ecf20Sopenharmony_ci		.name		= "filesystem",
2228c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
2238c2ecf20Sopenharmony_ci		.size		= MTDPART_SIZ_FULL,
2248c2ecf20Sopenharmony_ci		.mask_flags	= 0,
2258c2ecf20Sopenharmony_ci	},
2268c2ecf20Sopenharmony_ci};
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_cistatic struct davinci_aemif_timing da850_evm_nandflash_timing = {
2298c2ecf20Sopenharmony_ci	.wsetup		= 24,
2308c2ecf20Sopenharmony_ci	.wstrobe	= 21,
2318c2ecf20Sopenharmony_ci	.whold		= 14,
2328c2ecf20Sopenharmony_ci	.rsetup		= 19,
2338c2ecf20Sopenharmony_ci	.rstrobe	= 50,
2348c2ecf20Sopenharmony_ci	.rhold		= 0,
2358c2ecf20Sopenharmony_ci	.ta		= 20,
2368c2ecf20Sopenharmony_ci};
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_cistatic struct davinci_nand_pdata da850_evm_nandflash_data = {
2398c2ecf20Sopenharmony_ci	.core_chipsel	= 1,
2408c2ecf20Sopenharmony_ci	.parts		= da850_evm_nandflash_partition,
2418c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(da850_evm_nandflash_partition),
2428c2ecf20Sopenharmony_ci	.engine_type	= NAND_ECC_ENGINE_TYPE_ON_HOST,
2438c2ecf20Sopenharmony_ci	.ecc_bits	= 4,
2448c2ecf20Sopenharmony_ci	.bbt_options	= NAND_BBT_USE_FLASH,
2458c2ecf20Sopenharmony_ci	.timing		= &da850_evm_nandflash_timing,
2468c2ecf20Sopenharmony_ci};
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_cistatic struct resource da850_evm_nandflash_resource[] = {
2498c2ecf20Sopenharmony_ci	{
2508c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CS3_BASE,
2518c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
2528c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
2538c2ecf20Sopenharmony_ci	},
2548c2ecf20Sopenharmony_ci	{
2558c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CTL_BASE,
2568c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
2578c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
2588c2ecf20Sopenharmony_ci	},
2598c2ecf20Sopenharmony_ci};
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_cistatic struct resource da850_evm_aemif_resource[] = {
2628c2ecf20Sopenharmony_ci	{
2638c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CTL_BASE,
2648c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CTL_BASE + SZ_32K,
2658c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
2668c2ecf20Sopenharmony_ci	}
2678c2ecf20Sopenharmony_ci};
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_cistatic struct aemif_abus_data da850_evm_aemif_abus_data[] = {
2708c2ecf20Sopenharmony_ci	{
2718c2ecf20Sopenharmony_ci		.cs	= 3,
2728c2ecf20Sopenharmony_ci	}
2738c2ecf20Sopenharmony_ci};
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_cistatic struct platform_device da850_evm_aemif_devices[] = {
2768c2ecf20Sopenharmony_ci	{
2778c2ecf20Sopenharmony_ci		.name		= "davinci_nand",
2788c2ecf20Sopenharmony_ci		.id		= 1,
2798c2ecf20Sopenharmony_ci		.dev		= {
2808c2ecf20Sopenharmony_ci			.platform_data	= &da850_evm_nandflash_data,
2818c2ecf20Sopenharmony_ci		},
2828c2ecf20Sopenharmony_ci		.num_resources	= ARRAY_SIZE(da850_evm_nandflash_resource),
2838c2ecf20Sopenharmony_ci		.resource	= da850_evm_nandflash_resource,
2848c2ecf20Sopenharmony_ci	},
2858c2ecf20Sopenharmony_ci	{
2868c2ecf20Sopenharmony_ci		.name		= "physmap-flash",
2878c2ecf20Sopenharmony_ci		.id		= 0,
2888c2ecf20Sopenharmony_ci		.dev		= {
2898c2ecf20Sopenharmony_ci			.platform_data  = &da850_evm_norflash_data,
2908c2ecf20Sopenharmony_ci		},
2918c2ecf20Sopenharmony_ci		.num_resources	= 1,
2928c2ecf20Sopenharmony_ci		.resource	= da850_evm_norflash_resource,
2938c2ecf20Sopenharmony_ci	}
2948c2ecf20Sopenharmony_ci};
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_cistatic struct aemif_platform_data da850_evm_aemif_pdata = {
2978c2ecf20Sopenharmony_ci	.cs_offset = 2,
2988c2ecf20Sopenharmony_ci	.abus_data = da850_evm_aemif_abus_data,
2998c2ecf20Sopenharmony_ci	.num_abus_data = ARRAY_SIZE(da850_evm_aemif_abus_data),
3008c2ecf20Sopenharmony_ci	.sub_devices = da850_evm_aemif_devices,
3018c2ecf20Sopenharmony_ci	.num_sub_devices = ARRAY_SIZE(da850_evm_aemif_devices),
3028c2ecf20Sopenharmony_ci};
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_cistatic struct platform_device da850_evm_aemif_device = {
3058c2ecf20Sopenharmony_ci	.name		= "ti-aemif",
3068c2ecf20Sopenharmony_ci	.id		= -1,
3078c2ecf20Sopenharmony_ci	.dev = {
3088c2ecf20Sopenharmony_ci		.platform_data	= &da850_evm_aemif_pdata,
3098c2ecf20Sopenharmony_ci	},
3108c2ecf20Sopenharmony_ci	.resource	= da850_evm_aemif_resource,
3118c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(da850_evm_aemif_resource),
3128c2ecf20Sopenharmony_ci};
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_cistatic const short da850_evm_nand_pins[] = {
3158c2ecf20Sopenharmony_ci	DA850_EMA_D_0, DA850_EMA_D_1, DA850_EMA_D_2, DA850_EMA_D_3,
3168c2ecf20Sopenharmony_ci	DA850_EMA_D_4, DA850_EMA_D_5, DA850_EMA_D_6, DA850_EMA_D_7,
3178c2ecf20Sopenharmony_ci	DA850_EMA_A_1, DA850_EMA_A_2, DA850_NEMA_CS_3, DA850_NEMA_CS_4,
3188c2ecf20Sopenharmony_ci	DA850_NEMA_WE, DA850_NEMA_OE,
3198c2ecf20Sopenharmony_ci	-1
3208c2ecf20Sopenharmony_ci};
3218c2ecf20Sopenharmony_ci
3228c2ecf20Sopenharmony_cistatic const short da850_evm_nor_pins[] = {
3238c2ecf20Sopenharmony_ci	DA850_EMA_BA_1, DA850_EMA_CLK, DA850_EMA_WAIT_1, DA850_NEMA_CS_2,
3248c2ecf20Sopenharmony_ci	DA850_NEMA_WE, DA850_NEMA_OE, DA850_EMA_D_0, DA850_EMA_D_1,
3258c2ecf20Sopenharmony_ci	DA850_EMA_D_2, DA850_EMA_D_3, DA850_EMA_D_4, DA850_EMA_D_5,
3268c2ecf20Sopenharmony_ci	DA850_EMA_D_6, DA850_EMA_D_7, DA850_EMA_D_8, DA850_EMA_D_9,
3278c2ecf20Sopenharmony_ci	DA850_EMA_D_10, DA850_EMA_D_11, DA850_EMA_D_12, DA850_EMA_D_13,
3288c2ecf20Sopenharmony_ci	DA850_EMA_D_14, DA850_EMA_D_15, DA850_EMA_A_0, DA850_EMA_A_1,
3298c2ecf20Sopenharmony_ci	DA850_EMA_A_2, DA850_EMA_A_3, DA850_EMA_A_4, DA850_EMA_A_5,
3308c2ecf20Sopenharmony_ci	DA850_EMA_A_6, DA850_EMA_A_7, DA850_EMA_A_8, DA850_EMA_A_9,
3318c2ecf20Sopenharmony_ci	DA850_EMA_A_10, DA850_EMA_A_11, DA850_EMA_A_12, DA850_EMA_A_13,
3328c2ecf20Sopenharmony_ci	DA850_EMA_A_14, DA850_EMA_A_15, DA850_EMA_A_16, DA850_EMA_A_17,
3338c2ecf20Sopenharmony_ci	DA850_EMA_A_18, DA850_EMA_A_19, DA850_EMA_A_20, DA850_EMA_A_21,
3348c2ecf20Sopenharmony_ci	DA850_EMA_A_22, DA850_EMA_A_23,
3358c2ecf20Sopenharmony_ci	-1
3368c2ecf20Sopenharmony_ci};
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci#define HAS_MMC		IS_ENABLED(CONFIG_MMC_DAVINCI)
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_cistatic inline void da850_evm_setup_nor_nand(void)
3418c2ecf20Sopenharmony_ci{
3428c2ecf20Sopenharmony_ci	int ret = 0;
3438c2ecf20Sopenharmony_ci
3448c2ecf20Sopenharmony_ci	if (!HAS_MMC) {
3458c2ecf20Sopenharmony_ci		ret = davinci_cfg_reg_list(da850_evm_nand_pins);
3468c2ecf20Sopenharmony_ci		if (ret)
3478c2ecf20Sopenharmony_ci			pr_warn("%s: NAND mux setup failed: %d\n",
3488c2ecf20Sopenharmony_ci				__func__, ret);
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci		ret = davinci_cfg_reg_list(da850_evm_nor_pins);
3518c2ecf20Sopenharmony_ci		if (ret)
3528c2ecf20Sopenharmony_ci			pr_warn("%s: NOR mux setup failed: %d\n",
3538c2ecf20Sopenharmony_ci				__func__, ret);
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci		ret = platform_device_register(&da850_evm_aemif_device);
3568c2ecf20Sopenharmony_ci		if (ret)
3578c2ecf20Sopenharmony_ci			pr_warn("%s: registering aemif failed: %d\n",
3588c2ecf20Sopenharmony_ci				__func__, ret);
3598c2ecf20Sopenharmony_ci	}
3608c2ecf20Sopenharmony_ci}
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci#ifdef CONFIG_DA850_UI_RMII
3638c2ecf20Sopenharmony_cistatic inline void da850_evm_setup_emac_rmii(int rmii_sel)
3648c2ecf20Sopenharmony_ci{
3658c2ecf20Sopenharmony_ci	struct davinci_soc_info *soc_info = &davinci_soc_info;
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ci	soc_info->emac_pdata->rmii_en = 1;
3688c2ecf20Sopenharmony_ci	gpio_set_value_cansleep(rmii_sel, 0);
3698c2ecf20Sopenharmony_ci}
3708c2ecf20Sopenharmony_ci#else
3718c2ecf20Sopenharmony_cistatic inline void da850_evm_setup_emac_rmii(int rmii_sel) { }
3728c2ecf20Sopenharmony_ci#endif
3738c2ecf20Sopenharmony_ci
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci#define DA850_KEYS_DEBOUNCE_MS	10
3768c2ecf20Sopenharmony_ci/*
3778c2ecf20Sopenharmony_ci * At 200ms polling interval it is possible to miss an
3788c2ecf20Sopenharmony_ci * event by tapping very lightly on the push button but most
3798c2ecf20Sopenharmony_ci * pushes do result in an event; longer intervals require the
3808c2ecf20Sopenharmony_ci * user to hold the button whereas shorter intervals require
3818c2ecf20Sopenharmony_ci * more CPU time for polling.
3828c2ecf20Sopenharmony_ci */
3838c2ecf20Sopenharmony_ci#define DA850_GPIO_KEYS_POLL_MS	200
3848c2ecf20Sopenharmony_ci
3858c2ecf20Sopenharmony_cienum da850_evm_ui_exp_pins {
3868c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_SEL_C = 5,
3878c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_SEL_B,
3888c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_SEL_A,
3898c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB8,
3908c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB7,
3918c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB6,
3928c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB5,
3938c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB4,
3948c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB3,
3958c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB2,
3968c2ecf20Sopenharmony_ci	DA850_EVM_UI_EXP_PB1,
3978c2ecf20Sopenharmony_ci};
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_cistatic const char * const da850_evm_ui_exp[] = {
4008c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_SEL_C]        = "sel_c",
4018c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_SEL_B]        = "sel_b",
4028c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_SEL_A]        = "sel_a",
4038c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB8]          = "pb8",
4048c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB7]          = "pb7",
4058c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB6]          = "pb6",
4068c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB5]          = "pb5",
4078c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB4]          = "pb4",
4088c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB3]          = "pb3",
4098c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB2]          = "pb2",
4108c2ecf20Sopenharmony_ci	[DA850_EVM_UI_EXP_PB1]          = "pb1",
4118c2ecf20Sopenharmony_ci};
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci#define DA850_N_UI_PB		8
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_cistatic struct gpio_keys_button da850_evm_ui_keys[] = {
4168c2ecf20Sopenharmony_ci	[0 ... DA850_N_UI_PB - 1] = {
4178c2ecf20Sopenharmony_ci		.type			= EV_KEY,
4188c2ecf20Sopenharmony_ci		.active_low		= 1,
4198c2ecf20Sopenharmony_ci		.wakeup			= 0,
4208c2ecf20Sopenharmony_ci		.debounce_interval	= DA850_KEYS_DEBOUNCE_MS,
4218c2ecf20Sopenharmony_ci		.code			= -1, /* assigned at runtime */
4228c2ecf20Sopenharmony_ci		.gpio			= -1, /* assigned at runtime */
4238c2ecf20Sopenharmony_ci		.desc			= NULL, /* assigned at runtime */
4248c2ecf20Sopenharmony_ci	},
4258c2ecf20Sopenharmony_ci};
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_cistatic struct gpio_keys_platform_data da850_evm_ui_keys_pdata = {
4288c2ecf20Sopenharmony_ci	.buttons = da850_evm_ui_keys,
4298c2ecf20Sopenharmony_ci	.nbuttons = ARRAY_SIZE(da850_evm_ui_keys),
4308c2ecf20Sopenharmony_ci	.poll_interval = DA850_GPIO_KEYS_POLL_MS,
4318c2ecf20Sopenharmony_ci};
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_cistatic struct platform_device da850_evm_ui_keys_device = {
4348c2ecf20Sopenharmony_ci	.name = "gpio-keys-polled",
4358c2ecf20Sopenharmony_ci	.id = 0,
4368c2ecf20Sopenharmony_ci	.dev = {
4378c2ecf20Sopenharmony_ci		.platform_data = &da850_evm_ui_keys_pdata
4388c2ecf20Sopenharmony_ci	},
4398c2ecf20Sopenharmony_ci};
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_cistatic void da850_evm_ui_keys_init(unsigned gpio)
4428c2ecf20Sopenharmony_ci{
4438c2ecf20Sopenharmony_ci	int i;
4448c2ecf20Sopenharmony_ci	struct gpio_keys_button *button;
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci	for (i = 0; i < DA850_N_UI_PB; i++) {
4478c2ecf20Sopenharmony_ci		button = &da850_evm_ui_keys[i];
4488c2ecf20Sopenharmony_ci		button->code = KEY_F8 - i;
4498c2ecf20Sopenharmony_ci		button->desc = da850_evm_ui_exp[DA850_EVM_UI_EXP_PB8 + i];
4508c2ecf20Sopenharmony_ci		button->gpio = gpio + DA850_EVM_UI_EXP_PB8 + i;
4518c2ecf20Sopenharmony_ci	}
4528c2ecf20Sopenharmony_ci}
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci#ifdef CONFIG_DA850_UI_SD_VIDEO_PORT
4558c2ecf20Sopenharmony_cistatic inline void da850_evm_setup_video_port(int video_sel)
4568c2ecf20Sopenharmony_ci{
4578c2ecf20Sopenharmony_ci	gpio_set_value_cansleep(video_sel, 0);
4588c2ecf20Sopenharmony_ci}
4598c2ecf20Sopenharmony_ci#else
4608c2ecf20Sopenharmony_cistatic inline void da850_evm_setup_video_port(int video_sel) { }
4618c2ecf20Sopenharmony_ci#endif
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_cistatic int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio,
4648c2ecf20Sopenharmony_ci						unsigned ngpio, void *c)
4658c2ecf20Sopenharmony_ci{
4668c2ecf20Sopenharmony_ci	int sel_a, sel_b, sel_c, ret;
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ci	sel_a = gpio + DA850_EVM_UI_EXP_SEL_A;
4698c2ecf20Sopenharmony_ci	sel_b = gpio + DA850_EVM_UI_EXP_SEL_B;
4708c2ecf20Sopenharmony_ci	sel_c = gpio + DA850_EVM_UI_EXP_SEL_C;
4718c2ecf20Sopenharmony_ci
4728c2ecf20Sopenharmony_ci	ret = gpio_request(sel_a, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_A]);
4738c2ecf20Sopenharmony_ci	if (ret) {
4748c2ecf20Sopenharmony_ci		pr_warn("Cannot open UI expander pin %d\n", sel_a);
4758c2ecf20Sopenharmony_ci		goto exp_setup_sela_fail;
4768c2ecf20Sopenharmony_ci	}
4778c2ecf20Sopenharmony_ci
4788c2ecf20Sopenharmony_ci	ret = gpio_request(sel_b, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_B]);
4798c2ecf20Sopenharmony_ci	if (ret) {
4808c2ecf20Sopenharmony_ci		pr_warn("Cannot open UI expander pin %d\n", sel_b);
4818c2ecf20Sopenharmony_ci		goto exp_setup_selb_fail;
4828c2ecf20Sopenharmony_ci	}
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci	ret = gpio_request(sel_c, da850_evm_ui_exp[DA850_EVM_UI_EXP_SEL_C]);
4858c2ecf20Sopenharmony_ci	if (ret) {
4868c2ecf20Sopenharmony_ci		pr_warn("Cannot open UI expander pin %d\n", sel_c);
4878c2ecf20Sopenharmony_ci		goto exp_setup_selc_fail;
4888c2ecf20Sopenharmony_ci	}
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_ci	/* deselect all functionalities */
4918c2ecf20Sopenharmony_ci	gpio_direction_output(sel_a, 1);
4928c2ecf20Sopenharmony_ci	gpio_direction_output(sel_b, 1);
4938c2ecf20Sopenharmony_ci	gpio_direction_output(sel_c, 1);
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci	da850_evm_ui_keys_init(gpio);
4968c2ecf20Sopenharmony_ci	ret = platform_device_register(&da850_evm_ui_keys_device);
4978c2ecf20Sopenharmony_ci	if (ret) {
4988c2ecf20Sopenharmony_ci		pr_warn("Could not register UI GPIO expander push-buttons");
4998c2ecf20Sopenharmony_ci		goto exp_setup_keys_fail;
5008c2ecf20Sopenharmony_ci	}
5018c2ecf20Sopenharmony_ci
5028c2ecf20Sopenharmony_ci	pr_info("DA850/OMAP-L138 EVM UI card detected\n");
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci	da850_evm_setup_nor_nand();
5058c2ecf20Sopenharmony_ci
5068c2ecf20Sopenharmony_ci	da850_evm_setup_emac_rmii(sel_a);
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	da850_evm_setup_video_port(sel_c);
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_ci	return 0;
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ciexp_setup_keys_fail:
5138c2ecf20Sopenharmony_ci	gpio_free(sel_c);
5148c2ecf20Sopenharmony_ciexp_setup_selc_fail:
5158c2ecf20Sopenharmony_ci	gpio_free(sel_b);
5168c2ecf20Sopenharmony_ciexp_setup_selb_fail:
5178c2ecf20Sopenharmony_ci	gpio_free(sel_a);
5188c2ecf20Sopenharmony_ciexp_setup_sela_fail:
5198c2ecf20Sopenharmony_ci	return ret;
5208c2ecf20Sopenharmony_ci}
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_cistatic int da850_evm_ui_expander_teardown(struct i2c_client *client,
5238c2ecf20Sopenharmony_ci					unsigned gpio, unsigned ngpio, void *c)
5248c2ecf20Sopenharmony_ci{
5258c2ecf20Sopenharmony_ci	platform_device_unregister(&da850_evm_ui_keys_device);
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci	/* deselect all functionalities */
5288c2ecf20Sopenharmony_ci	gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_C, 1);
5298c2ecf20Sopenharmony_ci	gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_B, 1);
5308c2ecf20Sopenharmony_ci	gpio_set_value_cansleep(gpio + DA850_EVM_UI_EXP_SEL_A, 1);
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_ci	gpio_free(gpio + DA850_EVM_UI_EXP_SEL_C);
5338c2ecf20Sopenharmony_ci	gpio_free(gpio + DA850_EVM_UI_EXP_SEL_B);
5348c2ecf20Sopenharmony_ci	gpio_free(gpio + DA850_EVM_UI_EXP_SEL_A);
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci	return 0;
5378c2ecf20Sopenharmony_ci}
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci/* assign the baseboard expander's GPIOs after the UI board's */
5408c2ecf20Sopenharmony_ci#define DA850_UI_EXPANDER_N_GPIOS ARRAY_SIZE(da850_evm_ui_exp)
5418c2ecf20Sopenharmony_ci#define DA850_BB_EXPANDER_GPIO_BASE (DAVINCI_N_GPIO + DA850_UI_EXPANDER_N_GPIOS)
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_cienum da850_evm_bb_exp_pins {
5448c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_DEEP_SLEEP_EN = 0,
5458c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_SW_RST,
5468c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_TP_23,
5478c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_TP_22,
5488c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_TP_21,
5498c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_PB1,
5508c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_LED2,
5518c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_LED1,
5528c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW1,
5538c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW2,
5548c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW3,
5558c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW4,
5568c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW5,
5578c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW6,
5588c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW7,
5598c2ecf20Sopenharmony_ci	DA850_EVM_BB_EXP_USER_SW8
5608c2ecf20Sopenharmony_ci};
5618c2ecf20Sopenharmony_ci
5628c2ecf20Sopenharmony_cistatic const char * const da850_evm_bb_exp[] = {
5638c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_DEEP_SLEEP_EN]	= "deep_sleep_en",
5648c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_SW_RST]		= "sw_rst",
5658c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_TP_23]		= "tp_23",
5668c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_TP_22]		= "tp_22",
5678c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_TP_21]		= "tp_21",
5688c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_PB1]		= "user_pb1",
5698c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_LED2]		= "user_led2",
5708c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_LED1]		= "user_led1",
5718c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW1]		= "user_sw1",
5728c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW2]		= "user_sw2",
5738c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW3]		= "user_sw3",
5748c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW4]		= "user_sw4",
5758c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW5]		= "user_sw5",
5768c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW6]		= "user_sw6",
5778c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW7]		= "user_sw7",
5788c2ecf20Sopenharmony_ci	[DA850_EVM_BB_EXP_USER_SW8]		= "user_sw8",
5798c2ecf20Sopenharmony_ci};
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ci#define DA850_N_BB_USER_SW	8
5828c2ecf20Sopenharmony_ci
5838c2ecf20Sopenharmony_cistatic struct gpio_keys_button da850_evm_bb_keys[] = {
5848c2ecf20Sopenharmony_ci	[0] = {
5858c2ecf20Sopenharmony_ci		.type			= EV_KEY,
5868c2ecf20Sopenharmony_ci		.active_low		= 1,
5878c2ecf20Sopenharmony_ci		.wakeup			= 0,
5888c2ecf20Sopenharmony_ci		.debounce_interval	= DA850_KEYS_DEBOUNCE_MS,
5898c2ecf20Sopenharmony_ci		.code			= KEY_PROG1,
5908c2ecf20Sopenharmony_ci		.desc			= NULL, /* assigned at runtime */
5918c2ecf20Sopenharmony_ci		.gpio			= -1, /* assigned at runtime */
5928c2ecf20Sopenharmony_ci	},
5938c2ecf20Sopenharmony_ci	[1 ... DA850_N_BB_USER_SW] = {
5948c2ecf20Sopenharmony_ci		.type			= EV_SW,
5958c2ecf20Sopenharmony_ci		.active_low		= 1,
5968c2ecf20Sopenharmony_ci		.wakeup			= 0,
5978c2ecf20Sopenharmony_ci		.debounce_interval	= DA850_KEYS_DEBOUNCE_MS,
5988c2ecf20Sopenharmony_ci		.code			= -1, /* assigned at runtime */
5998c2ecf20Sopenharmony_ci		.desc			= NULL, /* assigned at runtime */
6008c2ecf20Sopenharmony_ci		.gpio			= -1, /* assigned at runtime */
6018c2ecf20Sopenharmony_ci	},
6028c2ecf20Sopenharmony_ci};
6038c2ecf20Sopenharmony_ci
6048c2ecf20Sopenharmony_cistatic struct gpio_keys_platform_data da850_evm_bb_keys_pdata = {
6058c2ecf20Sopenharmony_ci	.buttons = da850_evm_bb_keys,
6068c2ecf20Sopenharmony_ci	.nbuttons = ARRAY_SIZE(da850_evm_bb_keys),
6078c2ecf20Sopenharmony_ci	.poll_interval = DA850_GPIO_KEYS_POLL_MS,
6088c2ecf20Sopenharmony_ci};
6098c2ecf20Sopenharmony_ci
6108c2ecf20Sopenharmony_cistatic struct platform_device da850_evm_bb_keys_device = {
6118c2ecf20Sopenharmony_ci	.name = "gpio-keys-polled",
6128c2ecf20Sopenharmony_ci	.id = 1,
6138c2ecf20Sopenharmony_ci	.dev = {
6148c2ecf20Sopenharmony_ci		.platform_data = &da850_evm_bb_keys_pdata
6158c2ecf20Sopenharmony_ci	},
6168c2ecf20Sopenharmony_ci};
6178c2ecf20Sopenharmony_ci
6188c2ecf20Sopenharmony_cistatic void da850_evm_bb_keys_init(unsigned gpio)
6198c2ecf20Sopenharmony_ci{
6208c2ecf20Sopenharmony_ci	int i;
6218c2ecf20Sopenharmony_ci	struct gpio_keys_button *button;
6228c2ecf20Sopenharmony_ci
6238c2ecf20Sopenharmony_ci	button = &da850_evm_bb_keys[0];
6248c2ecf20Sopenharmony_ci	button->desc = da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_PB1];
6258c2ecf20Sopenharmony_ci	button->gpio = gpio + DA850_EVM_BB_EXP_USER_PB1;
6268c2ecf20Sopenharmony_ci
6278c2ecf20Sopenharmony_ci	for (i = 0; i < DA850_N_BB_USER_SW; i++) {
6288c2ecf20Sopenharmony_ci		button = &da850_evm_bb_keys[i + 1];
6298c2ecf20Sopenharmony_ci		button->code = SW_LID + i;
6308c2ecf20Sopenharmony_ci		button->desc = da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_SW1 + i];
6318c2ecf20Sopenharmony_ci		button->gpio = gpio + DA850_EVM_BB_EXP_USER_SW1 + i;
6328c2ecf20Sopenharmony_ci	}
6338c2ecf20Sopenharmony_ci}
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_cistatic struct gpio_led da850_evm_bb_leds[] = {
6368c2ecf20Sopenharmony_ci	{
6378c2ecf20Sopenharmony_ci		.name = "user_led2",
6388c2ecf20Sopenharmony_ci	},
6398c2ecf20Sopenharmony_ci	{
6408c2ecf20Sopenharmony_ci		.name = "user_led1",
6418c2ecf20Sopenharmony_ci	},
6428c2ecf20Sopenharmony_ci};
6438c2ecf20Sopenharmony_ci
6448c2ecf20Sopenharmony_cistatic struct gpio_led_platform_data da850_evm_bb_leds_pdata = {
6458c2ecf20Sopenharmony_ci	.leds = da850_evm_bb_leds,
6468c2ecf20Sopenharmony_ci	.num_leds = ARRAY_SIZE(da850_evm_bb_leds),
6478c2ecf20Sopenharmony_ci};
6488c2ecf20Sopenharmony_ci
6498c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table da850_evm_bb_leds_gpio_table = {
6508c2ecf20Sopenharmony_ci	.dev_id = "leds-gpio",
6518c2ecf20Sopenharmony_ci	.table = {
6528c2ecf20Sopenharmony_ci		GPIO_LOOKUP_IDX("i2c-bb-expander",
6538c2ecf20Sopenharmony_ci				DA850_EVM_BB_EXP_USER_LED2, NULL,
6548c2ecf20Sopenharmony_ci				0, GPIO_ACTIVE_LOW),
6558c2ecf20Sopenharmony_ci		GPIO_LOOKUP_IDX("i2c-bb-expander",
6568c2ecf20Sopenharmony_ci				DA850_EVM_BB_EXP_USER_LED2 + 1, NULL,
6578c2ecf20Sopenharmony_ci				1, GPIO_ACTIVE_LOW),
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_ci		{ },
6608c2ecf20Sopenharmony_ci	},
6618c2ecf20Sopenharmony_ci};
6628c2ecf20Sopenharmony_ci
6638c2ecf20Sopenharmony_cistatic struct platform_device da850_evm_bb_leds_device = {
6648c2ecf20Sopenharmony_ci	.name		= "leds-gpio",
6658c2ecf20Sopenharmony_ci	.id		= -1,
6668c2ecf20Sopenharmony_ci	.dev = {
6678c2ecf20Sopenharmony_ci		.platform_data = &da850_evm_bb_leds_pdata
6688c2ecf20Sopenharmony_ci	}
6698c2ecf20Sopenharmony_ci};
6708c2ecf20Sopenharmony_ci
6718c2ecf20Sopenharmony_cistatic int da850_evm_bb_expander_setup(struct i2c_client *client,
6728c2ecf20Sopenharmony_ci						unsigned gpio, unsigned ngpio,
6738c2ecf20Sopenharmony_ci						void *c)
6748c2ecf20Sopenharmony_ci{
6758c2ecf20Sopenharmony_ci	int ret;
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_ci	/*
6788c2ecf20Sopenharmony_ci	 * Register the switches and pushbutton on the baseboard as a gpio-keys
6798c2ecf20Sopenharmony_ci	 * device.
6808c2ecf20Sopenharmony_ci	 */
6818c2ecf20Sopenharmony_ci	da850_evm_bb_keys_init(gpio);
6828c2ecf20Sopenharmony_ci	ret = platform_device_register(&da850_evm_bb_keys_device);
6838c2ecf20Sopenharmony_ci	if (ret) {
6848c2ecf20Sopenharmony_ci		pr_warn("Could not register baseboard GPIO expander keys");
6858c2ecf20Sopenharmony_ci		goto io_exp_setup_sw_fail;
6868c2ecf20Sopenharmony_ci	}
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_ci	gpiod_add_lookup_table(&da850_evm_bb_leds_gpio_table);
6898c2ecf20Sopenharmony_ci	ret = platform_device_register(&da850_evm_bb_leds_device);
6908c2ecf20Sopenharmony_ci	if (ret) {
6918c2ecf20Sopenharmony_ci		pr_warn("Could not register baseboard GPIO expander LEDs");
6928c2ecf20Sopenharmony_ci		goto io_exp_setup_leds_fail;
6938c2ecf20Sopenharmony_ci	}
6948c2ecf20Sopenharmony_ci
6958c2ecf20Sopenharmony_ci	return 0;
6968c2ecf20Sopenharmony_ci
6978c2ecf20Sopenharmony_ciio_exp_setup_leds_fail:
6988c2ecf20Sopenharmony_ci	platform_device_unregister(&da850_evm_bb_keys_device);
6998c2ecf20Sopenharmony_ciio_exp_setup_sw_fail:
7008c2ecf20Sopenharmony_ci	return ret;
7018c2ecf20Sopenharmony_ci}
7028c2ecf20Sopenharmony_ci
7038c2ecf20Sopenharmony_cistatic int da850_evm_bb_expander_teardown(struct i2c_client *client,
7048c2ecf20Sopenharmony_ci					unsigned gpio, unsigned ngpio, void *c)
7058c2ecf20Sopenharmony_ci{
7068c2ecf20Sopenharmony_ci	platform_device_unregister(&da850_evm_bb_leds_device);
7078c2ecf20Sopenharmony_ci	platform_device_unregister(&da850_evm_bb_keys_device);
7088c2ecf20Sopenharmony_ci
7098c2ecf20Sopenharmony_ci	return 0;
7108c2ecf20Sopenharmony_ci}
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_cistatic struct pca953x_platform_data da850_evm_ui_expander_info = {
7138c2ecf20Sopenharmony_ci	.gpio_base	= DAVINCI_N_GPIO,
7148c2ecf20Sopenharmony_ci	.setup		= da850_evm_ui_expander_setup,
7158c2ecf20Sopenharmony_ci	.teardown	= da850_evm_ui_expander_teardown,
7168c2ecf20Sopenharmony_ci	.names		= da850_evm_ui_exp,
7178c2ecf20Sopenharmony_ci};
7188c2ecf20Sopenharmony_ci
7198c2ecf20Sopenharmony_cistatic struct pca953x_platform_data da850_evm_bb_expander_info = {
7208c2ecf20Sopenharmony_ci	.gpio_base	= DA850_BB_EXPANDER_GPIO_BASE,
7218c2ecf20Sopenharmony_ci	.setup		= da850_evm_bb_expander_setup,
7228c2ecf20Sopenharmony_ci	.teardown	= da850_evm_bb_expander_teardown,
7238c2ecf20Sopenharmony_ci	.names		= da850_evm_bb_exp,
7248c2ecf20Sopenharmony_ci};
7258c2ecf20Sopenharmony_ci
7268c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
7278c2ecf20Sopenharmony_ci	{
7288c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("tlv320aic3x", 0x18),
7298c2ecf20Sopenharmony_ci	},
7308c2ecf20Sopenharmony_ci	{
7318c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("tca6416", 0x20),
7328c2ecf20Sopenharmony_ci		.dev_name = "ui-expander",
7338c2ecf20Sopenharmony_ci		.platform_data = &da850_evm_ui_expander_info,
7348c2ecf20Sopenharmony_ci	},
7358c2ecf20Sopenharmony_ci	{
7368c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("tca6416", 0x21),
7378c2ecf20Sopenharmony_ci		.dev_name = "bb-expander",
7388c2ecf20Sopenharmony_ci		.platform_data = &da850_evm_bb_expander_info,
7398c2ecf20Sopenharmony_ci	},
7408c2ecf20Sopenharmony_ci};
7418c2ecf20Sopenharmony_ci
7428c2ecf20Sopenharmony_cistatic struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
7438c2ecf20Sopenharmony_ci	.bus_freq	= 100,	/* kHz */
7448c2ecf20Sopenharmony_ci	.bus_delay	= 0,	/* usec */
7458c2ecf20Sopenharmony_ci};
7468c2ecf20Sopenharmony_ci
7478c2ecf20Sopenharmony_ci/* davinci da850 evm audio machine driver */
7488c2ecf20Sopenharmony_cistatic u8 da850_iis_serializer_direction[] = {
7498c2ecf20Sopenharmony_ci	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
7508c2ecf20Sopenharmony_ci	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
7518c2ecf20Sopenharmony_ci	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	TX_MODE,
7528c2ecf20Sopenharmony_ci	RX_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
7538c2ecf20Sopenharmony_ci};
7548c2ecf20Sopenharmony_ci
7558c2ecf20Sopenharmony_cistatic struct snd_platform_data da850_evm_snd_data = {
7568c2ecf20Sopenharmony_ci	.tx_dma_offset		= 0x2000,
7578c2ecf20Sopenharmony_ci	.rx_dma_offset		= 0x2000,
7588c2ecf20Sopenharmony_ci	.op_mode		= DAVINCI_MCASP_IIS_MODE,
7598c2ecf20Sopenharmony_ci	.num_serializer		= ARRAY_SIZE(da850_iis_serializer_direction),
7608c2ecf20Sopenharmony_ci	.tdm_slots		= 2,
7618c2ecf20Sopenharmony_ci	.serial_dir		= da850_iis_serializer_direction,
7628c2ecf20Sopenharmony_ci	.asp_chan_q		= EVENTQ_0,
7638c2ecf20Sopenharmony_ci	.ram_chan_q		= EVENTQ_1,
7648c2ecf20Sopenharmony_ci	.version		= MCASP_VERSION_2,
7658c2ecf20Sopenharmony_ci	.txnumevt		= 1,
7668c2ecf20Sopenharmony_ci	.rxnumevt		= 1,
7678c2ecf20Sopenharmony_ci	.sram_size_playback	= SZ_8K,
7688c2ecf20Sopenharmony_ci	.sram_size_capture	= SZ_8K,
7698c2ecf20Sopenharmony_ci};
7708c2ecf20Sopenharmony_ci
7718c2ecf20Sopenharmony_cistatic const short da850_evm_mcasp_pins[] __initconst = {
7728c2ecf20Sopenharmony_ci	DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
7738c2ecf20Sopenharmony_ci	DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
7748c2ecf20Sopenharmony_ci	DA850_AXR_11, DA850_AXR_12,
7758c2ecf20Sopenharmony_ci	-1
7768c2ecf20Sopenharmony_ci};
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_ci#define DA850_MMCSD_CD_PIN		GPIO_TO_PIN(4, 0)
7798c2ecf20Sopenharmony_ci#define DA850_MMCSD_WP_PIN		GPIO_TO_PIN(4, 1)
7808c2ecf20Sopenharmony_ci
7818c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table mmc_gpios_table = {
7828c2ecf20Sopenharmony_ci	.dev_id = "da830-mmc.0",
7838c2ecf20Sopenharmony_ci	.table = {
7848c2ecf20Sopenharmony_ci		/* gpio chip 2 contains gpio range 64-95 */
7858c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", DA850_MMCSD_CD_PIN, "cd",
7868c2ecf20Sopenharmony_ci			    GPIO_ACTIVE_LOW),
7878c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", DA850_MMCSD_WP_PIN, "wp",
7888c2ecf20Sopenharmony_ci			    GPIO_ACTIVE_HIGH),
7898c2ecf20Sopenharmony_ci		{ }
7908c2ecf20Sopenharmony_ci	},
7918c2ecf20Sopenharmony_ci};
7928c2ecf20Sopenharmony_ci
7938c2ecf20Sopenharmony_cistatic struct davinci_mmc_config da850_mmc_config = {
7948c2ecf20Sopenharmony_ci	.wires		= 4,
7958c2ecf20Sopenharmony_ci	.max_freq	= 50000000,
7968c2ecf20Sopenharmony_ci	.caps		= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
7978c2ecf20Sopenharmony_ci};
7988c2ecf20Sopenharmony_ci
7998c2ecf20Sopenharmony_cistatic const short da850_evm_mmcsd0_pins[] __initconst = {
8008c2ecf20Sopenharmony_ci	DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
8018c2ecf20Sopenharmony_ci	DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
8028c2ecf20Sopenharmony_ci	DA850_GPIO4_0, DA850_GPIO4_1,
8038c2ecf20Sopenharmony_ci	-1
8048c2ecf20Sopenharmony_ci};
8058c2ecf20Sopenharmony_ci
8068c2ecf20Sopenharmony_cistatic struct property_entry da850_lcd_backlight_props[] = {
8078c2ecf20Sopenharmony_ci	PROPERTY_ENTRY_BOOL("default-on"),
8088c2ecf20Sopenharmony_ci	{ }
8098c2ecf20Sopenharmony_ci};
8108c2ecf20Sopenharmony_ci
8118c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table da850_lcd_backlight_gpio_table = {
8128c2ecf20Sopenharmony_ci	.dev_id		= "gpio-backlight",
8138c2ecf20Sopenharmony_ci	.table = {
8148c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", DA850_LCD_BL_PIN, NULL, 0),
8158c2ecf20Sopenharmony_ci		{ }
8168c2ecf20Sopenharmony_ci	},
8178c2ecf20Sopenharmony_ci};
8188c2ecf20Sopenharmony_ci
8198c2ecf20Sopenharmony_cistatic const struct platform_device_info da850_lcd_backlight_info = {
8208c2ecf20Sopenharmony_ci	.name		= "gpio-backlight",
8218c2ecf20Sopenharmony_ci	.id		= PLATFORM_DEVID_NONE,
8228c2ecf20Sopenharmony_ci	.properties	= da850_lcd_backlight_props,
8238c2ecf20Sopenharmony_ci};
8248c2ecf20Sopenharmony_ci
8258c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply da850_lcd_supplies[] = {
8268c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("lcd", NULL),
8278c2ecf20Sopenharmony_ci};
8288c2ecf20Sopenharmony_ci
8298c2ecf20Sopenharmony_cistatic struct regulator_init_data da850_lcd_supply_data = {
8308c2ecf20Sopenharmony_ci	.consumer_supplies	= da850_lcd_supplies,
8318c2ecf20Sopenharmony_ci	.num_consumer_supplies	= ARRAY_SIZE(da850_lcd_supplies),
8328c2ecf20Sopenharmony_ci	.constraints    = {
8338c2ecf20Sopenharmony_ci		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
8348c2ecf20Sopenharmony_ci	},
8358c2ecf20Sopenharmony_ci};
8368c2ecf20Sopenharmony_ci
8378c2ecf20Sopenharmony_cistatic struct fixed_voltage_config da850_lcd_supply = {
8388c2ecf20Sopenharmony_ci	.supply_name		= "lcd",
8398c2ecf20Sopenharmony_ci	.microvolts		= 33000000,
8408c2ecf20Sopenharmony_ci	.init_data		= &da850_lcd_supply_data,
8418c2ecf20Sopenharmony_ci};
8428c2ecf20Sopenharmony_ci
8438c2ecf20Sopenharmony_cistatic struct platform_device da850_lcd_supply_device = {
8448c2ecf20Sopenharmony_ci	.name			= "reg-fixed-voltage",
8458c2ecf20Sopenharmony_ci	.id			= 1, /* Dummy fixed regulator is 0 */
8468c2ecf20Sopenharmony_ci	.dev			= {
8478c2ecf20Sopenharmony_ci		.platform_data = &da850_lcd_supply,
8488c2ecf20Sopenharmony_ci	},
8498c2ecf20Sopenharmony_ci};
8508c2ecf20Sopenharmony_ci
8518c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table da850_lcd_supply_gpio_table = {
8528c2ecf20Sopenharmony_ci	.dev_id			= "reg-fixed-voltage.1",
8538c2ecf20Sopenharmony_ci	.table = {
8548c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", DA850_LCD_PWR_PIN, NULL, 0),
8558c2ecf20Sopenharmony_ci		{ }
8568c2ecf20Sopenharmony_ci	},
8578c2ecf20Sopenharmony_ci};
8588c2ecf20Sopenharmony_ci
8598c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table *da850_lcd_gpio_lookups[] = {
8608c2ecf20Sopenharmony_ci	&da850_lcd_backlight_gpio_table,
8618c2ecf20Sopenharmony_ci	&da850_lcd_supply_gpio_table,
8628c2ecf20Sopenharmony_ci};
8638c2ecf20Sopenharmony_ci
8648c2ecf20Sopenharmony_cistatic int da850_lcd_hw_init(void)
8658c2ecf20Sopenharmony_ci{
8668c2ecf20Sopenharmony_ci	struct platform_device *backlight;
8678c2ecf20Sopenharmony_ci	int status;
8688c2ecf20Sopenharmony_ci
8698c2ecf20Sopenharmony_ci	gpiod_add_lookup_tables(da850_lcd_gpio_lookups,
8708c2ecf20Sopenharmony_ci				ARRAY_SIZE(da850_lcd_gpio_lookups));
8718c2ecf20Sopenharmony_ci
8728c2ecf20Sopenharmony_ci	backlight = platform_device_register_full(&da850_lcd_backlight_info);
8738c2ecf20Sopenharmony_ci	if (IS_ERR(backlight))
8748c2ecf20Sopenharmony_ci		return PTR_ERR(backlight);
8758c2ecf20Sopenharmony_ci
8768c2ecf20Sopenharmony_ci	status = platform_device_register(&da850_lcd_supply_device);
8778c2ecf20Sopenharmony_ci	if (status)
8788c2ecf20Sopenharmony_ci		return status;
8798c2ecf20Sopenharmony_ci
8808c2ecf20Sopenharmony_ci	return 0;
8818c2ecf20Sopenharmony_ci}
8828c2ecf20Sopenharmony_ci
8838c2ecf20Sopenharmony_ci/* Fixed regulator support */
8848c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply fixed_supplies[] = {
8858c2ecf20Sopenharmony_ci	/* Baseboard 3.3V: 5V -> TPS73701DCQ -> 3.3V */
8868c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("AVDD", "1-0018"),
8878c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("DRVDD", "1-0018"),
8888c2ecf20Sopenharmony_ci
8898c2ecf20Sopenharmony_ci	/* Baseboard 1.8V: 5V -> TPS73701DCQ -> 1.8V */
8908c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("DVDD", "1-0018"),
8918c2ecf20Sopenharmony_ci
8928c2ecf20Sopenharmony_ci	/* UI card 3.3V: 5V -> TPS73701DCQ -> 3.3V */
8938c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("vcc", "1-0020"),
8948c2ecf20Sopenharmony_ci};
8958c2ecf20Sopenharmony_ci
8968c2ecf20Sopenharmony_ci/* TPS65070 voltage regulator support */
8978c2ecf20Sopenharmony_ci
8988c2ecf20Sopenharmony_ci/* 3.3V */
8998c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65070_dcdc1_consumers[] = {
9008c2ecf20Sopenharmony_ci	{
9018c2ecf20Sopenharmony_ci		.supply = "usb0_vdda33",
9028c2ecf20Sopenharmony_ci	},
9038c2ecf20Sopenharmony_ci	{
9048c2ecf20Sopenharmony_ci		.supply = "usb1_vdda33",
9058c2ecf20Sopenharmony_ci	},
9068c2ecf20Sopenharmony_ci};
9078c2ecf20Sopenharmony_ci
9088c2ecf20Sopenharmony_ci/* 3.3V or 1.8V */
9098c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65070_dcdc2_consumers[] = {
9108c2ecf20Sopenharmony_ci	{
9118c2ecf20Sopenharmony_ci		.supply = "dvdd3318_a",
9128c2ecf20Sopenharmony_ci	},
9138c2ecf20Sopenharmony_ci	{
9148c2ecf20Sopenharmony_ci		.supply = "dvdd3318_b",
9158c2ecf20Sopenharmony_ci	},
9168c2ecf20Sopenharmony_ci	{
9178c2ecf20Sopenharmony_ci		.supply = "dvdd3318_c",
9188c2ecf20Sopenharmony_ci	},
9198c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("IOVDD", "1-0018"),
9208c2ecf20Sopenharmony_ci};
9218c2ecf20Sopenharmony_ci
9228c2ecf20Sopenharmony_ci/* 1.2V */
9238c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65070_dcdc3_consumers[] = {
9248c2ecf20Sopenharmony_ci	{
9258c2ecf20Sopenharmony_ci		.supply = "cvdd",
9268c2ecf20Sopenharmony_ci	},
9278c2ecf20Sopenharmony_ci};
9288c2ecf20Sopenharmony_ci
9298c2ecf20Sopenharmony_ci/* 1.8V LDO */
9308c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65070_ldo1_consumers[] = {
9318c2ecf20Sopenharmony_ci	{
9328c2ecf20Sopenharmony_ci		.supply = "sata_vddr",
9338c2ecf20Sopenharmony_ci	},
9348c2ecf20Sopenharmony_ci	{
9358c2ecf20Sopenharmony_ci		.supply = "usb0_vdda18",
9368c2ecf20Sopenharmony_ci	},
9378c2ecf20Sopenharmony_ci	{
9388c2ecf20Sopenharmony_ci		.supply = "usb1_vdda18",
9398c2ecf20Sopenharmony_ci	},
9408c2ecf20Sopenharmony_ci	{
9418c2ecf20Sopenharmony_ci		.supply = "ddr_dvdd18",
9428c2ecf20Sopenharmony_ci	},
9438c2ecf20Sopenharmony_ci};
9448c2ecf20Sopenharmony_ci
9458c2ecf20Sopenharmony_ci/* 1.2V LDO */
9468c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65070_ldo2_consumers[] = {
9478c2ecf20Sopenharmony_ci	{
9488c2ecf20Sopenharmony_ci		.supply = "sata_vdd",
9498c2ecf20Sopenharmony_ci	},
9508c2ecf20Sopenharmony_ci	{
9518c2ecf20Sopenharmony_ci		.supply = "pll0_vdda",
9528c2ecf20Sopenharmony_ci	},
9538c2ecf20Sopenharmony_ci	{
9548c2ecf20Sopenharmony_ci		.supply = "pll1_vdda",
9558c2ecf20Sopenharmony_ci	},
9568c2ecf20Sopenharmony_ci	{
9578c2ecf20Sopenharmony_ci		.supply = "usbs_cvdd",
9588c2ecf20Sopenharmony_ci	},
9598c2ecf20Sopenharmony_ci	{
9608c2ecf20Sopenharmony_ci		.supply = "vddarnwa1",
9618c2ecf20Sopenharmony_ci	},
9628c2ecf20Sopenharmony_ci};
9638c2ecf20Sopenharmony_ci
9648c2ecf20Sopenharmony_ci/* We take advantage of the fact that both defdcdc{2,3} are tied high */
9658c2ecf20Sopenharmony_cistatic struct tps6507x_reg_platform_data tps6507x_platform_data = {
9668c2ecf20Sopenharmony_ci	.defdcdc_default = true,
9678c2ecf20Sopenharmony_ci};
9688c2ecf20Sopenharmony_ci
9698c2ecf20Sopenharmony_cistatic struct regulator_init_data tps65070_regulator_data[] = {
9708c2ecf20Sopenharmony_ci	/* dcdc1 */
9718c2ecf20Sopenharmony_ci	{
9728c2ecf20Sopenharmony_ci		.constraints = {
9738c2ecf20Sopenharmony_ci			.min_uV = 3150000,
9748c2ecf20Sopenharmony_ci			.max_uV = 3450000,
9758c2ecf20Sopenharmony_ci			.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
9768c2ecf20Sopenharmony_ci				REGULATOR_CHANGE_STATUS),
9778c2ecf20Sopenharmony_ci			.boot_on = 1,
9788c2ecf20Sopenharmony_ci		},
9798c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc1_consumers),
9808c2ecf20Sopenharmony_ci		.consumer_supplies = tps65070_dcdc1_consumers,
9818c2ecf20Sopenharmony_ci	},
9828c2ecf20Sopenharmony_ci
9838c2ecf20Sopenharmony_ci	/* dcdc2 */
9848c2ecf20Sopenharmony_ci	{
9858c2ecf20Sopenharmony_ci		.constraints = {
9868c2ecf20Sopenharmony_ci			.min_uV = 1710000,
9878c2ecf20Sopenharmony_ci			.max_uV = 3450000,
9888c2ecf20Sopenharmony_ci			.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
9898c2ecf20Sopenharmony_ci				REGULATOR_CHANGE_STATUS),
9908c2ecf20Sopenharmony_ci			.boot_on = 1,
9918c2ecf20Sopenharmony_ci			.always_on = 1,
9928c2ecf20Sopenharmony_ci		},
9938c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers),
9948c2ecf20Sopenharmony_ci		.consumer_supplies = tps65070_dcdc2_consumers,
9958c2ecf20Sopenharmony_ci		.driver_data = &tps6507x_platform_data,
9968c2ecf20Sopenharmony_ci	},
9978c2ecf20Sopenharmony_ci
9988c2ecf20Sopenharmony_ci	/* dcdc3 */
9998c2ecf20Sopenharmony_ci	{
10008c2ecf20Sopenharmony_ci		.constraints = {
10018c2ecf20Sopenharmony_ci			.min_uV = 950000,
10028c2ecf20Sopenharmony_ci			.max_uV = 1350000,
10038c2ecf20Sopenharmony_ci			.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
10048c2ecf20Sopenharmony_ci				REGULATOR_CHANGE_STATUS),
10058c2ecf20Sopenharmony_ci			.boot_on = 1,
10068c2ecf20Sopenharmony_ci		},
10078c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers),
10088c2ecf20Sopenharmony_ci		.consumer_supplies = tps65070_dcdc3_consumers,
10098c2ecf20Sopenharmony_ci		.driver_data = &tps6507x_platform_data,
10108c2ecf20Sopenharmony_ci	},
10118c2ecf20Sopenharmony_ci
10128c2ecf20Sopenharmony_ci	/* ldo1 */
10138c2ecf20Sopenharmony_ci	{
10148c2ecf20Sopenharmony_ci		.constraints = {
10158c2ecf20Sopenharmony_ci			.min_uV = 1710000,
10168c2ecf20Sopenharmony_ci			.max_uV = 1890000,
10178c2ecf20Sopenharmony_ci			.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
10188c2ecf20Sopenharmony_ci				REGULATOR_CHANGE_STATUS),
10198c2ecf20Sopenharmony_ci			.boot_on = 1,
10208c2ecf20Sopenharmony_ci		},
10218c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65070_ldo1_consumers),
10228c2ecf20Sopenharmony_ci		.consumer_supplies = tps65070_ldo1_consumers,
10238c2ecf20Sopenharmony_ci	},
10248c2ecf20Sopenharmony_ci
10258c2ecf20Sopenharmony_ci	/* ldo2 */
10268c2ecf20Sopenharmony_ci	{
10278c2ecf20Sopenharmony_ci		.constraints = {
10288c2ecf20Sopenharmony_ci			.min_uV = 1140000,
10298c2ecf20Sopenharmony_ci			.max_uV = 1320000,
10308c2ecf20Sopenharmony_ci			.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
10318c2ecf20Sopenharmony_ci				REGULATOR_CHANGE_STATUS),
10328c2ecf20Sopenharmony_ci			.boot_on = 1,
10338c2ecf20Sopenharmony_ci		},
10348c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65070_ldo2_consumers),
10358c2ecf20Sopenharmony_ci		.consumer_supplies = tps65070_ldo2_consumers,
10368c2ecf20Sopenharmony_ci	},
10378c2ecf20Sopenharmony_ci};
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_cistatic struct touchscreen_init_data tps6507x_touchscreen_data = {
10408c2ecf20Sopenharmony_ci	.poll_period =  30,	/* ms between touch samples */
10418c2ecf20Sopenharmony_ci	.min_pressure = 0x30,	/* minimum pressure to trigger touch */
10428c2ecf20Sopenharmony_ci	.vendor = 0,		/* /sys/class/input/input?/id/vendor */
10438c2ecf20Sopenharmony_ci	.product = 65070,	/* /sys/class/input/input?/id/product */
10448c2ecf20Sopenharmony_ci	.version = 0x100,	/* /sys/class/input/input?/id/version */
10458c2ecf20Sopenharmony_ci};
10468c2ecf20Sopenharmony_ci
10478c2ecf20Sopenharmony_cistatic struct tps6507x_board tps_board = {
10488c2ecf20Sopenharmony_ci	.tps6507x_pmic_init_data = &tps65070_regulator_data[0],
10498c2ecf20Sopenharmony_ci	.tps6507x_ts_init_data = &tps6507x_touchscreen_data,
10508c2ecf20Sopenharmony_ci};
10518c2ecf20Sopenharmony_ci
10528c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata da850_evm_tps65070_info[] = {
10538c2ecf20Sopenharmony_ci	{
10548c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("tps6507x", 0x48),
10558c2ecf20Sopenharmony_ci		.platform_data = &tps_board,
10568c2ecf20Sopenharmony_ci	},
10578c2ecf20Sopenharmony_ci};
10588c2ecf20Sopenharmony_ci
10598c2ecf20Sopenharmony_cistatic int __init pmic_tps65070_init(void)
10608c2ecf20Sopenharmony_ci{
10618c2ecf20Sopenharmony_ci	return i2c_register_board_info(1, da850_evm_tps65070_info,
10628c2ecf20Sopenharmony_ci					ARRAY_SIZE(da850_evm_tps65070_info));
10638c2ecf20Sopenharmony_ci}
10648c2ecf20Sopenharmony_ci
10658c2ecf20Sopenharmony_cistatic const short da850_evm_lcdc_pins[] = {
10668c2ecf20Sopenharmony_ci	DA850_GPIO2_8, DA850_GPIO2_15,
10678c2ecf20Sopenharmony_ci	-1
10688c2ecf20Sopenharmony_ci};
10698c2ecf20Sopenharmony_ci
10708c2ecf20Sopenharmony_cistatic const short da850_evm_mii_pins[] = {
10718c2ecf20Sopenharmony_ci	DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
10728c2ecf20Sopenharmony_ci	DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
10738c2ecf20Sopenharmony_ci	DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
10748c2ecf20Sopenharmony_ci	DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
10758c2ecf20Sopenharmony_ci	DA850_MDIO_D,
10768c2ecf20Sopenharmony_ci	-1
10778c2ecf20Sopenharmony_ci};
10788c2ecf20Sopenharmony_ci
10798c2ecf20Sopenharmony_cistatic const short da850_evm_rmii_pins[] = {
10808c2ecf20Sopenharmony_ci	DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
10818c2ecf20Sopenharmony_ci	DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,
10828c2ecf20Sopenharmony_ci	DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,
10838c2ecf20Sopenharmony_ci	DA850_MDIO_D,
10848c2ecf20Sopenharmony_ci	-1
10858c2ecf20Sopenharmony_ci};
10868c2ecf20Sopenharmony_ci
10878c2ecf20Sopenharmony_cistatic struct gpiod_hog da850_evm_emac_gpio_hogs[] = {
10888c2ecf20Sopenharmony_ci	{
10898c2ecf20Sopenharmony_ci		.chip_label	= "davinci_gpio",
10908c2ecf20Sopenharmony_ci		.chip_hwnum	= DA850_MII_MDIO_CLKEN_PIN,
10918c2ecf20Sopenharmony_ci		.line_name	= "mdio_clk_en",
10928c2ecf20Sopenharmony_ci		.lflags		= 0,
10938c2ecf20Sopenharmony_ci		/* dflags set in da850_evm_config_emac() */
10948c2ecf20Sopenharmony_ci	},
10958c2ecf20Sopenharmony_ci	{ }
10968c2ecf20Sopenharmony_ci};
10978c2ecf20Sopenharmony_ci
10988c2ecf20Sopenharmony_cistatic int __init da850_evm_config_emac(void)
10998c2ecf20Sopenharmony_ci{
11008c2ecf20Sopenharmony_ci	void __iomem *cfg_chip3_base;
11018c2ecf20Sopenharmony_ci	int ret;
11028c2ecf20Sopenharmony_ci	u32 val;
11038c2ecf20Sopenharmony_ci	struct davinci_soc_info *soc_info = &davinci_soc_info;
11048c2ecf20Sopenharmony_ci	u8 rmii_en;
11058c2ecf20Sopenharmony_ci
11068c2ecf20Sopenharmony_ci	if (!machine_is_davinci_da850_evm())
11078c2ecf20Sopenharmony_ci		return 0;
11088c2ecf20Sopenharmony_ci
11098c2ecf20Sopenharmony_ci	rmii_en = soc_info->emac_pdata->rmii_en;
11108c2ecf20Sopenharmony_ci
11118c2ecf20Sopenharmony_ci	cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
11128c2ecf20Sopenharmony_ci
11138c2ecf20Sopenharmony_ci	val = __raw_readl(cfg_chip3_base);
11148c2ecf20Sopenharmony_ci
11158c2ecf20Sopenharmony_ci	if (rmii_en) {
11168c2ecf20Sopenharmony_ci		val |= BIT(8);
11178c2ecf20Sopenharmony_ci		ret = davinci_cfg_reg_list(da850_evm_rmii_pins);
11188c2ecf20Sopenharmony_ci		pr_info("EMAC: RMII PHY configured, MII PHY will not be"
11198c2ecf20Sopenharmony_ci							" functional\n");
11208c2ecf20Sopenharmony_ci	} else {
11218c2ecf20Sopenharmony_ci		val &= ~BIT(8);
11228c2ecf20Sopenharmony_ci		ret = davinci_cfg_reg_list(da850_evm_mii_pins);
11238c2ecf20Sopenharmony_ci		pr_info("EMAC: MII PHY configured, RMII PHY will not be"
11248c2ecf20Sopenharmony_ci							" functional\n");
11258c2ecf20Sopenharmony_ci	}
11268c2ecf20Sopenharmony_ci
11278c2ecf20Sopenharmony_ci	if (ret)
11288c2ecf20Sopenharmony_ci		pr_warn("%s: CPGMAC/RMII mux setup failed: %d\n",
11298c2ecf20Sopenharmony_ci			__func__, ret);
11308c2ecf20Sopenharmony_ci
11318c2ecf20Sopenharmony_ci	/* configure the CFGCHIP3 register for RMII or MII */
11328c2ecf20Sopenharmony_ci	__raw_writel(val, cfg_chip3_base);
11338c2ecf20Sopenharmony_ci
11348c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg(DA850_GPIO2_6);
11358c2ecf20Sopenharmony_ci	if (ret)
11368c2ecf20Sopenharmony_ci		pr_warn("%s:GPIO(2,6) mux setup failed\n", __func__);
11378c2ecf20Sopenharmony_ci
11388c2ecf20Sopenharmony_ci	da850_evm_emac_gpio_hogs[0].dflags = rmii_en ? GPIOD_OUT_HIGH
11398c2ecf20Sopenharmony_ci						     : GPIOD_OUT_LOW;
11408c2ecf20Sopenharmony_ci	gpiod_add_hogs(da850_evm_emac_gpio_hogs);
11418c2ecf20Sopenharmony_ci
11428c2ecf20Sopenharmony_ci	soc_info->emac_pdata->phy_id = DA850_EVM_PHY_ID;
11438c2ecf20Sopenharmony_ci
11448c2ecf20Sopenharmony_ci	ret = da8xx_register_emac();
11458c2ecf20Sopenharmony_ci	if (ret)
11468c2ecf20Sopenharmony_ci		pr_warn("%s: EMAC registration failed: %d\n", __func__, ret);
11478c2ecf20Sopenharmony_ci
11488c2ecf20Sopenharmony_ci	return 0;
11498c2ecf20Sopenharmony_ci}
11508c2ecf20Sopenharmony_cidevice_initcall(da850_evm_config_emac);
11518c2ecf20Sopenharmony_ci
11528c2ecf20Sopenharmony_ci/*
11538c2ecf20Sopenharmony_ci * The following EDMA channels/slots are not being used by drivers (for
11548c2ecf20Sopenharmony_ci * example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM, hence
11558c2ecf20Sopenharmony_ci * they are being reserved for codecs on the DSP side.
11568c2ecf20Sopenharmony_ci */
11578c2ecf20Sopenharmony_cistatic const s16 da850_dma0_rsv_chans[][2] = {
11588c2ecf20Sopenharmony_ci	/* (offset, number) */
11598c2ecf20Sopenharmony_ci	{ 8,  6},
11608c2ecf20Sopenharmony_ci	{24,  4},
11618c2ecf20Sopenharmony_ci	{30,  2},
11628c2ecf20Sopenharmony_ci	{-1, -1}
11638c2ecf20Sopenharmony_ci};
11648c2ecf20Sopenharmony_ci
11658c2ecf20Sopenharmony_cistatic const s16 da850_dma0_rsv_slots[][2] = {
11668c2ecf20Sopenharmony_ci	/* (offset, number) */
11678c2ecf20Sopenharmony_ci	{ 8,  6},
11688c2ecf20Sopenharmony_ci	{24,  4},
11698c2ecf20Sopenharmony_ci	{30, 50},
11708c2ecf20Sopenharmony_ci	{-1, -1}
11718c2ecf20Sopenharmony_ci};
11728c2ecf20Sopenharmony_ci
11738c2ecf20Sopenharmony_cistatic const s16 da850_dma1_rsv_chans[][2] = {
11748c2ecf20Sopenharmony_ci	/* (offset, number) */
11758c2ecf20Sopenharmony_ci	{ 0, 28},
11768c2ecf20Sopenharmony_ci	{30,  2},
11778c2ecf20Sopenharmony_ci	{-1, -1}
11788c2ecf20Sopenharmony_ci};
11798c2ecf20Sopenharmony_ci
11808c2ecf20Sopenharmony_cistatic const s16 da850_dma1_rsv_slots[][2] = {
11818c2ecf20Sopenharmony_ci	/* (offset, number) */
11828c2ecf20Sopenharmony_ci	{ 0, 28},
11838c2ecf20Sopenharmony_ci	{30, 90},
11848c2ecf20Sopenharmony_ci	{-1, -1}
11858c2ecf20Sopenharmony_ci};
11868c2ecf20Sopenharmony_ci
11878c2ecf20Sopenharmony_cistatic struct edma_rsv_info da850_edma_cc0_rsv = {
11888c2ecf20Sopenharmony_ci	.rsv_chans	= da850_dma0_rsv_chans,
11898c2ecf20Sopenharmony_ci	.rsv_slots	= da850_dma0_rsv_slots,
11908c2ecf20Sopenharmony_ci};
11918c2ecf20Sopenharmony_ci
11928c2ecf20Sopenharmony_cistatic struct edma_rsv_info da850_edma_cc1_rsv = {
11938c2ecf20Sopenharmony_ci	.rsv_chans	= da850_dma1_rsv_chans,
11948c2ecf20Sopenharmony_ci	.rsv_slots	= da850_dma1_rsv_slots,
11958c2ecf20Sopenharmony_ci};
11968c2ecf20Sopenharmony_ci
11978c2ecf20Sopenharmony_cistatic struct edma_rsv_info *da850_edma_rsv[2] = {
11988c2ecf20Sopenharmony_ci	&da850_edma_cc0_rsv,
11998c2ecf20Sopenharmony_ci	&da850_edma_cc1_rsv,
12008c2ecf20Sopenharmony_ci};
12018c2ecf20Sopenharmony_ci
12028c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_FREQ
12038c2ecf20Sopenharmony_cistatic __init int da850_evm_init_cpufreq(void)
12048c2ecf20Sopenharmony_ci{
12058c2ecf20Sopenharmony_ci	switch (system_rev & 0xF) {
12068c2ecf20Sopenharmony_ci	case 3:
12078c2ecf20Sopenharmony_ci		da850_max_speed = 456000;
12088c2ecf20Sopenharmony_ci		break;
12098c2ecf20Sopenharmony_ci	case 2:
12108c2ecf20Sopenharmony_ci		da850_max_speed = 408000;
12118c2ecf20Sopenharmony_ci		break;
12128c2ecf20Sopenharmony_ci	case 1:
12138c2ecf20Sopenharmony_ci		da850_max_speed = 372000;
12148c2ecf20Sopenharmony_ci		break;
12158c2ecf20Sopenharmony_ci	}
12168c2ecf20Sopenharmony_ci
12178c2ecf20Sopenharmony_ci	return da850_register_cpufreq("pll0_sysclk3");
12188c2ecf20Sopenharmony_ci}
12198c2ecf20Sopenharmony_ci#else
12208c2ecf20Sopenharmony_cistatic __init int da850_evm_init_cpufreq(void) { return 0; }
12218c2ecf20Sopenharmony_ci#endif
12228c2ecf20Sopenharmony_ci
12238c2ecf20Sopenharmony_ci#if defined(CONFIG_DA850_UI_SD_VIDEO_PORT)
12248c2ecf20Sopenharmony_ci
12258c2ecf20Sopenharmony_ci#define TVP5147_CH0		"tvp514x-0"
12268c2ecf20Sopenharmony_ci#define TVP5147_CH1		"tvp514x-1"
12278c2ecf20Sopenharmony_ci
12288c2ecf20Sopenharmony_ci/* VPIF capture configuration */
12298c2ecf20Sopenharmony_cistatic struct tvp514x_platform_data tvp5146_pdata = {
12308c2ecf20Sopenharmony_ci		.clk_polarity = 0,
12318c2ecf20Sopenharmony_ci		.hs_polarity  = 1,
12328c2ecf20Sopenharmony_ci		.vs_polarity  = 1,
12338c2ecf20Sopenharmony_ci};
12348c2ecf20Sopenharmony_ci
12358c2ecf20Sopenharmony_ci#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL)
12368c2ecf20Sopenharmony_ci
12378c2ecf20Sopenharmony_cistatic struct vpif_input da850_ch0_inputs[] = {
12388c2ecf20Sopenharmony_ci	{
12398c2ecf20Sopenharmony_ci		.input = {
12408c2ecf20Sopenharmony_ci			.index = 0,
12418c2ecf20Sopenharmony_ci			.name  = "Composite",
12428c2ecf20Sopenharmony_ci			.type  = V4L2_INPUT_TYPE_CAMERA,
12438c2ecf20Sopenharmony_ci			.capabilities = V4L2_IN_CAP_STD,
12448c2ecf20Sopenharmony_ci			.std   = TVP514X_STD_ALL,
12458c2ecf20Sopenharmony_ci		},
12468c2ecf20Sopenharmony_ci		.input_route = INPUT_CVBS_VI2B,
12478c2ecf20Sopenharmony_ci		.output_route = OUTPUT_10BIT_422_EMBEDDED_SYNC,
12488c2ecf20Sopenharmony_ci		.subdev_name = TVP5147_CH0,
12498c2ecf20Sopenharmony_ci	},
12508c2ecf20Sopenharmony_ci};
12518c2ecf20Sopenharmony_ci
12528c2ecf20Sopenharmony_cistatic struct vpif_input da850_ch1_inputs[] = {
12538c2ecf20Sopenharmony_ci	{
12548c2ecf20Sopenharmony_ci		.input = {
12558c2ecf20Sopenharmony_ci			.index = 0,
12568c2ecf20Sopenharmony_ci			.name  = "S-Video",
12578c2ecf20Sopenharmony_ci			.type  = V4L2_INPUT_TYPE_CAMERA,
12588c2ecf20Sopenharmony_ci			.capabilities = V4L2_IN_CAP_STD,
12598c2ecf20Sopenharmony_ci			.std   = TVP514X_STD_ALL,
12608c2ecf20Sopenharmony_ci		},
12618c2ecf20Sopenharmony_ci		.input_route = INPUT_SVIDEO_VI2C_VI1C,
12628c2ecf20Sopenharmony_ci		.output_route = OUTPUT_10BIT_422_EMBEDDED_SYNC,
12638c2ecf20Sopenharmony_ci		.subdev_name = TVP5147_CH1,
12648c2ecf20Sopenharmony_ci	},
12658c2ecf20Sopenharmony_ci};
12668c2ecf20Sopenharmony_ci
12678c2ecf20Sopenharmony_cistatic struct vpif_subdev_info da850_vpif_capture_sdev_info[] = {
12688c2ecf20Sopenharmony_ci	{
12698c2ecf20Sopenharmony_ci		.name = TVP5147_CH0,
12708c2ecf20Sopenharmony_ci		.board_info = {
12718c2ecf20Sopenharmony_ci			I2C_BOARD_INFO("tvp5146", 0x5d),
12728c2ecf20Sopenharmony_ci			.platform_data = &tvp5146_pdata,
12738c2ecf20Sopenharmony_ci		},
12748c2ecf20Sopenharmony_ci	},
12758c2ecf20Sopenharmony_ci	{
12768c2ecf20Sopenharmony_ci		.name = TVP5147_CH1,
12778c2ecf20Sopenharmony_ci		.board_info = {
12788c2ecf20Sopenharmony_ci			I2C_BOARD_INFO("tvp5146", 0x5c),
12798c2ecf20Sopenharmony_ci			.platform_data = &tvp5146_pdata,
12808c2ecf20Sopenharmony_ci		},
12818c2ecf20Sopenharmony_ci	},
12828c2ecf20Sopenharmony_ci};
12838c2ecf20Sopenharmony_ci
12848c2ecf20Sopenharmony_cistatic struct vpif_capture_config da850_vpif_capture_config = {
12858c2ecf20Sopenharmony_ci	.subdev_info = da850_vpif_capture_sdev_info,
12868c2ecf20Sopenharmony_ci	.subdev_count = ARRAY_SIZE(da850_vpif_capture_sdev_info),
12878c2ecf20Sopenharmony_ci	.i2c_adapter_id = 1,
12888c2ecf20Sopenharmony_ci	.chan_config[0] = {
12898c2ecf20Sopenharmony_ci		.inputs = da850_ch0_inputs,
12908c2ecf20Sopenharmony_ci		.input_count = ARRAY_SIZE(da850_ch0_inputs),
12918c2ecf20Sopenharmony_ci		.vpif_if = {
12928c2ecf20Sopenharmony_ci			.if_type = VPIF_IF_BT656,
12938c2ecf20Sopenharmony_ci			.hd_pol  = 1,
12948c2ecf20Sopenharmony_ci			.vd_pol  = 1,
12958c2ecf20Sopenharmony_ci			.fid_pol = 0,
12968c2ecf20Sopenharmony_ci		},
12978c2ecf20Sopenharmony_ci	},
12988c2ecf20Sopenharmony_ci	.chan_config[1] = {
12998c2ecf20Sopenharmony_ci		.inputs = da850_ch1_inputs,
13008c2ecf20Sopenharmony_ci		.input_count = ARRAY_SIZE(da850_ch1_inputs),
13018c2ecf20Sopenharmony_ci		.vpif_if = {
13028c2ecf20Sopenharmony_ci			.if_type = VPIF_IF_BT656,
13038c2ecf20Sopenharmony_ci			.hd_pol  = 1,
13048c2ecf20Sopenharmony_ci			.vd_pol  = 1,
13058c2ecf20Sopenharmony_ci			.fid_pol = 0,
13068c2ecf20Sopenharmony_ci		},
13078c2ecf20Sopenharmony_ci	},
13088c2ecf20Sopenharmony_ci	.card_name = "DA850/OMAP-L138 Video Capture",
13098c2ecf20Sopenharmony_ci};
13108c2ecf20Sopenharmony_ci
13118c2ecf20Sopenharmony_ci/* VPIF display configuration */
13128c2ecf20Sopenharmony_ci
13138c2ecf20Sopenharmony_cistatic struct adv7343_platform_data adv7343_pdata = {
13148c2ecf20Sopenharmony_ci	.mode_config = {
13158c2ecf20Sopenharmony_ci		.dac = { 1, 1, 1 },
13168c2ecf20Sopenharmony_ci	},
13178c2ecf20Sopenharmony_ci	.sd_config = {
13188c2ecf20Sopenharmony_ci		.sd_dac_out = { 1 },
13198c2ecf20Sopenharmony_ci	},
13208c2ecf20Sopenharmony_ci};
13218c2ecf20Sopenharmony_ci
13228c2ecf20Sopenharmony_cistatic struct vpif_subdev_info da850_vpif_subdev[] = {
13238c2ecf20Sopenharmony_ci	{
13248c2ecf20Sopenharmony_ci		.name = "adv7343",
13258c2ecf20Sopenharmony_ci		.board_info = {
13268c2ecf20Sopenharmony_ci			I2C_BOARD_INFO("adv7343", 0x2a),
13278c2ecf20Sopenharmony_ci			.platform_data = &adv7343_pdata,
13288c2ecf20Sopenharmony_ci		},
13298c2ecf20Sopenharmony_ci	},
13308c2ecf20Sopenharmony_ci};
13318c2ecf20Sopenharmony_ci
13328c2ecf20Sopenharmony_cistatic const struct vpif_output da850_ch0_outputs[] = {
13338c2ecf20Sopenharmony_ci	{
13348c2ecf20Sopenharmony_ci		.output = {
13358c2ecf20Sopenharmony_ci			.index = 0,
13368c2ecf20Sopenharmony_ci			.name = "Composite",
13378c2ecf20Sopenharmony_ci			.type = V4L2_OUTPUT_TYPE_ANALOG,
13388c2ecf20Sopenharmony_ci			.capabilities = V4L2_OUT_CAP_STD,
13398c2ecf20Sopenharmony_ci			.std = V4L2_STD_ALL,
13408c2ecf20Sopenharmony_ci		},
13418c2ecf20Sopenharmony_ci		.subdev_name = "adv7343",
13428c2ecf20Sopenharmony_ci		.output_route = ADV7343_COMPOSITE_ID,
13438c2ecf20Sopenharmony_ci	},
13448c2ecf20Sopenharmony_ci	{
13458c2ecf20Sopenharmony_ci		.output = {
13468c2ecf20Sopenharmony_ci			.index = 1,
13478c2ecf20Sopenharmony_ci			.name = "S-Video",
13488c2ecf20Sopenharmony_ci			.type = V4L2_OUTPUT_TYPE_ANALOG,
13498c2ecf20Sopenharmony_ci			.capabilities = V4L2_OUT_CAP_STD,
13508c2ecf20Sopenharmony_ci			.std = V4L2_STD_ALL,
13518c2ecf20Sopenharmony_ci		},
13528c2ecf20Sopenharmony_ci		.subdev_name = "adv7343",
13538c2ecf20Sopenharmony_ci		.output_route = ADV7343_SVIDEO_ID,
13548c2ecf20Sopenharmony_ci	},
13558c2ecf20Sopenharmony_ci};
13568c2ecf20Sopenharmony_ci
13578c2ecf20Sopenharmony_cistatic struct vpif_display_config da850_vpif_display_config = {
13588c2ecf20Sopenharmony_ci	.subdevinfo   = da850_vpif_subdev,
13598c2ecf20Sopenharmony_ci	.subdev_count = ARRAY_SIZE(da850_vpif_subdev),
13608c2ecf20Sopenharmony_ci	.chan_config[0] = {
13618c2ecf20Sopenharmony_ci		.outputs = da850_ch0_outputs,
13628c2ecf20Sopenharmony_ci		.output_count = ARRAY_SIZE(da850_ch0_outputs),
13638c2ecf20Sopenharmony_ci	},
13648c2ecf20Sopenharmony_ci	.card_name    = "DA850/OMAP-L138 Video Display",
13658c2ecf20Sopenharmony_ci	.i2c_adapter_id = 1,
13668c2ecf20Sopenharmony_ci};
13678c2ecf20Sopenharmony_ci
13688c2ecf20Sopenharmony_cistatic __init void da850_vpif_init(void)
13698c2ecf20Sopenharmony_ci{
13708c2ecf20Sopenharmony_ci	int ret;
13718c2ecf20Sopenharmony_ci
13728c2ecf20Sopenharmony_ci	ret = da850_register_vpif();
13738c2ecf20Sopenharmony_ci	if (ret)
13748c2ecf20Sopenharmony_ci		pr_warn("da850_evm_init: VPIF setup failed: %d\n", ret);
13758c2ecf20Sopenharmony_ci
13768c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da850_vpif_capture_pins);
13778c2ecf20Sopenharmony_ci	if (ret)
13788c2ecf20Sopenharmony_ci		pr_warn("da850_evm_init: VPIF capture mux setup failed: %d\n",
13798c2ecf20Sopenharmony_ci			ret);
13808c2ecf20Sopenharmony_ci
13818c2ecf20Sopenharmony_ci	ret = da850_register_vpif_capture(&da850_vpif_capture_config);
13828c2ecf20Sopenharmony_ci	if (ret)
13838c2ecf20Sopenharmony_ci		pr_warn("da850_evm_init: VPIF capture setup failed: %d\n", ret);
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da850_vpif_display_pins);
13868c2ecf20Sopenharmony_ci	if (ret)
13878c2ecf20Sopenharmony_ci		pr_warn("da850_evm_init: VPIF display mux setup failed: %d\n",
13888c2ecf20Sopenharmony_ci			ret);
13898c2ecf20Sopenharmony_ci
13908c2ecf20Sopenharmony_ci	ret = da850_register_vpif_display(&da850_vpif_display_config);
13918c2ecf20Sopenharmony_ci	if (ret)
13928c2ecf20Sopenharmony_ci		pr_warn("da850_evm_init: VPIF display setup failed: %d\n", ret);
13938c2ecf20Sopenharmony_ci}
13948c2ecf20Sopenharmony_ci
13958c2ecf20Sopenharmony_ci#else
13968c2ecf20Sopenharmony_cistatic __init void da850_vpif_init(void) {}
13978c2ecf20Sopenharmony_ci#endif
13988c2ecf20Sopenharmony_ci
13998c2ecf20Sopenharmony_ci#define DA850EVM_SATA_REFCLKPN_RATE	(100 * 1000 * 1000)
14008c2ecf20Sopenharmony_ci
14018c2ecf20Sopenharmony_cistatic __init void da850_evm_init(void)
14028c2ecf20Sopenharmony_ci{
14038c2ecf20Sopenharmony_ci	int ret;
14048c2ecf20Sopenharmony_ci
14058c2ecf20Sopenharmony_ci	da850_register_clocks();
14068c2ecf20Sopenharmony_ci
14078c2ecf20Sopenharmony_ci	ret = da850_register_gpio();
14088c2ecf20Sopenharmony_ci	if (ret)
14098c2ecf20Sopenharmony_ci		pr_warn("%s: GPIO init failed: %d\n", __func__, ret);
14108c2ecf20Sopenharmony_ci
14118c2ecf20Sopenharmony_ci	regulator_register_fixed(0, fixed_supplies, ARRAY_SIZE(fixed_supplies));
14128c2ecf20Sopenharmony_ci
14138c2ecf20Sopenharmony_ci	ret = pmic_tps65070_init();
14148c2ecf20Sopenharmony_ci	if (ret)
14158c2ecf20Sopenharmony_ci		pr_warn("%s: TPS65070 PMIC init failed: %d\n", __func__, ret);
14168c2ecf20Sopenharmony_ci
14178c2ecf20Sopenharmony_ci	ret = da850_register_edma(da850_edma_rsv);
14188c2ecf20Sopenharmony_ci	if (ret)
14198c2ecf20Sopenharmony_ci		pr_warn("%s: EDMA registration failed: %d\n", __func__, ret);
14208c2ecf20Sopenharmony_ci
14218c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da850_i2c0_pins);
14228c2ecf20Sopenharmony_ci	if (ret)
14238c2ecf20Sopenharmony_ci		pr_warn("%s: I2C0 mux setup failed: %d\n", __func__, ret);
14248c2ecf20Sopenharmony_ci
14258c2ecf20Sopenharmony_ci	ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);
14268c2ecf20Sopenharmony_ci	if (ret)
14278c2ecf20Sopenharmony_ci		pr_warn("%s: I2C0 registration failed: %d\n", __func__, ret);
14288c2ecf20Sopenharmony_ci
14298c2ecf20Sopenharmony_ci
14308c2ecf20Sopenharmony_ci	ret = da8xx_register_watchdog();
14318c2ecf20Sopenharmony_ci	if (ret)
14328c2ecf20Sopenharmony_ci		pr_warn("%s: watchdog registration failed: %d\n",
14338c2ecf20Sopenharmony_ci			__func__, ret);
14348c2ecf20Sopenharmony_ci
14358c2ecf20Sopenharmony_ci	if (HAS_MMC) {
14368c2ecf20Sopenharmony_ci		ret = davinci_cfg_reg_list(da850_evm_mmcsd0_pins);
14378c2ecf20Sopenharmony_ci		if (ret)
14388c2ecf20Sopenharmony_ci			pr_warn("%s: MMCSD0 mux setup failed: %d\n",
14398c2ecf20Sopenharmony_ci				__func__, ret);
14408c2ecf20Sopenharmony_ci
14418c2ecf20Sopenharmony_ci		gpiod_add_lookup_table(&mmc_gpios_table);
14428c2ecf20Sopenharmony_ci
14438c2ecf20Sopenharmony_ci		ret = da8xx_register_mmcsd0(&da850_mmc_config);
14448c2ecf20Sopenharmony_ci		if (ret)
14458c2ecf20Sopenharmony_ci			pr_warn("%s: MMCSD0 registration failed: %d\n",
14468c2ecf20Sopenharmony_ci				__func__, ret);
14478c2ecf20Sopenharmony_ci	}
14488c2ecf20Sopenharmony_ci
14498c2ecf20Sopenharmony_ci	davinci_serial_init(da8xx_serial_device);
14508c2ecf20Sopenharmony_ci
14518c2ecf20Sopenharmony_ci	nvmem_add_cell_table(&da850evm_nvmem_cell_table);
14528c2ecf20Sopenharmony_ci	nvmem_add_cell_lookups(&da850evm_nvmem_cell_lookup, 1);
14538c2ecf20Sopenharmony_ci
14548c2ecf20Sopenharmony_ci	i2c_register_board_info(1, da850_evm_i2c_devices,
14558c2ecf20Sopenharmony_ci			ARRAY_SIZE(da850_evm_i2c_devices));
14568c2ecf20Sopenharmony_ci
14578c2ecf20Sopenharmony_ci	/*
14588c2ecf20Sopenharmony_ci	 * shut down uart 0 and 1; they are not used on the board and
14598c2ecf20Sopenharmony_ci	 * accessing them causes endless "too much work in irq53" messages
14608c2ecf20Sopenharmony_ci	 * with arago fs
14618c2ecf20Sopenharmony_ci	 */
14628c2ecf20Sopenharmony_ci	__raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
14638c2ecf20Sopenharmony_ci	__raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
14648c2ecf20Sopenharmony_ci
14658c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da850_evm_mcasp_pins);
14668c2ecf20Sopenharmony_ci	if (ret)
14678c2ecf20Sopenharmony_ci		pr_warn("%s: McASP mux setup failed: %d\n", __func__, ret);
14688c2ecf20Sopenharmony_ci
14698c2ecf20Sopenharmony_ci	da850_evm_snd_data.sram_pool = sram_get_gen_pool();
14708c2ecf20Sopenharmony_ci	da8xx_register_mcasp(0, &da850_evm_snd_data);
14718c2ecf20Sopenharmony_ci
14728c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
14738c2ecf20Sopenharmony_ci	if (ret)
14748c2ecf20Sopenharmony_ci		pr_warn("%s: LCDC mux setup failed: %d\n", __func__, ret);
14758c2ecf20Sopenharmony_ci
14768c2ecf20Sopenharmony_ci	ret = da8xx_register_uio_pruss();
14778c2ecf20Sopenharmony_ci	if (ret)
14788c2ecf20Sopenharmony_ci		pr_warn("da850_evm_init: pruss initialization failed: %d\n",
14798c2ecf20Sopenharmony_ci				ret);
14808c2ecf20Sopenharmony_ci
14818c2ecf20Sopenharmony_ci	/* Handle board specific muxing for LCD here */
14828c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da850_evm_lcdc_pins);
14838c2ecf20Sopenharmony_ci	if (ret)
14848c2ecf20Sopenharmony_ci		pr_warn("%s: EVM specific LCD mux setup failed: %d\n",
14858c2ecf20Sopenharmony_ci			__func__, ret);
14868c2ecf20Sopenharmony_ci
14878c2ecf20Sopenharmony_ci	ret = da850_lcd_hw_init();
14888c2ecf20Sopenharmony_ci	if (ret)
14898c2ecf20Sopenharmony_ci		pr_warn("%s: LCD initialization failed: %d\n", __func__, ret);
14908c2ecf20Sopenharmony_ci
14918c2ecf20Sopenharmony_ci	ret = da8xx_register_lcdc(&sharp_lk043t1dg01_pdata);
14928c2ecf20Sopenharmony_ci	if (ret)
14938c2ecf20Sopenharmony_ci		pr_warn("%s: LCDC registration failed: %d\n", __func__, ret);
14948c2ecf20Sopenharmony_ci
14958c2ecf20Sopenharmony_ci	ret = da8xx_register_rtc();
14968c2ecf20Sopenharmony_ci	if (ret)
14978c2ecf20Sopenharmony_ci		pr_warn("%s: RTC setup failed: %d\n", __func__, ret);
14988c2ecf20Sopenharmony_ci
14998c2ecf20Sopenharmony_ci	ret = da850_evm_init_cpufreq();
15008c2ecf20Sopenharmony_ci	if (ret)
15018c2ecf20Sopenharmony_ci		pr_warn("%s: cpufreq registration failed: %d\n", __func__, ret);
15028c2ecf20Sopenharmony_ci
15038c2ecf20Sopenharmony_ci	ret = da8xx_register_cpuidle();
15048c2ecf20Sopenharmony_ci	if (ret)
15058c2ecf20Sopenharmony_ci		pr_warn("%s: cpuidle registration failed: %d\n", __func__, ret);
15068c2ecf20Sopenharmony_ci
15078c2ecf20Sopenharmony_ci	davinci_pm_init();
15088c2ecf20Sopenharmony_ci	da850_vpif_init();
15098c2ecf20Sopenharmony_ci
15108c2ecf20Sopenharmony_ci	ret = spi_register_board_info(da850evm_spi_info,
15118c2ecf20Sopenharmony_ci				      ARRAY_SIZE(da850evm_spi_info));
15128c2ecf20Sopenharmony_ci	if (ret)
15138c2ecf20Sopenharmony_ci		pr_warn("%s: spi info registration failed: %d\n", __func__,
15148c2ecf20Sopenharmony_ci			ret);
15158c2ecf20Sopenharmony_ci
15168c2ecf20Sopenharmony_ci	ret = da8xx_register_spi_bus(1, ARRAY_SIZE(da850evm_spi_info));
15178c2ecf20Sopenharmony_ci	if (ret)
15188c2ecf20Sopenharmony_ci		pr_warn("%s: SPI 1 registration failed: %d\n", __func__, ret);
15198c2ecf20Sopenharmony_ci
15208c2ecf20Sopenharmony_ci	ret = da850_register_sata(DA850EVM_SATA_REFCLKPN_RATE);
15218c2ecf20Sopenharmony_ci	if (ret)
15228c2ecf20Sopenharmony_ci		pr_warn("%s: SATA registration failed: %d\n", __func__, ret);
15238c2ecf20Sopenharmony_ci
15248c2ecf20Sopenharmony_ci	ret = da8xx_register_rproc();
15258c2ecf20Sopenharmony_ci	if (ret)
15268c2ecf20Sopenharmony_ci		pr_warn("%s: dsp/rproc registration failed: %d\n",
15278c2ecf20Sopenharmony_ci			__func__, ret);
15288c2ecf20Sopenharmony_ci
15298c2ecf20Sopenharmony_ci	regulator_has_full_constraints();
15308c2ecf20Sopenharmony_ci}
15318c2ecf20Sopenharmony_ci
15328c2ecf20Sopenharmony_ci#ifdef CONFIG_SERIAL_8250_CONSOLE
15338c2ecf20Sopenharmony_cistatic int __init da850_evm_console_init(void)
15348c2ecf20Sopenharmony_ci{
15358c2ecf20Sopenharmony_ci	if (!machine_is_davinci_da850_evm())
15368c2ecf20Sopenharmony_ci		return 0;
15378c2ecf20Sopenharmony_ci
15388c2ecf20Sopenharmony_ci	return add_preferred_console("ttyS", 2, "115200");
15398c2ecf20Sopenharmony_ci}
15408c2ecf20Sopenharmony_ciconsole_initcall(da850_evm_console_init);
15418c2ecf20Sopenharmony_ci#endif
15428c2ecf20Sopenharmony_ci
15438c2ecf20Sopenharmony_cistatic void __init da850_evm_map_io(void)
15448c2ecf20Sopenharmony_ci{
15458c2ecf20Sopenharmony_ci	da850_init();
15468c2ecf20Sopenharmony_ci}
15478c2ecf20Sopenharmony_ci
15488c2ecf20Sopenharmony_ciMACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM")
15498c2ecf20Sopenharmony_ci	.atag_offset	= 0x100,
15508c2ecf20Sopenharmony_ci	.map_io		= da850_evm_map_io,
15518c2ecf20Sopenharmony_ci	.init_irq	= da850_init_irq,
15528c2ecf20Sopenharmony_ci	.init_time	= da850_init_time,
15538c2ecf20Sopenharmony_ci	.init_machine	= da850_evm_init,
15548c2ecf20Sopenharmony_ci	.init_late	= davinci_init_late,
15558c2ecf20Sopenharmony_ci	.dma_zone_size	= SZ_128M,
15568c2ecf20Sopenharmony_ci	.reserve	= da8xx_rproc_reserve_cma,
15578c2ecf20Sopenharmony_ciMACHINE_END
1558