18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Critical Link MityOMAP-L138 SoM
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 2010 Critical Link LLC - https://www.criticallink.com
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * This file is licensed under the terms of the GNU General Public License
78c2ecf20Sopenharmony_ci * version 2. This program is licensed "as is" without any warranty of
88c2ecf20Sopenharmony_ci * any kind, whether express or implied.
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define pr_fmt(fmt) "MityOMAPL138: " fmt
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/kernel.h>
148c2ecf20Sopenharmony_ci#include <linux/init.h>
158c2ecf20Sopenharmony_ci#include <linux/console.h>
168c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
178c2ecf20Sopenharmony_ci#include <linux/property.h>
188c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h>
198c2ecf20Sopenharmony_ci#include <linux/notifier.h>
208c2ecf20Sopenharmony_ci#include <linux/nvmem-consumer.h>
218c2ecf20Sopenharmony_ci#include <linux/nvmem-provider.h>
228c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h>
238c2ecf20Sopenharmony_ci#include <linux/i2c.h>
248c2ecf20Sopenharmony_ci#include <linux/etherdevice.h>
258c2ecf20Sopenharmony_ci#include <linux/spi/spi.h>
268c2ecf20Sopenharmony_ci#include <linux/spi/flash.h>
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#include <asm/io.h>
298c2ecf20Sopenharmony_ci#include <asm/mach-types.h>
308c2ecf20Sopenharmony_ci#include <asm/mach/arch.h>
318c2ecf20Sopenharmony_ci#include <mach/common.h>
328c2ecf20Sopenharmony_ci#include <mach/da8xx.h>
338c2ecf20Sopenharmony_ci#include <linux/platform_data/mtd-davinci.h>
348c2ecf20Sopenharmony_ci#include <linux/platform_data/mtd-davinci-aemif.h>
358c2ecf20Sopenharmony_ci#include <linux/platform_data/ti-aemif.h>
368c2ecf20Sopenharmony_ci#include <mach/mux.h>
378c2ecf20Sopenharmony_ci#include <linux/platform_data/spi-davinci.h>
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define MITYOMAPL138_PHY_ID		""
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define FACTORY_CONFIG_MAGIC	0x012C0138
428c2ecf20Sopenharmony_ci#define FACTORY_CONFIG_VERSION	0x00010001
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci/* Data Held in On-Board I2C device */
458c2ecf20Sopenharmony_cistruct factory_config {
468c2ecf20Sopenharmony_ci	u32	magic;
478c2ecf20Sopenharmony_ci	u32	version;
488c2ecf20Sopenharmony_ci	u8	mac[6];
498c2ecf20Sopenharmony_ci	u32	fpga_type;
508c2ecf20Sopenharmony_ci	u32	spare;
518c2ecf20Sopenharmony_ci	u32	serialnumber;
528c2ecf20Sopenharmony_ci	char	partnum[32];
538c2ecf20Sopenharmony_ci};
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistatic struct factory_config factory_config;
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_FREQ
588c2ecf20Sopenharmony_cistruct part_no_info {
598c2ecf20Sopenharmony_ci	const char	*part_no;	/* part number string of interest */
608c2ecf20Sopenharmony_ci	int		max_freq;	/* khz */
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistatic struct part_no_info mityomapl138_pn_info[] = {
648c2ecf20Sopenharmony_ci	{
658c2ecf20Sopenharmony_ci		.part_no	= "L138-C",
668c2ecf20Sopenharmony_ci		.max_freq	= 300000,
678c2ecf20Sopenharmony_ci	},
688c2ecf20Sopenharmony_ci	{
698c2ecf20Sopenharmony_ci		.part_no	= "L138-D",
708c2ecf20Sopenharmony_ci		.max_freq	= 375000,
718c2ecf20Sopenharmony_ci	},
728c2ecf20Sopenharmony_ci	{
738c2ecf20Sopenharmony_ci		.part_no	= "L138-F",
748c2ecf20Sopenharmony_ci		.max_freq	= 456000,
758c2ecf20Sopenharmony_ci	},
768c2ecf20Sopenharmony_ci	{
778c2ecf20Sopenharmony_ci		.part_no	= "1808-C",
788c2ecf20Sopenharmony_ci		.max_freq	= 300000,
798c2ecf20Sopenharmony_ci	},
808c2ecf20Sopenharmony_ci	{
818c2ecf20Sopenharmony_ci		.part_no	= "1808-D",
828c2ecf20Sopenharmony_ci		.max_freq	= 375000,
838c2ecf20Sopenharmony_ci	},
848c2ecf20Sopenharmony_ci	{
858c2ecf20Sopenharmony_ci		.part_no	= "1808-F",
868c2ecf20Sopenharmony_ci		.max_freq	= 456000,
878c2ecf20Sopenharmony_ci	},
888c2ecf20Sopenharmony_ci	{
898c2ecf20Sopenharmony_ci		.part_no	= "1810-D",
908c2ecf20Sopenharmony_ci		.max_freq	= 375000,
918c2ecf20Sopenharmony_ci	},
928c2ecf20Sopenharmony_ci};
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_cistatic void mityomapl138_cpufreq_init(const char *partnum)
958c2ecf20Sopenharmony_ci{
968c2ecf20Sopenharmony_ci	int i, ret;
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	for (i = 0; partnum && i < ARRAY_SIZE(mityomapl138_pn_info); i++) {
998c2ecf20Sopenharmony_ci		/*
1008c2ecf20Sopenharmony_ci		 * the part number has additional characters beyond what is
1018c2ecf20Sopenharmony_ci		 * stored in the table.  This information is not needed for
1028c2ecf20Sopenharmony_ci		 * determining the speed grade, and would require several
1038c2ecf20Sopenharmony_ci		 * more table entries.  Only check the first N characters
1048c2ecf20Sopenharmony_ci		 * for a match.
1058c2ecf20Sopenharmony_ci		 */
1068c2ecf20Sopenharmony_ci		if (!strncmp(partnum, mityomapl138_pn_info[i].part_no,
1078c2ecf20Sopenharmony_ci			     strlen(mityomapl138_pn_info[i].part_no))) {
1088c2ecf20Sopenharmony_ci			da850_max_speed = mityomapl138_pn_info[i].max_freq;
1098c2ecf20Sopenharmony_ci			break;
1108c2ecf20Sopenharmony_ci		}
1118c2ecf20Sopenharmony_ci	}
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	ret = da850_register_cpufreq("pll0_sysclk3");
1148c2ecf20Sopenharmony_ci	if (ret)
1158c2ecf20Sopenharmony_ci		pr_warn("cpufreq registration failed: %d\n", ret);
1168c2ecf20Sopenharmony_ci}
1178c2ecf20Sopenharmony_ci#else
1188c2ecf20Sopenharmony_cistatic void mityomapl138_cpufreq_init(const char *partnum) { }
1198c2ecf20Sopenharmony_ci#endif
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_cistatic int read_factory_config(struct notifier_block *nb,
1228c2ecf20Sopenharmony_ci			       unsigned long event, void *data)
1238c2ecf20Sopenharmony_ci{
1248c2ecf20Sopenharmony_ci	int ret;
1258c2ecf20Sopenharmony_ci	const char *partnum = NULL;
1268c2ecf20Sopenharmony_ci	struct nvmem_device *nvmem = data;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	if (strcmp(nvmem_dev_name(nvmem), "1-00500") != 0)
1298c2ecf20Sopenharmony_ci		return NOTIFY_DONE;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	if (!IS_BUILTIN(CONFIG_NVMEM)) {
1328c2ecf20Sopenharmony_ci		pr_warn("Factory Config not available without CONFIG_NVMEM\n");
1338c2ecf20Sopenharmony_ci		goto bad_config;
1348c2ecf20Sopenharmony_ci	}
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci	ret = nvmem_device_read(nvmem, 0, sizeof(factory_config),
1378c2ecf20Sopenharmony_ci				&factory_config);
1388c2ecf20Sopenharmony_ci	if (ret != sizeof(struct factory_config)) {
1398c2ecf20Sopenharmony_ci		pr_warn("Read Factory Config Failed: %d\n", ret);
1408c2ecf20Sopenharmony_ci		goto bad_config;
1418c2ecf20Sopenharmony_ci	}
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	if (factory_config.magic != FACTORY_CONFIG_MAGIC) {
1448c2ecf20Sopenharmony_ci		pr_warn("Factory Config Magic Wrong (%X)\n",
1458c2ecf20Sopenharmony_ci			factory_config.magic);
1468c2ecf20Sopenharmony_ci		goto bad_config;
1478c2ecf20Sopenharmony_ci	}
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci	if (factory_config.version != FACTORY_CONFIG_VERSION) {
1508c2ecf20Sopenharmony_ci		pr_warn("Factory Config Version Wrong (%X)\n",
1518c2ecf20Sopenharmony_ci			factory_config.version);
1528c2ecf20Sopenharmony_ci		goto bad_config;
1538c2ecf20Sopenharmony_ci	}
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci	partnum = factory_config.partnum;
1568c2ecf20Sopenharmony_ci	pr_info("Part Number = %s\n", partnum);
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_cibad_config:
1598c2ecf20Sopenharmony_ci	/* default maximum speed is valid for all platforms */
1608c2ecf20Sopenharmony_ci	mityomapl138_cpufreq_init(partnum);
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci	return NOTIFY_STOP;
1638c2ecf20Sopenharmony_ci}
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_cistatic struct notifier_block mityomapl138_nvmem_notifier = {
1668c2ecf20Sopenharmony_ci	.notifier_call = read_factory_config,
1678c2ecf20Sopenharmony_ci};
1688c2ecf20Sopenharmony_ci
1698c2ecf20Sopenharmony_ci/*
1708c2ecf20Sopenharmony_ci * We don't define a cell for factory config as it will be accessed from the
1718c2ecf20Sopenharmony_ci * board file using the nvmem notifier chain.
1728c2ecf20Sopenharmony_ci */
1738c2ecf20Sopenharmony_cistatic struct nvmem_cell_info mityomapl138_nvmem_cells[] = {
1748c2ecf20Sopenharmony_ci	{
1758c2ecf20Sopenharmony_ci		.name		= "macaddr",
1768c2ecf20Sopenharmony_ci		.offset		= 0x64,
1778c2ecf20Sopenharmony_ci		.bytes		= ETH_ALEN,
1788c2ecf20Sopenharmony_ci	}
1798c2ecf20Sopenharmony_ci};
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_cistatic struct nvmem_cell_table mityomapl138_nvmem_cell_table = {
1828c2ecf20Sopenharmony_ci	.nvmem_name	= "1-00500",
1838c2ecf20Sopenharmony_ci	.cells		= mityomapl138_nvmem_cells,
1848c2ecf20Sopenharmony_ci	.ncells		= ARRAY_SIZE(mityomapl138_nvmem_cells),
1858c2ecf20Sopenharmony_ci};
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_cistatic struct nvmem_cell_lookup mityomapl138_nvmem_cell_lookup = {
1888c2ecf20Sopenharmony_ci	.nvmem_name	= "1-00500",
1898c2ecf20Sopenharmony_ci	.cell_name	= "macaddr",
1908c2ecf20Sopenharmony_ci	.dev_id		= "davinci_emac.1",
1918c2ecf20Sopenharmony_ci	.con_id		= "mac-address",
1928c2ecf20Sopenharmony_ci};
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_cistatic const struct property_entry mityomapl138_fd_chip_properties[] = {
1958c2ecf20Sopenharmony_ci	PROPERTY_ENTRY_U32("pagesize", 8),
1968c2ecf20Sopenharmony_ci	PROPERTY_ENTRY_BOOL("read-only"),
1978c2ecf20Sopenharmony_ci	{ }
1988c2ecf20Sopenharmony_ci};
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_cistatic struct davinci_i2c_platform_data mityomap_i2c_0_pdata = {
2018c2ecf20Sopenharmony_ci	.bus_freq	= 100,	/* kHz */
2028c2ecf20Sopenharmony_ci	.bus_delay	= 0,	/* usec */
2038c2ecf20Sopenharmony_ci};
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci/* TPS65023 voltage regulator support */
2068c2ecf20Sopenharmony_ci/* 1.2V Core */
2078c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65023_dcdc1_consumers[] = {
2088c2ecf20Sopenharmony_ci	{
2098c2ecf20Sopenharmony_ci		.supply = "cvdd",
2108c2ecf20Sopenharmony_ci	},
2118c2ecf20Sopenharmony_ci};
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci/* 1.8V */
2148c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65023_dcdc2_consumers[] = {
2158c2ecf20Sopenharmony_ci	{
2168c2ecf20Sopenharmony_ci		.supply = "usb0_vdda18",
2178c2ecf20Sopenharmony_ci	},
2188c2ecf20Sopenharmony_ci	{
2198c2ecf20Sopenharmony_ci		.supply = "usb1_vdda18",
2208c2ecf20Sopenharmony_ci	},
2218c2ecf20Sopenharmony_ci	{
2228c2ecf20Sopenharmony_ci		.supply = "ddr_dvdd18",
2238c2ecf20Sopenharmony_ci	},
2248c2ecf20Sopenharmony_ci	{
2258c2ecf20Sopenharmony_ci		.supply = "sata_vddr",
2268c2ecf20Sopenharmony_ci	},
2278c2ecf20Sopenharmony_ci};
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci/* 1.2V */
2308c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65023_dcdc3_consumers[] = {
2318c2ecf20Sopenharmony_ci	{
2328c2ecf20Sopenharmony_ci		.supply = "sata_vdd",
2338c2ecf20Sopenharmony_ci	},
2348c2ecf20Sopenharmony_ci	{
2358c2ecf20Sopenharmony_ci		.supply = "usb_cvdd",
2368c2ecf20Sopenharmony_ci	},
2378c2ecf20Sopenharmony_ci	{
2388c2ecf20Sopenharmony_ci		.supply = "pll0_vdda",
2398c2ecf20Sopenharmony_ci	},
2408c2ecf20Sopenharmony_ci	{
2418c2ecf20Sopenharmony_ci		.supply = "pll1_vdda",
2428c2ecf20Sopenharmony_ci	},
2438c2ecf20Sopenharmony_ci};
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci/* 1.8V Aux LDO, not used */
2468c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65023_ldo1_consumers[] = {
2478c2ecf20Sopenharmony_ci	{
2488c2ecf20Sopenharmony_ci		.supply = "1.8v_aux",
2498c2ecf20Sopenharmony_ci	},
2508c2ecf20Sopenharmony_ci};
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci/* FPGA VCC Aux (2.5 or 3.3) LDO */
2538c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply tps65023_ldo2_consumers[] = {
2548c2ecf20Sopenharmony_ci	{
2558c2ecf20Sopenharmony_ci		.supply = "vccaux",
2568c2ecf20Sopenharmony_ci	},
2578c2ecf20Sopenharmony_ci};
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_cistatic struct regulator_init_data tps65023_regulator_data[] = {
2608c2ecf20Sopenharmony_ci	/* dcdc1 */
2618c2ecf20Sopenharmony_ci	{
2628c2ecf20Sopenharmony_ci		.constraints = {
2638c2ecf20Sopenharmony_ci			.min_uV = 1150000,
2648c2ecf20Sopenharmony_ci			.max_uV = 1350000,
2658c2ecf20Sopenharmony_ci			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
2668c2ecf20Sopenharmony_ci					  REGULATOR_CHANGE_STATUS,
2678c2ecf20Sopenharmony_ci			.boot_on = 1,
2688c2ecf20Sopenharmony_ci		},
2698c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc1_consumers),
2708c2ecf20Sopenharmony_ci		.consumer_supplies = tps65023_dcdc1_consumers,
2718c2ecf20Sopenharmony_ci	},
2728c2ecf20Sopenharmony_ci	/* dcdc2 */
2738c2ecf20Sopenharmony_ci	{
2748c2ecf20Sopenharmony_ci		.constraints = {
2758c2ecf20Sopenharmony_ci			.min_uV = 1800000,
2768c2ecf20Sopenharmony_ci			.max_uV = 1800000,
2778c2ecf20Sopenharmony_ci			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
2788c2ecf20Sopenharmony_ci			.boot_on = 1,
2798c2ecf20Sopenharmony_ci		},
2808c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc2_consumers),
2818c2ecf20Sopenharmony_ci		.consumer_supplies = tps65023_dcdc2_consumers,
2828c2ecf20Sopenharmony_ci	},
2838c2ecf20Sopenharmony_ci	/* dcdc3 */
2848c2ecf20Sopenharmony_ci	{
2858c2ecf20Sopenharmony_ci		.constraints = {
2868c2ecf20Sopenharmony_ci			.min_uV = 1200000,
2878c2ecf20Sopenharmony_ci			.max_uV = 1200000,
2888c2ecf20Sopenharmony_ci			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
2898c2ecf20Sopenharmony_ci			.boot_on = 1,
2908c2ecf20Sopenharmony_ci		},
2918c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc3_consumers),
2928c2ecf20Sopenharmony_ci		.consumer_supplies = tps65023_dcdc3_consumers,
2938c2ecf20Sopenharmony_ci	},
2948c2ecf20Sopenharmony_ci	/* ldo1 */
2958c2ecf20Sopenharmony_ci	{
2968c2ecf20Sopenharmony_ci		.constraints = {
2978c2ecf20Sopenharmony_ci			.min_uV = 1800000,
2988c2ecf20Sopenharmony_ci			.max_uV = 1800000,
2998c2ecf20Sopenharmony_ci			.valid_ops_mask = REGULATOR_CHANGE_STATUS,
3008c2ecf20Sopenharmony_ci			.boot_on = 1,
3018c2ecf20Sopenharmony_ci		},
3028c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65023_ldo1_consumers),
3038c2ecf20Sopenharmony_ci		.consumer_supplies = tps65023_ldo1_consumers,
3048c2ecf20Sopenharmony_ci	},
3058c2ecf20Sopenharmony_ci	/* ldo2 */
3068c2ecf20Sopenharmony_ci	{
3078c2ecf20Sopenharmony_ci		.constraints = {
3088c2ecf20Sopenharmony_ci			.min_uV = 2500000,
3098c2ecf20Sopenharmony_ci			.max_uV = 3300000,
3108c2ecf20Sopenharmony_ci			.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
3118c2ecf20Sopenharmony_ci					  REGULATOR_CHANGE_STATUS,
3128c2ecf20Sopenharmony_ci			.boot_on = 1,
3138c2ecf20Sopenharmony_ci		},
3148c2ecf20Sopenharmony_ci		.num_consumer_supplies = ARRAY_SIZE(tps65023_ldo2_consumers),
3158c2ecf20Sopenharmony_ci		.consumer_supplies = tps65023_ldo2_consumers,
3168c2ecf20Sopenharmony_ci	},
3178c2ecf20Sopenharmony_ci};
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_cistatic struct i2c_board_info __initdata mityomap_tps65023_info[] = {
3208c2ecf20Sopenharmony_ci	{
3218c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("tps65023", 0x48),
3228c2ecf20Sopenharmony_ci		.platform_data = &tps65023_regulator_data[0],
3238c2ecf20Sopenharmony_ci	},
3248c2ecf20Sopenharmony_ci	{
3258c2ecf20Sopenharmony_ci		I2C_BOARD_INFO("24c02", 0x50),
3268c2ecf20Sopenharmony_ci		.properties = mityomapl138_fd_chip_properties,
3278c2ecf20Sopenharmony_ci	},
3288c2ecf20Sopenharmony_ci};
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_cistatic int __init pmic_tps65023_init(void)
3318c2ecf20Sopenharmony_ci{
3328c2ecf20Sopenharmony_ci	return i2c_register_board_info(1, mityomap_tps65023_info,
3338c2ecf20Sopenharmony_ci					ARRAY_SIZE(mityomap_tps65023_info));
3348c2ecf20Sopenharmony_ci}
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ci/*
3378c2ecf20Sopenharmony_ci * SPI Devices:
3388c2ecf20Sopenharmony_ci *	SPI1_CS0: 8M Flash ST-M25P64-VME6G
3398c2ecf20Sopenharmony_ci */
3408c2ecf20Sopenharmony_cistatic struct mtd_partition spi_flash_partitions[] = {
3418c2ecf20Sopenharmony_ci	[0] = {
3428c2ecf20Sopenharmony_ci		.name		= "ubl",
3438c2ecf20Sopenharmony_ci		.offset		= 0,
3448c2ecf20Sopenharmony_ci		.size		= SZ_64K,
3458c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,
3468c2ecf20Sopenharmony_ci	},
3478c2ecf20Sopenharmony_ci	[1] = {
3488c2ecf20Sopenharmony_ci		.name		= "u-boot",
3498c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
3508c2ecf20Sopenharmony_ci		.size		= SZ_512K,
3518c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,
3528c2ecf20Sopenharmony_ci	},
3538c2ecf20Sopenharmony_ci	[2] = {
3548c2ecf20Sopenharmony_ci		.name		= "u-boot-env",
3558c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
3568c2ecf20Sopenharmony_ci		.size		= SZ_64K,
3578c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,
3588c2ecf20Sopenharmony_ci	},
3598c2ecf20Sopenharmony_ci	[3] = {
3608c2ecf20Sopenharmony_ci		.name		= "periph-config",
3618c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
3628c2ecf20Sopenharmony_ci		.size		= SZ_64K,
3638c2ecf20Sopenharmony_ci		.mask_flags	= MTD_WRITEABLE,
3648c2ecf20Sopenharmony_ci	},
3658c2ecf20Sopenharmony_ci	[4] = {
3668c2ecf20Sopenharmony_ci		.name		= "reserved",
3678c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
3688c2ecf20Sopenharmony_ci		.size		= SZ_256K + SZ_64K,
3698c2ecf20Sopenharmony_ci	},
3708c2ecf20Sopenharmony_ci	[5] = {
3718c2ecf20Sopenharmony_ci		.name		= "kernel",
3728c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
3738c2ecf20Sopenharmony_ci		.size		= SZ_2M + SZ_1M,
3748c2ecf20Sopenharmony_ci	},
3758c2ecf20Sopenharmony_ci	[6] = {
3768c2ecf20Sopenharmony_ci		.name		= "fpga",
3778c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
3788c2ecf20Sopenharmony_ci		.size		= SZ_2M,
3798c2ecf20Sopenharmony_ci	},
3808c2ecf20Sopenharmony_ci	[7] = {
3818c2ecf20Sopenharmony_ci		.name		= "spare",
3828c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
3838c2ecf20Sopenharmony_ci		.size		= MTDPART_SIZ_FULL,
3848c2ecf20Sopenharmony_ci	},
3858c2ecf20Sopenharmony_ci};
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_cistatic struct flash_platform_data mityomapl138_spi_flash_data = {
3888c2ecf20Sopenharmony_ci	.name		= "m25p80",
3898c2ecf20Sopenharmony_ci	.parts		= spi_flash_partitions,
3908c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(spi_flash_partitions),
3918c2ecf20Sopenharmony_ci	.type		= "m24p64",
3928c2ecf20Sopenharmony_ci};
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_cistatic struct davinci_spi_config spi_eprom_config = {
3958c2ecf20Sopenharmony_ci	.io_type	= SPI_IO_TYPE_DMA,
3968c2ecf20Sopenharmony_ci	.c2tdelay	= 8,
3978c2ecf20Sopenharmony_ci	.t2cdelay	= 8,
3988c2ecf20Sopenharmony_ci};
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_cistatic struct spi_board_info mityomapl138_spi_flash_info[] = {
4018c2ecf20Sopenharmony_ci	{
4028c2ecf20Sopenharmony_ci		.modalias		= "m25p80",
4038c2ecf20Sopenharmony_ci		.platform_data		= &mityomapl138_spi_flash_data,
4048c2ecf20Sopenharmony_ci		.controller_data	= &spi_eprom_config,
4058c2ecf20Sopenharmony_ci		.mode			= SPI_MODE_0,
4068c2ecf20Sopenharmony_ci		.max_speed_hz		= 30000000,
4078c2ecf20Sopenharmony_ci		.bus_num		= 1,
4088c2ecf20Sopenharmony_ci		.chip_select		= 0,
4098c2ecf20Sopenharmony_ci	},
4108c2ecf20Sopenharmony_ci};
4118c2ecf20Sopenharmony_ci
4128c2ecf20Sopenharmony_ci/*
4138c2ecf20Sopenharmony_ci * MityDSP-L138 includes a 256 MByte large-page NAND flash
4148c2ecf20Sopenharmony_ci * (128K blocks).
4158c2ecf20Sopenharmony_ci */
4168c2ecf20Sopenharmony_cistatic struct mtd_partition mityomapl138_nandflash_partition[] = {
4178c2ecf20Sopenharmony_ci	{
4188c2ecf20Sopenharmony_ci		.name		= "rootfs",
4198c2ecf20Sopenharmony_ci		.offset		= 0,
4208c2ecf20Sopenharmony_ci		.size		= SZ_128M,
4218c2ecf20Sopenharmony_ci		.mask_flags	= 0, /* MTD_WRITEABLE, */
4228c2ecf20Sopenharmony_ci	},
4238c2ecf20Sopenharmony_ci	{
4248c2ecf20Sopenharmony_ci		.name		= "homefs",
4258c2ecf20Sopenharmony_ci		.offset		= MTDPART_OFS_APPEND,
4268c2ecf20Sopenharmony_ci		.size		= MTDPART_SIZ_FULL,
4278c2ecf20Sopenharmony_ci		.mask_flags	= 0,
4288c2ecf20Sopenharmony_ci	},
4298c2ecf20Sopenharmony_ci};
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_cistatic struct davinci_nand_pdata mityomapl138_nandflash_data = {
4328c2ecf20Sopenharmony_ci	.core_chipsel	= 1,
4338c2ecf20Sopenharmony_ci	.parts		= mityomapl138_nandflash_partition,
4348c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(mityomapl138_nandflash_partition),
4358c2ecf20Sopenharmony_ci	.engine_type	= NAND_ECC_ENGINE_TYPE_ON_HOST,
4368c2ecf20Sopenharmony_ci	.bbt_options	= NAND_BBT_USE_FLASH,
4378c2ecf20Sopenharmony_ci	.options	= NAND_BUSWIDTH_16,
4388c2ecf20Sopenharmony_ci	.ecc_bits	= 1, /* 4 bit mode is not supported with 16 bit NAND */
4398c2ecf20Sopenharmony_ci};
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_cistatic struct resource mityomapl138_nandflash_resource[] = {
4428c2ecf20Sopenharmony_ci	{
4438c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CS3_BASE,
4448c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
4458c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
4468c2ecf20Sopenharmony_ci	},
4478c2ecf20Sopenharmony_ci	{
4488c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CTL_BASE,
4498c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
4508c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
4518c2ecf20Sopenharmony_ci	},
4528c2ecf20Sopenharmony_ci};
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_cistatic struct platform_device mityomapl138_aemif_devices[] = {
4558c2ecf20Sopenharmony_ci	{
4568c2ecf20Sopenharmony_ci		.name		= "davinci_nand",
4578c2ecf20Sopenharmony_ci		.id		= 1,
4588c2ecf20Sopenharmony_ci		.dev		= {
4598c2ecf20Sopenharmony_ci			.platform_data	= &mityomapl138_nandflash_data,
4608c2ecf20Sopenharmony_ci		},
4618c2ecf20Sopenharmony_ci		.num_resources	= ARRAY_SIZE(mityomapl138_nandflash_resource),
4628c2ecf20Sopenharmony_ci		.resource	= mityomapl138_nandflash_resource,
4638c2ecf20Sopenharmony_ci	},
4648c2ecf20Sopenharmony_ci};
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_cistatic struct resource mityomapl138_aemif_resources[] = {
4678c2ecf20Sopenharmony_ci	{
4688c2ecf20Sopenharmony_ci		.start	= DA8XX_AEMIF_CTL_BASE,
4698c2ecf20Sopenharmony_ci		.end	= DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
4708c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
4718c2ecf20Sopenharmony_ci	},
4728c2ecf20Sopenharmony_ci};
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_cistatic struct aemif_abus_data mityomapl138_aemif_abus_data[] = {
4758c2ecf20Sopenharmony_ci	{
4768c2ecf20Sopenharmony_ci		.cs	= 1,
4778c2ecf20Sopenharmony_ci	},
4788c2ecf20Sopenharmony_ci};
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_cistatic struct aemif_platform_data mityomapl138_aemif_pdata = {
4818c2ecf20Sopenharmony_ci	.abus_data		= mityomapl138_aemif_abus_data,
4828c2ecf20Sopenharmony_ci	.num_abus_data		= ARRAY_SIZE(mityomapl138_aemif_abus_data),
4838c2ecf20Sopenharmony_ci	.sub_devices		= mityomapl138_aemif_devices,
4848c2ecf20Sopenharmony_ci	.num_sub_devices	= ARRAY_SIZE(mityomapl138_aemif_devices),
4858c2ecf20Sopenharmony_ci};
4868c2ecf20Sopenharmony_ci
4878c2ecf20Sopenharmony_cistatic struct platform_device mityomapl138_aemif_device = {
4888c2ecf20Sopenharmony_ci	.name		= "ti-aemif",
4898c2ecf20Sopenharmony_ci	.id		= -1,
4908c2ecf20Sopenharmony_ci	.dev = {
4918c2ecf20Sopenharmony_ci		.platform_data	= &mityomapl138_aemif_pdata,
4928c2ecf20Sopenharmony_ci	},
4938c2ecf20Sopenharmony_ci	.resource	= mityomapl138_aemif_resources,
4948c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(mityomapl138_aemif_resources),
4958c2ecf20Sopenharmony_ci};
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_cistatic void __init mityomapl138_setup_nand(void)
4988c2ecf20Sopenharmony_ci{
4998c2ecf20Sopenharmony_ci	if (platform_device_register(&mityomapl138_aemif_device))
5008c2ecf20Sopenharmony_ci		pr_warn("%s: Cannot register AEMIF device\n", __func__);
5018c2ecf20Sopenharmony_ci}
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_cistatic const short mityomap_mii_pins[] = {
5048c2ecf20Sopenharmony_ci	DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
5058c2ecf20Sopenharmony_ci	DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
5068c2ecf20Sopenharmony_ci	DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
5078c2ecf20Sopenharmony_ci	DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
5088c2ecf20Sopenharmony_ci	DA850_MDIO_D,
5098c2ecf20Sopenharmony_ci	-1
5108c2ecf20Sopenharmony_ci};
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_cistatic const short mityomap_rmii_pins[] = {
5138c2ecf20Sopenharmony_ci	DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
5148c2ecf20Sopenharmony_ci	DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,
5158c2ecf20Sopenharmony_ci	DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,
5168c2ecf20Sopenharmony_ci	DA850_MDIO_D,
5178c2ecf20Sopenharmony_ci	-1
5188c2ecf20Sopenharmony_ci};
5198c2ecf20Sopenharmony_ci
5208c2ecf20Sopenharmony_cistatic void __init mityomapl138_config_emac(void)
5218c2ecf20Sopenharmony_ci{
5228c2ecf20Sopenharmony_ci	void __iomem *cfg_chip3_base;
5238c2ecf20Sopenharmony_ci	int ret;
5248c2ecf20Sopenharmony_ci	u32 val;
5258c2ecf20Sopenharmony_ci	struct davinci_soc_info *soc_info = &davinci_soc_info;
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci	soc_info->emac_pdata->rmii_en = 0; /* hardcoded for now */
5288c2ecf20Sopenharmony_ci
5298c2ecf20Sopenharmony_ci	cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
5308c2ecf20Sopenharmony_ci	val = __raw_readl(cfg_chip3_base);
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_ci	if (soc_info->emac_pdata->rmii_en) {
5338c2ecf20Sopenharmony_ci		val |= BIT(8);
5348c2ecf20Sopenharmony_ci		ret = davinci_cfg_reg_list(mityomap_rmii_pins);
5358c2ecf20Sopenharmony_ci		pr_info("RMII PHY configured\n");
5368c2ecf20Sopenharmony_ci	} else {
5378c2ecf20Sopenharmony_ci		val &= ~BIT(8);
5388c2ecf20Sopenharmony_ci		ret = davinci_cfg_reg_list(mityomap_mii_pins);
5398c2ecf20Sopenharmony_ci		pr_info("MII PHY configured\n");
5408c2ecf20Sopenharmony_ci	}
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_ci	if (ret) {
5438c2ecf20Sopenharmony_ci		pr_warn("mii/rmii mux setup failed: %d\n", ret);
5448c2ecf20Sopenharmony_ci		return;
5458c2ecf20Sopenharmony_ci	}
5468c2ecf20Sopenharmony_ci
5478c2ecf20Sopenharmony_ci	/* configure the CFGCHIP3 register for RMII or MII */
5488c2ecf20Sopenharmony_ci	__raw_writel(val, cfg_chip3_base);
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_ci	soc_info->emac_pdata->phy_id = MITYOMAPL138_PHY_ID;
5518c2ecf20Sopenharmony_ci
5528c2ecf20Sopenharmony_ci	ret = da8xx_register_emac();
5538c2ecf20Sopenharmony_ci	if (ret)
5548c2ecf20Sopenharmony_ci		pr_warn("emac registration failed: %d\n", ret);
5558c2ecf20Sopenharmony_ci}
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_cistatic void __init mityomapl138_init(void)
5588c2ecf20Sopenharmony_ci{
5598c2ecf20Sopenharmony_ci	int ret;
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_ci	da850_register_clocks();
5628c2ecf20Sopenharmony_ci
5638c2ecf20Sopenharmony_ci	/* for now, no special EDMA channels are reserved */
5648c2ecf20Sopenharmony_ci	ret = da850_register_edma(NULL);
5658c2ecf20Sopenharmony_ci	if (ret)
5668c2ecf20Sopenharmony_ci		pr_warn("edma registration failed: %d\n", ret);
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci	ret = da8xx_register_watchdog();
5698c2ecf20Sopenharmony_ci	if (ret)
5708c2ecf20Sopenharmony_ci		pr_warn("watchdog registration failed: %d\n", ret);
5718c2ecf20Sopenharmony_ci
5728c2ecf20Sopenharmony_ci	davinci_serial_init(da8xx_serial_device);
5738c2ecf20Sopenharmony_ci
5748c2ecf20Sopenharmony_ci	nvmem_register_notifier(&mityomapl138_nvmem_notifier);
5758c2ecf20Sopenharmony_ci	nvmem_add_cell_table(&mityomapl138_nvmem_cell_table);
5768c2ecf20Sopenharmony_ci	nvmem_add_cell_lookups(&mityomapl138_nvmem_cell_lookup, 1);
5778c2ecf20Sopenharmony_ci
5788c2ecf20Sopenharmony_ci	ret = da8xx_register_i2c(0, &mityomap_i2c_0_pdata);
5798c2ecf20Sopenharmony_ci	if (ret)
5808c2ecf20Sopenharmony_ci		pr_warn("i2c0 registration failed: %d\n", ret);
5818c2ecf20Sopenharmony_ci
5828c2ecf20Sopenharmony_ci	ret = pmic_tps65023_init();
5838c2ecf20Sopenharmony_ci	if (ret)
5848c2ecf20Sopenharmony_ci		pr_warn("TPS65023 PMIC init failed: %d\n", ret);
5858c2ecf20Sopenharmony_ci
5868c2ecf20Sopenharmony_ci	mityomapl138_setup_nand();
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci	ret = spi_register_board_info(mityomapl138_spi_flash_info,
5898c2ecf20Sopenharmony_ci				      ARRAY_SIZE(mityomapl138_spi_flash_info));
5908c2ecf20Sopenharmony_ci	if (ret)
5918c2ecf20Sopenharmony_ci		pr_warn("spi info registration failed: %d\n", ret);
5928c2ecf20Sopenharmony_ci
5938c2ecf20Sopenharmony_ci	ret = da8xx_register_spi_bus(1,
5948c2ecf20Sopenharmony_ci				     ARRAY_SIZE(mityomapl138_spi_flash_info));
5958c2ecf20Sopenharmony_ci	if (ret)
5968c2ecf20Sopenharmony_ci		pr_warn("spi 1 registration failed: %d\n", ret);
5978c2ecf20Sopenharmony_ci
5988c2ecf20Sopenharmony_ci	mityomapl138_config_emac();
5998c2ecf20Sopenharmony_ci
6008c2ecf20Sopenharmony_ci	ret = da8xx_register_rtc();
6018c2ecf20Sopenharmony_ci	if (ret)
6028c2ecf20Sopenharmony_ci		pr_warn("rtc setup failed: %d\n", ret);
6038c2ecf20Sopenharmony_ci
6048c2ecf20Sopenharmony_ci	ret = da8xx_register_cpuidle();
6058c2ecf20Sopenharmony_ci	if (ret)
6068c2ecf20Sopenharmony_ci		pr_warn("cpuidle registration failed: %d\n", ret);
6078c2ecf20Sopenharmony_ci
6088c2ecf20Sopenharmony_ci	davinci_pm_init();
6098c2ecf20Sopenharmony_ci}
6108c2ecf20Sopenharmony_ci
6118c2ecf20Sopenharmony_ci#ifdef CONFIG_SERIAL_8250_CONSOLE
6128c2ecf20Sopenharmony_cistatic int __init mityomapl138_console_init(void)
6138c2ecf20Sopenharmony_ci{
6148c2ecf20Sopenharmony_ci	if (!machine_is_mityomapl138())
6158c2ecf20Sopenharmony_ci		return 0;
6168c2ecf20Sopenharmony_ci
6178c2ecf20Sopenharmony_ci	return add_preferred_console("ttyS", 1, "115200");
6188c2ecf20Sopenharmony_ci}
6198c2ecf20Sopenharmony_ciconsole_initcall(mityomapl138_console_init);
6208c2ecf20Sopenharmony_ci#endif
6218c2ecf20Sopenharmony_ci
6228c2ecf20Sopenharmony_cistatic void __init mityomapl138_map_io(void)
6238c2ecf20Sopenharmony_ci{
6248c2ecf20Sopenharmony_ci	da850_init();
6258c2ecf20Sopenharmony_ci}
6268c2ecf20Sopenharmony_ci
6278c2ecf20Sopenharmony_ciMACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808")
6288c2ecf20Sopenharmony_ci	.atag_offset	= 0x100,
6298c2ecf20Sopenharmony_ci	.map_io		= mityomapl138_map_io,
6308c2ecf20Sopenharmony_ci	.init_irq	= da850_init_irq,
6318c2ecf20Sopenharmony_ci	.init_time	= da850_init_time,
6328c2ecf20Sopenharmony_ci	.init_machine	= mityomapl138_init,
6338c2ecf20Sopenharmony_ci	.init_late	= davinci_init_late,
6348c2ecf20Sopenharmony_ci	.dma_zone_size	= SZ_128M,
6358c2ecf20Sopenharmony_ciMACHINE_END
636