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