/*
 * Copyright (C) 2011-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/sizes.h>

#include "../init.h"
#include "ddrphy-regs.h"
#include "umc-regs.h"

static void umc_start_ssif(void __iomem *ssif_base)
{
	writel(0x00000000, ssif_base + 0x0000b004);
	writel(0xffffffff, ssif_base + 0x0000c004);
	writel(0x000fffcf, ssif_base + 0x0000c008);
	writel(0x00000001, ssif_base + 0x0000b000);
	writel(0x00000001, ssif_base + 0x0000c000);
	writel(0x03010101, ssif_base + UMC_MDMCHSEL);
	writel(0x03010100, ssif_base + UMC_DMDCHSEL);

	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_FETCH);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_COMQUE0);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_COMWC0);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_COMRC0);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_COMQUE1);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_COMWC1);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_COMRC1);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_WC);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_RC);
	writel(0x00000000, ssif_base + UMC_CLKEN_SSIF_DST);

	writel(0x00000001, ssif_base + UMC_CPURST);
	writel(0x00000001, ssif_base + UMC_IDSRST);
	writel(0x00000001, ssif_base + UMC_IXMRST);
	writel(0x00000001, ssif_base + UMC_MDMRST);
	writel(0x00000001, ssif_base + UMC_MDDRST);
	writel(0x00000001, ssif_base + UMC_SIORST);
	writel(0x00000001, ssif_base + UMC_VIORST);
	writel(0x00000001, ssif_base + UMC_FRCRST);
	writel(0x00000001, ssif_base + UMC_RGLRST);
	writel(0x00000001, ssif_base + UMC_AIORST);
	writel(0x00000001, ssif_base + UMC_DMDRST);
}

static void umc_dramcont_init(void __iomem *dramcont, void __iomem *ca_base,
			      int size, int freq)
{
	if (freq == 1333) {
		writel(0x45990b11, dramcont + UMC_CMDCTLA);
		writel(0x16958924, dramcont + UMC_CMDCTLB);
		writel(0x5101046A, dramcont + UMC_INITCTLA);

		if (size == 1)
			writel(0x27028B0A, dramcont + UMC_INITCTLB);
		else if (size == 2)
			writel(0x38028B0A, dramcont + UMC_INITCTLB);

		writel(0x000FF0FF, dramcont + UMC_INITCTLC);
		writel(0x00000b51, dramcont + UMC_DRMMR0);
	} else if (freq == 1600) {
		writel(0x36BB0F17, dramcont + UMC_CMDCTLA);
		writel(0x18C6AA24, dramcont + UMC_CMDCTLB);
		writel(0x5101387F, dramcont + UMC_INITCTLA);

		if (size == 1)
			writel(0x2F030D3F, dramcont + UMC_INITCTLB);
		else if (size == 2)
			writel(0x43030D3F, dramcont + UMC_INITCTLB);

		writel(0x00FF00FF, dramcont + UMC_INITCTLC);
		writel(0x00000d71, dramcont + UMC_DRMMR0);
	}

	writel(0x00000006, dramcont + UMC_DRMMR1);

	if (freq == 1333)
		writel(0x00000290, dramcont + UMC_DRMMR2);
	else if (freq == 1600)
		writel(0x00000298, dramcont + UMC_DRMMR2);

	writel(0x00000800, dramcont + UMC_DRMMR3);

	if (freq == 1333) {
		if (size == 1)
			writel(0x00240512, dramcont + UMC_SPCCTLA);
		else if (size == 2)
			writel(0x00350512, dramcont + UMC_SPCCTLA);

		writel(0x00ff0006, dramcont + UMC_SPCCTLB);
		writel(0x000a00ac, dramcont + UMC_RDATACTL_D0);
	} else if (freq == 1600) {
		if (size == 1)
			writel(0x002B0617, dramcont + UMC_SPCCTLA);
		else if (size == 2)
			writel(0x003F0617, dramcont + UMC_SPCCTLA);

		writel(0x00ff0008, dramcont + UMC_SPCCTLB);
		writel(0x000c00ae, dramcont + UMC_RDATACTL_D0);
	}

	writel(0x04060806, dramcont + UMC_WDATACTL_D0);
	writel(0x04a02000, dramcont + UMC_DATASET);
	writel(0x00000000, ca_base + 0x2300);
	writel(0x00400020, dramcont + UMC_DCCGCTL);
	writel(0x00000003, dramcont + 0x7000);
	writel(0x0000000f, dramcont + 0x8000);
	writel(0x000000c3, dramcont + 0x8004);
	writel(0x00000071, dramcont + 0x8008);
	writel(0x0000003b, dramcont + UMC_DICGCTLA);
	writel(0x020a0808, dramcont + UMC_DICGCTLB);
	writel(0x00000004, dramcont + UMC_FLOWCTLG);
	writel(0x80000201, ca_base + 0xc20);
	writel(0x0801e01e, dramcont + UMC_FLOWCTLA);
	writel(0x00200000, dramcont + UMC_FLOWCTLB);
	writel(0x00004444, dramcont + UMC_FLOWCTLC);
	writel(0x200a0a00, dramcont + UMC_SPCSETB);
	writel(0x00000000, dramcont + UMC_SPCSETD);
	writel(0x00000520, dramcont + UMC_DFICUPDCTLA);
}

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 *phy1_0 = (void __iomem *)DDRPHY_BASE(1, 0);

	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);

	ph1_ld4_ddrphy_init(phy0_0, freq, size_ch0);

	ddrphy_prepare_training(phy0_0, 0);
	ddrphy_training(phy0_0);

	writel(0x00000101, dramcont1 + UMC_DIOCTLA);

	ph1_ld4_ddrphy_init(phy1_0, freq, size_ch1);

	ddrphy_prepare_training(phy1_0, 1);
	ddrphy_training(phy1_0);

	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;
}

int ph1_ld4_umc_init(const struct uniphier_board_data *bd)
{
	if ((bd->dram_ch0_size == SZ_128M || bd->dram_ch0_size == SZ_256M) &&
	    (bd->dram_ch1_size == SZ_128M || bd->dram_ch1_size == SZ_256M) &&
	    (bd->dram_freq == 1333 || bd->dram_freq == 1600) &&
	    bd->dram_ch0_width == 16 && bd->dram_ch1_width == 16) {
		return umc_init_sub(bd->dram_freq,
				    bd->dram_ch0_size / SZ_128M,
				    bd->dram_ch1_size / SZ_128M);
	} else {
		pr_err("Unsupported DDR configuration\n");
		return -EINVAL;
	}
}
