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