u-boot/board/sacsng/clkinit.c

1026 lines
24 KiB
C
Raw Normal View History

2002-11-03 00:24:07 +00:00
/*
* (C) Copyright 2002
* Custom IDEAS, Inc. <www.cideas.com>
* Jon Diekema <diekema@cideas.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <ioports.h>
#include <mpc8260.h>
#include <asm/cpm_8260.h>
#include <configs/sacsng.h>
#include "clkinit.h"
DECLARE_GLOBAL_DATA_PTR;
2002-11-03 00:24:07 +00:00
int Daq64xSampling = 0;
void Daq_BRG_Reset(uint brg)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
volatile uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
*brg_ptr |= CPM_BRG_RST;
*brg_ptr &= ~CPM_BRG_RST;
}
void Daq_BRG_Disable(uint brg)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
volatile uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
*brg_ptr &= ~CPM_BRG_EN;
}
void Daq_BRG_Enable(uint brg)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
volatile uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
*brg_ptr |= CPM_BRG_EN;
}
uint Daq_BRG_Get_Div16(uint brg)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
if (*brg_ptr & CPM_BRG_DIV16) {
/* DIV16 active */
return true;
2002-11-03 00:24:07 +00:00
}
else {
/* DIV16 inactive */
return false;
2002-11-03 00:24:07 +00:00
}
}
void Daq_BRG_Set_Div16(uint brg, uint div16)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
if (div16) {
/* DIV16 active */
*brg_ptr |= CPM_BRG_DIV16;
2002-11-03 00:24:07 +00:00
}
else {
/* DIV16 inactive */
*brg_ptr &= ~CPM_BRG_DIV16;
2002-11-03 00:24:07 +00:00
}
}
uint Daq_BRG_Get_Count(uint brg)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint *brg_ptr;
uint brg_cnt;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
/* Get the clock divider
*
* Note: A clock divider of 0 means divide by 1,
* therefore we need to add 1 to the count.
*/
brg_cnt = (*brg_ptr & CPM_BRG_CD_MASK) >> CPM_BRG_DIV16_SHIFT;
brg_cnt++;
if (*brg_ptr & CPM_BRG_DIV16) {
brg_cnt *= 16;
2002-11-03 00:24:07 +00:00
}
return (brg_cnt);
}
void Daq_BRG_Set_Count(uint brg, uint brg_cnt)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
/*
* Note: A clock divider of 0 means divide by 1,
* therefore we need to subtract 1 from the count.
*/
if (brg_cnt > 4096) {
/* Prescale = Divide by 16 */
*brg_ptr = (*brg_ptr & ~CPM_BRG_CD_MASK) |
2002-11-03 00:24:07 +00:00
(((brg_cnt / 16) - 1) << CPM_BRG_DIV16_SHIFT);
*brg_ptr |= CPM_BRG_DIV16;
}
else {
/* Prescale = Divide by 1 */
*brg_ptr = (*brg_ptr & ~CPM_BRG_CD_MASK) |
2002-11-03 00:24:07 +00:00
((brg_cnt - 1) << CPM_BRG_DIV16_SHIFT);
*brg_ptr &= ~CPM_BRG_DIV16;
}
}
uint Daq_BRG_Get_ExtClk(uint brg)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
return ((*brg_ptr & CPM_BRG_EXTC_MASK) >> CPM_BRG_EXTC_SHIFT);
}
char* Daq_BRG_Get_ExtClk_Description(uint brg)
{
uint extc;
extc = Daq_BRG_Get_ExtClk(brg);
switch (brg + 1) {
case 1:
case 2:
case 5:
case 6: {
switch (extc) {
case 0: {
return ("BRG_INT");
}
case 1: {
return ("CLK3");
}
case 2: {
return ("CLK5");
}
}
return ("??1245??");
}
case 3:
case 4:
case 7:
case 8: {
switch (extc) {
case 0: {
return ("BRG_INT");
}
case 1: {
return ("CLK9");
}
case 2: {
return ("CLK15");
}
}
return ("??3478??");
}
2002-11-03 00:24:07 +00:00
}
return ("??9876??");
}
void Daq_BRG_Set_ExtClk(uint brg, uint extc)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint *brg_ptr;
brg_ptr = (uint *)&immr->im_brgc1;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg -= 4;
2002-11-03 00:24:07 +00:00
}
brg_ptr += brg;
*brg_ptr = (*brg_ptr & ~CPM_BRG_EXTC_MASK) |
((extc << CPM_BRG_EXTC_SHIFT) & CPM_BRG_EXTC_MASK);
2002-11-03 00:24:07 +00:00
}
uint Daq_BRG_Rate(uint brg)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint *brg_ptr;
uint brg_cnt;
uint brg_freq = 0;
brg_ptr = (uint *)&immr->im_brgc1;
brg_ptr += brg;
if (brg >= 5) {
brg_ptr = (uint *)&immr->im_brgc5;
brg_ptr += (brg - 4);
2002-11-03 00:24:07 +00:00
}
brg_cnt = Daq_BRG_Get_Count(brg);
switch (Daq_BRG_Get_ExtClk(brg)) {
case CPM_BRG_EXTC_CLK3:
case CPM_BRG_EXTC_CLK5: {
2002-11-03 00:24:07 +00:00
brg_freq = brg_cnt;
break;
}
default: {
brg_freq = (uint)BRG_INT_CLK / brg_cnt;
}
}
return (brg_freq);
}
uint Daq_Get_SampleRate(void)
{
/*
* Read the BRG's to return the actual sample rate.
*/
return (Daq_BRG_Rate(MCLK_BRG) / (MCLK_DIVISOR * SCLK_DIVISOR));
}
void Daq_Init_Clocks(int sample_rate, int sample_64x)
{
volatile ioport_t *iopa = ioport_addr((immap_t *)CONFIG_SYS_IMMR, 0 /* port A */);
uint mclk_divisor; /* MCLK divisor */
int flag; /* Interrupt state */
2002-11-03 00:24:07 +00:00
/* Save off the clocking data */
Daq64xSampling = sample_64x;
/*
* Limit the sample rate to some sensible values.
*/
if (sample_rate > MAX_64x_SAMPLE_RATE) {
sample_rate = MAX_64x_SAMPLE_RATE;
2002-11-03 00:24:07 +00:00
}
if (sample_rate < MIN_SAMPLE_RATE) {
sample_rate = MIN_SAMPLE_RATE;
2002-11-03 00:24:07 +00:00
}
/*
* Initialize the MCLK/SCLK/LRCLK baud rate generators.
*/
/* Setup MCLK */
Daq_BRG_Set_ExtClk(MCLK_BRG, CPM_BRG_EXTC_BRGCLK);
/* Setup SCLK */
# ifdef RUN_SCLK_ON_BRG_INT
Daq_BRG_Set_ExtClk(SCLK_BRG, CPM_BRG_EXTC_BRGCLK);
2002-11-03 00:24:07 +00:00
# else
Daq_BRG_Set_ExtClk(SCLK_BRG, CPM_BRG_EXTC_CLK9);
2002-11-03 00:24:07 +00:00
# endif
/* Setup LRCLK */
# ifdef RUN_LRCLK_ON_BRG_INT
Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_BRGCLK);
2002-11-03 00:24:07 +00:00
# else
Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_CLK5);
2002-11-03 00:24:07 +00:00
# endif
/*
* Dynamically adjust MCLK based on the new sample rate.
*/
/* Compute the divisors */
mclk_divisor = BRG_INT_CLK / (sample_rate * MCLK_DIVISOR * SCLK_DIVISOR);
/*
* Disable interrupt and save the current state
*/
flag = disable_interrupts();
/* Setup MCLK */
Daq_BRG_Set_Count(MCLK_BRG, mclk_divisor);
/* Setup SCLK */
# ifdef RUN_SCLK_ON_BRG_INT
Daq_BRG_Set_Count(SCLK_BRG, mclk_divisor * MCLK_DIVISOR);
# else
Daq_BRG_Set_Count(SCLK_BRG, MCLK_DIVISOR);
# endif
# ifdef RUN_LRCLK_ON_BRG_INT
Daq_BRG_Set_Count(LRCLK_BRG,
mclk_divisor * MCLK_DIVISOR * SCLK_DIVISOR);
# else
Daq_BRG_Set_Count(LRCLK_BRG, SCLK_DIVISOR);
# endif
/*
* Restore the Interrupt state
*/
if (flag) {
enable_interrupts();
}
2002-11-03 00:24:07 +00:00
/* Enable the clock drivers */
iopa->pdat &= ~SLRCLK_EN_MASK;
}
void Daq_Stop_Clocks(void)
{
#ifdef TIGHTEN_UP_BRG_TIMING
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
register uint mclk_brg; /* MCLK BRG value */
register uint sclk_brg; /* SCLK BRG value */
register uint lrclk_brg; /* LRCLK BRG value */
unsigned long flag; /* Interrupt flags */
2002-11-03 00:24:07 +00:00
#endif
# ifdef TIGHTEN_UP_BRG_TIMING
/*
* Obtain MCLK BRG reset/disabled value
*/
2002-11-03 00:24:07 +00:00
# if (MCLK_BRG == 0)
mclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 1)
mclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 2)
mclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 3)
mclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 4)
mclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 5)
mclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 6)
mclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 7)
mclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
/*
* Obtain SCLK BRG reset/disabled value
*/
2002-11-03 00:24:07 +00:00
# if (SCLK_BRG == 0)
sclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 1)
sclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 2)
sclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 3)
sclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 4)
sclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 5)
sclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 6)
sclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 7)
sclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
/*
* Obtain LRCLK BRG reset/disabled value
*/
# if (LRCLK_BRG == 0)
lrclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
# if (LRCLK_BRG == 1)
lrclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
# if (LRCLK_BRG == 2)
lrclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
# if (LRCLK_BRG == 3)
lrclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
# if (LRCLK_BRG == 4)
lrclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
# if (LRCLK_BRG == 5)
lrclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
# if (LRCLK_BRG == 6)
lrclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
# if (LRCLK_BRG == 7)
lrclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
# endif
/*
* Disable interrupt and save the current state
*/
flag = disable_interrupts();
/*
* Set reset on MCLK BRG
*/
# if (MCLK_BRG == 0)
*IM_BRGC1 = mclk_brg;
# endif
# if (MCLK_BRG == 1)
*IM_BRGC2 = mclk_brg;
# endif
# if (MCLK_BRG == 2)
*IM_BRGC3 = mclk_brg;
# endif
# if (MCLK_BRG == 3)
*IM_BRGC4 = mclk_brg;
# endif
# if (MCLK_BRG == 4)
*IM_BRGC5 = mclk_brg;
# endif
# if (MCLK_BRG == 5)
*IM_BRGC6 = mclk_brg;
# endif
# if (MCLK_BRG == 6)
*IM_BRGC7 = mclk_brg;
# endif
# if (MCLK_BRG == 7)
*IM_BRGC8 = mclk_brg;
# endif
/*
* Set reset on SCLK BRG
*/
# if (SCLK_BRG == 0)
*IM_BRGC1 = sclk_brg;
# endif
# if (SCLK_BRG == 1)
*IM_BRGC2 = sclk_brg;
# endif
# if (SCLK_BRG == 2)
*IM_BRGC3 = sclk_brg;
# endif
# if (SCLK_BRG == 3)
*IM_BRGC4 = sclk_brg;
# endif
# if (SCLK_BRG == 4)
*IM_BRGC5 = sclk_brg;
# endif
# if (SCLK_BRG == 5)
*IM_BRGC6 = sclk_brg;
# endif
# if (SCLK_BRG == 6)
*IM_BRGC7 = sclk_brg;
# endif
# if (SCLK_BRG == 7)
*IM_BRGC8 = sclk_brg;
# endif
/*
* Set reset on LRCLK BRG
*/
# if (LRCLK_BRG == 0)
*IM_BRGC1 = lrclk_brg;
# endif
# if (LRCLK_BRG == 1)
*IM_BRGC2 = lrclk_brg;
# endif
# if (LRCLK_BRG == 2)
*IM_BRGC3 = lrclk_brg;
# endif
# if (LRCLK_BRG == 3)
*IM_BRGC4 = lrclk_brg;
# endif
# if (LRCLK_BRG == 4)
*IM_BRGC5 = lrclk_brg;
# endif
# if (LRCLK_BRG == 5)
*IM_BRGC6 = lrclk_brg;
# endif
# if (LRCLK_BRG == 6)
*IM_BRGC7 = lrclk_brg;
# endif
# if (LRCLK_BRG == 7)
*IM_BRGC8 = lrclk_brg;
# endif
/*
* Clear reset on MCLK BRG
*/
# if (MCLK_BRG == 0)
*IM_BRGC1 = mclk_brg & ~CPM_BRG_RST;
# endif
# if (MCLK_BRG == 1)
*IM_BRGC2 = mclk_brg & ~CPM_BRG_RST;
# endif
# if (MCLK_BRG == 2)
*IM_BRGC3 = mclk_brg & ~CPM_BRG_RST;
# endif
# if (MCLK_BRG == 3)
*IM_BRGC4 = mclk_brg & ~CPM_BRG_RST;
# endif
# if (MCLK_BRG == 4)
*IM_BRGC5 = mclk_brg & ~CPM_BRG_RST;
# endif
# if (MCLK_BRG == 5)
*IM_BRGC6 = mclk_brg & ~CPM_BRG_RST;
# endif
# if (MCLK_BRG == 6)
*IM_BRGC7 = mclk_brg & ~CPM_BRG_RST;
# endif
# if (MCLK_BRG == 7)
*IM_BRGC8 = mclk_brg & ~CPM_BRG_RST;
# endif
/*
* Clear reset on SCLK BRG
*/
# if (SCLK_BRG == 0)
*IM_BRGC1 = sclk_brg & ~CPM_BRG_RST;
# endif
# if (SCLK_BRG == 1)
*IM_BRGC2 = sclk_brg & ~CPM_BRG_RST;
# endif
# if (SCLK_BRG == 2)
*IM_BRGC3 = sclk_brg & ~CPM_BRG_RST;
# endif
# if (SCLK_BRG == 3)
*IM_BRGC4 = sclk_brg & ~CPM_BRG_RST;
# endif
# if (SCLK_BRG == 4)
*IM_BRGC5 = sclk_brg & ~CPM_BRG_RST;
# endif
# if (SCLK_BRG == 5)
*IM_BRGC6 = sclk_brg & ~CPM_BRG_RST;
# endif
# if (SCLK_BRG == 6)
*IM_BRGC7 = sclk_brg & ~CPM_BRG_RST;
# endif
# if (SCLK_BRG == 7)
*IM_BRGC8 = sclk_brg & ~CPM_BRG_RST;
# endif
/*
* Clear reset on LRCLK BRG
*/
2002-11-03 00:24:07 +00:00
# if (LRCLK_BRG == 0)
*IM_BRGC1 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 1)
*IM_BRGC2 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 2)
*IM_BRGC3 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 3)
*IM_BRGC4 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 4)
*IM_BRGC5 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 5)
*IM_BRGC6 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 6)
*IM_BRGC7 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 7)
*IM_BRGC8 = lrclk_brg & ~CPM_BRG_RST;
2002-11-03 00:24:07 +00:00
# endif
/*
* Restore the Interrupt state
*/
if (flag) {
enable_interrupts();
}
2002-11-03 00:24:07 +00:00
# else
/*
* Reset the clocks
*/
Daq_BRG_Reset(MCLK_BRG);
Daq_BRG_Reset(SCLK_BRG);
Daq_BRG_Reset(LRCLK_BRG);
2002-11-03 00:24:07 +00:00
# endif
}
void Daq_Start_Clocks(int sample_rate)
{
#ifdef TIGHTEN_UP_BRG_TIMING
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
register uint mclk_brg; /* MCLK BRG value */
register uint sclk_brg; /* SCLK BRG value */
register uint temp_lrclk_brg; /* Temporary LRCLK BRG value */
register uint real_lrclk_brg; /* Permanent LRCLK BRG value */
2002-11-03 00:24:07 +00:00
uint lrclk_brg; /* LRCLK BRG value */
unsigned long flags; /* Interrupt flags */
uint sclk_cnt; /* SCLK count */
uint delay_cnt; /* Delay count */
#endif
# ifdef TIGHTEN_UP_BRG_TIMING
/*
* Obtain the enabled MCLK BRG value
*/
2002-11-03 00:24:07 +00:00
# if (MCLK_BRG == 0)
mclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 1)
mclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 2)
mclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 3)
mclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 4)
mclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 5)
mclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 6)
mclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 7)
mclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
/*
* Obtain the enabled SCLK BRG value
*/
2002-11-03 00:24:07 +00:00
# if (SCLK_BRG == 0)
sclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 1)
sclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 2)
sclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 3)
sclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 4)
sclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 5)
sclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 6)
sclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 7)
sclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
/*
* Obtain the enabled LRCLK BRG value
*/
2002-11-03 00:24:07 +00:00
# if (LRCLK_BRG == 0)
lrclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 1)
lrclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 2)
lrclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 3)
lrclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 4)
lrclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 5)
lrclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 6)
lrclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 7)
lrclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
2002-11-03 00:24:07 +00:00
# endif
/* Save off the real LRCLK value */
real_lrclk_brg = lrclk_brg;
/* Obtain the current SCLK count */
sclk_cnt = ((sclk_brg & 0x00001FFE) >> 1) + 1;
/* Compute the delay as a function of SCLK count */
delay_cnt = ((sclk_cnt / 4) - 2) * 10 + 6;
if (DaqSampleRate == 43402) {
2002-11-03 00:24:07 +00:00
delay_cnt++;
}
/* Clear out the count */
2002-11-03 00:24:07 +00:00
temp_lrclk_brg = sclk_brg & ~0x00001FFE;
/* Insert the count */
2002-11-03 00:24:07 +00:00
temp_lrclk_brg |= ((delay_cnt + (sclk_cnt / 2) - 1) << 1) & 0x00001FFE;
/*
* Disable interrupt and save the current state
*/
flag = disable_interrupts();
/*
* Enable MCLK BRG
*/
2002-11-03 00:24:07 +00:00
# if (MCLK_BRG == 0)
*IM_BRGC1 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 1)
*IM_BRGC2 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 2)
*IM_BRGC3 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 3)
*IM_BRGC4 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 4)
*IM_BRGC5 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 5)
*IM_BRGC6 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 6)
*IM_BRGC7 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (MCLK_BRG == 7)
*IM_BRGC8 = mclk_brg;
2002-11-03 00:24:07 +00:00
# endif
/*
* Enable SCLK BRG
*/
2002-11-03 00:24:07 +00:00
# if (SCLK_BRG == 0)
*IM_BRGC1 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 1)
*IM_BRGC2 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 2)
*IM_BRGC3 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 3)
*IM_BRGC4 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 4)
*IM_BRGC5 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 5)
*IM_BRGC6 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 6)
*IM_BRGC7 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (SCLK_BRG == 7)
*IM_BRGC8 = sclk_brg;
2002-11-03 00:24:07 +00:00
# endif
/*
* Enable LRCLK BRG (1st time - temporary)
*/
2002-11-03 00:24:07 +00:00
# if (LRCLK_BRG == 0)
*IM_BRGC1 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 1)
*IM_BRGC2 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 2)
*IM_BRGC3 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 3)
*IM_BRGC4 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 4)
*IM_BRGC5 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 5)
*IM_BRGC6 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 6)
*IM_BRGC7 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 7)
*IM_BRGC8 = temp_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
/*
* Enable LRCLK BRG (2nd time - permanent)
*/
2002-11-03 00:24:07 +00:00
# if (LRCLK_BRG == 0)
*IM_BRGC1 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 1)
*IM_BRGC2 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 2)
*IM_BRGC3 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 3)
*IM_BRGC4 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 4)
*IM_BRGC5 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 5)
*IM_BRGC6 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 6)
*IM_BRGC7 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
# if (LRCLK_BRG == 7)
*IM_BRGC8 = real_lrclk_brg;
2002-11-03 00:24:07 +00:00
# endif
/*
* Restore the Interrupt state
*/
if (flag) {
enable_interrupts();
}
2002-11-03 00:24:07 +00:00
# else
/*
* Enable the clocks
*/
Daq_BRG_Enable(LRCLK_BRG);
Daq_BRG_Enable(SCLK_BRG);
Daq_BRG_Enable(MCLK_BRG);
2002-11-03 00:24:07 +00:00
# endif
}
void Daq_Display_Clocks(void)
{
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
2002-11-03 00:24:07 +00:00
uint mclk_divisor; /* Detected MCLK divisor */
uint sclk_divisor; /* Detected SCLK divisor */
printf("\nBRG:\n");
if (immr->im_brgc4 != 0) {
printf("\tbrgc4\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, MCLK\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc4,
(uint)&(immr->im_brgc4),
Daq_BRG_Get_Count(3),
Daq_BRG_Get_ExtClk(3),
Daq_BRG_Get_ExtClk_Description(3));
}
if (immr->im_brgc8 != 0) {
printf("\tbrgc8\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SCLK\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc8,
(uint)&(immr->im_brgc8),
Daq_BRG_Get_Count(7),
Daq_BRG_Get_ExtClk(7),
Daq_BRG_Get_ExtClk_Description(7));
}
if (immr->im_brgc6 != 0) {
printf("\tbrgc6\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, LRCLK\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc6,
(uint)&(immr->im_brgc6),
Daq_BRG_Get_Count(5),
Daq_BRG_Get_ExtClk(5),
Daq_BRG_Get_ExtClk_Description(5));
}
if (immr->im_brgc1 != 0) {
printf("\tbrgc1\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SMC1\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc1,
(uint)&(immr->im_brgc1),
Daq_BRG_Get_Count(0),
Daq_BRG_Get_ExtClk(0),
Daq_BRG_Get_ExtClk_Description(0));
}
if (immr->im_brgc2 != 0) {
printf("\tbrgc2\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SMC2\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc2,
(uint)&(immr->im_brgc2),
Daq_BRG_Get_Count(1),
Daq_BRG_Get_ExtClk(1),
Daq_BRG_Get_ExtClk_Description(1));
}
if (immr->im_brgc3 != 0) {
printf("\tbrgc3\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SCC1\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc3,
(uint)&(immr->im_brgc3),
Daq_BRG_Get_Count(2),
Daq_BRG_Get_ExtClk(2),
Daq_BRG_Get_ExtClk_Description(2));
}
if (immr->im_brgc5 != 0) {
printf("\tbrgc5\t0x%08x @ 0x%08x, %5d count, %d extc, %8s\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc5,
(uint)&(immr->im_brgc5),
Daq_BRG_Get_Count(4),
Daq_BRG_Get_ExtClk(4),
Daq_BRG_Get_ExtClk_Description(4));
}
if (immr->im_brgc7 != 0) {
printf("\tbrgc7\t0x%08x @ 0x%08x, %5d count, %d extc, %8s\n",
2002-11-03 00:24:07 +00:00
immr->im_brgc7,
(uint)&(immr->im_brgc7),
Daq_BRG_Get_Count(6),
Daq_BRG_Get_ExtClk(6),
Daq_BRG_Get_ExtClk_Description(6));
}
# ifdef RUN_SCLK_ON_BRG_INT
mclk_divisor = Daq_BRG_Rate(MCLK_BRG) / Daq_BRG_Rate(SCLK_BRG);
2002-11-03 00:24:07 +00:00
# else
mclk_divisor = Daq_BRG_Get_Count(SCLK_BRG);
2002-11-03 00:24:07 +00:00
# endif
# ifdef RUN_LRCLK_ON_BRG_INT
sclk_divisor = Daq_BRG_Rate(SCLK_BRG) / Daq_BRG_Rate(LRCLK_BRG);
2002-11-03 00:24:07 +00:00
# else
sclk_divisor = Daq_BRG_Get_Count(LRCLK_BRG);
2002-11-03 00:24:07 +00:00
# endif
printf("\nADC/DAC Clocking (%d/%d):\n", sclk_divisor, mclk_divisor);
printf("\tMCLK %8d Hz, or %3dx SCLK, or %3dx LRCLK\n",
Daq_BRG_Rate(MCLK_BRG),
mclk_divisor,
mclk_divisor * sclk_divisor);
# ifdef RUN_SCLK_ON_BRG_INT
printf("\tSCLK %8d Hz, or %3dx LRCLK\n",
2002-11-03 00:24:07 +00:00
Daq_BRG_Rate(SCLK_BRG),
sclk_divisor);
# else
printf("\tSCLK %8d Hz, or %3dx LRCLK\n",
2002-11-03 00:24:07 +00:00
Daq_BRG_Rate(MCLK_BRG) / mclk_divisor,
sclk_divisor);
# endif
# ifdef RUN_LRCLK_ON_BRG_INT
printf("\tLRCLK %8d Hz\n",
2002-11-03 00:24:07 +00:00
Daq_BRG_Rate(LRCLK_BRG));
# else
# ifdef RUN_SCLK_ON_BRG_INT
printf("\tLRCLK %8d Hz\n",
2002-11-03 00:24:07 +00:00
Daq_BRG_Rate(SCLK_BRG) / sclk_divisor);
# else
printf("\tLRCLK %8d Hz\n",
2002-11-03 00:24:07 +00:00
Daq_BRG_Rate(MCLK_BRG) / (mclk_divisor * sclk_divisor));
# endif
# endif
printf("\n");
}