int lpddr3_freq_init(int freq) { unsigned int data; if (freq == DDR_FREQ_800M) { set_ddrc_800mhz(); INFO("%s, set ddrc 800mhz\n", __func__); } else { set_ddrc_533mhz(); INFO("%s, set ddrc 533mhz\n", __func__); } mmio_write_32((0xf712c000 + 0x004), 0xf1); if (freq == DDR_FREQ_800M) mmio_write_32((0xf7128000 + 0x050), 0x100023); else mmio_write_32((0xf7128000 + 0x050), 0x100123); mmio_write_32((0xf7128000 + 0x060), 0x133); mmio_write_32((0xf7128000 + 0x064), 0x133); mmio_write_32((0xf7128000 + 0x200), 0xa1000); if (freq == DDR_FREQ_800M) { mmio_write_32((0xf7128000 + 0x100), 0x755a9d12); mmio_write_32((0xf7128000 + 0x104), 0x1753b055); mmio_write_32((0xf7128000 + 0x108), 0x7401505f); mmio_write_32((0xf7128000 + 0x10c), 0x578ca244); mmio_write_32((0xf7128000 + 0x110), 0x10700000); mmio_write_32((0xf7128000 + 0x114), 0x13141306); } else { mmio_write_32((0xf7128000 + 0x100), 0xb77b6718); mmio_write_32((0xf7128000 + 0x104), 0x1e82a071); mmio_write_32((0xf7128000 + 0x108), 0x9501c07e); mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255); mmio_write_32((0xf7128000 + 0x110), 0x10b00000); mmio_write_32((0xf7128000 + 0x114), 0x13181908); } mmio_write_32((0xf7128000 + 0x118), 0x44); do { data = mmio_read_32((0xf712c000 + 0x004)); } while (data & 1); data = mmio_read_32((0xf712c000 + 0x008)); if (data & 0x7fe) { NOTICE("fail to init ddr3 rank0\n"); return -EFAULT; } INFO("init ddr3 rank0\n"); ddrx_rdet(); ddrx_wdet(); data = mmio_read_32((0xf712c000 + 0x048)); data |= 1; mmio_write_32((0xf712c000 + 0x048), data); mmio_write_32((0xf712c000 + 0x004), 0x21); do { data = mmio_read_32((0xf712c000 + 0x004)); } while (data & 1); data = mmio_read_32((0xf712c000 + 0x008)); if (data & 0x7fe) NOTICE("ddr3 rank1 init failure\n"); else INFO("ddr3 rank1 init pass\n"); data = mmio_read_32((0xf712c000 + 0x048)); data &= ~0xf; mmio_write_32((0xf712c000 + 0x048), data); return 0; }
int lpddr3_freq_init(int ddr800) { unsigned int data; if (ddr800) { set_ddrc_800mhz(); tf_printf("INFO: " "%s, set ddrc 800mhz\n", __func__); } else { set_ddrc_533mhz(); tf_printf("INFO: " "%s, set ddrc 533mhz\n", __func__); } data = cat_533mhz_800mhz(); if (data) tf_printf("NOTICE: " "fail to set eye diagram\n"); mmio_write_32((0xf712c000 + 0x004), 0xf1); if (ddr800) mmio_write_32((0xf7128000 + 0x050), 0x100023); else mmio_write_32((0xf7128000 + 0x050), 0x100123); mmio_write_32((0xf7128000 + 0x060), 0x133); mmio_write_32((0xf7128000 + 0x064), 0x133); mmio_write_32((0xf7128000 + 0x200), 0xa1000); if (ddr800) { mmio_write_32((0xf7128000 + 0x100), 0x755a9d12); mmio_write_32((0xf7128000 + 0x104), 0x1753b055); mmio_write_32((0xf7128000 + 0x108), 0x7401505f); mmio_write_32((0xf7128000 + 0x10c), 0x578ca244); mmio_write_32((0xf7128000 + 0x110), 0x10700000); mmio_write_32((0xf7128000 + 0x114), 0x13141306); } else { mmio_write_32((0xf7128000 + 0x100), 0xb77b6718); mmio_write_32((0xf7128000 + 0x104), 0x1e82a071); mmio_write_32((0xf7128000 + 0x108), 0x9501c07e); mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255); mmio_write_32((0xf7128000 + 0x110), 0x10b00000); mmio_write_32((0xf7128000 + 0x114), 0x13181908); } mmio_write_32((0xf7128000 + 0x118), 0x44); do { data = mmio_read_32((0xf712c000 + 0x004)); } while (data & 1); data = mmio_read_32((0xf712c000 + 0x008)); if (data & 0x7fe) { tf_printf("NOTICE: " "fail to init ddr3 rank0\n"); return -14; } tf_printf("INFO: " "init ddr3 rank0\n"); ddrx_rdet(); ddrx_wdet(); data = mmio_read_32((0xf712c000 + 0x048)); data |= 1; mmio_write_32((0xf712c000 + 0x048), data); mmio_write_32((0xf712c000 + 0x004), 0x21); do { data = mmio_read_32((0xf712c000 + 0x004)); } while (data & 1); data = mmio_read_32((0xf712c000 + 0x008)); if (data & 0x7fe) tf_printf("NOTICE: " "ddr3 rank1 init failure\n"); else tf_printf("INFO: " "ddr3 rank1 init pass\n"); data = mmio_read_32((0xf712c000 + 0x048)); data &= ~0xf; mmio_write_32((0xf712c000 + 0x048), data); return 0; }