1fcc238baSMasahiro Yamada /* 2fcc238baSMasahiro Yamada * Copyright (C) 2013-2014 Panasonic Corporation 3fcc238baSMasahiro Yamada * Copyright (C) 2015-2016 Socionext Inc. 4fcc238baSMasahiro Yamada * 5fcc238baSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 6fcc238baSMasahiro Yamada */ 7fcc238baSMasahiro Yamada 8fcc238baSMasahiro Yamada #include <common.h> 9*0f4ec05bSMasahiro Yamada #include <linux/errno.h> 10fcc238baSMasahiro Yamada #include <linux/io.h> 11fcc238baSMasahiro Yamada 12fcc238baSMasahiro Yamada #include "../init.h" 13fcc238baSMasahiro Yamada #include "../sc-regs.h" 14fcc238baSMasahiro Yamada 15fcc238baSMasahiro Yamada #undef DPLL_SSC_RATE_1PER 16fcc238baSMasahiro Yamada uniphier_pro4_dpll_init(const struct uniphier_board_data * bd)17fcc238baSMasahiro Yamadaint uniphier_pro4_dpll_init(const struct uniphier_board_data *bd) 18fcc238baSMasahiro Yamada { 19fcc238baSMasahiro Yamada unsigned int dram_freq = bd->dram_freq; 20fcc238baSMasahiro Yamada u32 tmp; 21fcc238baSMasahiro Yamada 22fcc238baSMasahiro Yamada /* 23fcc238baSMasahiro Yamada * Set Frequency 24fcc238baSMasahiro Yamada * Set 0xc(1600MHz)/0xd(1333MHz)/0xe(1066MHz) 25fcc238baSMasahiro Yamada * to FOUT ( DPLLCTRL.bit[29:20] ) 26fcc238baSMasahiro Yamada */ 27fcc238baSMasahiro Yamada tmp = readl(SC_DPLLCTRL); 28fcc238baSMasahiro Yamada tmp &= ~(0x000f0000); 29fcc238baSMasahiro Yamada switch (dram_freq) { 30fcc238baSMasahiro Yamada case 1333: 31fcc238baSMasahiro Yamada tmp |= 0x000d0000; 32fcc238baSMasahiro Yamada break; 33fcc238baSMasahiro Yamada case 1600: 34fcc238baSMasahiro Yamada tmp |= 0x000c0000; 35fcc238baSMasahiro Yamada break; 36fcc238baSMasahiro Yamada default: 37fcc238baSMasahiro Yamada pr_err("Unsupported frequency"); 38fcc238baSMasahiro Yamada return -EINVAL; 39fcc238baSMasahiro Yamada } 40fcc238baSMasahiro Yamada 41fcc238baSMasahiro Yamada /* 42fcc238baSMasahiro Yamada * Set Moduration rate 43fcc238baSMasahiro Yamada * Set 0x0(1%)/0x1(2%) to SSC_RATE(DPLLCTRL.bit[15]) 44fcc238baSMasahiro Yamada */ 45fcc238baSMasahiro Yamada #if defined(DPLL_SSC_RATE_1PER) 46fcc238baSMasahiro Yamada tmp &= ~0x00008000; 47fcc238baSMasahiro Yamada #else 48fcc238baSMasahiro Yamada tmp |= 0x00008000; 49fcc238baSMasahiro Yamada #endif 50fcc238baSMasahiro Yamada writel(tmp, SC_DPLLCTRL); 51fcc238baSMasahiro Yamada 52fcc238baSMasahiro Yamada tmp = readl(SC_DPLLCTRL2); 53fcc238baSMasahiro Yamada tmp |= SC_DPLLCTRL2_NRSTDS; 54fcc238baSMasahiro Yamada writel(tmp, SC_DPLLCTRL2); 55fcc238baSMasahiro Yamada 56fcc238baSMasahiro Yamada /* Wait until dpll gets stable */ 57fcc238baSMasahiro Yamada udelay(500); 58fcc238baSMasahiro Yamada 59fcc238baSMasahiro Yamada return 0; 60fcc238baSMasahiro Yamada } 61