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