1bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood/* 2bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * MPC8xx support functions 3bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * 4bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * Author: Scott Wood <scottwood@freescale.com> 5bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * 6bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * Copyright (c) 2007 Freescale Semiconductor, Inc. 7bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * 8bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * This program is free software; you can redistribute it and/or modify it 9bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * under the terms of the GNU General Public License version 2 as published 10bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood * by the Free Software Foundation. 11bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood */ 12bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 13bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood#include "ops.h" 14bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood#include "types.h" 15bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood#include "fsl-soc.h" 16bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood#include "mpc8xx.h" 17bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood#include "stdio.h" 18bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood#include "io.h" 19bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 20bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood#define MPC8XX_PLPRCR (0x284/4) /* PLL and Reset Control Register */ 21bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 22bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood/* Return system clock from crystal frequency */ 23bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Woodu32 mpc885_get_clock(u32 crystal) 24bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood{ 25bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood u32 *immr; 26bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood u32 plprcr; 27bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood int mfi, mfn, mfd, pdf, div; 28bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood u32 ret; 29bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 30bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood immr = fsl_get_immr(); 31bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood if (!immr) { 32bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood printf("mpc885_get_clock: Couldn't get IMMR base.\r\n"); 33bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood return 0; 34bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood } 35bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 36bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood plprcr = in_be32(&immr[MPC8XX_PLPRCR]); 37bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 38bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood mfi = (plprcr >> 16) & 15; 39bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood if (mfi < 5) { 40bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood printf("Warning: PLPRCR[MFI] value of %d out-of-bounds\r\n", 41bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood mfi); 42bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood mfi = 5; 43bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood } 44bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 45bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood pdf = (plprcr >> 1) & 0xf; 46bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood div = (plprcr >> 20) & 3; 47bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood mfd = (plprcr >> 22) & 0x1f; 48bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood mfn = (plprcr >> 27) & 0x1f; 49bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 50bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood ret = crystal * mfi; 51bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 52bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood if (mfn != 0) 53bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood ret += crystal * mfn / (mfd + 1); 54bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 55bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood return ret / (pdf + 1); 56bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood} 57bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 58bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood/* Set common device tree fields based on the given clock frequencies. */ 59bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Woodvoid mpc8xx_set_clocks(u32 sysclk) 60bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood{ 61bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood void *node; 62bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 63bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood dt_fixup_cpu_clocks(sysclk, sysclk / 16, sysclk); 64bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 65bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood node = finddevice("/soc/cpm"); 66bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood if (node) 67bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood setprop(node, "clock-frequency", &sysclk, 4); 68bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 69bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood node = finddevice("/soc/cpm/brg"); 70bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood if (node) 71bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood setprop(node, "clock-frequency", &sysclk, 4); 72bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood} 73bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 74bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Woodint mpc885_fixup_clocks(u32 crystal) 75bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood{ 76bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood u32 sysclk = mpc885_get_clock(crystal); 77bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood if (!sysclk) 78bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood return 0; 79bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood 80bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood mpc8xx_set_clocks(sysclk); 81bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood return 1; 82bbc6fac387f09e46a372e4aadbc935cba5a6b463Scott Wood} 83