clkinit.c 24 KB

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