mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-27 15:12:21 +00:00
6d0f6bcf33
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
1025 lines
24 KiB
C
1025 lines
24 KiB
C
/*
|
|
* (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;
|
|
|
|
int Daq64xSampling = 0;
|
|
|
|
|
|
void Daq_BRG_Reset(uint brg)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
volatile uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
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;
|
|
volatile uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
brg_ptr += brg;
|
|
*brg_ptr &= ~CPM_BRG_EN;
|
|
}
|
|
|
|
void Daq_BRG_Enable(uint brg)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
volatile uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
brg_ptr += brg;
|
|
*brg_ptr |= CPM_BRG_EN;
|
|
}
|
|
|
|
uint Daq_BRG_Get_Div16(uint brg)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
brg_ptr += brg;
|
|
|
|
if (*brg_ptr & CPM_BRG_DIV16) {
|
|
/* DIV16 active */
|
|
return (TRUE);
|
|
}
|
|
else {
|
|
/* DIV16 inactive */
|
|
return (FALSE);
|
|
}
|
|
}
|
|
|
|
void Daq_BRG_Set_Div16(uint brg, uint div16)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
brg_ptr += brg;
|
|
|
|
if (div16) {
|
|
/* DIV16 active */
|
|
*brg_ptr |= CPM_BRG_DIV16;
|
|
}
|
|
else {
|
|
/* DIV16 inactive */
|
|
*brg_ptr &= ~CPM_BRG_DIV16;
|
|
}
|
|
}
|
|
|
|
uint Daq_BRG_Get_Count(uint brg)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
uint *brg_ptr;
|
|
uint brg_cnt;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
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;
|
|
}
|
|
|
|
return (brg_cnt);
|
|
}
|
|
|
|
void Daq_BRG_Set_Count(uint brg, uint brg_cnt)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
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) |
|
|
(((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) |
|
|
((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;
|
|
uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
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??");
|
|
}
|
|
}
|
|
return ("??9876??");
|
|
}
|
|
|
|
void Daq_BRG_Set_ExtClk(uint brg, uint extc)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
uint *brg_ptr;
|
|
|
|
brg_ptr = (uint *)&immr->im_brgc1;
|
|
if (brg >= 5) {
|
|
brg_ptr = (uint *)&immr->im_brgc5;
|
|
brg -= 4;
|
|
}
|
|
brg_ptr += brg;
|
|
|
|
*brg_ptr = (*brg_ptr & ~CPM_BRG_EXTC_MASK) |
|
|
((extc << CPM_BRG_EXTC_SHIFT) & CPM_BRG_EXTC_MASK);
|
|
}
|
|
|
|
uint Daq_BRG_Rate(uint brg)
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
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);
|
|
}
|
|
|
|
brg_cnt = Daq_BRG_Get_Count(brg);
|
|
|
|
switch (Daq_BRG_Get_ExtClk(brg)) {
|
|
case CPM_BRG_EXTC_CLK3:
|
|
case CPM_BRG_EXTC_CLK5: {
|
|
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 */
|
|
|
|
/* 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;
|
|
}
|
|
if (sample_rate < MIN_SAMPLE_RATE) {
|
|
sample_rate = MIN_SAMPLE_RATE;
|
|
}
|
|
|
|
/*
|
|
* 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);
|
|
# else
|
|
Daq_BRG_Set_ExtClk(SCLK_BRG, CPM_BRG_EXTC_CLK9);
|
|
# endif
|
|
|
|
/* Setup LRCLK */
|
|
# ifdef RUN_LRCLK_ON_BRG_INT
|
|
Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_BRGCLK);
|
|
# else
|
|
Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_CLK5);
|
|
# 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();
|
|
}
|
|
|
|
/* 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 */
|
|
#endif
|
|
|
|
# ifdef TIGHTEN_UP_BRG_TIMING
|
|
/*
|
|
* Obtain MCLK BRG reset/disabled value
|
|
*/
|
|
# if (MCLK_BRG == 0)
|
|
mclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 1)
|
|
mclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 2)
|
|
mclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 3)
|
|
mclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 4)
|
|
mclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 5)
|
|
mclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 6)
|
|
mclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 7)
|
|
mclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
|
|
/*
|
|
* Obtain SCLK BRG reset/disabled value
|
|
*/
|
|
# if (SCLK_BRG == 0)
|
|
sclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 1)
|
|
sclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 2)
|
|
sclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 3)
|
|
sclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 4)
|
|
sclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 5)
|
|
sclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 6)
|
|
sclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 7)
|
|
sclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
|
|
# 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
|
|
*/
|
|
# if (LRCLK_BRG == 0)
|
|
*IM_BRGC1 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
# if (LRCLK_BRG == 1)
|
|
*IM_BRGC2 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
# if (LRCLK_BRG == 2)
|
|
*IM_BRGC3 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
# if (LRCLK_BRG == 3)
|
|
*IM_BRGC4 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
# if (LRCLK_BRG == 4)
|
|
*IM_BRGC5 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
# if (LRCLK_BRG == 5)
|
|
*IM_BRGC6 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
# if (LRCLK_BRG == 6)
|
|
*IM_BRGC7 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
# if (LRCLK_BRG == 7)
|
|
*IM_BRGC8 = lrclk_brg & ~CPM_BRG_RST;
|
|
# endif
|
|
|
|
/*
|
|
* Restore the Interrupt state
|
|
*/
|
|
if (flag) {
|
|
enable_interrupts();
|
|
}
|
|
# else
|
|
/*
|
|
* Reset the clocks
|
|
*/
|
|
Daq_BRG_Reset(MCLK_BRG);
|
|
Daq_BRG_Reset(SCLK_BRG);
|
|
Daq_BRG_Reset(LRCLK_BRG);
|
|
# endif
|
|
}
|
|
|
|
void Daq_Start_Clocks(int sample_rate)
|
|
|
|
{
|
|
#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 temp_lrclk_brg; /* Temporary LRCLK BRG value */
|
|
register uint real_lrclk_brg; /* Permanent LRCLK BRG value */
|
|
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
|
|
*/
|
|
# if (MCLK_BRG == 0)
|
|
mclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 1)
|
|
mclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 2)
|
|
mclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 3)
|
|
mclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 4)
|
|
mclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 5)
|
|
mclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 6)
|
|
mclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (MCLK_BRG == 7)
|
|
mclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
|
|
/*
|
|
* Obtain the enabled SCLK BRG value
|
|
*/
|
|
# if (SCLK_BRG == 0)
|
|
sclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 1)
|
|
sclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 2)
|
|
sclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 3)
|
|
sclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 4)
|
|
sclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 5)
|
|
sclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 6)
|
|
sclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
# if (SCLK_BRG == 7)
|
|
sclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
|
|
# endif
|
|
|
|
/*
|
|
* Obtain the enabled LRCLK BRG 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
|
|
|
|
/* 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) {
|
|
delay_cnt++;
|
|
}
|
|
|
|
/* Clear out the count */
|
|
temp_lrclk_brg = sclk_brg & ~0x00001FFE;
|
|
|
|
/* Insert the count */
|
|
temp_lrclk_brg |= ((delay_cnt + (sclk_cnt / 2) - 1) << 1) & 0x00001FFE;
|
|
|
|
/*
|
|
* Disable interrupt and save the current state
|
|
*/
|
|
flag = disable_interrupts();
|
|
|
|
/*
|
|
* Enable 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
|
|
|
|
/*
|
|
* Enable 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
|
|
|
|
/*
|
|
* Enable LRCLK BRG (1st time - temporary)
|
|
*/
|
|
# if (LRCLK_BRG == 0)
|
|
*IM_BRGC1 = temp_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 1)
|
|
*IM_BRGC2 = temp_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 2)
|
|
*IM_BRGC3 = temp_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 3)
|
|
*IM_BRGC4 = temp_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 4)
|
|
*IM_BRGC5 = temp_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 5)
|
|
*IM_BRGC6 = temp_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 6)
|
|
*IM_BRGC7 = temp_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 7)
|
|
*IM_BRGC8 = temp_lrclk_brg;
|
|
# endif
|
|
|
|
/*
|
|
* Enable LRCLK BRG (2nd time - permanent)
|
|
*/
|
|
# if (LRCLK_BRG == 0)
|
|
*IM_BRGC1 = real_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 1)
|
|
*IM_BRGC2 = real_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 2)
|
|
*IM_BRGC3 = real_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 3)
|
|
*IM_BRGC4 = real_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 4)
|
|
*IM_BRGC5 = real_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 5)
|
|
*IM_BRGC6 = real_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 6)
|
|
*IM_BRGC7 = real_lrclk_brg;
|
|
# endif
|
|
# if (LRCLK_BRG == 7)
|
|
*IM_BRGC8 = real_lrclk_brg;
|
|
# endif
|
|
|
|
/*
|
|
* Restore the Interrupt state
|
|
*/
|
|
if (flag) {
|
|
enable_interrupts();
|
|
}
|
|
# else
|
|
/*
|
|
* Enable the clocks
|
|
*/
|
|
Daq_BRG_Enable(LRCLK_BRG);
|
|
Daq_BRG_Enable(SCLK_BRG);
|
|
Daq_BRG_Enable(MCLK_BRG);
|
|
# endif
|
|
}
|
|
|
|
void Daq_Display_Clocks(void)
|
|
|
|
{
|
|
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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);
|
|
# else
|
|
mclk_divisor = Daq_BRG_Get_Count(SCLK_BRG);
|
|
# endif
|
|
# ifdef RUN_LRCLK_ON_BRG_INT
|
|
sclk_divisor = Daq_BRG_Rate(SCLK_BRG) / Daq_BRG_Rate(LRCLK_BRG);
|
|
# else
|
|
sclk_divisor = Daq_BRG_Get_Count(LRCLK_BRG);
|
|
# 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",
|
|
Daq_BRG_Rate(SCLK_BRG),
|
|
sclk_divisor);
|
|
# else
|
|
printf("\tSCLK %8d Hz, or %3dx LRCLK\n",
|
|
Daq_BRG_Rate(MCLK_BRG) / mclk_divisor,
|
|
sclk_divisor);
|
|
# endif
|
|
# ifdef RUN_LRCLK_ON_BRG_INT
|
|
printf("\tLRCLK %8d Hz\n",
|
|
Daq_BRG_Rate(LRCLK_BRG));
|
|
# else
|
|
# ifdef RUN_SCLK_ON_BRG_INT
|
|
printf("\tLRCLK %8d Hz\n",
|
|
Daq_BRG_Rate(SCLK_BRG) / sclk_divisor);
|
|
# else
|
|
printf("\tLRCLK %8d Hz\n",
|
|
Daq_BRG_Rate(MCLK_BRG) / (mclk_divisor * sclk_divisor));
|
|
# endif
|
|
# endif
|
|
printf("\n");
|
|
}
|