|
@@ -21,6 +21,7 @@ struct stm32_sdram_control {
|
|
|
u8 memory_width;
|
|
|
u8 no_banks;
|
|
|
u8 cas_latency;
|
|
|
+ u8 sdclk;
|
|
|
u8 rd_burst;
|
|
|
u8 rd_pipe_delay;
|
|
|
};
|
|
@@ -31,51 +32,25 @@ struct stm32_sdram_timing {
|
|
|
u8 tras;
|
|
|
u8 trc;
|
|
|
u8 trp;
|
|
|
+ u8 twr;
|
|
|
u8 trcd;
|
|
|
};
|
|
|
struct stm32_sdram_params {
|
|
|
u8 no_sdram_banks;
|
|
|
struct stm32_sdram_control sdram_control;
|
|
|
struct stm32_sdram_timing sdram_timing;
|
|
|
+ u32 sdram_ref_count;
|
|
|
};
|
|
|
-static inline u32 _ns2clk(u32 ns, u32 freq)
|
|
|
-{
|
|
|
- u32 tmp = freq/1000000;
|
|
|
- return (tmp * ns) / 1000;
|
|
|
-}
|
|
|
-
|
|
|
-#define NS2CLK(ns) (_ns2clk(ns, freq))
|
|
|
-
|
|
|
-#define SDRAM_TREF (NS2CLK(64000000 / 8192) - 20)
|
|
|
|
|
|
#define SDRAM_MODE_BL_SHIFT 0
|
|
|
#define SDRAM_MODE_CAS_SHIFT 4
|
|
|
#define SDRAM_MODE_BL 0
|
|
|
-#define SDRAM_MODE_CAS 3
|
|
|
-
|
|
|
-#define SDRAM_TRDL 12
|
|
|
|
|
|
int stm32_sdram_init(struct udevice *dev)
|
|
|
{
|
|
|
- u32 freq;
|
|
|
- u32 sdram_twr;
|
|
|
struct stm32_sdram_params *params = dev_get_platdata(dev);
|
|
|
|
|
|
- /*
|
|
|
- * Get frequency for NS2CLK calculation.
|
|
|
- */
|
|
|
- freq = clock_get(CLOCK_AHB) / CONFIG_SYS_RAM_FREQ_DIV;
|
|
|
- debug("%s, sdram freq = %d\n", __func__, freq);
|
|
|
-
|
|
|
- /* Last data in to row precharge, need also comply ineq on page 1648 */
|
|
|
- sdram_twr = max(
|
|
|
- max(SDRAM_TRDL, params->sdram_timing.tras
|
|
|
- - params->sdram_timing.trcd),
|
|
|
- params->sdram_timing.trc - params->sdram_timing.trcd
|
|
|
- - params->sdram_timing.trp
|
|
|
- );
|
|
|
-
|
|
|
- writel(CONFIG_SYS_RAM_FREQ_DIV << FMC_SDCR_SDCLK_SHIFT
|
|
|
+ writel(params->sdram_control.sdclk << FMC_SDCR_SDCLK_SHIFT
|
|
|
| params->sdram_control.cas_latency << FMC_SDCR_CAS_SHIFT
|
|
|
| params->sdram_control.no_banks << FMC_SDCR_NB_SHIFT
|
|
|
| params->sdram_control.memory_width << FMC_SDCR_MWID_SHIFT
|
|
@@ -85,13 +60,13 @@ int stm32_sdram_init(struct udevice *dev)
|
|
|
| params->sdram_control.rd_burst << FMC_SDCR_RBURST_SHIFT,
|
|
|
&STM32_SDRAM_FMC->sdcr1);
|
|
|
|
|
|
- writel(NS2CLK(params->sdram_timing.trcd) << FMC_SDTR_TRCD_SHIFT
|
|
|
- | NS2CLK(params->sdram_timing.trp) << FMC_SDTR_TRP_SHIFT
|
|
|
- | NS2CLK(sdram_twr) << FMC_SDTR_TWR_SHIFT
|
|
|
- | NS2CLK(params->sdram_timing.trc) << FMC_SDTR_TRC_SHIFT
|
|
|
- | NS2CLK(params->sdram_timing.tras) << FMC_SDTR_TRAS_SHIFT
|
|
|
- | NS2CLK(params->sdram_timing.txsr) << FMC_SDTR_TXSR_SHIFT
|
|
|
- | NS2CLK(params->sdram_timing.tmrd) << FMC_SDTR_TMRD_SHIFT,
|
|
|
+ writel(params->sdram_timing.trcd << FMC_SDTR_TRCD_SHIFT
|
|
|
+ | params->sdram_timing.trp << FMC_SDTR_TRP_SHIFT
|
|
|
+ | params->sdram_timing.twr << FMC_SDTR_TWR_SHIFT
|
|
|
+ | params->sdram_timing.trc << FMC_SDTR_TRC_SHIFT
|
|
|
+ | params->sdram_timing.tras << FMC_SDTR_TRAS_SHIFT
|
|
|
+ | params->sdram_timing.txsr << FMC_SDTR_TXSR_SHIFT
|
|
|
+ | params->sdram_timing.tmrd << FMC_SDTR_TMRD_SHIFT,
|
|
|
&STM32_SDRAM_FMC->sdtr1);
|
|
|
|
|
|
writel(FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_START_CLOCK,
|
|
@@ -110,7 +85,7 @@ int stm32_sdram_init(struct udevice *dev)
|
|
|
FMC_BUSY_WAIT();
|
|
|
|
|
|
writel(FMC_SDCMR_BANK_1 | (SDRAM_MODE_BL << SDRAM_MODE_BL_SHIFT
|
|
|
- | SDRAM_MODE_CAS << SDRAM_MODE_CAS_SHIFT)
|
|
|
+ | params->sdram_control.cas_latency << SDRAM_MODE_CAS_SHIFT)
|
|
|
<< FMC_SDCMR_MODE_REGISTER_SHIFT | FMC_SDCMR_MODE_WRITE_MODE,
|
|
|
&STM32_SDRAM_FMC->sdcmr);
|
|
|
udelay(100);
|
|
@@ -121,7 +96,7 @@ int stm32_sdram_init(struct udevice *dev)
|
|
|
FMC_BUSY_WAIT();
|
|
|
|
|
|
/* Refresh timer */
|
|
|
- writel(SDRAM_TREF, &STM32_SDRAM_FMC->sdrtr);
|
|
|
+ writel((params->sdram_ref_count) << 1, &STM32_SDRAM_FMC->sdrtr);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -142,12 +117,14 @@ static int stm32_fmc_ofdata_to_platdata(struct udevice *dev)
|
|
|
sizeof(params->sdram_control));
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
-
|
|
|
ret = fdtdec_get_byte_array(blob, node, "st,sdram-timing",
|
|
|
(u8 *)¶ms->sdram_timing,
|
|
|
sizeof(params->sdram_timing));
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
+
|
|
|
+ params->sdram_ref_count = fdtdec_get_int(blob, node,
|
|
|
+ "st,sdram-refcount", 8196);
|
|
|
}
|
|
|
|
|
|
return 0;
|