1*166097e8SThomas Abraham /* 2*166097e8SThomas Abraham * Exynos PLL helper functions for clock drivers. 3*166097e8SThomas Abraham * Copyright (C) 2016 Samsung Electronics 4*166097e8SThomas Abraham * Thomas Abraham <thomas.ab@samsung.com> 5*166097e8SThomas Abraham * 6*166097e8SThomas Abraham * SPDX-License-Identifier: GPL-2.0+ 7*166097e8SThomas Abraham */ 8*166097e8SThomas Abraham 9*166097e8SThomas Abraham #include <common.h> 10*166097e8SThomas Abraham #include <asm/io.h> 11*166097e8SThomas Abraham #include <div64.h> 12*166097e8SThomas Abraham 13*166097e8SThomas Abraham #define PLL145X_MDIV_SHIFT 16 14*166097e8SThomas Abraham #define PLL145X_MDIV_MASK 0x3ff 15*166097e8SThomas Abraham #define PLL145X_PDIV_SHIFT 8 16*166097e8SThomas Abraham #define PLL145X_PDIV_MASK 0x3f 17*166097e8SThomas Abraham #define PLL145X_SDIV_SHIFT 0 18*166097e8SThomas Abraham #define PLL145X_SDIV_MASK 0x7 19*166097e8SThomas Abraham pll145x_get_rate(unsigned int * con1,unsigned long fin_freq)20*166097e8SThomas Abrahamunsigned long pll145x_get_rate(unsigned int *con1, unsigned long fin_freq) 21*166097e8SThomas Abraham { 22*166097e8SThomas Abraham unsigned long pll_con1 = readl(con1); 23*166097e8SThomas Abraham unsigned long mdiv, sdiv, pdiv; 24*166097e8SThomas Abraham uint64_t fvco = fin_freq; 25*166097e8SThomas Abraham 26*166097e8SThomas Abraham mdiv = (pll_con1 >> PLL145X_MDIV_SHIFT) & PLL145X_MDIV_MASK; 27*166097e8SThomas Abraham pdiv = (pll_con1 >> PLL145X_PDIV_SHIFT) & PLL145X_PDIV_MASK; 28*166097e8SThomas Abraham sdiv = (pll_con1 >> PLL145X_SDIV_SHIFT) & PLL145X_SDIV_MASK; 29*166097e8SThomas Abraham 30*166097e8SThomas Abraham fvco *= mdiv; 31*166097e8SThomas Abraham do_div(fvco, (pdiv << sdiv)); 32*166097e8SThomas Abraham return (unsigned long)fvco; 33*166097e8SThomas Abraham } 34