1983e3700STom Rini /* 2983e3700STom Rini * emif4.c 3983e3700STom Rini * 4983e3700STom Rini * AM33XX emif4 configuration file 5983e3700STom Rini * 6983e3700STom Rini * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ 7983e3700STom Rini * 8983e3700STom Rini * SPDX-License-Identifier: GPL-2.0+ 9983e3700STom Rini */ 10983e3700STom Rini 11983e3700STom Rini #include <common.h> 12983e3700STom Rini #include <asm/arch/cpu.h> 13983e3700STom Rini #include <asm/arch/ddr_defs.h> 14983e3700STom Rini #include <asm/arch/hardware.h> 15983e3700STom Rini #include <asm/arch/clock.h> 16983e3700STom Rini #include <asm/arch/sys_proto.h> 17983e3700STom Rini #include <asm/io.h> 18983e3700STom Rini #include <asm/emif.h> 19983e3700STom Rini 20983e3700STom Rini static struct vtp_reg *vtpreg[2] = { 21983e3700STom Rini (struct vtp_reg *)VTP0_CTRL_ADDR, 22983e3700STom Rini (struct vtp_reg *)VTP1_CTRL_ADDR}; 23983e3700STom Rini #ifdef CONFIG_AM33XX 24983e3700STom Rini static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR; 25983e3700STom Rini #endif 26983e3700STom Rini #ifdef CONFIG_AM43XX 27983e3700STom Rini static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR; 28983e3700STom Rini static struct cm_device_inst *cm_device = 29983e3700STom Rini (struct cm_device_inst *)CM_DEVICE_INST; 30983e3700STom Rini #endif 31983e3700STom Rini 32*86277339STom Rini #ifdef CONFIG_TI814X 33983e3700STom Rini void config_dmm(const struct dmm_lisa_map_regs *regs) 34983e3700STom Rini { 35*86277339STom Rini struct dmm_lisa_map_regs *hw_lisa_map_regs = 36*86277339STom Rini (struct dmm_lisa_map_regs *)DMM_BASE; 37*86277339STom Rini 38983e3700STom Rini enable_dmm_clocks(); 39983e3700STom Rini 40983e3700STom Rini writel(0, &hw_lisa_map_regs->dmm_lisa_map_3); 41983e3700STom Rini writel(0, &hw_lisa_map_regs->dmm_lisa_map_2); 42983e3700STom Rini writel(0, &hw_lisa_map_regs->dmm_lisa_map_1); 43983e3700STom Rini writel(0, &hw_lisa_map_regs->dmm_lisa_map_0); 44983e3700STom Rini 45983e3700STom Rini writel(regs->dmm_lisa_map_3, &hw_lisa_map_regs->dmm_lisa_map_3); 46983e3700STom Rini writel(regs->dmm_lisa_map_2, &hw_lisa_map_regs->dmm_lisa_map_2); 47983e3700STom Rini writel(regs->dmm_lisa_map_1, &hw_lisa_map_regs->dmm_lisa_map_1); 48983e3700STom Rini writel(regs->dmm_lisa_map_0, &hw_lisa_map_regs->dmm_lisa_map_0); 49983e3700STom Rini } 50983e3700STom Rini #endif 51983e3700STom Rini 52983e3700STom Rini static void config_vtp(int nr) 53983e3700STom Rini { 54983e3700STom Rini writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_ENABLE, 55983e3700STom Rini &vtpreg[nr]->vtp0ctrlreg); 56983e3700STom Rini writel(readl(&vtpreg[nr]->vtp0ctrlreg) & (~VTP_CTRL_START_EN), 57983e3700STom Rini &vtpreg[nr]->vtp0ctrlreg); 58983e3700STom Rini writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_START_EN, 59983e3700STom Rini &vtpreg[nr]->vtp0ctrlreg); 60983e3700STom Rini 61983e3700STom Rini /* Poll for READY */ 62983e3700STom Rini while ((readl(&vtpreg[nr]->vtp0ctrlreg) & VTP_CTRL_READY) != 63983e3700STom Rini VTP_CTRL_READY) 64983e3700STom Rini ; 65983e3700STom Rini } 66983e3700STom Rini 67983e3700STom Rini void __weak ddr_pll_config(unsigned int ddrpll_m) 68983e3700STom Rini { 69983e3700STom Rini } 70983e3700STom Rini 71983e3700STom Rini void config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs, 72983e3700STom Rini const struct ddr_data *data, const struct cmd_control *ctrl, 73983e3700STom Rini const struct emif_regs *regs, int nr) 74983e3700STom Rini { 75983e3700STom Rini ddr_pll_config(pll); 76983e3700STom Rini config_vtp(nr); 77983e3700STom Rini config_cmd_ctrl(ctrl, nr); 78983e3700STom Rini 79983e3700STom Rini config_ddr_data(data, nr); 80983e3700STom Rini #ifdef CONFIG_AM33XX 81983e3700STom Rini config_io_ctrl(ioregs); 82983e3700STom Rini 83983e3700STom Rini /* Set CKE to be controlled by EMIF/DDR PHY */ 84983e3700STom Rini writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl); 85983e3700STom Rini 86983e3700STom Rini #endif 87983e3700STom Rini #ifdef CONFIG_AM43XX 88983e3700STom Rini writel(readl(&cm_device->cm_dll_ctrl) & ~0x1, &cm_device->cm_dll_ctrl); 89983e3700STom Rini while ((readl(&cm_device->cm_dll_ctrl) & CM_DLL_READYST) == 0) 90983e3700STom Rini ; 91983e3700STom Rini 92983e3700STom Rini config_io_ctrl(ioregs); 93983e3700STom Rini 94983e3700STom Rini /* Set CKE to be controlled by EMIF/DDR PHY */ 95983e3700STom Rini writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl); 96983e3700STom Rini 97983e3700STom Rini if (emif_sdram_type(regs->sdram_config) == EMIF_SDRAM_TYPE_DDR3) 98983e3700STom Rini /* Allow EMIF to control DDR_RESET */ 99983e3700STom Rini writel(0x00000000, &ddrctrl->ddrioctrl); 100983e3700STom Rini #endif 101983e3700STom Rini 102983e3700STom Rini /* Program EMIF instance */ 103983e3700STom Rini config_ddr_phy(regs, nr); 104983e3700STom Rini set_sdram_timings(regs, nr); 105983e3700STom Rini if (get_emif_rev(EMIF1_BASE) == EMIF_4D5) 106983e3700STom Rini config_sdram_emif4d5(regs, nr); 107983e3700STom Rini else 108983e3700STom Rini config_sdram(regs, nr); 109983e3700STom Rini } 110