blob: 39ca535d11dfe39d66a2fdb2101918f815e6ce80 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Ilya Ledvich791ca182013-11-07 07:57:33 +02002/*
3 * SPL specific code for Compulab CM-T335 board
4 *
5 * Board functions for Compulab CM-T335 board
6 *
7 * Copyright (C) 2013, Compulab Ltd - http://compulab.co.il/
8 *
9 * Author: Ilya Ledvich <ilya@compulab.co.il>
Ilya Ledvich791ca182013-11-07 07:57:33 +020010 */
11
12#include <common.h>
Simon Glassafb02152019-12-28 10:45:01 -070013#include <cpu_func.h>
Ilya Ledvich791ca182013-11-07 07:57:33 +020014#include <errno.h>
Simon Glass8e16b1e2019-12-28 10:45:05 -070015#include <init.h>
Ilya Ledvich791ca182013-11-07 07:57:33 +020016
17#include <asm/arch/ddr_defs.h>
18#include <asm/arch/clock.h>
19#include <asm/arch/clocks_am33xx.h>
20#include <asm/arch/sys_proto.h>
21#include <asm/arch/hardware_am33xx.h>
Alexey Brodkin267d8e22014-02-26 17:47:58 +040022#include <linux/sizes.h>
Ilya Ledvich791ca182013-11-07 07:57:33 +020023
Lokesh Vutla303b2672013-12-10 15:02:21 +053024const struct ctrl_ioregs ioregs = {
25 .cm0ioctl = MT41J128MJT125_IOCTRL_VALUE,
26 .cm1ioctl = MT41J128MJT125_IOCTRL_VALUE,
27 .cm2ioctl = MT41J128MJT125_IOCTRL_VALUE,
28 .dt0ioctl = MT41J128MJT125_IOCTRL_VALUE,
29 .dt1ioctl = MT41J128MJT125_IOCTRL_VALUE,
30};
31
Ilya Ledvich791ca182013-11-07 07:57:33 +020032static const struct ddr_data ddr3_data = {
33 .datardsratio0 = MT41J128MJT125_RD_DQS,
34 .datawdsratio0 = MT41J128MJT125_WR_DQS,
35 .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE,
36 .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA,
Ilya Ledvich791ca182013-11-07 07:57:33 +020037};
38
39static const struct cmd_control ddr3_cmd_ctrl_data = {
40 .cmd0csratio = MT41J128MJT125_RATIO,
Ilya Ledvich791ca182013-11-07 07:57:33 +020041 .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT,
42
43 .cmd1csratio = MT41J128MJT125_RATIO,
Ilya Ledvich791ca182013-11-07 07:57:33 +020044 .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT,
45
46 .cmd2csratio = MT41J128MJT125_RATIO,
Ilya Ledvich791ca182013-11-07 07:57:33 +020047 .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT,
48};
49
50static struct emif_regs ddr3_emif_reg_data = {
51 .sdram_config = MT41J128MJT125_EMIF_SDCFG,
52 .ref_ctrl = MT41J128MJT125_EMIF_SDREF,
53 .sdram_tim1 = MT41J128MJT125_EMIF_TIM1,
54 .sdram_tim2 = MT41J128MJT125_EMIF_TIM2,
55 .sdram_tim3 = MT41J128MJT125_EMIF_TIM3,
56 .zq_config = MT41J128MJT125_ZQ_CFG,
57 .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY |
58 PHY_EN_DYN_PWRDN,
59};
60
61const struct dpll_params dpll_ddr = {
62/* M N M2 M3 M4 M5 M6 */
63 303, (V_OSCK/1000000) - 1, 1, -1, -1, -1, -1};
64
65void am33xx_spl_board_init(void)
66{
67 struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
68
69 /* Get the frequency */
70 dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
71
72 /* Set CORE Frequencies to OPP100 */
73 do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
74
75 /* Set MPU Frequency to what we detected now that voltages are set */
76 do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
77}
78
79const struct dpll_params *get_dpll_ddr_params(void)
80{
81 return &dpll_ddr;
82}
83
84static void probe_sdram_size(long size)
85{
86 switch (size) {
87 case SZ_512M:
88 ddr3_emif_reg_data.sdram_config = MT41J256MJT125_EMIF_SDCFG;
89 break;
90 case SZ_256M:
91 ddr3_emif_reg_data.sdram_config = MT41J128MJT125_EMIF_SDCFG;
92 break;
93 case SZ_128M:
94 ddr3_emif_reg_data.sdram_config = MT41J64MJT125_EMIF_SDCFG;
95 break;
96 default:
97 puts("Failed configuring DRAM, resetting...\n\n");
98 reset_cpu(0);
99 }
100 debug("%s: setting DRAM size to %ldM\n", __func__, size >> 20);
Lokesh Vutla303b2672013-12-10 15:02:21 +0530101 config_ddr(303, &ioregs, &ddr3_data,
Ilya Ledvich791ca182013-11-07 07:57:33 +0200102 &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);
103}
104
105void sdram_init(void)
106{
107 long size = SZ_1G;
108
109 do {
110 size = size / 2;
111 probe_sdram_size(size);
112 } while (get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, size) < size);
113
114 return;
115}