18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * TI DA830/OMAP L137 EVM board
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Author: Mark A. Greer <mgreer@mvista.com>
58c2ecf20Sopenharmony_ci * Derived from: arch/arm/mach-davinci/board-dm644x-evm.c
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
88c2ecf20Sopenharmony_ci * the terms of the GNU General Public License version 2. This program
98c2ecf20Sopenharmony_ci * is licensed "as is" without any warranty of any kind, whether express
108c2ecf20Sopenharmony_ci * or implied.
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_ci#include <linux/kernel.h>
138c2ecf20Sopenharmony_ci#include <linux/init.h>
148c2ecf20Sopenharmony_ci#include <linux/console.h>
158c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
168c2ecf20Sopenharmony_ci#include <linux/gpio.h>
178c2ecf20Sopenharmony_ci#include <linux/gpio/machine.h>
188c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
198c2ecf20Sopenharmony_ci#include <linux/i2c.h>
208c2ecf20Sopenharmony_ci#include <linux/platform_data/pcf857x.h>
218c2ecf20Sopenharmony_ci#include <linux/property.h>
228c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h>
238c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h>
248c2ecf20Sopenharmony_ci#include <linux/spi/spi.h>
258c2ecf20Sopenharmony_ci#include <linux/spi/flash.h>
268c2ecf20Sopenharmony_ci#include <linux/platform_data/gpio-davinci.h>
278c2ecf20Sopenharmony_ci#include <linux/platform_data/mtd-davinci.h>
288c2ecf20Sopenharmony_ci#include <linux/platform_data/mtd-davinci-aemif.h>
298c2ecf20Sopenharmony_ci#include <linux/platform_data/spi-davinci.h>
308c2ecf20Sopenharmony_ci#include <linux/platform_data/usb-davinci.h>
318c2ecf20Sopenharmony_ci#include <linux/platform_data/ti-aemif.h>
328c2ecf20Sopenharmony_ci#include <linux/regulator/fixed.h>
338c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h>
348c2ecf20Sopenharmony_ci#include <linux/nvmem-provider.h>
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#include <asm/mach-types.h>
378c2ecf20Sopenharmony_ci#include <asm/mach/arch.h>
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#include <mach/common.h>
408c2ecf20Sopenharmony_ci#include <mach/mux.h>
418c2ecf20Sopenharmony_ci#include <mach/da8xx.h>
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#include "irqs.h"
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#define DA830_EVM_PHY_ID		""
468c2ecf20Sopenharmony_ci/*
478c2ecf20Sopenharmony_ci * USB1 VBUS is controlled by GPIO1[15], over-current is reported on GPIO2[4].
488c2ecf20Sopenharmony_ci */
498c2ecf20Sopenharmony_ci#define ON_BD_USB_DRV	GPIO_TO_PIN(1, 15)
508c2ecf20Sopenharmony_ci#define ON_BD_USB_OVC	GPIO_TO_PIN(2, 4)
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic const short da830_evm_usb11_pins[] = {
538c2ecf20Sopenharmony_ci	DA830_GPIO1_15, DA830_GPIO2_4,
548c2ecf20Sopenharmony_ci	-1
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply da830_evm_usb_supplies[] = {
588c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("vbus", NULL),
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_cistatic struct regulator_init_data da830_evm_usb_vbus_data = {
628c2ecf20Sopenharmony_ci	.consumer_supplies	= da830_evm_usb_supplies,
638c2ecf20Sopenharmony_ci	.num_consumer_supplies	= ARRAY_SIZE(da830_evm_usb_supplies),
648c2ecf20Sopenharmony_ci	.constraints    = {
658c2ecf20Sopenharmony_ci		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
668c2ecf20Sopenharmony_ci	},
678c2ecf20Sopenharmony_ci};
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_cistatic struct fixed_voltage_config da830_evm_usb_vbus = {
708c2ecf20Sopenharmony_ci	.supply_name		= "vbus",
718c2ecf20Sopenharmony_ci	.microvolts		= 33000000,
728c2ecf20Sopenharmony_ci	.init_data		= &da830_evm_usb_vbus_data,
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistatic struct platform_device da830_evm_usb_vbus_device = {
768c2ecf20Sopenharmony_ci	.name		= "reg-fixed-voltage",
778c2ecf20Sopenharmony_ci	.id		= 0,
788c2ecf20Sopenharmony_ci	.dev		= {
798c2ecf20Sopenharmony_ci		.platform_data = &da830_evm_usb_vbus,
808c2ecf20Sopenharmony_ci	},
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table da830_evm_usb_oc_gpio_lookup = {
848c2ecf20Sopenharmony_ci	.dev_id		= "ohci-da8xx",
858c2ecf20Sopenharmony_ci	.table = {
868c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", ON_BD_USB_OVC, "oc", 0),
878c2ecf20Sopenharmony_ci		{ }
888c2ecf20Sopenharmony_ci	},
898c2ecf20Sopenharmony_ci};
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table da830_evm_usb_vbus_gpio_lookup = {
928c2ecf20Sopenharmony_ci	.dev_id		= "reg-fixed-voltage.0",
938c2ecf20Sopenharmony_ci	.table = {
948c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", ON_BD_USB_DRV, NULL, 0),
958c2ecf20Sopenharmony_ci		{ }
968c2ecf20Sopenharmony_ci	},
978c2ecf20Sopenharmony_ci};
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table *da830_evm_usb_gpio_lookups[] = {
1008c2ecf20Sopenharmony_ci	&da830_evm_usb_oc_gpio_lookup,
1018c2ecf20Sopenharmony_ci	&da830_evm_usb_vbus_gpio_lookup,
1028c2ecf20Sopenharmony_ci};
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_cistatic struct da8xx_ohci_root_hub da830_evm_usb11_pdata = {
1058c2ecf20Sopenharmony_ci	/* TPS2065 switch @ 5V */
1068c2ecf20Sopenharmony_ci	.potpgt		= (3 + 1) / 2,	/* 3 ms max */
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_cistatic __init void da830_evm_usb_init(void)
1108c2ecf20Sopenharmony_ci{
1118c2ecf20Sopenharmony_ci	int ret;
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	ret = da8xx_register_usb_phy_clocks();
1148c2ecf20Sopenharmony_ci	if (ret)
1158c2ecf20Sopenharmony_ci		pr_warn("%s: USB PHY CLK registration failed: %d\n",
1168c2ecf20Sopenharmony_ci			__func__, ret);
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	gpiod_add_lookup_tables(da830_evm_usb_gpio_lookups,
1198c2ecf20Sopenharmony_ci				ARRAY_SIZE(da830_evm_usb_gpio_lookups));
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	ret = da8xx_register_usb_phy();
1228c2ecf20Sopenharmony_ci	if (ret)
1238c2ecf20Sopenharmony_ci		pr_warn("%s: USB PHY registration failed: %d\n",
1248c2ecf20Sopenharmony_ci			__func__, ret);
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg(DA830_USB0_DRVVBUS);
1278c2ecf20Sopenharmony_ci	if (ret)
1288c2ecf20Sopenharmony_ci		pr_warn("%s: USB 2.0 PinMux setup failed: %d\n", __func__, ret);
1298c2ecf20Sopenharmony_ci	else {
1308c2ecf20Sopenharmony_ci		/*
1318c2ecf20Sopenharmony_ci		 * TPS2065 switch @ 5V supplies 1 A (sustains 1.5 A),
1328c2ecf20Sopenharmony_ci		 * with the power on to power good time of 3 ms.
1338c2ecf20Sopenharmony_ci		 */
1348c2ecf20Sopenharmony_ci		ret = da8xx_register_usb20(1000, 3);
1358c2ecf20Sopenharmony_ci		if (ret)
1368c2ecf20Sopenharmony_ci			pr_warn("%s: USB 2.0 registration failed: %d\n",
1378c2ecf20Sopenharmony_ci				__func__, ret);
1388c2ecf20Sopenharmony_ci	}
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da830_evm_usb11_pins);
1418c2ecf20Sopenharmony_ci	if (ret) {
1428c2ecf20Sopenharmony_ci		pr_warn("%s: USB 1.1 PinMux setup failed: %d\n", __func__, ret);
1438c2ecf20Sopenharmony_ci		return;
1448c2ecf20Sopenharmony_ci	}
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	ret = platform_device_register(&da830_evm_usb_vbus_device);
1478c2ecf20Sopenharmony_ci	if (ret) {
1488c2ecf20Sopenharmony_ci		pr_warn("%s: Unable to register the vbus supply\n", __func__);
1498c2ecf20Sopenharmony_ci		return;
1508c2ecf20Sopenharmony_ci	}
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci	ret = da8xx_register_usb11(&da830_evm_usb11_pdata);
1538c2ecf20Sopenharmony_ci	if (ret)
1548c2ecf20Sopenharmony_ci		pr_warn("%s: USB 1.1 registration failed: %d\n", __func__, ret);
1558c2ecf20Sopenharmony_ci}
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_cistatic const short da830_evm_mcasp1_pins[] = {
1588c2ecf20Sopenharmony_ci	DA830_AHCLKX1, DA830_ACLKX1, DA830_AFSX1, DA830_AHCLKR1, DA830_AFSR1,
1598c2ecf20Sopenharmony_ci	DA830_AMUTE1, DA830_AXR1_0, DA830_AXR1_1, DA830_AXR1_2, DA830_AXR1_5,
1608c2ecf20Sopenharmony_ci	DA830_ACLKR1, DA830_AXR1_6, DA830_AXR1_7, DA830_AXR1_8, DA830_AXR1_10,
1618c2ecf20Sopenharmony_ci	DA830_AXR1_11,
1628c2ecf20Sopenharmony_ci	-1
1638c2ecf20Sopenharmony_ci};
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_cistatic u8 da830_iis_serializer_direction[] = {
1668c2ecf20Sopenharmony_ci	RX_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
1678c2ecf20Sopenharmony_ci	INACTIVE_MODE,	TX_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
1688c2ecf20Sopenharmony_ci	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
1698c2ecf20Sopenharmony_ci};
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_cistatic struct snd_platform_data da830_evm_snd_data = {
1728c2ecf20Sopenharmony_ci	.tx_dma_offset  = 0x2000,
1738c2ecf20Sopenharmony_ci	.rx_dma_offset  = 0x2000,
1748c2ecf20Sopenharmony_ci	.op_mode        = DAVINCI_MCASP_IIS_MODE,
1758c2ecf20Sopenharmony_ci	.num_serializer = ARRAY_SIZE(da830_iis_serializer_direction),
1768c2ecf20Sopenharmony_ci	.tdm_slots      = 2,
1778c2ecf20Sopenharmony_ci	.serial_dir     = da830_iis_serializer_direction,
1788c2ecf20Sopenharmony_ci	.asp_chan_q     = EVENTQ_0,
1798c2ecf20Sopenharmony_ci	.version	= MCASP_VERSION_2,
1808c2ecf20Sopenharmony_ci	.txnumevt	= 1,
1818c2ecf20Sopenharmony_ci	.rxnumevt	= 1,
1828c2ecf20Sopenharmony_ci};
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci/*
1858c2ecf20Sopenharmony_ci * GPIO2[1] is used as MMC_SD_WP and GPIO2[2] as MMC_SD_INS.
1868c2ecf20Sopenharmony_ci */
1878c2ecf20Sopenharmony_cistatic const short da830_evm_mmc_sd_pins[] = {
1888c2ecf20Sopenharmony_ci	DA830_MMCSD_DAT_0, DA830_MMCSD_DAT_1, DA830_MMCSD_DAT_2,
1898c2ecf20Sopenharmony_ci	DA830_MMCSD_DAT_3, DA830_MMCSD_DAT_4, DA830_MMCSD_DAT_5,
1908c2ecf20Sopenharmony_ci	DA830_MMCSD_DAT_6, DA830_MMCSD_DAT_7, DA830_MMCSD_CLK,
1918c2ecf20Sopenharmony_ci	DA830_MMCSD_CMD,   DA830_GPIO2_1,     DA830_GPIO2_2,
1928c2ecf20Sopenharmony_ci	-1
1938c2ecf20Sopenharmony_ci};
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci#define DA830_MMCSD_WP_PIN		GPIO_TO_PIN(2, 1)
1968c2ecf20Sopenharmony_ci#define DA830_MMCSD_CD_PIN		GPIO_TO_PIN(2, 2)
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table mmc_gpios_table = {
1998c2ecf20Sopenharmony_ci	.dev_id = "da830-mmc.0",
2008c2ecf20Sopenharmony_ci	.table = {
2018c2ecf20Sopenharmony_ci		/* gpio chip 1 contains gpio range 32-63 */
2028c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", DA830_MMCSD_CD_PIN, "cd",
2038c2ecf20Sopenharmony_ci			    GPIO_ACTIVE_LOW),
2048c2ecf20Sopenharmony_ci		GPIO_LOOKUP("davinci_gpio", DA830_MMCSD_WP_PIN, "wp",
2058c2ecf20Sopenharmony_ci			    GPIO_ACTIVE_LOW),
2068c2ecf20Sopenharmony_ci		{ }
2078c2ecf20Sopenharmony_ci	},
2088c2ecf20Sopenharmony_ci};
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_cistatic struct davinci_mmc_config da830_evm_mmc_config = {
2118c2ecf20Sopenharmony_ci	.wires			= 8,
2128c2ecf20Sopenharmony_ci	.max_freq		= 50000000,
2138c2ecf20Sopenharmony_ci	.caps			= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
2148c2ecf20Sopenharmony_ci};
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_cistatic inline void da830_evm_init_mmc(void)
2178c2ecf20Sopenharmony_ci{
2188c2ecf20Sopenharmony_ci	int ret;
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da830_evm_mmc_sd_pins);
2218c2ecf20Sopenharmony_ci	if (ret) {
2228c2ecf20Sopenharmony_ci		pr_warn("%s: mmc/sd mux setup failed: %d\n", __func__, ret);
2238c2ecf20Sopenharmony_ci		return;
2248c2ecf20Sopenharmony_ci	}
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ci	gpiod_add_lookup_table(&mmc_gpios_table);
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci	ret = da8xx_register_mmcsd0(&da830_evm_mmc_config);
2298c2ecf20Sopenharmony_ci	if (ret) {
2308c2ecf20Sopenharmony_ci		pr_warn("%s: mmc/sd registration failed: %d\n", __func__, ret);
2318c2ecf20Sopenharmony_ci		gpiod_remove_lookup_table(&mmc_gpios_table);
2328c2ecf20Sopenharmony_ci	}
2338c2ecf20Sopenharmony_ci}
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci#define HAS_MMC		IS_ENABLED(CONFIG_MMC_DAVINCI)
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci#ifdef CONFIG_DA830_UI_NAND
2388c2ecf20Sopenharmony_cistatic struct mtd_partition da830_evm_nand_partitions[] = {
2398c2ecf20Sopenharmony_ci	/* bootloader (U-Boot, etc) in first sector */
2408c2ecf20Sopenharmony_ci	[0] = {
2418c2ecf20Sopenharmony_ci		.name		= "bootloader",
2428c2ecf20Sopenharmony_ci		.offset		= 0,
2438c2ecf20Sopenharmony_ci		.size		= SZ_128K,
2448c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
2458c2ecf20Sopenharmony_ci	},
2468c2ecf20Sopenharmony_ci	/* bootloader params in the next sector */
2478c2ecf20Sopenharmony_ci	[1] = {
2488c2ecf20Sopenharmony_ci		.name		= "params",
2498c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
2508c2ecf20Sopenharmony_ci		.size		= SZ_128K,
2518c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
2528c2ecf20Sopenharmony_ci	},
2538c2ecf20Sopenharmony_ci	/* kernel */
2548c2ecf20Sopenharmony_ci	[2] = {
2558c2ecf20Sopenharmony_ci		.name		= "kernel",
2568c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
2578c2ecf20Sopenharmony_ci		.size		= SZ_2M,
2588c2ecf20Sopenharmony_ci		.mask_flags	= 0,
2598c2ecf20Sopenharmony_ci	},
2608c2ecf20Sopenharmony_ci	/* file system */
2618c2ecf20Sopenharmony_ci	[3] = {
2628c2ecf20Sopenharmony_ci		.name		= "filesystem",
2638c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
2648c2ecf20Sopenharmony_ci		.size		= MTDPART_SIZ_FULL,
2658c2ecf20Sopenharmony_ci		.mask_flags	= 0,
2668c2ecf20Sopenharmony_ci	}
2678c2ecf20Sopenharmony_ci};
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci/* flash bbt descriptors */
2708c2ecf20Sopenharmony_cistatic uint8_t da830_evm_nand_bbt_pattern[] = { 'B', 'b', 't', '0' };
2718c2ecf20Sopenharmony_cistatic uint8_t da830_evm_nand_mirror_pattern[] = { '1', 't', 'b', 'B' };
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_cistatic struct nand_bbt_descr da830_evm_nand_bbt_main_descr = {
2748c2ecf20Sopenharmony_ci	.options	= NAND_BBT_LASTBLOCK | NAND_BBT_CREATE |
2758c2ecf20Sopenharmony_ci			  NAND_BBT_WRITE | NAND_BBT_2BIT |
2768c2ecf20Sopenharmony_ci			  NAND_BBT_VERSION | NAND_BBT_PERCHIP,
2778c2ecf20Sopenharmony_ci	.offs		= 2,
2788c2ecf20Sopenharmony_ci	.len		= 4,
2798c2ecf20Sopenharmony_ci	.veroffs	= 16,
2808c2ecf20Sopenharmony_ci	.maxblocks	= 4,
2818c2ecf20Sopenharmony_ci	.pattern	= da830_evm_nand_bbt_pattern
2828c2ecf20Sopenharmony_ci};
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_cistatic struct nand_bbt_descr da830_evm_nand_bbt_mirror_descr = {
2858c2ecf20Sopenharmony_ci	.options	= NAND_BBT_LASTBLOCK | NAND_BBT_CREATE |
2868c2ecf20Sopenharmony_ci			  NAND_BBT_WRITE | NAND_BBT_2BIT |
2878c2ecf20Sopenharmony_ci			  NAND_BBT_VERSION | NAND_BBT_PERCHIP,
2888c2ecf20Sopenharmony_ci	.offs		= 2,
2898c2ecf20Sopenharmony_ci	.len		= 4,
2908c2ecf20Sopenharmony_ci	.veroffs	= 16,
2918c2ecf20Sopenharmony_ci	.maxblocks	= 4,
2928c2ecf20Sopenharmony_ci	.pattern	= da830_evm_nand_mirror_pattern
2938c2ecf20Sopenharmony_ci};
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_cistatic struct davinci_aemif_timing da830_evm_nandflash_timing = {
2968c2ecf20Sopenharmony_ci	.wsetup         = 24,
2978c2ecf20Sopenharmony_ci	.wstrobe        = 21,
2988c2ecf20Sopenharmony_ci	.whold          = 14,
2998c2ecf20Sopenharmony_ci	.rsetup         = 19,
3008c2ecf20Sopenharmony_ci	.rstrobe        = 50,
3018c2ecf20Sopenharmony_ci	.rhold          = 0,
3028c2ecf20Sopenharmony_ci	.ta             = 20,
3038c2ecf20Sopenharmony_ci};
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_cistatic struct davinci_nand_pdata da830_evm_nand_pdata = {
3068c2ecf20Sopenharmony_ci	.core_chipsel	= 1,
3078c2ecf20Sopenharmony_ci	.parts		= da830_evm_nand_partitions,
3088c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(da830_evm_nand_partitions),
3098c2ecf20Sopenharmony_ci	.engine_type	= NAND_ECC_ENGINE_TYPE_ON_HOST,
3108c2ecf20Sopenharmony_ci	.ecc_bits	= 4,
3118c2ecf20Sopenharmony_ci	.bbt_options	= NAND_BBT_USE_FLASH,
3128c2ecf20Sopenharmony_ci	.bbt_td		= &da830_evm_nand_bbt_main_descr,
3138c2ecf20Sopenharmony_ci	.bbt_md		= &da830_evm_nand_bbt_mirror_descr,
3148c2ecf20Sopenharmony_ci	.timing         = &da830_evm_nandflash_timing,
3158c2ecf20Sopenharmony_ci};
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_cistatic struct resource da830_evm_nand_resources[] = {
3188c2ecf20Sopenharmony_ci	[0] = {		/* First memory resource is NAND I/O window */
3198c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CS3_BASE,
3208c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CS3_BASE + PAGE_SIZE - 1,
3218c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
3228c2ecf20Sopenharmony_ci	},
3238c2ecf20Sopenharmony_ci	[1] = {		/* Second memory resource is AEMIF control registers */
3248c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CTL_BASE,
3258c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
3268c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
3278c2ecf20Sopenharmony_ci	},
3288c2ecf20Sopenharmony_ci};
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_cistatic struct platform_device da830_evm_aemif_devices[] = {
3318c2ecf20Sopenharmony_ci	{
3328c2ecf20Sopenharmony_ci		.name		= "davinci_nand",
3338c2ecf20Sopenharmony_ci		.id		= 1,
3348c2ecf20Sopenharmony_ci		.dev		= {
3358c2ecf20Sopenharmony_ci			.platform_data	= &da830_evm_nand_pdata,
3368c2ecf20Sopenharmony_ci		},
3378c2ecf20Sopenharmony_ci		.num_resources	= ARRAY_SIZE(da830_evm_nand_resources),
3388c2ecf20Sopenharmony_ci		.resource	= da830_evm_nand_resources,
3398c2ecf20Sopenharmony_ci	},
3408c2ecf20Sopenharmony_ci};
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_cistatic struct resource da830_evm_aemif_resource[] = {
3438c2ecf20Sopenharmony_ci	{
3448c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CTL_BASE,
3458c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
3468c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
3478c2ecf20Sopenharmony_ci	},
3488c2ecf20Sopenharmony_ci};
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_cistatic struct aemif_abus_data da830_evm_aemif_abus_data[] = {
3518c2ecf20Sopenharmony_ci	{
3528c2ecf20Sopenharmony_ci		.cs	= 3,
3538c2ecf20Sopenharmony_ci	},
3548c2ecf20Sopenharmony_ci};
3558c2ecf20Sopenharmony_ci
3568c2ecf20Sopenharmony_cistatic struct aemif_platform_data da830_evm_aemif_pdata = {
3578c2ecf20Sopenharmony_ci	.abus_data		= da830_evm_aemif_abus_data,
3588c2ecf20Sopenharmony_ci	.num_abus_data		= ARRAY_SIZE(da830_evm_aemif_abus_data),
3598c2ecf20Sopenharmony_ci	.sub_devices		= da830_evm_aemif_devices,
3608c2ecf20Sopenharmony_ci	.num_sub_devices	= ARRAY_SIZE(da830_evm_aemif_devices),
3618c2ecf20Sopenharmony_ci	.cs_offset		= 2,
3628c2ecf20Sopenharmony_ci};
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_cistatic struct platform_device da830_evm_aemif_device = {
3658c2ecf20Sopenharmony_ci	.name		= "ti-aemif",
3668c2ecf20Sopenharmony_ci	.id		= -1,
3678c2ecf20Sopenharmony_ci	.dev = {
3688c2ecf20Sopenharmony_ci		.platform_data = &da830_evm_aemif_pdata,
3698c2ecf20Sopenharmony_ci	},
3708c2ecf20Sopenharmony_ci	.resource	= da830_evm_aemif_resource,
3718c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(da830_evm_aemif_resource),
3728c2ecf20Sopenharmony_ci};
3738c2ecf20Sopenharmony_ci
3748c2ecf20Sopenharmony_ci/*
3758c2ecf20Sopenharmony_ci * UI board NAND/NOR flashes only use 8-bit data bus.
3768c2ecf20Sopenharmony_ci */
3778c2ecf20Sopenharmony_cistatic const short da830_evm_emif25_pins[] = {
3788c2ecf20Sopenharmony_ci	DA830_EMA_D_0, DA830_EMA_D_1, DA830_EMA_D_2, DA830_EMA_D_3,
3798c2ecf20Sopenharmony_ci	DA830_EMA_D_4, DA830_EMA_D_5, DA830_EMA_D_6, DA830_EMA_D_7,
3808c2ecf20Sopenharmony_ci	DA830_EMA_A_0, DA830_EMA_A_1, DA830_EMA_A_2, DA830_EMA_A_3,
3818c2ecf20Sopenharmony_ci	DA830_EMA_A_4, DA830_EMA_A_5, DA830_EMA_A_6, DA830_EMA_A_7,
3828c2ecf20Sopenharmony_ci	DA830_EMA_A_8, DA830_EMA_A_9, DA830_EMA_A_10, DA830_EMA_A_11,
3838c2ecf20Sopenharmony_ci	DA830_EMA_A_12, DA830_EMA_BA_0, DA830_EMA_BA_1, DA830_NEMA_WE,
3848c2ecf20Sopenharmony_ci	DA830_NEMA_CS_2, DA830_NEMA_CS_3, DA830_NEMA_OE, DA830_EMA_WAIT_0,
3858c2ecf20Sopenharmony_ci	-1
3868c2ecf20Sopenharmony_ci};
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_cistatic inline void da830_evm_init_nand(int mux_mode)
3898c2ecf20Sopenharmony_ci{
3908c2ecf20Sopenharmony_ci	int ret;
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci	if (HAS_MMC) {
3938c2ecf20Sopenharmony_ci		pr_warn("WARNING: both MMC/SD and NAND are enabled, but they share AEMIF pins\n"
3948c2ecf20Sopenharmony_ci			"\tDisable MMC/SD for NAND support\n");
3958c2ecf20Sopenharmony_ci		return;
3968c2ecf20Sopenharmony_ci	}
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da830_evm_emif25_pins);
3998c2ecf20Sopenharmony_ci	if (ret)
4008c2ecf20Sopenharmony_ci		pr_warn("%s: emif25 mux setup failed: %d\n", __func__, ret);
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_ci	ret = platform_device_register(&da830_evm_aemif_device);
4038c2ecf20Sopenharmony_ci	if (ret)
4048c2ecf20Sopenharmony_ci		pr_warn("%s: AEMIF device not registered\n", __func__);
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci	gpio_direction_output(mux_mode, 1);
4078c2ecf20Sopenharmony_ci}
4088c2ecf20Sopenharmony_ci#else
4098c2ecf20Sopenharmony_cistatic inline void da830_evm_init_nand(int mux_mode) { }
4108c2ecf20Sopenharmony_ci#endif
4118c2ecf20Sopenharmony_ci
4128c2ecf20Sopenharmony_ci#ifdef CONFIG_DA830_UI_LCD
4138c2ecf20Sopenharmony_cistatic inline void da830_evm_init_lcdc(int mux_mode)
4148c2ecf20Sopenharmony_ci{
4158c2ecf20Sopenharmony_ci	int ret;
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da830_lcdcntl_pins);
4188c2ecf20Sopenharmony_ci	if (ret)
4198c2ecf20Sopenharmony_ci		pr_warn("%s: lcdcntl mux setup failed: %d\n", __func__, ret);
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci	ret = da8xx_register_lcdc(&sharp_lcd035q3dg01_pdata);
4228c2ecf20Sopenharmony_ci	if (ret)
4238c2ecf20Sopenharmony_ci		pr_warn("%s: lcd setup failed: %d\n", __func__, ret);
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci	gpio_direction_output(mux_mode, 0);
4268c2ecf20Sopenharmony_ci}
4278c2ecf20Sopenharmony_ci#else
4288c2ecf20Sopenharmony_cistatic inline void da830_evm_init_lcdc(int mux_mode) { }
4298c2ecf20Sopenharmony_ci#endif
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_cistatic struct nvmem_cell_info da830_evm_nvmem_cells[] = {
4328c2ecf20Sopenharmony_ci	{
4338c2ecf20Sopenharmony_ci		.name		= "macaddr",
4348c2ecf20Sopenharmony_ci		.offset		= 0x7f00,
4358c2ecf20Sopenharmony_ci		.bytes		= ETH_ALEN,
4368c2ecf20Sopenharmony_ci	}
4378c2ecf20Sopenharmony_ci};
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_cistatic struct nvmem_cell_table da830_evm_nvmem_cell_table = {
4408c2ecf20Sopenharmony_ci	.nvmem_name	= "1-00500",
4418c2ecf20Sopenharmony_ci	.cells		= da830_evm_nvmem_cells,
4428c2ecf20Sopenharmony_ci	.ncells		= ARRAY_SIZE(da830_evm_nvmem_cells),
4438c2ecf20Sopenharmony_ci};
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_cistatic struct nvmem_cell_lookup da830_evm_nvmem_cell_lookup = {
4468c2ecf20Sopenharmony_ci	.nvmem_name	= "1-00500",
4478c2ecf20Sopenharmony_ci	.cell_name	= "macaddr",
4488c2ecf20Sopenharmony_ci	.dev_id		= "davinci_emac.1",
4498c2ecf20Sopenharmony_ci	.con_id		= "mac-address",
4508c2ecf20Sopenharmony_ci};
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_cistatic const struct property_entry da830_evm_i2c_eeprom_properties[] = {
4538c2ecf20Sopenharmony_ci	PROPERTY_ENTRY_U32("pagesize", 64),
4548c2ecf20Sopenharmony_ci	{ }
4558c2ecf20Sopenharmony_ci};
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_cistatic int __init da830_evm_ui_expander_setup(struct i2c_client *client,
4588c2ecf20Sopenharmony_ci		int gpio, unsigned ngpio, void *context)
4598c2ecf20Sopenharmony_ci{
4608c2ecf20Sopenharmony_ci	gpio_request(gpio + 6, "UI MUX_MODE");
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci	/* Drive mux mode low to match the default without UI card */
4638c2ecf20Sopenharmony_ci	gpio_direction_output(gpio + 6, 0);
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci	da830_evm_init_lcdc(gpio + 6);
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	da830_evm_init_nand(gpio + 6);
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_ci	return 0;
4708c2ecf20Sopenharmony_ci}
4718c2ecf20Sopenharmony_ci
4728c2ecf20Sopenharmony_cistatic int da830_evm_ui_expander_teardown(struct i2c_client *client, int gpio,
4738c2ecf20Sopenharmony_ci		unsigned ngpio, void *context)
4748c2ecf20Sopenharmony_ci{
4758c2ecf20Sopenharmony_ci	gpio_free(gpio + 6);
4768c2ecf20Sopenharmony_ci	return 0;
4778c2ecf20Sopenharmony_ci}
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_cistatic struct pcf857x_platform_data __initdata da830_evm_ui_expander_info = {
4808c2ecf20Sopenharmony_ci	.gpio_base	= DAVINCI_N_GPIO,
4818c2ecf20Sopenharmony_ci	.setup		= da830_evm_ui_expander_setup,
4828c2ecf20Sopenharmony_ci	.teardown	= da830_evm_ui_expander_teardown,
4838c2ecf20Sopenharmony_ci};
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
4868c2ecf20Sopenharmony_ci	{
4878c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("24c256", 0x50),
4888c2ecf20Sopenharmony_ci		.properties = da830_evm_i2c_eeprom_properties,
4898c2ecf20Sopenharmony_ci	},
4908c2ecf20Sopenharmony_ci	{
4918c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("tlv320aic3x", 0x18),
4928c2ecf20Sopenharmony_ci	},
4938c2ecf20Sopenharmony_ci	{
4948c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("pcf8574", 0x3f),
4958c2ecf20Sopenharmony_ci		.platform_data	= &da830_evm_ui_expander_info,
4968c2ecf20Sopenharmony_ci	},
4978c2ecf20Sopenharmony_ci};
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_cistatic struct davinci_i2c_platform_data da830_evm_i2c_0_pdata = {
5008c2ecf20Sopenharmony_ci	.bus_freq	= 100,	/* kHz */
5018c2ecf20Sopenharmony_ci	.bus_delay	= 0,	/* usec */
5028c2ecf20Sopenharmony_ci};
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci/*
5058c2ecf20Sopenharmony_ci * The following EDMA channels/slots are not being used by drivers (for
5068c2ecf20Sopenharmony_ci * example: Timer, GPIO, UART events etc) on da830/omap-l137 EVM, hence
5078c2ecf20Sopenharmony_ci * they are being reserved for codecs on the DSP side.
5088c2ecf20Sopenharmony_ci */
5098c2ecf20Sopenharmony_cistatic const s16 da830_dma_rsv_chans[][2] = {
5108c2ecf20Sopenharmony_ci	/* (offset, number) */
5118c2ecf20Sopenharmony_ci	{ 8,  2},
5128c2ecf20Sopenharmony_ci	{12,  2},
5138c2ecf20Sopenharmony_ci	{24,  4},
5148c2ecf20Sopenharmony_ci	{30,  2},
5158c2ecf20Sopenharmony_ci	{-1, -1}
5168c2ecf20Sopenharmony_ci};
5178c2ecf20Sopenharmony_ci
5188c2ecf20Sopenharmony_cistatic const s16 da830_dma_rsv_slots[][2] = {
5198c2ecf20Sopenharmony_ci	/* (offset, number) */
5208c2ecf20Sopenharmony_ci	{ 8,  2},
5218c2ecf20Sopenharmony_ci	{12,  2},
5228c2ecf20Sopenharmony_ci	{24,  4},
5238c2ecf20Sopenharmony_ci	{30, 26},
5248c2ecf20Sopenharmony_ci	{-1, -1}
5258c2ecf20Sopenharmony_ci};
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_cistatic struct edma_rsv_info da830_edma_rsv[] = {
5288c2ecf20Sopenharmony_ci	{
5298c2ecf20Sopenharmony_ci		.rsv_chans	= da830_dma_rsv_chans,
5308c2ecf20Sopenharmony_ci		.rsv_slots	= da830_dma_rsv_slots,
5318c2ecf20Sopenharmony_ci	},
5328c2ecf20Sopenharmony_ci};
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_cistatic struct mtd_partition da830evm_spiflash_part[] = {
5358c2ecf20Sopenharmony_ci	[0] = {
5368c2ecf20Sopenharmony_ci		.name = "DSP-UBL",
5378c2ecf20Sopenharmony_ci		.offset = 0,
5388c2ecf20Sopenharmony_ci		.size = SZ_8K,
5398c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,
5408c2ecf20Sopenharmony_ci	},
5418c2ecf20Sopenharmony_ci	[1] = {
5428c2ecf20Sopenharmony_ci		.name = "ARM-UBL",
5438c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
5448c2ecf20Sopenharmony_ci		.size = SZ_16K + SZ_8K,
5458c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,
5468c2ecf20Sopenharmony_ci	},
5478c2ecf20Sopenharmony_ci	[2] = {
5488c2ecf20Sopenharmony_ci		.name = "U-Boot",
5498c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
5508c2ecf20Sopenharmony_ci		.size = SZ_256K - SZ_32K,
5518c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,
5528c2ecf20Sopenharmony_ci	},
5538c2ecf20Sopenharmony_ci	[3] = {
5548c2ecf20Sopenharmony_ci		.name = "U-Boot-Environment",
5558c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
5568c2ecf20Sopenharmony_ci		.size = SZ_16K,
5578c2ecf20Sopenharmony_ci		.mask_flags = 0,
5588c2ecf20Sopenharmony_ci	},
5598c2ecf20Sopenharmony_ci	[4] = {
5608c2ecf20Sopenharmony_ci		.name = "Kernel",
5618c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
5628c2ecf20Sopenharmony_ci		.size = MTDPART_SIZ_FULL,
5638c2ecf20Sopenharmony_ci		.mask_flags = 0,
5648c2ecf20Sopenharmony_ci	},
5658c2ecf20Sopenharmony_ci};
5668c2ecf20Sopenharmony_ci
5678c2ecf20Sopenharmony_cistatic struct flash_platform_data da830evm_spiflash_data = {
5688c2ecf20Sopenharmony_ci	.name		= "m25p80",
5698c2ecf20Sopenharmony_ci	.parts		= da830evm_spiflash_part,
5708c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(da830evm_spiflash_part),
5718c2ecf20Sopenharmony_ci	.type		= "w25x32",
5728c2ecf20Sopenharmony_ci};
5738c2ecf20Sopenharmony_ci
5748c2ecf20Sopenharmony_cistatic struct davinci_spi_config da830evm_spiflash_cfg = {
5758c2ecf20Sopenharmony_ci	.io_type	= SPI_IO_TYPE_DMA,
5768c2ecf20Sopenharmony_ci	.c2tdelay	= 8,
5778c2ecf20Sopenharmony_ci	.t2cdelay	= 8,
5788c2ecf20Sopenharmony_ci};
5798c2ecf20Sopenharmony_ci
5808c2ecf20Sopenharmony_cistatic struct spi_board_info da830evm_spi_info[] = {
5818c2ecf20Sopenharmony_ci	{
5828c2ecf20Sopenharmony_ci		.modalias		= "m25p80",
5838c2ecf20Sopenharmony_ci		.platform_data		= &da830evm_spiflash_data,
5848c2ecf20Sopenharmony_ci		.controller_data	= &da830evm_spiflash_cfg,
5858c2ecf20Sopenharmony_ci		.mode			= SPI_MODE_0,
5868c2ecf20Sopenharmony_ci		.max_speed_hz		= 30000000,
5878c2ecf20Sopenharmony_ci		.bus_num		= 0,
5888c2ecf20Sopenharmony_ci		.chip_select		= 0,
5898c2ecf20Sopenharmony_ci	},
5908c2ecf20Sopenharmony_ci};
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_cistatic __init void da830_evm_init(void)
5938c2ecf20Sopenharmony_ci{
5948c2ecf20Sopenharmony_ci	struct davinci_soc_info *soc_info = &davinci_soc_info;
5958c2ecf20Sopenharmony_ci	int ret;
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_ci	da830_register_clocks();
5988c2ecf20Sopenharmony_ci
5998c2ecf20Sopenharmony_ci	ret = da830_register_gpio();
6008c2ecf20Sopenharmony_ci	if (ret)
6018c2ecf20Sopenharmony_ci		pr_warn("%s: GPIO init failed: %d\n", __func__, ret);
6028c2ecf20Sopenharmony_ci
6038c2ecf20Sopenharmony_ci	ret = da830_register_edma(da830_edma_rsv);
6048c2ecf20Sopenharmony_ci	if (ret)
6058c2ecf20Sopenharmony_ci		pr_warn("%s: edma registration failed: %d\n", __func__, ret);
6068c2ecf20Sopenharmony_ci
6078c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da830_i2c0_pins);
6088c2ecf20Sopenharmony_ci	if (ret)
6098c2ecf20Sopenharmony_ci		pr_warn("%s: i2c0 mux setup failed: %d\n", __func__, ret);
6108c2ecf20Sopenharmony_ci
6118c2ecf20Sopenharmony_ci	ret = da8xx_register_i2c(0, &da830_evm_i2c_0_pdata);
6128c2ecf20Sopenharmony_ci	if (ret)
6138c2ecf20Sopenharmony_ci		pr_warn("%s: i2c0 registration failed: %d\n", __func__, ret);
6148c2ecf20Sopenharmony_ci
6158c2ecf20Sopenharmony_ci	da830_evm_usb_init();
6168c2ecf20Sopenharmony_ci
6178c2ecf20Sopenharmony_ci	soc_info->emac_pdata->rmii_en = 1;
6188c2ecf20Sopenharmony_ci	soc_info->emac_pdata->phy_id = DA830_EVM_PHY_ID;
6198c2ecf20Sopenharmony_ci
6208c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da830_cpgmac_pins);
6218c2ecf20Sopenharmony_ci	if (ret)
6228c2ecf20Sopenharmony_ci		pr_warn("%s: cpgmac mux setup failed: %d\n", __func__, ret);
6238c2ecf20Sopenharmony_ci
6248c2ecf20Sopenharmony_ci	ret = da8xx_register_emac();
6258c2ecf20Sopenharmony_ci	if (ret)
6268c2ecf20Sopenharmony_ci		pr_warn("%s: emac registration failed: %d\n", __func__, ret);
6278c2ecf20Sopenharmony_ci
6288c2ecf20Sopenharmony_ci	ret = da8xx_register_watchdog();
6298c2ecf20Sopenharmony_ci	if (ret)
6308c2ecf20Sopenharmony_ci		pr_warn("%s: watchdog registration failed: %d\n",
6318c2ecf20Sopenharmony_ci			__func__, ret);
6328c2ecf20Sopenharmony_ci
6338c2ecf20Sopenharmony_ci	davinci_serial_init(da8xx_serial_device);
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_ci	nvmem_add_cell_table(&da830_evm_nvmem_cell_table);
6368c2ecf20Sopenharmony_ci	nvmem_add_cell_lookups(&da830_evm_nvmem_cell_lookup, 1);
6378c2ecf20Sopenharmony_ci
6388c2ecf20Sopenharmony_ci	i2c_register_board_info(1, da830_evm_i2c_devices,
6398c2ecf20Sopenharmony_ci			ARRAY_SIZE(da830_evm_i2c_devices));
6408c2ecf20Sopenharmony_ci
6418c2ecf20Sopenharmony_ci	ret = davinci_cfg_reg_list(da830_evm_mcasp1_pins);
6428c2ecf20Sopenharmony_ci	if (ret)
6438c2ecf20Sopenharmony_ci		pr_warn("%s: mcasp1 mux setup failed: %d\n", __func__, ret);
6448c2ecf20Sopenharmony_ci
6458c2ecf20Sopenharmony_ci	da8xx_register_mcasp(1, &da830_evm_snd_data);
6468c2ecf20Sopenharmony_ci
6478c2ecf20Sopenharmony_ci	da830_evm_init_mmc();
6488c2ecf20Sopenharmony_ci
6498c2ecf20Sopenharmony_ci	ret = da8xx_register_rtc();
6508c2ecf20Sopenharmony_ci	if (ret)
6518c2ecf20Sopenharmony_ci		pr_warn("%s: rtc setup failed: %d\n", __func__, ret);
6528c2ecf20Sopenharmony_ci
6538c2ecf20Sopenharmony_ci	ret = spi_register_board_info(da830evm_spi_info,
6548c2ecf20Sopenharmony_ci				      ARRAY_SIZE(da830evm_spi_info));
6558c2ecf20Sopenharmony_ci	if (ret)
6568c2ecf20Sopenharmony_ci		pr_warn("%s: spi info registration failed: %d\n",
6578c2ecf20Sopenharmony_ci			__func__, ret);
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_ci	ret = da8xx_register_spi_bus(0, ARRAY_SIZE(da830evm_spi_info));
6608c2ecf20Sopenharmony_ci	if (ret)
6618c2ecf20Sopenharmony_ci		pr_warn("%s: spi 0 registration failed: %d\n", __func__, ret);
6628c2ecf20Sopenharmony_ci
6638c2ecf20Sopenharmony_ci	regulator_has_full_constraints();
6648c2ecf20Sopenharmony_ci}
6658c2ecf20Sopenharmony_ci
6668c2ecf20Sopenharmony_ci#ifdef CONFIG_SERIAL_8250_CONSOLE
6678c2ecf20Sopenharmony_cistatic int __init da830_evm_console_init(void)
6688c2ecf20Sopenharmony_ci{
6698c2ecf20Sopenharmony_ci	if (!machine_is_davinci_da830_evm())
6708c2ecf20Sopenharmony_ci		return 0;
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci	return add_preferred_console("ttyS", 2, "115200");
6738c2ecf20Sopenharmony_ci}
6748c2ecf20Sopenharmony_ciconsole_initcall(da830_evm_console_init);
6758c2ecf20Sopenharmony_ci#endif
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_cistatic void __init da830_evm_map_io(void)
6788c2ecf20Sopenharmony_ci{
6798c2ecf20Sopenharmony_ci	da830_init();
6808c2ecf20Sopenharmony_ci}
6818c2ecf20Sopenharmony_ci
6828c2ecf20Sopenharmony_ciMACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM")
6838c2ecf20Sopenharmony_ci	.atag_offset	= 0x100,
6848c2ecf20Sopenharmony_ci	.map_io		= da830_evm_map_io,
6858c2ecf20Sopenharmony_ci	.init_irq	= da830_init_irq,
6868c2ecf20Sopenharmony_ci	.init_time	= da830_init_time,
6878c2ecf20Sopenharmony_ci	.init_machine	= da830_evm_init,
6888c2ecf20Sopenharmony_ci	.init_late	= davinci_init_late,
6898c2ecf20Sopenharmony_ci	.dma_zone_size	= SZ_128M,
6908c2ecf20Sopenharmony_ciMACHINE_END
691