uboot/board/sacsng/clkinit.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2002
   3 * Custom IDEAS, Inc. <www.cideas.com>
   4 * Jon Diekema <diekema@cideas.com>
   5 *
   6 * SPDX-License-Identifier:     GPL-2.0+
   7 */
   8
   9#include <common.h>
  10#include <ioports.h>
  11#include <mpc8260.h>
  12#include <asm/cpm_8260.h>
  13#include <configs/sacsng.h>
  14
  15#include "clkinit.h"
  16
  17DECLARE_GLOBAL_DATA_PTR;
  18
  19int Daq64xSampling = 0;
  20
  21
  22void Daq_BRG_Reset(uint brg)
  23{
  24     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
  25     volatile uint *brg_ptr;
  26
  27     brg_ptr = (uint *)&immr->im_brgc1;
  28
  29     if (brg >= 5) {
  30         brg_ptr = (uint *)&immr->im_brgc5;
  31         brg -= 4;
  32     }
  33     brg_ptr += brg;
  34     *brg_ptr |=  CPM_BRG_RST;
  35     *brg_ptr &= ~CPM_BRG_RST;
  36}
  37
  38void Daq_BRG_Disable(uint brg)
  39{
  40     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
  41     volatile uint *brg_ptr;
  42
  43     brg_ptr = (uint *)&immr->im_brgc1;
  44
  45     if (brg >= 5) {
  46         brg_ptr = (uint *)&immr->im_brgc5;
  47         brg -= 4;
  48     }
  49     brg_ptr += brg;
  50     *brg_ptr &= ~CPM_BRG_EN;
  51}
  52
  53void Daq_BRG_Enable(uint brg)
  54{
  55     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
  56     volatile uint *brg_ptr;
  57
  58     brg_ptr = (uint *)&immr->im_brgc1;
  59     if (brg >= 5) {
  60         brg_ptr = (uint *)&immr->im_brgc5;
  61         brg -= 4;
  62     }
  63     brg_ptr += brg;
  64     *brg_ptr |= CPM_BRG_EN;
  65}
  66
  67uint Daq_BRG_Get_Div16(uint brg)
  68{
  69     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
  70     uint *brg_ptr;
  71
  72     brg_ptr = (uint *)&immr->im_brgc1;
  73     if (brg >= 5) {
  74         brg_ptr = (uint *)&immr->im_brgc5;
  75         brg -= 4;
  76     }
  77     brg_ptr += brg;
  78
  79     if (*brg_ptr & CPM_BRG_DIV16) {
  80         /* DIV16 active */
  81         return true;
  82     }
  83     else {
  84         /* DIV16 inactive */
  85         return false;
  86     }
  87}
  88
  89void Daq_BRG_Set_Div16(uint brg, uint div16)
  90{
  91     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
  92     uint *brg_ptr;
  93
  94     brg_ptr = (uint *)&immr->im_brgc1;
  95     if (brg >= 5) {
  96         brg_ptr = (uint *)&immr->im_brgc5;
  97         brg -= 4;
  98     }
  99     brg_ptr += brg;
 100
 101     if (div16) {
 102         /* DIV16 active */
 103         *brg_ptr |=  CPM_BRG_DIV16;
 104     }
 105     else {
 106         /* DIV16 inactive */
 107         *brg_ptr &= ~CPM_BRG_DIV16;
 108     }
 109}
 110
 111uint Daq_BRG_Get_Count(uint brg)
 112{
 113     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 114     uint *brg_ptr;
 115     uint brg_cnt;
 116
 117     brg_ptr = (uint *)&immr->im_brgc1;
 118     if (brg >= 5) {
 119         brg_ptr = (uint *)&immr->im_brgc5;
 120         brg -= 4;
 121     }
 122     brg_ptr += brg;
 123
 124     /* Get the clock divider
 125      *
 126      * Note: A clock divider of 0 means divide by 1,
 127      *       therefore we need to add 1 to the count.
 128      */
 129     brg_cnt = (*brg_ptr & CPM_BRG_CD_MASK) >> CPM_BRG_DIV16_SHIFT;
 130     brg_cnt++;
 131     if (*brg_ptr & CPM_BRG_DIV16) {
 132         brg_cnt *= 16;
 133     }
 134
 135    return (brg_cnt);
 136}
 137
 138void Daq_BRG_Set_Count(uint brg, uint brg_cnt)
 139{
 140     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 141     uint *brg_ptr;
 142
 143     brg_ptr = (uint *)&immr->im_brgc1;
 144     if (brg >= 5) {
 145         brg_ptr = (uint *)&immr->im_brgc5;
 146         brg -= 4;
 147     }
 148     brg_ptr += brg;
 149
 150     /*
 151      * Note: A clock divider of 0 means divide by 1,
 152      *  therefore we need to subtract 1 from the count.
 153      */
 154     if (brg_cnt > 4096) {
 155         /* Prescale = Divide by 16 */
 156         *brg_ptr = (*brg_ptr & ~CPM_BRG_CD_MASK)   |
 157             (((brg_cnt / 16) - 1) << CPM_BRG_DIV16_SHIFT);
 158         *brg_ptr |= CPM_BRG_DIV16;
 159     }
 160     else {
 161         /* Prescale = Divide by 1 */
 162         *brg_ptr = (*brg_ptr & ~CPM_BRG_CD_MASK) |
 163             ((brg_cnt - 1) << CPM_BRG_DIV16_SHIFT);
 164         *brg_ptr &= ~CPM_BRG_DIV16;
 165     }
 166}
 167
 168uint Daq_BRG_Get_ExtClk(uint brg)
 169{
 170     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 171     uint *brg_ptr;
 172
 173     brg_ptr = (uint *)&immr->im_brgc1;
 174     if (brg >= 5) {
 175         brg_ptr = (uint *)&immr->im_brgc5;
 176         brg -= 4;
 177     }
 178     brg_ptr += brg;
 179
 180     return ((*brg_ptr & CPM_BRG_EXTC_MASK) >> CPM_BRG_EXTC_SHIFT);
 181}
 182
 183char* Daq_BRG_Get_ExtClk_Description(uint brg)
 184{
 185     uint extc;
 186
 187     extc = Daq_BRG_Get_ExtClk(brg);
 188
 189     switch (brg + 1) {
 190         case 1:
 191         case 2:
 192         case 5:
 193         case 6: {
 194             switch (extc) {
 195                 case 0: {
 196                     return ("BRG_INT");
 197                 }
 198                 case 1: {
 199                     return ("CLK3");
 200                 }
 201                 case 2: {
 202                     return ("CLK5");
 203                 }
 204             }
 205             return ("??1245??");
 206         }
 207         case 3:
 208         case 4:
 209         case 7:
 210         case 8: {
 211             switch (extc) {
 212                 case 0: {
 213                     return ("BRG_INT");
 214                 }
 215                 case 1: {
 216                     return ("CLK9");
 217                 }
 218                 case 2: {
 219                     return ("CLK15");
 220                 }
 221             }
 222             return ("??3478??");
 223         }
 224     }
 225     return ("??9876??");
 226}
 227
 228void Daq_BRG_Set_ExtClk(uint brg, uint extc)
 229{
 230     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 231     uint *brg_ptr;
 232
 233     brg_ptr = (uint *)&immr->im_brgc1;
 234     if (brg >= 5) {
 235         brg_ptr = (uint *)&immr->im_brgc5;
 236         brg -= 4;
 237     }
 238     brg_ptr += brg;
 239
 240     *brg_ptr = (*brg_ptr & ~CPM_BRG_EXTC_MASK) |
 241                ((extc << CPM_BRG_EXTC_SHIFT) & CPM_BRG_EXTC_MASK);
 242}
 243
 244uint Daq_BRG_Rate(uint brg)
 245{
 246     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 247     uint *brg_ptr;
 248     uint brg_cnt;
 249     uint brg_freq = 0;
 250
 251     brg_ptr = (uint *)&immr->im_brgc1;
 252     brg_ptr += brg;
 253     if (brg >= 5) {
 254         brg_ptr = (uint *)&immr->im_brgc5;
 255         brg_ptr += (brg - 4);
 256     }
 257
 258    brg_cnt = Daq_BRG_Get_Count(brg);
 259
 260    switch (Daq_BRG_Get_ExtClk(brg)) {
 261        case CPM_BRG_EXTC_CLK3:
 262        case CPM_BRG_EXTC_CLK5: {
 263            brg_freq = brg_cnt;
 264            break;
 265        }
 266        default: {
 267            brg_freq = (uint)BRG_INT_CLK / brg_cnt;
 268        }
 269    }
 270    return (brg_freq);
 271}
 272
 273uint Daq_Get_SampleRate(void)
 274{
 275     /*
 276      * Read the BRG's to return the actual sample rate.
 277      */
 278     return (Daq_BRG_Rate(MCLK_BRG) / (MCLK_DIVISOR * SCLK_DIVISOR));
 279}
 280
 281void Daq_Init_Clocks(int sample_rate, int sample_64x)
 282{
 283    volatile ioport_t *iopa = ioport_addr((immap_t *)CONFIG_SYS_IMMR, 0 /* port A */);
 284    uint mclk_divisor; /* MCLK divisor */
 285    int  flag;         /* Interrupt state */
 286
 287    /* Save off the clocking data */
 288    Daq64xSampling = sample_64x;
 289
 290    /*
 291     * Limit the sample rate to some sensible values.
 292     */
 293    if (sample_rate > MAX_64x_SAMPLE_RATE) {
 294        sample_rate = MAX_64x_SAMPLE_RATE;
 295    }
 296    if (sample_rate < MIN_SAMPLE_RATE) {
 297        sample_rate = MIN_SAMPLE_RATE;
 298    }
 299
 300    /*
 301     * Initialize the MCLK/SCLK/LRCLK baud rate generators.
 302     */
 303
 304    /* Setup MCLK */
 305    Daq_BRG_Set_ExtClk(MCLK_BRG, CPM_BRG_EXTC_BRGCLK);
 306
 307    /* Setup SCLK */
 308#   ifdef RUN_SCLK_ON_BRG_INT
 309        Daq_BRG_Set_ExtClk(SCLK_BRG, CPM_BRG_EXTC_BRGCLK);
 310#   else
 311        Daq_BRG_Set_ExtClk(SCLK_BRG, CPM_BRG_EXTC_CLK9);
 312#   endif
 313
 314    /* Setup LRCLK */
 315#   ifdef RUN_LRCLK_ON_BRG_INT
 316        Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_BRGCLK);
 317#   else
 318        Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_CLK5);
 319#   endif
 320
 321    /*
 322     * Dynamically adjust MCLK based on the new sample rate.
 323     */
 324
 325    /* Compute the divisors */
 326    mclk_divisor = BRG_INT_CLK / (sample_rate * MCLK_DIVISOR * SCLK_DIVISOR);
 327
 328    /*
 329     * Disable interrupt and save the current state
 330     */
 331    flag = disable_interrupts();
 332
 333    /* Setup MCLK */
 334    Daq_BRG_Set_Count(MCLK_BRG, mclk_divisor);
 335
 336    /* Setup SCLK */
 337#   ifdef RUN_SCLK_ON_BRG_INT
 338        Daq_BRG_Set_Count(SCLK_BRG, mclk_divisor * MCLK_DIVISOR);
 339#   else
 340        Daq_BRG_Set_Count(SCLK_BRG, MCLK_DIVISOR);
 341#   endif
 342
 343#   ifdef RUN_LRCLK_ON_BRG_INT
 344        Daq_BRG_Set_Count(LRCLK_BRG,
 345                          mclk_divisor * MCLK_DIVISOR * SCLK_DIVISOR);
 346#   else
 347        Daq_BRG_Set_Count(LRCLK_BRG, SCLK_DIVISOR);
 348#   endif
 349
 350    /*
 351     * Restore the Interrupt state
 352     */
 353     if (flag) {
 354         enable_interrupts();
 355     }
 356
 357    /* Enable the clock drivers */
 358    iopa->pdat &= ~SLRCLK_EN_MASK;
 359}
 360
 361void Daq_Stop_Clocks(void)
 362
 363{
 364#ifdef TIGHTEN_UP_BRG_TIMING
 365    volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 366    register uint mclk_brg;       /* MCLK  BRG value */
 367    register uint sclk_brg;       /* SCLK  BRG value */
 368    register uint lrclk_brg;      /* LRCLK BRG value */
 369    unsigned long flag;           /* Interrupt flags */
 370#endif
 371
 372#   ifdef TIGHTEN_UP_BRG_TIMING
 373        /*
 374         * Obtain MCLK BRG reset/disabled value
 375         */
 376#       if (MCLK_BRG == 0)
 377            mclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
 378#       endif
 379#       if (MCLK_BRG == 1)
 380            mclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
 381#       endif
 382#       if (MCLK_BRG == 2)
 383            mclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
 384#       endif
 385#       if (MCLK_BRG == 3)
 386            mclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
 387#       endif
 388#       if (MCLK_BRG == 4)
 389            mclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
 390#       endif
 391#       if (MCLK_BRG == 5)
 392            mclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
 393#       endif
 394#       if (MCLK_BRG == 6)
 395            mclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
 396#       endif
 397#       if (MCLK_BRG == 7)
 398            mclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
 399#       endif
 400
 401        /*
 402         * Obtain SCLK BRG reset/disabled value
 403         */
 404#       if (SCLK_BRG == 0)
 405            sclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
 406#       endif
 407#       if (SCLK_BRG == 1)
 408            sclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
 409#       endif
 410#       if (SCLK_BRG == 2)
 411            sclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
 412#       endif
 413#       if (SCLK_BRG == 3)
 414            sclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
 415#       endif
 416#       if (SCLK_BRG == 4)
 417            sclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
 418#       endif
 419#       if (SCLK_BRG == 5)
 420            sclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
 421#       endif
 422#       if (SCLK_BRG == 6)
 423            sclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
 424#       endif
 425#       if (SCLK_BRG == 7)
 426            sclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
 427#       endif
 428
 429        /*
 430         * Obtain LRCLK BRG reset/disabled value
 431         */
 432#       if (LRCLK_BRG == 0)
 433            lrclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN;
 434#       endif
 435#       if (LRCLK_BRG == 1)
 436            lrclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN;
 437#       endif
 438#       if (LRCLK_BRG == 2)
 439            lrclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN;
 440#       endif
 441#       if (LRCLK_BRG == 3)
 442            lrclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN;
 443#       endif
 444#       if (LRCLK_BRG == 4)
 445            lrclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN;
 446#       endif
 447#       if (LRCLK_BRG == 5)
 448            lrclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN;
 449#       endif
 450#       if (LRCLK_BRG == 6)
 451            lrclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN;
 452#       endif
 453#       if (LRCLK_BRG == 7)
 454            lrclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN;
 455#       endif
 456
 457        /*
 458         * Disable interrupt and save the current state
 459         */
 460        flag = disable_interrupts();
 461
 462        /*
 463         * Set reset on MCLK BRG
 464         */
 465#       if (MCLK_BRG == 0)
 466            *IM_BRGC1 = mclk_brg;
 467#       endif
 468#       if (MCLK_BRG == 1)
 469            *IM_BRGC2 = mclk_brg;
 470#       endif
 471#       if (MCLK_BRG == 2)
 472            *IM_BRGC3 = mclk_brg;
 473#       endif
 474#       if (MCLK_BRG == 3)
 475            *IM_BRGC4 = mclk_brg;
 476#       endif
 477#       if (MCLK_BRG == 4)
 478            *IM_BRGC5 = mclk_brg;
 479#       endif
 480#       if (MCLK_BRG == 5)
 481            *IM_BRGC6 = mclk_brg;
 482#       endif
 483#       if (MCLK_BRG == 6)
 484            *IM_BRGC7 = mclk_brg;
 485#       endif
 486#       if (MCLK_BRG == 7)
 487            *IM_BRGC8 = mclk_brg;
 488#       endif
 489
 490        /*
 491         * Set reset on SCLK BRG
 492         */
 493#       if (SCLK_BRG == 0)
 494            *IM_BRGC1 = sclk_brg;
 495#       endif
 496#       if (SCLK_BRG == 1)
 497            *IM_BRGC2 = sclk_brg;
 498#       endif
 499#       if (SCLK_BRG == 2)
 500            *IM_BRGC3 = sclk_brg;
 501#       endif
 502#       if (SCLK_BRG == 3)
 503            *IM_BRGC4 = sclk_brg;
 504#       endif
 505#       if (SCLK_BRG == 4)
 506            *IM_BRGC5 = sclk_brg;
 507#       endif
 508#       if (SCLK_BRG == 5)
 509            *IM_BRGC6 = sclk_brg;
 510#       endif
 511#       if (SCLK_BRG == 6)
 512            *IM_BRGC7 = sclk_brg;
 513#       endif
 514#       if (SCLK_BRG == 7)
 515            *IM_BRGC8 = sclk_brg;
 516#       endif
 517
 518        /*
 519         * Set reset on LRCLK BRG
 520         */
 521#       if (LRCLK_BRG == 0)
 522            *IM_BRGC1 = lrclk_brg;
 523#       endif
 524#       if (LRCLK_BRG == 1)
 525            *IM_BRGC2 = lrclk_brg;
 526#       endif
 527#       if (LRCLK_BRG == 2)
 528            *IM_BRGC3 = lrclk_brg;
 529#       endif
 530#       if (LRCLK_BRG == 3)
 531            *IM_BRGC4 = lrclk_brg;
 532#       endif
 533#       if (LRCLK_BRG == 4)
 534            *IM_BRGC5 = lrclk_brg;
 535#       endif
 536#       if (LRCLK_BRG == 5)
 537            *IM_BRGC6 = lrclk_brg;
 538#       endif
 539#       if (LRCLK_BRG == 6)
 540            *IM_BRGC7 = lrclk_brg;
 541#       endif
 542#       if (LRCLK_BRG == 7)
 543            *IM_BRGC8 = lrclk_brg;
 544#       endif
 545
 546        /*
 547         * Clear reset on MCLK BRG
 548         */
 549#       if (MCLK_BRG == 0)
 550            *IM_BRGC1 = mclk_brg & ~CPM_BRG_RST;
 551#       endif
 552#       if (MCLK_BRG == 1)
 553            *IM_BRGC2 = mclk_brg & ~CPM_BRG_RST;
 554#       endif
 555#       if (MCLK_BRG == 2)
 556            *IM_BRGC3 = mclk_brg & ~CPM_BRG_RST;
 557#       endif
 558#       if (MCLK_BRG == 3)
 559            *IM_BRGC4 = mclk_brg & ~CPM_BRG_RST;
 560#       endif
 561#       if (MCLK_BRG == 4)
 562            *IM_BRGC5 = mclk_brg & ~CPM_BRG_RST;
 563#       endif
 564#       if (MCLK_BRG == 5)
 565            *IM_BRGC6 = mclk_brg & ~CPM_BRG_RST;
 566#       endif
 567#       if (MCLK_BRG == 6)
 568            *IM_BRGC7 = mclk_brg & ~CPM_BRG_RST;
 569#       endif
 570#       if (MCLK_BRG == 7)
 571            *IM_BRGC8 = mclk_brg & ~CPM_BRG_RST;
 572#       endif
 573
 574        /*
 575         * Clear reset on SCLK BRG
 576         */
 577#       if (SCLK_BRG == 0)
 578            *IM_BRGC1 = sclk_brg & ~CPM_BRG_RST;
 579#       endif
 580#       if (SCLK_BRG == 1)
 581            *IM_BRGC2 = sclk_brg & ~CPM_BRG_RST;
 582#       endif
 583#       if (SCLK_BRG == 2)
 584            *IM_BRGC3 = sclk_brg & ~CPM_BRG_RST;
 585#       endif
 586#       if (SCLK_BRG == 3)
 587            *IM_BRGC4 = sclk_brg & ~CPM_BRG_RST;
 588#       endif
 589#       if (SCLK_BRG == 4)
 590            *IM_BRGC5 = sclk_brg & ~CPM_BRG_RST;
 591#       endif
 592#       if (SCLK_BRG == 5)
 593            *IM_BRGC6 = sclk_brg & ~CPM_BRG_RST;
 594#       endif
 595#       if (SCLK_BRG == 6)
 596            *IM_BRGC7 = sclk_brg & ~CPM_BRG_RST;
 597#       endif
 598#       if (SCLK_BRG == 7)
 599            *IM_BRGC8 = sclk_brg & ~CPM_BRG_RST;
 600#       endif
 601
 602        /*
 603         * Clear reset on LRCLK BRG
 604         */
 605#       if (LRCLK_BRG == 0)
 606            *IM_BRGC1 = lrclk_brg & ~CPM_BRG_RST;
 607#       endif
 608#       if (LRCLK_BRG == 1)
 609            *IM_BRGC2 = lrclk_brg & ~CPM_BRG_RST;
 610#       endif
 611#       if (LRCLK_BRG == 2)
 612            *IM_BRGC3 = lrclk_brg & ~CPM_BRG_RST;
 613#       endif
 614#       if (LRCLK_BRG == 3)
 615            *IM_BRGC4 = lrclk_brg & ~CPM_BRG_RST;
 616#       endif
 617#       if (LRCLK_BRG == 4)
 618            *IM_BRGC5 = lrclk_brg & ~CPM_BRG_RST;
 619#       endif
 620#       if (LRCLK_BRG == 5)
 621            *IM_BRGC6 = lrclk_brg & ~CPM_BRG_RST;
 622#       endif
 623#       if (LRCLK_BRG == 6)
 624            *IM_BRGC7 = lrclk_brg & ~CPM_BRG_RST;
 625#       endif
 626#       if (LRCLK_BRG == 7)
 627            *IM_BRGC8 = lrclk_brg & ~CPM_BRG_RST;
 628#       endif
 629
 630        /*
 631         * Restore the Interrupt state
 632         */
 633        if (flag) {
 634            enable_interrupts();
 635        }
 636#   else
 637        /*
 638         * Reset the clocks
 639         */
 640        Daq_BRG_Reset(MCLK_BRG);
 641        Daq_BRG_Reset(SCLK_BRG);
 642        Daq_BRG_Reset(LRCLK_BRG);
 643#   endif
 644}
 645
 646void Daq_Start_Clocks(int sample_rate)
 647
 648{
 649#ifdef TIGHTEN_UP_BRG_TIMING
 650    volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 651
 652    register uint mclk_brg;       /* MCLK  BRG value */
 653    register uint sclk_brg;       /* SCLK  BRG value */
 654    register uint temp_lrclk_brg; /* Temporary LRCLK BRG value */
 655    register uint real_lrclk_brg; /* Permanent LRCLK BRG value */
 656    uint          lrclk_brg;      /* LRCLK BRG value */
 657    unsigned long flags;          /* Interrupt flags */
 658    uint          sclk_cnt;       /* SCLK count */
 659    uint          delay_cnt;      /* Delay count */
 660#endif
 661
 662#   ifdef TIGHTEN_UP_BRG_TIMING
 663        /*
 664         * Obtain the enabled MCLK BRG value
 665         */
 666#       if (MCLK_BRG == 0)
 667            mclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
 668#       endif
 669#       if (MCLK_BRG == 1)
 670            mclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
 671#       endif
 672#       if (MCLK_BRG == 2)
 673            mclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
 674#       endif
 675#       if (MCLK_BRG == 3)
 676            mclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
 677#       endif
 678#       if (MCLK_BRG == 4)
 679            mclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
 680#       endif
 681#       if (MCLK_BRG == 5)
 682            mclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
 683#       endif
 684#       if (MCLK_BRG == 6)
 685            mclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
 686#       endif
 687#       if (MCLK_BRG == 7)
 688            mclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
 689#       endif
 690
 691        /*
 692         * Obtain the enabled SCLK BRG value
 693         */
 694#       if (SCLK_BRG == 0)
 695            sclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
 696#       endif
 697#       if (SCLK_BRG == 1)
 698            sclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
 699#       endif
 700#       if (SCLK_BRG == 2)
 701            sclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
 702#       endif
 703#       if (SCLK_BRG == 3)
 704            sclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
 705#       endif
 706#       if (SCLK_BRG == 4)
 707            sclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
 708#       endif
 709#       if (SCLK_BRG == 5)
 710            sclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
 711#       endif
 712#       if (SCLK_BRG == 6)
 713            sclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
 714#       endif
 715#       if (SCLK_BRG == 7)
 716            sclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
 717#       endif
 718
 719        /*
 720         * Obtain the enabled LRCLK BRG value
 721         */
 722#       if (LRCLK_BRG == 0)
 723            lrclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN;
 724#       endif
 725#       if (LRCLK_BRG == 1)
 726            lrclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN;
 727#       endif
 728#       if (LRCLK_BRG == 2)
 729            lrclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN;
 730#       endif
 731#       if (LRCLK_BRG == 3)
 732            lrclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN;
 733#       endif
 734#       if (LRCLK_BRG == 4)
 735            lrclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN;
 736#       endif
 737#       if (LRCLK_BRG == 5)
 738            lrclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN;
 739#       endif
 740#       if (LRCLK_BRG == 6)
 741            lrclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN;
 742#       endif
 743#       if (LRCLK_BRG == 7)
 744            lrclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN;
 745#       endif
 746
 747        /* Save off the real LRCLK value */
 748        real_lrclk_brg = lrclk_brg;
 749
 750        /* Obtain the current SCLK count */
 751        sclk_cnt  = ((sclk_brg & 0x00001FFE) >> 1) + 1;
 752
 753        /* Compute the delay as a function of SCLK count */
 754        delay_cnt = ((sclk_cnt / 4) - 2) * 10 + 6;
 755        if (DaqSampleRate == 43402) {
 756          delay_cnt++;
 757        }
 758
 759        /* Clear out the count */
 760        temp_lrclk_brg = sclk_brg & ~0x00001FFE;
 761
 762        /* Insert the count */
 763        temp_lrclk_brg |= ((delay_cnt + (sclk_cnt / 2) - 1) << 1) &  0x00001FFE;
 764
 765        /*
 766         * Disable interrupt and save the current state
 767         */
 768        flag = disable_interrupts();
 769
 770        /*
 771         * Enable MCLK BRG
 772         */
 773#       if (MCLK_BRG == 0)
 774            *IM_BRGC1 = mclk_brg;
 775#       endif
 776#       if (MCLK_BRG == 1)
 777            *IM_BRGC2 = mclk_brg;
 778#       endif
 779#       if (MCLK_BRG == 2)
 780            *IM_BRGC3 = mclk_brg;
 781#       endif
 782#       if (MCLK_BRG == 3)
 783            *IM_BRGC4 = mclk_brg;
 784#       endif
 785#       if (MCLK_BRG == 4)
 786            *IM_BRGC5 = mclk_brg;
 787#       endif
 788#       if (MCLK_BRG == 5)
 789            *IM_BRGC6 = mclk_brg;
 790#       endif
 791#       if (MCLK_BRG == 6)
 792            *IM_BRGC7 = mclk_brg;
 793#       endif
 794#       if (MCLK_BRG == 7)
 795            *IM_BRGC8 = mclk_brg;
 796#       endif
 797
 798        /*
 799         * Enable SCLK BRG
 800         */
 801#       if (SCLK_BRG == 0)
 802            *IM_BRGC1 = sclk_brg;
 803#       endif
 804#       if (SCLK_BRG == 1)
 805            *IM_BRGC2 = sclk_brg;
 806#       endif
 807#       if (SCLK_BRG == 2)
 808            *IM_BRGC3 = sclk_brg;
 809#       endif
 810#       if (SCLK_BRG == 3)
 811            *IM_BRGC4 = sclk_brg;
 812#       endif
 813#       if (SCLK_BRG == 4)
 814            *IM_BRGC5 = sclk_brg;
 815#       endif
 816#       if (SCLK_BRG == 5)
 817            *IM_BRGC6 = sclk_brg;
 818#       endif
 819#       if (SCLK_BRG == 6)
 820            *IM_BRGC7 = sclk_brg;
 821#       endif
 822#       if (SCLK_BRG == 7)
 823            *IM_BRGC8 = sclk_brg;
 824#       endif
 825
 826        /*
 827         * Enable LRCLK BRG (1st time - temporary)
 828         */
 829#       if (LRCLK_BRG == 0)
 830            *IM_BRGC1 = temp_lrclk_brg;
 831#       endif
 832#       if (LRCLK_BRG == 1)
 833            *IM_BRGC2 = temp_lrclk_brg;
 834#       endif
 835#       if (LRCLK_BRG == 2)
 836            *IM_BRGC3 = temp_lrclk_brg;
 837#       endif
 838#       if (LRCLK_BRG == 3)
 839            *IM_BRGC4 = temp_lrclk_brg;
 840#       endif
 841#       if (LRCLK_BRG == 4)
 842            *IM_BRGC5 = temp_lrclk_brg;
 843#       endif
 844#       if (LRCLK_BRG == 5)
 845            *IM_BRGC6 = temp_lrclk_brg;
 846#       endif
 847#       if (LRCLK_BRG == 6)
 848            *IM_BRGC7 = temp_lrclk_brg;
 849#       endif
 850#       if (LRCLK_BRG == 7)
 851            *IM_BRGC8 = temp_lrclk_brg;
 852#       endif
 853
 854        /*
 855         * Enable LRCLK BRG (2nd time - permanent)
 856         */
 857#       if (LRCLK_BRG == 0)
 858            *IM_BRGC1 = real_lrclk_brg;
 859#       endif
 860#       if (LRCLK_BRG == 1)
 861            *IM_BRGC2 = real_lrclk_brg;
 862#       endif
 863#       if (LRCLK_BRG == 2)
 864            *IM_BRGC3 = real_lrclk_brg;
 865#       endif
 866#       if (LRCLK_BRG == 3)
 867            *IM_BRGC4 = real_lrclk_brg;
 868#       endif
 869#       if (LRCLK_BRG == 4)
 870            *IM_BRGC5 = real_lrclk_brg;
 871#       endif
 872#       if (LRCLK_BRG == 5)
 873            *IM_BRGC6 = real_lrclk_brg;
 874#       endif
 875#       if (LRCLK_BRG == 6)
 876            *IM_BRGC7 = real_lrclk_brg;
 877#       endif
 878#       if (LRCLK_BRG == 7)
 879            *IM_BRGC8 = real_lrclk_brg;
 880#       endif
 881
 882        /*
 883         * Restore the Interrupt state
 884         */
 885        if (flag) {
 886            enable_interrupts();
 887        }
 888#   else
 889        /*
 890         * Enable the clocks
 891         */
 892        Daq_BRG_Enable(LRCLK_BRG);
 893        Daq_BRG_Enable(SCLK_BRG);
 894        Daq_BRG_Enable(MCLK_BRG);
 895#   endif
 896}
 897
 898void Daq_Display_Clocks(void)
 899
 900{
 901    volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
 902    uint mclk_divisor; /* Detected MCLK divisor */
 903    uint sclk_divisor; /* Detected SCLK divisor */
 904
 905    printf("\nBRG:\n");
 906    if (immr->im_brgc4 != 0) {
 907        printf("\tbrgc4\t0x%08x @ 0x%08x, %5d count, %d extc, %8s,  MCLK\n",
 908               immr->im_brgc4,
 909               (uint)&(immr->im_brgc4),
 910               Daq_BRG_Get_Count(3),
 911               Daq_BRG_Get_ExtClk(3),
 912               Daq_BRG_Get_ExtClk_Description(3));
 913    }
 914    if (immr->im_brgc8 != 0) {
 915        printf("\tbrgc8\t0x%08x @ 0x%08x, %5d count, %d extc, %8s,  SCLK\n",
 916               immr->im_brgc8,
 917               (uint)&(immr->im_brgc8),
 918               Daq_BRG_Get_Count(7),
 919               Daq_BRG_Get_ExtClk(7),
 920               Daq_BRG_Get_ExtClk_Description(7));
 921    }
 922    if (immr->im_brgc6 != 0) {
 923        printf("\tbrgc6\t0x%08x @ 0x%08x, %5d count, %d extc, %8s,  LRCLK\n",
 924               immr->im_brgc6,
 925               (uint)&(immr->im_brgc6),
 926               Daq_BRG_Get_Count(5),
 927               Daq_BRG_Get_ExtClk(5),
 928               Daq_BRG_Get_ExtClk_Description(5));
 929    }
 930    if (immr->im_brgc1 != 0) {
 931        printf("\tbrgc1\t0x%08x @ 0x%08x, %5d count, %d extc, %8s,  SMC1\n",
 932               immr->im_brgc1,
 933               (uint)&(immr->im_brgc1),
 934               Daq_BRG_Get_Count(0),
 935               Daq_BRG_Get_ExtClk(0),
 936               Daq_BRG_Get_ExtClk_Description(0));
 937    }
 938    if (immr->im_brgc2 != 0) {
 939        printf("\tbrgc2\t0x%08x @ 0x%08x, %5d count, %d extc, %8s,  SMC2\n",
 940               immr->im_brgc2,
 941               (uint)&(immr->im_brgc2),
 942               Daq_BRG_Get_Count(1),
 943               Daq_BRG_Get_ExtClk(1),
 944               Daq_BRG_Get_ExtClk_Description(1));
 945    }
 946    if (immr->im_brgc3 != 0) {
 947        printf("\tbrgc3\t0x%08x @ 0x%08x, %5d count, %d extc, %8s,  SCC1\n",
 948               immr->im_brgc3,
 949               (uint)&(immr->im_brgc3),
 950               Daq_BRG_Get_Count(2),
 951               Daq_BRG_Get_ExtClk(2),
 952               Daq_BRG_Get_ExtClk_Description(2));
 953    }
 954    if (immr->im_brgc5 != 0) {
 955        printf("\tbrgc5\t0x%08x @ 0x%08x, %5d count, %d extc, %8s\n",
 956               immr->im_brgc5,
 957               (uint)&(immr->im_brgc5),
 958               Daq_BRG_Get_Count(4),
 959               Daq_BRG_Get_ExtClk(4),
 960               Daq_BRG_Get_ExtClk_Description(4));
 961    }
 962    if (immr->im_brgc7 != 0) {
 963        printf("\tbrgc7\t0x%08x @ 0x%08x, %5d count, %d extc, %8s\n",
 964               immr->im_brgc7,
 965               (uint)&(immr->im_brgc7),
 966               Daq_BRG_Get_Count(6),
 967               Daq_BRG_Get_ExtClk(6),
 968               Daq_BRG_Get_ExtClk_Description(6));
 969    }
 970
 971#   ifdef RUN_SCLK_ON_BRG_INT
 972        mclk_divisor = Daq_BRG_Rate(MCLK_BRG) / Daq_BRG_Rate(SCLK_BRG);
 973#   else
 974        mclk_divisor = Daq_BRG_Get_Count(SCLK_BRG);
 975#   endif
 976#   ifdef RUN_LRCLK_ON_BRG_INT
 977        sclk_divisor = Daq_BRG_Rate(SCLK_BRG) / Daq_BRG_Rate(LRCLK_BRG);
 978#   else
 979        sclk_divisor = Daq_BRG_Get_Count(LRCLK_BRG);
 980#   endif
 981
 982    printf("\nADC/DAC Clocking (%d/%d):\n", sclk_divisor, mclk_divisor);
 983    printf("\tMCLK  %8d Hz, or %3dx SCLK, or %3dx LRCLK\n",
 984           Daq_BRG_Rate(MCLK_BRG),
 985           mclk_divisor,
 986           mclk_divisor * sclk_divisor);
 987#   ifdef RUN_SCLK_ON_BRG_INT
 988        printf("\tSCLK  %8d Hz, or %3dx LRCLK\n",
 989               Daq_BRG_Rate(SCLK_BRG),
 990               sclk_divisor);
 991#   else
 992        printf("\tSCLK  %8d Hz, or %3dx LRCLK\n",
 993               Daq_BRG_Rate(MCLK_BRG) / mclk_divisor,
 994               sclk_divisor);
 995#   endif
 996#   ifdef RUN_LRCLK_ON_BRG_INT
 997        printf("\tLRCLK %8d Hz\n",
 998               Daq_BRG_Rate(LRCLK_BRG));
 999#   else
1000#       ifdef RUN_SCLK_ON_BRG_INT
1001            printf("\tLRCLK %8d Hz\n",
1002                   Daq_BRG_Rate(SCLK_BRG) / sclk_divisor);
1003#       else
1004            printf("\tLRCLK %8d Hz\n",
1005                   Daq_BRG_Rate(MCLK_BRG) / (mclk_divisor * sclk_divisor));
1006#       endif
1007#   endif
1008    printf("\n");
1009}
1010