blob: bf3da43ed982aa91409c2a29043fe6a4e11dd2ac [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Chandan Nath62d7fe7c2011-10-14 02:58:24 +00002/*
3 * emif4.c
4 *
5 * AM33XX emif4 configuration file
6 *
7 * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
Chandan Nath62d7fe7c2011-10-14 02:58:24 +00008 */
9
10#include <common.h>
11#include <asm/arch/cpu.h>
12#include <asm/arch/ddr_defs.h>
13#include <asm/arch/hardware.h>
14#include <asm/arch/clock.h>
Tom Rinib971dfa2012-07-03 09:20:06 -070015#include <asm/arch/sys_proto.h>
Chandan Nath62d7fe7c2011-10-14 02:58:24 +000016#include <asm/io.h>
Tom Rinifda35eb2012-07-03 08:51:34 -070017#include <asm/emif.h>
Chandan Nath62d7fe7c2011-10-14 02:58:24 +000018
Matt Porter3ba65f92013-03-15 10:07:03 +000019static struct vtp_reg *vtpreg[2] = {
20 (struct vtp_reg *)VTP0_CTRL_ADDR,
21 (struct vtp_reg *)VTP1_CTRL_ADDR};
22#ifdef CONFIG_AM33XX
Tom Rini942d3f02012-07-30 14:13:16 -070023static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR;
Matt Porter3ba65f92013-03-15 10:07:03 +000024#endif
Lokesh Vutlad3daba12013-12-10 15:02:22 +053025#ifdef CONFIG_AM43XX
26static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR;
27static struct cm_device_inst *cm_device =
28 (struct cm_device_inst *)CM_DEVICE_INST;
29#endif
Tom Rini942d3f02012-07-30 14:13:16 -070030
Matt Porter3ba65f92013-03-15 10:07:03 +000031static void config_vtp(int nr)
Chandan Nath62d7fe7c2011-10-14 02:58:24 +000032{
Matt Porter3ba65f92013-03-15 10:07:03 +000033 writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_ENABLE,
34 &vtpreg[nr]->vtp0ctrlreg);
35 writel(readl(&vtpreg[nr]->vtp0ctrlreg) & (~VTP_CTRL_START_EN),
36 &vtpreg[nr]->vtp0ctrlreg);
37 writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_START_EN,
38 &vtpreg[nr]->vtp0ctrlreg);
Chandan Nath62d7fe7c2011-10-14 02:58:24 +000039
40 /* Poll for READY */
Matt Porter3ba65f92013-03-15 10:07:03 +000041 while ((readl(&vtpreg[nr]->vtp0ctrlreg) & VTP_CTRL_READY) !=
Chandan Nath62d7fe7c2011-10-14 02:58:24 +000042 VTP_CTRL_READY)
43 ;
44}
45
Lokesh Vutla94d77fb2013-07-30 10:48:52 +053046void __weak ddr_pll_config(unsigned int ddrpll_m)
47{
48}
49
Lokesh Vutla965de8b2013-12-10 15:02:21 +053050void config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs,
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000051 const struct ddr_data *data, const struct cmd_control *ctrl,
Matt Porter3ba65f92013-03-15 10:07:03 +000052 const struct emif_regs *regs, int nr)
Chandan Nath62d7fe7c2011-10-14 02:58:24 +000053{
Peter Korsgaardc00f69d2012-10-18 01:21:12 +000054 ddr_pll_config(pll);
Matt Porter3ba65f92013-03-15 10:07:03 +000055 config_vtp(nr);
56 config_cmd_ctrl(ctrl, nr);
Tom Rini318f27c2012-07-30 14:13:56 -070057
Matt Porter3ba65f92013-03-15 10:07:03 +000058 config_ddr_data(data, nr);
59#ifdef CONFIG_AM33XX
Lokesh Vutla965de8b2013-12-10 15:02:21 +053060 config_io_ctrl(ioregs);
Tom Rini318f27c2012-07-30 14:13:56 -070061
62 /* Set CKE to be controlled by EMIF/DDR PHY */
63 writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
James Doublesinfc46bae2014-12-22 16:26:11 -060064
Matt Porter3ba65f92013-03-15 10:07:03 +000065#endif
Lokesh Vutlad3daba12013-12-10 15:02:22 +053066#ifdef CONFIG_AM43XX
67 writel(readl(&cm_device->cm_dll_ctrl) & ~0x1, &cm_device->cm_dll_ctrl);
Jeroen Hofstee878cae62014-06-18 21:22:35 +020068 while ((readl(&cm_device->cm_dll_ctrl) & CM_DLL_READYST) == 0)
Lokesh Vutlad3daba12013-12-10 15:02:22 +053069 ;
Lokesh Vutlad3daba12013-12-10 15:02:22 +053070
71 config_io_ctrl(ioregs);
72
73 /* Set CKE to be controlled by EMIF/DDR PHY */
74 writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
James Doublesinfc46bae2014-12-22 16:26:11 -060075
Tom Rini7c352cd2015-06-05 15:51:11 +053076 if (emif_sdram_type(regs->sdram_config) == EMIF_SDRAM_TYPE_DDR3)
Dave Gerlache18945a2018-03-17 13:24:30 +053077#ifndef CONFIG_SPL_RTC_DDR_SUPPORT
Tom Rini7c352cd2015-06-05 15:51:11 +053078 /* Allow EMIF to control DDR_RESET */
79 writel(0x00000000, &ddrctrl->ddrioctrl);
Dave Gerlache18945a2018-03-17 13:24:30 +053080#else
81 /* Override EMIF DDR_RESET control */
82 writel(0x80000000, &ddrctrl->ddrioctrl);
83#endif /* CONFIG_SPL_RTC_DDR_SUPPORT */
Lokesh Vutlad3daba12013-12-10 15:02:22 +053084#endif
85
Tom Rini318f27c2012-07-30 14:13:56 -070086 /* Program EMIF instance */
Matt Porter3ba65f92013-03-15 10:07:03 +000087 config_ddr_phy(regs, nr);
88 set_sdram_timings(regs, nr);
Lokesh Vutlad3daba12013-12-10 15:02:22 +053089 if (get_emif_rev(EMIF1_BASE) == EMIF_4D5)
90 config_sdram_emif4d5(regs, nr);
91 else
92 config_sdram(regs, nr);
Chandan Nath62d7fe7c2011-10-14 02:58:24 +000093}