Path: blob/master/arch/arm/mach-davinci/board-mityomapl138.c
10699 views
/*1* Critical Link MityOMAP-L138 SoM2*3* Copyright (C) 2010 Critical Link LLC - http://www.criticallink.com4*5* This file is licensed under the terms of the GNU General Public License6* version 2. This program is licensed "as is" without any warranty of7* any kind, whether express or implied.8*/910#include <linux/kernel.h>11#include <linux/init.h>12#include <linux/console.h>13#include <linux/platform_device.h>14#include <linux/mtd/partitions.h>15#include <linux/regulator/machine.h>16#include <linux/i2c.h>17#include <linux/i2c/at24.h>18#include <linux/etherdevice.h>19#include <linux/spi/spi.h>20#include <linux/spi/flash.h>2122#include <asm/mach-types.h>23#include <asm/mach/arch.h>24#include <mach/common.h>25#include <mach/cp_intc.h>26#include <mach/da8xx.h>27#include <mach/nand.h>28#include <mach/mux.h>29#include <mach/spi.h>3031#define MITYOMAPL138_PHY_ID ""3233#define FACTORY_CONFIG_MAGIC 0x012C013834#define FACTORY_CONFIG_VERSION 0x000100013536/* Data Held in On-Board I2C device */37struct factory_config {38u32 magic;39u32 version;40u8 mac[6];41u32 fpga_type;42u32 spare;43u32 serialnumber;44char partnum[32];45};4647static struct factory_config factory_config;4849struct part_no_info {50const char *part_no; /* part number string of interest */51int max_freq; /* khz */52};5354static struct part_no_info mityomapl138_pn_info[] = {55{56.part_no = "L138-C",57.max_freq = 300000,58},59{60.part_no = "L138-D",61.max_freq = 375000,62},63{64.part_no = "L138-F",65.max_freq = 456000,66},67{68.part_no = "1808-C",69.max_freq = 300000,70},71{72.part_no = "1808-D",73.max_freq = 375000,74},75{76.part_no = "1808-F",77.max_freq = 456000,78},79{80.part_no = "1810-D",81.max_freq = 375000,82},83};8485#ifdef CONFIG_CPU_FREQ86static void mityomapl138_cpufreq_init(const char *partnum)87{88int i, ret;8990for (i = 0; partnum && i < ARRAY_SIZE(mityomapl138_pn_info); i++) {91/*92* the part number has additional characters beyond what is93* stored in the table. This information is not needed for94* determining the speed grade, and would require several95* more table entries. Only check the first N characters96* for a match.97*/98if (!strncmp(partnum, mityomapl138_pn_info[i].part_no,99strlen(mityomapl138_pn_info[i].part_no))) {100da850_max_speed = mityomapl138_pn_info[i].max_freq;101break;102}103}104105ret = da850_register_cpufreq("pll0_sysclk3");106if (ret)107pr_warning("cpufreq registration failed: %d\n", ret);108}109#else110static void mityomapl138_cpufreq_init(const char *partnum) { }111#endif112113static void read_factory_config(struct memory_accessor *a, void *context)114{115int ret;116const char *partnum = NULL;117struct davinci_soc_info *soc_info = &davinci_soc_info;118119ret = a->read(a, (char *)&factory_config, 0, sizeof(factory_config));120if (ret != sizeof(struct factory_config)) {121pr_warning("MityOMAPL138: Read Factory Config Failed: %d\n",122ret);123goto bad_config;124}125126if (factory_config.magic != FACTORY_CONFIG_MAGIC) {127pr_warning("MityOMAPL138: Factory Config Magic Wrong (%X)\n",128factory_config.magic);129goto bad_config;130}131132if (factory_config.version != FACTORY_CONFIG_VERSION) {133pr_warning("MityOMAPL138: Factory Config Version Wrong (%X)\n",134factory_config.version);135goto bad_config;136}137138pr_info("MityOMAPL138: Found MAC = %pM\n", factory_config.mac);139if (is_valid_ether_addr(factory_config.mac))140memcpy(soc_info->emac_pdata->mac_addr,141factory_config.mac, ETH_ALEN);142else143pr_warning("MityOMAPL138: Invalid MAC found "144"in factory config block\n");145146partnum = factory_config.partnum;147pr_info("MityOMAPL138: Part Number = %s\n", partnum);148149bad_config:150/* default maximum speed is valid for all platforms */151mityomapl138_cpufreq_init(partnum);152}153154static struct at24_platform_data mityomapl138_fd_chip = {155.byte_len = 256,156.page_size = 8,157.flags = AT24_FLAG_READONLY | AT24_FLAG_IRUGO,158.setup = read_factory_config,159.context = NULL,160};161162static struct davinci_i2c_platform_data mityomap_i2c_0_pdata = {163.bus_freq = 100, /* kHz */164.bus_delay = 0, /* usec */165};166167/* TPS65023 voltage regulator support */168/* 1.2V Core */169static struct regulator_consumer_supply tps65023_dcdc1_consumers[] = {170{171.supply = "cvdd",172},173};174175/* 1.8V */176static struct regulator_consumer_supply tps65023_dcdc2_consumers[] = {177{178.supply = "usb0_vdda18",179},180{181.supply = "usb1_vdda18",182},183{184.supply = "ddr_dvdd18",185},186{187.supply = "sata_vddr",188},189};190191/* 1.2V */192static struct regulator_consumer_supply tps65023_dcdc3_consumers[] = {193{194.supply = "sata_vdd",195},196{197.supply = "usb_cvdd",198},199{200.supply = "pll0_vdda",201},202{203.supply = "pll1_vdda",204},205};206207/* 1.8V Aux LDO, not used */208static struct regulator_consumer_supply tps65023_ldo1_consumers[] = {209{210.supply = "1.8v_aux",211},212};213214/* FPGA VCC Aux (2.5 or 3.3) LDO */215static struct regulator_consumer_supply tps65023_ldo2_consumers[] = {216{217.supply = "vccaux",218},219};220221static struct regulator_init_data tps65023_regulator_data[] = {222/* dcdc1 */223{224.constraints = {225.min_uV = 1150000,226.max_uV = 1350000,227.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |228REGULATOR_CHANGE_STATUS,229.boot_on = 1,230},231.num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc1_consumers),232.consumer_supplies = tps65023_dcdc1_consumers,233},234/* dcdc2 */235{236.constraints = {237.min_uV = 1800000,238.max_uV = 1800000,239.valid_ops_mask = REGULATOR_CHANGE_STATUS,240.boot_on = 1,241},242.num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc2_consumers),243.consumer_supplies = tps65023_dcdc2_consumers,244},245/* dcdc3 */246{247.constraints = {248.min_uV = 1200000,249.max_uV = 1200000,250.valid_ops_mask = REGULATOR_CHANGE_STATUS,251.boot_on = 1,252},253.num_consumer_supplies = ARRAY_SIZE(tps65023_dcdc3_consumers),254.consumer_supplies = tps65023_dcdc3_consumers,255},256/* ldo1 */257{258.constraints = {259.min_uV = 1800000,260.max_uV = 1800000,261.valid_ops_mask = REGULATOR_CHANGE_STATUS,262.boot_on = 1,263},264.num_consumer_supplies = ARRAY_SIZE(tps65023_ldo1_consumers),265.consumer_supplies = tps65023_ldo1_consumers,266},267/* ldo2 */268{269.constraints = {270.min_uV = 2500000,271.max_uV = 3300000,272.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |273REGULATOR_CHANGE_STATUS,274.boot_on = 1,275},276.num_consumer_supplies = ARRAY_SIZE(tps65023_ldo2_consumers),277.consumer_supplies = tps65023_ldo2_consumers,278},279};280281static struct i2c_board_info __initdata mityomap_tps65023_info[] = {282{283I2C_BOARD_INFO("tps65023", 0x48),284.platform_data = &tps65023_regulator_data[0],285},286{287I2C_BOARD_INFO("24c02", 0x50),288.platform_data = &mityomapl138_fd_chip,289},290};291292static int __init pmic_tps65023_init(void)293{294return i2c_register_board_info(1, mityomap_tps65023_info,295ARRAY_SIZE(mityomap_tps65023_info));296}297298/*299* SPI Devices:300* SPI1_CS0: 8M Flash ST-M25P64-VME6G301*/302static struct mtd_partition spi_flash_partitions[] = {303[0] = {304.name = "ubl",305.offset = 0,306.size = SZ_64K,307.mask_flags = MTD_WRITEABLE,308},309[1] = {310.name = "u-boot",311.offset = MTDPART_OFS_APPEND,312.size = SZ_512K,313.mask_flags = MTD_WRITEABLE,314},315[2] = {316.name = "u-boot-env",317.offset = MTDPART_OFS_APPEND,318.size = SZ_64K,319.mask_flags = MTD_WRITEABLE,320},321[3] = {322.name = "periph-config",323.offset = MTDPART_OFS_APPEND,324.size = SZ_64K,325.mask_flags = MTD_WRITEABLE,326},327[4] = {328.name = "reserved",329.offset = MTDPART_OFS_APPEND,330.size = SZ_256K + SZ_64K,331},332[5] = {333.name = "kernel",334.offset = MTDPART_OFS_APPEND,335.size = SZ_2M + SZ_1M,336},337[6] = {338.name = "fpga",339.offset = MTDPART_OFS_APPEND,340.size = SZ_2M,341},342[7] = {343.name = "spare",344.offset = MTDPART_OFS_APPEND,345.size = MTDPART_SIZ_FULL,346},347};348349static struct flash_platform_data mityomapl138_spi_flash_data = {350.name = "m25p80",351.parts = spi_flash_partitions,352.nr_parts = ARRAY_SIZE(spi_flash_partitions),353.type = "m24p64",354};355356static struct davinci_spi_config spi_eprom_config = {357.io_type = SPI_IO_TYPE_DMA,358.c2tdelay = 8,359.t2cdelay = 8,360};361362static struct spi_board_info mityomapl138_spi_flash_info[] = {363{364.modalias = "m25p80",365.platform_data = &mityomapl138_spi_flash_data,366.controller_data = &spi_eprom_config,367.mode = SPI_MODE_0,368.max_speed_hz = 30000000,369.bus_num = 1,370.chip_select = 0,371},372};373374/*375* MityDSP-L138 includes a 256 MByte large-page NAND flash376* (128K blocks).377*/378static struct mtd_partition mityomapl138_nandflash_partition[] = {379{380.name = "rootfs",381.offset = 0,382.size = SZ_128M,383.mask_flags = 0, /* MTD_WRITEABLE, */384},385{386.name = "homefs",387.offset = MTDPART_OFS_APPEND,388.size = MTDPART_SIZ_FULL,389.mask_flags = 0,390},391};392393static struct davinci_nand_pdata mityomapl138_nandflash_data = {394.parts = mityomapl138_nandflash_partition,395.nr_parts = ARRAY_SIZE(mityomapl138_nandflash_partition),396.ecc_mode = NAND_ECC_HW,397.options = NAND_USE_FLASH_BBT | NAND_BUSWIDTH_16,398.ecc_bits = 1, /* 4 bit mode is not supported with 16 bit NAND */399};400401static struct resource mityomapl138_nandflash_resource[] = {402{403.start = DA8XX_AEMIF_CS3_BASE,404.end = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,405.flags = IORESOURCE_MEM,406},407{408.start = DA8XX_AEMIF_CTL_BASE,409.end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,410.flags = IORESOURCE_MEM,411},412};413414static struct platform_device mityomapl138_nandflash_device = {415.name = "davinci_nand",416.id = 1,417.dev = {418.platform_data = &mityomapl138_nandflash_data,419},420.num_resources = ARRAY_SIZE(mityomapl138_nandflash_resource),421.resource = mityomapl138_nandflash_resource,422};423424static struct platform_device *mityomapl138_devices[] __initdata = {425&mityomapl138_nandflash_device,426};427428static void __init mityomapl138_setup_nand(void)429{430platform_add_devices(mityomapl138_devices,431ARRAY_SIZE(mityomapl138_devices));432}433434static struct davinci_uart_config mityomapl138_uart_config __initdata = {435.enabled_uarts = 0x7,436};437438static const short mityomap_mii_pins[] = {439DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,440DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,441DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,442DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,443DA850_MDIO_D,444-1445};446447static const short mityomap_rmii_pins[] = {448DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,449DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,450DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,451DA850_MDIO_D,452-1453};454455static void __init mityomapl138_config_emac(void)456{457void __iomem *cfg_chip3_base;458int ret;459u32 val;460struct davinci_soc_info *soc_info = &davinci_soc_info;461462soc_info->emac_pdata->rmii_en = 0; /* hardcoded for now */463464cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);465val = __raw_readl(cfg_chip3_base);466467if (soc_info->emac_pdata->rmii_en) {468val |= BIT(8);469ret = davinci_cfg_reg_list(mityomap_rmii_pins);470pr_info("RMII PHY configured\n");471} else {472val &= ~BIT(8);473ret = davinci_cfg_reg_list(mityomap_mii_pins);474pr_info("MII PHY configured\n");475}476477if (ret) {478pr_warning("mii/rmii mux setup failed: %d\n", ret);479return;480}481482/* configure the CFGCHIP3 register for RMII or MII */483__raw_writel(val, cfg_chip3_base);484485soc_info->emac_pdata->phy_id = MITYOMAPL138_PHY_ID;486487ret = da8xx_register_emac();488if (ret)489pr_warning("emac registration failed: %d\n", ret);490}491492static struct davinci_pm_config da850_pm_pdata = {493.sleepcount = 128,494};495496static struct platform_device da850_pm_device = {497.name = "pm-davinci",498.dev = {499.platform_data = &da850_pm_pdata,500},501.id = -1,502};503504static void __init mityomapl138_init(void)505{506int ret;507508/* for now, no special EDMA channels are reserved */509ret = da850_register_edma(NULL);510if (ret)511pr_warning("edma registration failed: %d\n", ret);512513ret = da8xx_register_watchdog();514if (ret)515pr_warning("watchdog registration failed: %d\n", ret);516517davinci_serial_init(&mityomapl138_uart_config);518519ret = da8xx_register_i2c(0, &mityomap_i2c_0_pdata);520if (ret)521pr_warning("i2c0 registration failed: %d\n", ret);522523ret = pmic_tps65023_init();524if (ret)525pr_warning("TPS65023 PMIC init failed: %d\n", ret);526527mityomapl138_setup_nand();528529ret = da8xx_register_spi(1, mityomapl138_spi_flash_info,530ARRAY_SIZE(mityomapl138_spi_flash_info));531if (ret)532pr_warning("spi 1 registration failed: %d\n", ret);533534mityomapl138_config_emac();535536ret = da8xx_register_rtc();537if (ret)538pr_warning("rtc setup failed: %d\n", ret);539540ret = da8xx_register_cpuidle();541if (ret)542pr_warning("cpuidle registration failed: %d\n", ret);543544ret = da850_register_pm(&da850_pm_device);545if (ret)546pr_warning("da850_evm_init: suspend registration failed: %d\n",547ret);548}549550#ifdef CONFIG_SERIAL_8250_CONSOLE551static int __init mityomapl138_console_init(void)552{553if (!machine_is_mityomapl138())554return 0;555556return add_preferred_console("ttyS", 1, "115200");557}558console_initcall(mityomapl138_console_init);559#endif560561static void __init mityomapl138_map_io(void)562{563da850_init();564}565566MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808")567.boot_params = (DA8XX_DDR_BASE + 0x100),568.map_io = mityomapl138_map_io,569.init_irq = cp_intc_init,570.timer = &davinci_timer,571.init_machine = mityomapl138_init,572MACHINE_END573574575