static int umc_init_sub(int freq, int size_ch0, int size_ch1) { void __iomem *ssif_base = (void __iomem *)UMC_SSIF_BASE; void __iomem *ca_base0 = (void __iomem *)UMC_CA_BASE(0); void __iomem *ca_base1 = (void __iomem *)UMC_CA_BASE(1); void __iomem *dramcont0 = (void __iomem *)UMC_DRAMCONT_BASE(0); void __iomem *dramcont1 = (void __iomem *)UMC_DRAMCONT_BASE(1); void __iomem *phy0_0 = (void __iomem *)DDRPHY_BASE(0, 0); void __iomem *phy0_1 = (void __iomem *)DDRPHY_BASE(0, 1); void __iomem *phy1_0 = (void __iomem *)DDRPHY_BASE(1, 0); void __iomem *phy1_1 = (void __iomem *)DDRPHY_BASE(1, 1); umc_dram_init_start(dramcont0); umc_dram_init_start(dramcont1); umc_dram_init_poll(dramcont0); umc_dram_init_poll(dramcont1); writel(0x00000101, dramcont0 + UMC_DIOCTLA); ddrphy_init(phy0_0, freq, size_ch0); ddrphy_prepare_training(phy0_0, 0); ddrphy_training(phy0_0); writel(0x00000103, dramcont0 + UMC_DIOCTLA); ddrphy_init(phy0_1, freq, size_ch0); ddrphy_prepare_training(phy0_1, 1); ddrphy_training(phy0_1); writel(0x00000101, dramcont1 + UMC_DIOCTLA); ddrphy_init(phy1_0, freq, size_ch1); ddrphy_prepare_training(phy1_0, 0); ddrphy_training(phy1_0); writel(0x00000103, dramcont1 + UMC_DIOCTLA); ddrphy_init(phy1_1, freq, size_ch1); ddrphy_prepare_training(phy1_1, 1); ddrphy_training(phy1_1); umc_dramcont_init(dramcont0, ca_base0, size_ch0, freq); umc_dramcont_init(dramcont1, ca_base1, size_ch1, freq); umc_start_ssif(ssif_base); return 0; }
static int umc_ch_init(void __iomem *dc_base, void __iomem *ca_base, int freq, unsigned long size, unsigned int width, bool ddr3plus) { void __iomem *phy_base = dc_base + 0x00001000; int nr_phy = width / 16; int phy, ret; writel(UMC_INITSET_INIT1EN, dc_base + UMC_INITSET); while (readl(dc_base + UMC_INITSET) & UMC_INITSTAT_INIT1ST) cpu_relax(); for (phy = 0; phy < nr_phy; phy++) { writel(0x00000100 | ((1 << (phy + 1)) - 1), dc_base + UMC_DIOCTLA); ret = uniphier_ld4_ddrphy_init(phy_base, freq, ddr3plus); if (ret) return ret; ddrphy_prepare_training(phy_base, phy); ret = ddrphy_training(phy_base); if (ret) return ret; phy_base += 0x00001000; } return umc_dramcont_init(dc_base, ca_base, freq, size / (width / 16), ddr3plus); }
static int umc_ch_init(void __iomem *dc_base, void __iomem *ca_base, int freq, unsigned long size, bool ddr3plus, int ch) { void __iomem *phy_base = dc_base + 0x00001000; int ret; writel(UMC_INITSET_INIT1EN, dc_base + UMC_INITSET); while (readl(dc_base + UMC_INITSET) & UMC_INITSTAT_INIT1ST) cpu_relax(); writel(0x00000101, dc_base + UMC_DIOCTLA); ret = uniphier_ld4_ddrphy_init(phy_base, freq, ddr3plus); if (ret) return ret; ddrphy_prepare_training(phy_base, umc_get_rank(ch)); ret = ddrphy_training(phy_base); if (ret) return ret; return umc_dramcont_init(dc_base, ca_base, freq, size, ddr3plus); }