clock.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487
  1. /*
  2. *
  3. * arch/arm/mach-u300/clock.c
  4. *
  5. *
  6. * Copyright (C) 2007-2009 ST-Ericsson AB
  7. * License terms: GNU General Public License (GPL) version 2
  8. * Define clocks in the app platform.
  9. * Author: Linus Walleij <linus.walleij@stericsson.com>
  10. * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
  11. *
  12. */
  13. #include <linux/module.h>
  14. #include <linux/kernel.h>
  15. #include <linux/list.h>
  16. #include <linux/errno.h>
  17. #include <linux/err.h>
  18. #include <linux/string.h>
  19. #include <linux/clk.h>
  20. #include <linux/mutex.h>
  21. #include <linux/spinlock.h>
  22. #include <linux/debugfs.h>
  23. #include <linux/device.h>
  24. #include <linux/init.h>
  25. #include <linux/timer.h>
  26. #include <linux/io.h>
  27. #include <asm/clkdev.h>
  28. #include <mach/hardware.h>
  29. #include <mach/syscon.h>
  30. #include "clock.h"
  31. /*
  32. * TODO:
  33. * - move all handling of the CCR register into this file and create
  34. * a spinlock for the CCR register
  35. * - switch to the clkdevice lookup mechanism that maps clocks to
  36. * device ID:s instead when it becomes available in kernel 2.6.29.
  37. * - implement rate get/set for all clocks that need it.
  38. */
  39. /*
  40. * Syscon clock I/O registers lock so clock requests don't collide
  41. * NOTE: this is a local lock only used to lock access to clock and
  42. * reset registers in syscon.
  43. */
  44. static DEFINE_SPINLOCK(syscon_clkreg_lock);
  45. static DEFINE_SPINLOCK(syscon_resetreg_lock);
  46. /*
  47. * The clocking hierarchy currently looks like this.
  48. * NOTE: the idea is NOT to show how the clocks are routed on the chip!
  49. * The ideas is to show dependencies, so a clock higher up in the
  50. * hierarchy has to be on in order for another clock to be on. Now,
  51. * both CPU and DMA can actually be on top of the hierarchy, and that
  52. * is not modeled currently. Instead we have the backbone AMBA bus on
  53. * top. This bus cannot be programmed in any way but conceptually it
  54. * needs to be active for the bridges and devices to transport data.
  55. *
  56. * Please be aware that a few clocks are hw controlled, which mean that
  57. * the hw itself can turn on/off or change the rate of the clock when
  58. * needed!
  59. *
  60. * AMBA bus
  61. * |
  62. * +- CPU
  63. * +- NANDIF NAND Flash interface
  64. * +- SEMI Shared Memory interface
  65. * +- ISP Image Signal Processor (U335 only)
  66. * +- CDS (U335 only)
  67. * +- DMA Direct Memory Access Controller
  68. * +- AAIF APP/ACC Inteface (Mobile Scalable Link, MSL)
  69. * +- APEX
  70. * +- VIDEO_ENC AVE2/3 Video Encoder
  71. * +- XGAM Graphics Accelerator Controller
  72. * +- AHB
  73. * |
  74. * +- ahb:0 AHB Bridge
  75. * | |
  76. * | +- ahb:1 INTCON Interrupt controller
  77. * | +- ahb:3 MSPRO Memory Stick Pro controller
  78. * | +- ahb:4 EMIF External Memory interface
  79. * |
  80. * +- fast:0 FAST bridge
  81. * | |
  82. * | +- fast:1 MMCSD MMC/SD card reader controller
  83. * | +- fast:2 I2S0 PCM I2S channel 0 controller
  84. * | +- fast:3 I2S1 PCM I2S channel 1 controller
  85. * | +- fast:4 I2C0 I2C channel 0 controller
  86. * | +- fast:5 I2C1 I2C channel 1 controller
  87. * | +- fast:6 SPI SPI controller
  88. * | +- fast:7 UART1 Secondary UART (U335 only)
  89. * |
  90. * +- slow:0 SLOW bridge
  91. * |
  92. * +- slow:1 SYSCON (not possible to control)
  93. * +- slow:2 WDOG Watchdog
  94. * +- slow:3 UART0 primary UART
  95. * +- slow:4 TIMER_APP Application timer - used in Linux
  96. * +- slow:5 KEYPAD controller
  97. * +- slow:6 GPIO controller
  98. * +- slow:7 RTC controller
  99. * +- slow:8 BT Bus Tracer (not used currently)
  100. * +- slow:9 EH Event Handler (not used currently)
  101. * +- slow:a TIMER_ACC Access style timer (not used currently)
  102. * +- slow:b PPM (U335 only, what is that?)
  103. */
  104. /*
  105. * Reset control functions. We remember if a block has been
  106. * taken out of reset and don't remove the reset assertion again
  107. * and vice versa. Currently we only remove resets so the
  108. * enablement function is defined out.
  109. */
  110. static void syscon_block_reset_enable(struct clk *clk)
  111. {
  112. u16 val;
  113. unsigned long iflags;
  114. /* Not all blocks support resetting */
  115. if (!clk->res_reg || !clk->res_mask)
  116. return;
  117. spin_lock_irqsave(&syscon_resetreg_lock, iflags);
  118. val = readw(clk->res_reg);
  119. val |= clk->res_mask;
  120. writew(val, clk->res_reg);
  121. spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
  122. clk->reset = true;
  123. }
  124. static void syscon_block_reset_disable(struct clk *clk)
  125. {
  126. u16 val;
  127. unsigned long iflags;
  128. /* Not all blocks support resetting */
  129. if (!clk->res_reg || !clk->res_mask)
  130. return;
  131. spin_lock_irqsave(&syscon_resetreg_lock, iflags);
  132. val = readw(clk->res_reg);
  133. val &= ~clk->res_mask;
  134. writew(val, clk->res_reg);
  135. spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
  136. clk->reset = false;
  137. }
  138. int __clk_get(struct clk *clk)
  139. {
  140. u16 val;
  141. /* The MMC and MSPRO clocks need some special set-up */
  142. if (!strcmp(clk->name, "MCLK")) {
  143. /* Set default MMC clock divisor to 18.9 MHz */
  144. writew(0x0054U, U300_SYSCON_VBASE + U300_SYSCON_MMF0R);
  145. val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR);
  146. /* Disable the MMC feedback clock */
  147. val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
  148. /* Disable MSPRO frequency */
  149. val &= ~U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
  150. writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR);
  151. }
  152. if (!strcmp(clk->name, "MSPRO")) {
  153. val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMCR);
  154. /* Disable the MMC feedback clock */
  155. val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
  156. /* Enable MSPRO frequency */
  157. val |= U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
  158. writew(val, U300_SYSCON_VBASE + U300_SYSCON_MMCR);
  159. }
  160. return 1;
  161. }
  162. EXPORT_SYMBOL(__clk_get);
  163. void __clk_put(struct clk *clk)
  164. {
  165. }
  166. EXPORT_SYMBOL(__clk_put);
  167. static void syscon_clk_disable(struct clk *clk)
  168. {
  169. unsigned long iflags;
  170. /* Don't touch the hardware controlled clocks */
  171. if (clk->hw_ctrld)
  172. return;
  173. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  174. writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCDR);
  175. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  176. }
  177. static void syscon_clk_enable(struct clk *clk)
  178. {
  179. unsigned long iflags;
  180. /* Don't touch the hardware controlled clocks */
  181. if (clk->hw_ctrld)
  182. return;
  183. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  184. writew(clk->clk_val, U300_SYSCON_VBASE + U300_SYSCON_SBCER);
  185. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  186. }
  187. static u16 syscon_clk_get_rate(void)
  188. {
  189. u16 val;
  190. unsigned long iflags;
  191. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  192. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
  193. val &= U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
  194. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  195. return val;
  196. }
  197. #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER
  198. static void enable_i2s0_vcxo(void)
  199. {
  200. u16 val;
  201. unsigned long iflags;
  202. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  203. /* Set I2S0 to use the VCXO 26 MHz clock */
  204. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
  205. val |= U300_SYSCON_CCR_TURN_VCXO_ON;
  206. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  207. val |= U300_SYSCON_CCR_I2S0_USE_VCXO;
  208. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  209. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  210. val |= U300_SYSCON_CEFR_I2S0_CLK_EN;
  211. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  212. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  213. }
  214. static void enable_i2s1_vcxo(void)
  215. {
  216. u16 val;
  217. unsigned long iflags;
  218. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  219. /* Set I2S1 to use the VCXO 26 MHz clock */
  220. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
  221. val |= U300_SYSCON_CCR_TURN_VCXO_ON;
  222. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  223. val |= U300_SYSCON_CCR_I2S1_USE_VCXO;
  224. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  225. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  226. val |= U300_SYSCON_CEFR_I2S1_CLK_EN;
  227. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  228. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  229. }
  230. static void disable_i2s0_vcxo(void)
  231. {
  232. u16 val;
  233. unsigned long iflags;
  234. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  235. /* Disable I2S0 use of the VCXO 26 MHz clock */
  236. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
  237. val &= ~U300_SYSCON_CCR_I2S0_USE_VCXO;
  238. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  239. /* Deactivate VCXO if noone else is using VCXO */
  240. if (!(val & U300_SYSCON_CCR_I2S1_USE_VCXO))
  241. val &= ~U300_SYSCON_CCR_TURN_VCXO_ON;
  242. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  243. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  244. val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN;
  245. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  246. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  247. }
  248. static void disable_i2s1_vcxo(void)
  249. {
  250. u16 val;
  251. unsigned long iflags;
  252. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  253. /* Disable I2S1 use of the VCXO 26 MHz clock */
  254. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
  255. val &= ~U300_SYSCON_CCR_I2S1_USE_VCXO;
  256. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  257. /* Deactivate VCXO if noone else is using VCXO */
  258. if (!(val & U300_SYSCON_CCR_I2S0_USE_VCXO))
  259. val &= ~U300_SYSCON_CCR_TURN_VCXO_ON;
  260. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  261. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  262. val &= ~U300_SYSCON_CEFR_I2S0_CLK_EN;
  263. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CEFR);
  264. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  265. }
  266. #endif /* CONFIG_MACH_U300_USE_I2S_AS_MASTER */
  267. static void syscon_clk_rate_set_mclk(unsigned long rate)
  268. {
  269. u16 val;
  270. u32 reg;
  271. unsigned long iflags;
  272. switch (rate) {
  273. case 18900000:
  274. val = 0x0054;
  275. break;
  276. case 20800000:
  277. val = 0x0044;
  278. break;
  279. case 23100000:
  280. val = 0x0043;
  281. break;
  282. case 26000000:
  283. val = 0x0033;
  284. break;
  285. case 29700000:
  286. val = 0x0032;
  287. break;
  288. case 34700000:
  289. val = 0x0022;
  290. break;
  291. case 41600000:
  292. val = 0x0021;
  293. break;
  294. case 52000000:
  295. val = 0x0011;
  296. break;
  297. case 104000000:
  298. val = 0x0000;
  299. break;
  300. default:
  301. printk(KERN_ERR "Trying to set MCLK to unknown speed! %ld\n",
  302. rate);
  303. return;
  304. }
  305. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  306. reg = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) &
  307. ~U300_SYSCON_MMF0R_MASK;
  308. writew(reg | val, U300_SYSCON_VBASE + U300_SYSCON_MMF0R);
  309. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  310. }
  311. void syscon_clk_rate_set_cpuclk(unsigned long rate)
  312. {
  313. u16 val;
  314. unsigned long iflags;
  315. switch (rate) {
  316. case 13000000:
  317. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER;
  318. break;
  319. case 52000000:
  320. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE;
  321. break;
  322. case 104000000:
  323. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH;
  324. break;
  325. case 208000000:
  326. val = U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST;
  327. break;
  328. default:
  329. return;
  330. }
  331. spin_lock_irqsave(&syscon_clkreg_lock, iflags);
  332. val |= readw(U300_SYSCON_VBASE + U300_SYSCON_CCR) &
  333. ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK ;
  334. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  335. spin_unlock_irqrestore(&syscon_clkreg_lock, iflags);
  336. }
  337. EXPORT_SYMBOL(syscon_clk_rate_set_cpuclk);
  338. void clk_disable(struct clk *clk)
  339. {
  340. unsigned long iflags;
  341. spin_lock_irqsave(&clk->lock, iflags);
  342. if (clk->usecount > 0 && !(--clk->usecount)) {
  343. /* some blocks lack clocking registers and cannot be disabled */
  344. if (clk->disable)
  345. clk->disable(clk);
  346. if (likely((u32)clk->parent))
  347. clk_disable(clk->parent);
  348. }
  349. #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER
  350. if (unlikely(!strcmp(clk->name, "I2S0")))
  351. disable_i2s0_vcxo();
  352. if (unlikely(!strcmp(clk->name, "I2S1")))
  353. disable_i2s1_vcxo();
  354. #endif
  355. spin_unlock_irqrestore(&clk->lock, iflags);
  356. }
  357. EXPORT_SYMBOL(clk_disable);
  358. int clk_enable(struct clk *clk)
  359. {
  360. int ret = 0;
  361. unsigned long iflags;
  362. spin_lock_irqsave(&clk->lock, iflags);
  363. if (clk->usecount++ == 0) {
  364. if (likely((u32)clk->parent))
  365. ret = clk_enable(clk->parent);
  366. if (unlikely(ret != 0))
  367. clk->usecount--;
  368. else {
  369. /* remove reset line (we never enable reset again) */
  370. syscon_block_reset_disable(clk);
  371. /* clocks without enable function are always on */
  372. if (clk->enable)
  373. clk->enable(clk);
  374. #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER
  375. if (unlikely(!strcmp(clk->name, "I2S0")))
  376. enable_i2s0_vcxo();
  377. if (unlikely(!strcmp(clk->name, "I2S1")))
  378. enable_i2s1_vcxo();
  379. #endif
  380. }
  381. }
  382. spin_unlock_irqrestore(&clk->lock, iflags);
  383. return ret;
  384. }
  385. EXPORT_SYMBOL(clk_enable);
  386. /* Returns the clock rate in Hz */
  387. static unsigned long clk_get_rate_cpuclk(struct clk *clk)
  388. {
  389. u16 val;
  390. val = syscon_clk_get_rate();
  391. switch (val) {
  392. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  393. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  394. return 13000000;
  395. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  396. return 52000000;
  397. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  398. return 104000000;
  399. case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
  400. return 208000000;
  401. default:
  402. break;
  403. }
  404. return clk->rate;
  405. }
  406. static unsigned long clk_get_rate_ahb_clk(struct clk *clk)
  407. {
  408. u16 val;
  409. val = syscon_clk_get_rate();
  410. switch (val) {
  411. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  412. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  413. return 6500000;
  414. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  415. return 26000000;
  416. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  417. case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
  418. return 52000000;
  419. default:
  420. break;
  421. }
  422. return clk->rate;
  423. }
  424. static unsigned long clk_get_rate_emif_clk(struct clk *clk)
  425. {
  426. u16 val;
  427. val = syscon_clk_get_rate();
  428. switch (val) {
  429. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  430. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  431. return 13000000;
  432. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  433. return 52000000;
  434. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  435. case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
  436. return 104000000;
  437. default:
  438. break;
  439. }
  440. return clk->rate;
  441. }
  442. static unsigned long clk_get_rate_xgamclk(struct clk *clk)
  443. {
  444. u16 val;
  445. val = syscon_clk_get_rate();
  446. switch (val) {
  447. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  448. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  449. return 6500000;
  450. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  451. return 26000000;
  452. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  453. case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
  454. return 52000000;
  455. default:
  456. break;
  457. }
  458. return clk->rate;
  459. }
  460. static unsigned long clk_get_rate_mclk(struct clk *clk)
  461. {
  462. u16 val;
  463. val = syscon_clk_get_rate();
  464. switch (val) {
  465. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  466. /*
  467. * Here, the 208 MHz PLL gets shut down and the always
  468. * on 13 MHz PLL used for RTC etc kicks into use
  469. * instead.
  470. */
  471. return 13000000;
  472. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  473. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  474. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  475. case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
  476. {
  477. /*
  478. * This clock is under program control. The register is
  479. * divided in two nybbles, bit 7-4 gives cycles-1 to count
  480. * high, bit 3-0 gives cycles-1 to count low. Distribute
  481. * these with no more than 1 cycle difference between
  482. * low and high and add low and high to get the actual
  483. * divisor. The base PLL is 208 MHz. Writing 0x00 will
  484. * divide by 1 and 1 so the highest frequency possible
  485. * is 104 MHz.
  486. *
  487. * e.g. 0x54 =>
  488. * f = 208 / ((5+1) + (4+1)) = 208 / 11 = 18.9 MHz
  489. */
  490. u16 val = readw(U300_SYSCON_VBASE + U300_SYSCON_MMF0R) &
  491. U300_SYSCON_MMF0R_MASK;
  492. switch (val) {
  493. case 0x0054:
  494. return 18900000;
  495. case 0x0044:
  496. return 20800000;
  497. case 0x0043:
  498. return 23100000;
  499. case 0x0033:
  500. return 26000000;
  501. case 0x0032:
  502. return 29700000;
  503. case 0x0022:
  504. return 34700000;
  505. case 0x0021:
  506. return 41600000;
  507. case 0x0011:
  508. return 52000000;
  509. case 0x0000:
  510. return 104000000;
  511. default:
  512. break;
  513. }
  514. }
  515. default:
  516. break;
  517. }
  518. return clk->rate;
  519. }
  520. static unsigned long clk_get_rate_i2s_i2c_spi(struct clk *clk)
  521. {
  522. u16 val;
  523. val = syscon_clk_get_rate();
  524. switch (val) {
  525. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
  526. case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
  527. return 13000000;
  528. case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
  529. case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
  530. case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
  531. return 26000000;
  532. default:
  533. break;
  534. }
  535. return clk->rate;
  536. }
  537. unsigned long clk_get_rate(struct clk *clk)
  538. {
  539. if (clk->get_rate)
  540. return clk->get_rate(clk);
  541. else
  542. return clk->rate;
  543. }
  544. EXPORT_SYMBOL(clk_get_rate);
  545. static unsigned long clk_round_rate_mclk(struct clk *clk, unsigned long rate)
  546. {
  547. if (rate >= 18900000)
  548. return 18900000;
  549. if (rate >= 20800000)
  550. return 20800000;
  551. if (rate >= 23100000)
  552. return 23100000;
  553. if (rate >= 26000000)
  554. return 26000000;
  555. if (rate >= 29700000)
  556. return 29700000;
  557. if (rate >= 34700000)
  558. return 34700000;
  559. if (rate >= 41600000)
  560. return 41600000;
  561. if (rate >= 52000000)
  562. return 52000000;
  563. return -EINVAL;
  564. }
  565. static unsigned long clk_round_rate_cpuclk(struct clk *clk, unsigned long rate)
  566. {
  567. if (rate >= 13000000)
  568. return 13000000;
  569. if (rate >= 52000000)
  570. return 52000000;
  571. if (rate >= 104000000)
  572. return 104000000;
  573. if (rate >= 208000000)
  574. return 208000000;
  575. return -EINVAL;
  576. }
  577. /*
  578. * This adjusts a requested rate to the closest exact rate
  579. * a certain clock can provide. For a fixed clock it's
  580. * mostly clk->rate.
  581. */
  582. long clk_round_rate(struct clk *clk, unsigned long rate)
  583. {
  584. /* TODO: get apropriate switches for EMIFCLK, AHBCLK and MCLK */
  585. /* Else default to fixed value */
  586. if (clk->round_rate) {
  587. return (long) clk->round_rate(clk, rate);
  588. } else {
  589. printk(KERN_ERR "clock: Failed to round rate of %s\n",
  590. clk->name);
  591. }
  592. return (long) clk->rate;
  593. }
  594. EXPORT_SYMBOL(clk_round_rate);
  595. static int clk_set_rate_mclk(struct clk *clk, unsigned long rate)
  596. {
  597. syscon_clk_rate_set_mclk(clk_round_rate(clk, rate));
  598. return 0;
  599. }
  600. static int clk_set_rate_cpuclk(struct clk *clk, unsigned long rate)
  601. {
  602. syscon_clk_rate_set_cpuclk(clk_round_rate(clk, rate));
  603. return 0;
  604. }
  605. int clk_set_rate(struct clk *clk, unsigned long rate)
  606. {
  607. /* TODO: set for EMIFCLK and AHBCLK */
  608. /* Else assume the clock is fixed and fail */
  609. if (clk->set_rate) {
  610. return clk->set_rate(clk, rate);
  611. } else {
  612. printk(KERN_ERR "clock: Failed to set %s to %ld hz\n",
  613. clk->name, rate);
  614. return -EINVAL;
  615. }
  616. }
  617. EXPORT_SYMBOL(clk_set_rate);
  618. /*
  619. * Clock definitions. The clock parents are set to respective
  620. * bridge and the clock framework makes sure that the clocks have
  621. * parents activated and are brought out of reset when in use.
  622. *
  623. * Clocks that have hw_ctrld = true are hw controlled, and the hw
  624. * can by itself turn these clocks on and off.
  625. * So in other words, we don't really have to care about them.
  626. */
  627. static struct clk amba_clk = {
  628. .name = "AMBA",
  629. .rate = 52000000, /* this varies! */
  630. .hw_ctrld = true,
  631. .reset = false,
  632. };
  633. /*
  634. * These blocks are connected directly to the AMBA bus
  635. * with no bridge.
  636. */
  637. static struct clk cpu_clk = {
  638. .name = "CPU",
  639. .parent = &amba_clk,
  640. .rate = 208000000, /* this varies! */
  641. .hw_ctrld = true,
  642. .reset = true,
  643. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  644. .res_mask = U300_SYSCON_RRR_CPU_RESET_EN,
  645. .set_rate = clk_set_rate_cpuclk,
  646. .get_rate = clk_get_rate_cpuclk,
  647. .round_rate = clk_round_rate_cpuclk,
  648. };
  649. static struct clk nandif_clk = {
  650. .name = "NANDIF",
  651. .parent = &amba_clk,
  652. .hw_ctrld = false,
  653. .reset = true,
  654. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  655. .res_mask = U300_SYSCON_RRR_NANDIF_RESET_EN,
  656. .clk_val = U300_SYSCON_SBCER_NANDIF_CLK_EN,
  657. .enable = syscon_clk_enable,
  658. .disable = syscon_clk_disable,
  659. };
  660. static struct clk semi_clk = {
  661. .name = "SEMI",
  662. .parent = &amba_clk,
  663. .rate = 0, /* FIXME */
  664. /* It is not possible to reset SEMI */
  665. .hw_ctrld = false,
  666. .reset = false,
  667. .clk_val = U300_SYSCON_SBCER_SEMI_CLK_EN,
  668. .enable = syscon_clk_enable,
  669. .disable = syscon_clk_disable,
  670. };
  671. #ifdef CONFIG_MACH_U300_BS335
  672. static struct clk isp_clk = {
  673. .name = "ISP",
  674. .parent = &amba_clk,
  675. .rate = 0, /* FIXME */
  676. .hw_ctrld = false,
  677. .reset = true,
  678. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  679. .res_mask = U300_SYSCON_RRR_ISP_RESET_EN,
  680. .clk_val = U300_SYSCON_SBCER_ISP_CLK_EN,
  681. .enable = syscon_clk_enable,
  682. .disable = syscon_clk_disable,
  683. };
  684. static struct clk cds_clk = {
  685. .name = "CDS",
  686. .parent = &amba_clk,
  687. .rate = 0, /* FIXME */
  688. .hw_ctrld = false,
  689. .reset = true,
  690. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  691. .res_mask = U300_SYSCON_RRR_CDS_RESET_EN,
  692. .clk_val = U300_SYSCON_SBCER_CDS_CLK_EN,
  693. .enable = syscon_clk_enable,
  694. .disable = syscon_clk_disable,
  695. };
  696. #endif
  697. static struct clk dma_clk = {
  698. .name = "DMA",
  699. .parent = &amba_clk,
  700. .rate = 52000000, /* this varies! */
  701. .hw_ctrld = true,
  702. .reset = true,
  703. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  704. .res_mask = U300_SYSCON_RRR_DMAC_RESET_EN,
  705. .clk_val = U300_SYSCON_SBCER_DMAC_CLK_EN,
  706. .enable = syscon_clk_enable,
  707. .disable = syscon_clk_disable,
  708. };
  709. static struct clk aaif_clk = {
  710. .name = "AAIF",
  711. .parent = &amba_clk,
  712. .rate = 52000000, /* this varies! */
  713. .hw_ctrld = true,
  714. .reset = true,
  715. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  716. .res_mask = U300_SYSCON_RRR_AAIF_RESET_EN,
  717. .clk_val = U300_SYSCON_SBCER_AAIF_CLK_EN,
  718. .enable = syscon_clk_enable,
  719. .disable = syscon_clk_disable,
  720. };
  721. static struct clk apex_clk = {
  722. .name = "APEX",
  723. .parent = &amba_clk,
  724. .rate = 0, /* FIXME */
  725. .hw_ctrld = true,
  726. .reset = true,
  727. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  728. .res_mask = U300_SYSCON_RRR_APEX_RESET_EN,
  729. .clk_val = U300_SYSCON_SBCER_APEX_CLK_EN,
  730. .enable = syscon_clk_enable,
  731. .disable = syscon_clk_disable,
  732. };
  733. static struct clk video_enc_clk = {
  734. .name = "VIDEO_ENC",
  735. .parent = &amba_clk,
  736. .rate = 208000000, /* this varies! */
  737. .hw_ctrld = false,
  738. .reset = false,
  739. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  740. /* This has XGAM in the name but refers to the video encoder */
  741. .res_mask = U300_SYSCON_RRR_XGAM_VC_SYNC_RESET_EN,
  742. .clk_val = U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN,
  743. .enable = syscon_clk_enable,
  744. .disable = syscon_clk_disable,
  745. };
  746. static struct clk xgam_clk = {
  747. .name = "XGAMCLK",
  748. .parent = &amba_clk,
  749. .rate = 52000000, /* this varies! */
  750. .hw_ctrld = false,
  751. .reset = true,
  752. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  753. .res_mask = U300_SYSCON_RRR_XGAM_RESET_EN,
  754. .clk_val = U300_SYSCON_SBCER_XGAM_CLK_EN,
  755. .get_rate = clk_get_rate_xgamclk,
  756. .enable = syscon_clk_enable,
  757. .disable = syscon_clk_disable,
  758. };
  759. /* This clock is used to activate the video encoder */
  760. static struct clk ahb_clk = {
  761. .name = "AHB",
  762. .parent = &amba_clk,
  763. .rate = 52000000, /* this varies! */
  764. .hw_ctrld = false, /* This one is set to false due to HW bug */
  765. .reset = true,
  766. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  767. .res_mask = U300_SYSCON_RRR_AHB_RESET_EN,
  768. .clk_val = U300_SYSCON_SBCER_AHB_CLK_EN,
  769. .enable = syscon_clk_enable,
  770. .disable = syscon_clk_disable,
  771. .get_rate = clk_get_rate_ahb_clk,
  772. };
  773. /*
  774. * Clocks on the AHB bridge
  775. */
  776. static struct clk ahb_subsys_clk = {
  777. .name = "AHB_SUBSYS",
  778. .parent = &amba_clk,
  779. .rate = 52000000, /* this varies! */
  780. .hw_ctrld = true,
  781. .reset = false,
  782. .clk_val = U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN,
  783. .enable = syscon_clk_enable,
  784. .disable = syscon_clk_disable,
  785. .get_rate = clk_get_rate_ahb_clk,
  786. };
  787. static struct clk intcon_clk = {
  788. .name = "INTCON",
  789. .parent = &ahb_subsys_clk,
  790. .rate = 52000000, /* this varies! */
  791. .hw_ctrld = false,
  792. .reset = true,
  793. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  794. .res_mask = U300_SYSCON_RRR_INTCON_RESET_EN,
  795. /* INTCON can be reset but not clock-gated */
  796. };
  797. static struct clk mspro_clk = {
  798. .name = "MSPRO",
  799. .parent = &ahb_subsys_clk,
  800. .rate = 0, /* FIXME */
  801. .hw_ctrld = false,
  802. .reset = true,
  803. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  804. .res_mask = U300_SYSCON_RRR_MSPRO_RESET_EN,
  805. .clk_val = U300_SYSCON_SBCER_MSPRO_CLK_EN,
  806. .enable = syscon_clk_enable,
  807. .disable = syscon_clk_disable,
  808. };
  809. static struct clk emif_clk = {
  810. .name = "EMIF",
  811. .parent = &ahb_subsys_clk,
  812. .rate = 104000000, /* this varies! */
  813. .hw_ctrld = false,
  814. .reset = true,
  815. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
  816. .res_mask = U300_SYSCON_RRR_EMIF_RESET_EN,
  817. .clk_val = U300_SYSCON_SBCER_EMIF_CLK_EN,
  818. .enable = syscon_clk_enable,
  819. .disable = syscon_clk_disable,
  820. .get_rate = clk_get_rate_emif_clk,
  821. };
  822. /*
  823. * Clocks on the FAST bridge
  824. */
  825. static struct clk fast_clk = {
  826. .name = "FAST_BRIDGE",
  827. .parent = &amba_clk,
  828. .rate = 13000000, /* this varies! */
  829. .hw_ctrld = true,
  830. .reset = true,
  831. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  832. .res_mask = U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE,
  833. .clk_val = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN,
  834. .enable = syscon_clk_enable,
  835. .disable = syscon_clk_disable,
  836. };
  837. static struct clk mmcsd_clk = {
  838. .name = "MCLK",
  839. .parent = &fast_clk,
  840. .rate = 18900000, /* this varies! */
  841. .hw_ctrld = false,
  842. .reset = true,
  843. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  844. .res_mask = U300_SYSCON_RFR_MMC_RESET_ENABLE,
  845. .clk_val = U300_SYSCON_SBCER_MMC_CLK_EN,
  846. .get_rate = clk_get_rate_mclk,
  847. .set_rate = clk_set_rate_mclk,
  848. .round_rate = clk_round_rate_mclk,
  849. .disable = syscon_clk_disable,
  850. .enable = syscon_clk_enable,
  851. };
  852. static struct clk i2s0_clk = {
  853. .name = "i2s0",
  854. .parent = &fast_clk,
  855. .rate = 26000000, /* this varies! */
  856. .hw_ctrld = true,
  857. .reset = true,
  858. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  859. .res_mask = U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE,
  860. .clk_val = U300_SYSCON_SBCER_I2S0_CORE_CLK_EN,
  861. .enable = syscon_clk_enable,
  862. .disable = syscon_clk_disable,
  863. .get_rate = clk_get_rate_i2s_i2c_spi,
  864. };
  865. static struct clk i2s1_clk = {
  866. .name = "i2s1",
  867. .parent = &fast_clk,
  868. .rate = 26000000, /* this varies! */
  869. .hw_ctrld = true,
  870. .reset = true,
  871. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  872. .res_mask = U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE,
  873. .clk_val = U300_SYSCON_SBCER_I2S1_CORE_CLK_EN,
  874. .enable = syscon_clk_enable,
  875. .disable = syscon_clk_disable,
  876. .get_rate = clk_get_rate_i2s_i2c_spi,
  877. };
  878. static struct clk i2c0_clk = {
  879. .name = "I2C0",
  880. .parent = &fast_clk,
  881. .rate = 26000000, /* this varies! */
  882. .hw_ctrld = false,
  883. .reset = true,
  884. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  885. .res_mask = U300_SYSCON_RFR_I2C0_RESET_ENABLE,
  886. .clk_val = U300_SYSCON_SBCER_I2C0_CLK_EN,
  887. .enable = syscon_clk_enable,
  888. .disable = syscon_clk_disable,
  889. .get_rate = clk_get_rate_i2s_i2c_spi,
  890. };
  891. static struct clk i2c1_clk = {
  892. .name = "I2C1",
  893. .parent = &fast_clk,
  894. .rate = 26000000, /* this varies! */
  895. .hw_ctrld = false,
  896. .reset = true,
  897. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  898. .res_mask = U300_SYSCON_RFR_I2C1_RESET_ENABLE,
  899. .clk_val = U300_SYSCON_SBCER_I2C1_CLK_EN,
  900. .enable = syscon_clk_enable,
  901. .disable = syscon_clk_disable,
  902. .get_rate = clk_get_rate_i2s_i2c_spi,
  903. };
  904. static struct clk spi_clk = {
  905. .name = "SPI",
  906. .parent = &fast_clk,
  907. .rate = 26000000, /* this varies! */
  908. .hw_ctrld = false,
  909. .reset = true,
  910. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  911. .res_mask = U300_SYSCON_RFR_SPI_RESET_ENABLE,
  912. .clk_val = U300_SYSCON_SBCER_SPI_CLK_EN,
  913. .enable = syscon_clk_enable,
  914. .disable = syscon_clk_disable,
  915. .get_rate = clk_get_rate_i2s_i2c_spi,
  916. };
  917. #ifdef CONFIG_MACH_U300_BS335
  918. static struct clk uart1_clk = {
  919. .name = "UART1",
  920. .parent = &fast_clk,
  921. .rate = 13000000,
  922. .hw_ctrld = false,
  923. .reset = true,
  924. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RFR,
  925. .res_mask = U300_SYSCON_RFR_UART1_RESET_ENABLE,
  926. .clk_val = U300_SYSCON_SBCER_UART1_CLK_EN,
  927. .enable = syscon_clk_enable,
  928. .disable = syscon_clk_disable,
  929. };
  930. #endif
  931. /*
  932. * Clocks on the SLOW bridge
  933. */
  934. static struct clk slow_clk = {
  935. .name = "SLOW_BRIDGE",
  936. .parent = &amba_clk,
  937. .rate = 13000000,
  938. .hw_ctrld = true,
  939. .reset = true,
  940. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  941. .res_mask = U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN,
  942. .clk_val = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN,
  943. .enable = syscon_clk_enable,
  944. .disable = syscon_clk_disable,
  945. };
  946. /* TODO: implement SYSCON clock? */
  947. static struct clk wdog_clk = {
  948. .name = "WDOG",
  949. .parent = &slow_clk,
  950. .hw_ctrld = false,
  951. .rate = 32768,
  952. .reset = false,
  953. /* This is always on, cannot be enabled/disabled or reset */
  954. };
  955. /* This one is hardwired to PLL13 */
  956. static struct clk uart_clk = {
  957. .name = "UARTCLK",
  958. .parent = &slow_clk,
  959. .rate = 13000000,
  960. .hw_ctrld = false,
  961. .reset = true,
  962. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  963. .res_mask = U300_SYSCON_RSR_UART_RESET_EN,
  964. .clk_val = U300_SYSCON_SBCER_UART_CLK_EN,
  965. .enable = syscon_clk_enable,
  966. .disable = syscon_clk_disable,
  967. };
  968. static struct clk keypad_clk = {
  969. .name = "KEYPAD",
  970. .parent = &slow_clk,
  971. .rate = 32768,
  972. .hw_ctrld = false,
  973. .reset = true,
  974. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  975. .res_mask = U300_SYSCON_RSR_KEYPAD_RESET_EN,
  976. .clk_val = U300_SYSCON_SBCER_KEYPAD_CLK_EN,
  977. .enable = syscon_clk_enable,
  978. .disable = syscon_clk_disable,
  979. };
  980. static struct clk gpio_clk = {
  981. .name = "GPIO",
  982. .parent = &slow_clk,
  983. .rate = 13000000,
  984. .hw_ctrld = true,
  985. .reset = true,
  986. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  987. .res_mask = U300_SYSCON_RSR_GPIO_RESET_EN,
  988. .clk_val = U300_SYSCON_SBCER_GPIO_CLK_EN,
  989. .enable = syscon_clk_enable,
  990. .disable = syscon_clk_disable,
  991. };
  992. static struct clk rtc_clk = {
  993. .name = "RTC",
  994. .parent = &slow_clk,
  995. .rate = 32768,
  996. .hw_ctrld = true,
  997. .reset = true,
  998. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  999. .res_mask = U300_SYSCON_RSR_RTC_RESET_EN,
  1000. /* This clock is always on, cannot be enabled/disabled */
  1001. };
  1002. static struct clk bustr_clk = {
  1003. .name = "BUSTR",
  1004. .parent = &slow_clk,
  1005. .rate = 13000000,
  1006. .hw_ctrld = true,
  1007. .reset = true,
  1008. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  1009. .res_mask = U300_SYSCON_RSR_BTR_RESET_EN,
  1010. .clk_val = U300_SYSCON_SBCER_BTR_CLK_EN,
  1011. .enable = syscon_clk_enable,
  1012. .disable = syscon_clk_disable,
  1013. };
  1014. static struct clk evhist_clk = {
  1015. .name = "EVHIST",
  1016. .parent = &slow_clk,
  1017. .rate = 13000000,
  1018. .hw_ctrld = true,
  1019. .reset = true,
  1020. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  1021. .res_mask = U300_SYSCON_RSR_EH_RESET_EN,
  1022. .clk_val = U300_SYSCON_SBCER_EH_CLK_EN,
  1023. .enable = syscon_clk_enable,
  1024. .disable = syscon_clk_disable,
  1025. };
  1026. static struct clk timer_clk = {
  1027. .name = "TIMER",
  1028. .parent = &slow_clk,
  1029. .rate = 13000000,
  1030. .hw_ctrld = true,
  1031. .reset = true,
  1032. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  1033. .res_mask = U300_SYSCON_RSR_ACC_TMR_RESET_EN,
  1034. .clk_val = U300_SYSCON_SBCER_ACC_TMR_CLK_EN,
  1035. .enable = syscon_clk_enable,
  1036. .disable = syscon_clk_disable,
  1037. };
  1038. static struct clk app_timer_clk = {
  1039. .name = "TIMER_APP",
  1040. .parent = &slow_clk,
  1041. .rate = 13000000,
  1042. .hw_ctrld = true,
  1043. .reset = true,
  1044. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  1045. .res_mask = U300_SYSCON_RSR_APP_TMR_RESET_EN,
  1046. .clk_val = U300_SYSCON_SBCER_APP_TMR_CLK_EN,
  1047. .enable = syscon_clk_enable,
  1048. .disable = syscon_clk_disable,
  1049. };
  1050. #ifdef CONFIG_MACH_U300_BS335
  1051. static struct clk ppm_clk = {
  1052. .name = "PPM",
  1053. .parent = &slow_clk,
  1054. .rate = 0, /* FIXME */
  1055. .hw_ctrld = true, /* TODO: Look up if it is hw ctrld or not */
  1056. .reset = true,
  1057. .res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
  1058. .res_mask = U300_SYSCON_RSR_PPM_RESET_EN,
  1059. .clk_val = U300_SYSCON_SBCER_PPM_CLK_EN,
  1060. .enable = syscon_clk_enable,
  1061. .disable = syscon_clk_disable,
  1062. };
  1063. #endif
  1064. #define DEF_LOOKUP(devid, clkref) \
  1065. { \
  1066. .dev_id = devid, \
  1067. .clk = clkref, \
  1068. }
  1069. /*
  1070. * Here we only define clocks that are meaningful to
  1071. * look up through clockdevice.
  1072. */
  1073. static struct clk_lookup lookups[] = {
  1074. /* Connected directly to the AMBA bus */
  1075. DEF_LOOKUP("amba", &amba_clk),
  1076. DEF_LOOKUP("cpu", &cpu_clk),
  1077. DEF_LOOKUP("nandif", &nandif_clk),
  1078. DEF_LOOKUP("semi", &semi_clk),
  1079. #ifdef CONFIG_MACH_U300_BS335
  1080. DEF_LOOKUP("isp", &isp_clk),
  1081. DEF_LOOKUP("cds", &cds_clk),
  1082. #endif
  1083. DEF_LOOKUP("dma", &dma_clk),
  1084. DEF_LOOKUP("aaif", &aaif_clk),
  1085. DEF_LOOKUP("apex", &apex_clk),
  1086. DEF_LOOKUP("video_enc", &video_enc_clk),
  1087. DEF_LOOKUP("xgam", &xgam_clk),
  1088. DEF_LOOKUP("ahb", &ahb_clk),
  1089. /* AHB bridge clocks */
  1090. DEF_LOOKUP("ahb", &ahb_subsys_clk),
  1091. DEF_LOOKUP("intcon", &intcon_clk),
  1092. DEF_LOOKUP("mspro", &mspro_clk),
  1093. DEF_LOOKUP("pl172", &emif_clk),
  1094. /* FAST bridge clocks */
  1095. DEF_LOOKUP("fast", &fast_clk),
  1096. DEF_LOOKUP("mmci", &mmcsd_clk),
  1097. /*
  1098. * The .0 and .1 identifiers on these comes from the platform device
  1099. * .id field and are assigned when the platform devices are registered.
  1100. */
  1101. DEF_LOOKUP("i2s.0", &i2s0_clk),
  1102. DEF_LOOKUP("i2s.1", &i2s1_clk),
  1103. DEF_LOOKUP("stddci2c.0", &i2c0_clk),
  1104. DEF_LOOKUP("stddci2c.1", &i2c1_clk),
  1105. DEF_LOOKUP("pl022", &spi_clk),
  1106. #ifdef CONFIG_MACH_U300_BS335
  1107. DEF_LOOKUP("uart1", &uart1_clk),
  1108. #endif
  1109. /* SLOW bridge clocks */
  1110. DEF_LOOKUP("slow", &slow_clk),
  1111. DEF_LOOKUP("wdog", &wdog_clk),
  1112. DEF_LOOKUP("uart0", &uart_clk),
  1113. DEF_LOOKUP("apptimer", &app_timer_clk),
  1114. DEF_LOOKUP("keypad", &keypad_clk),
  1115. DEF_LOOKUP("u300-gpio", &gpio_clk),
  1116. DEF_LOOKUP("rtc0", &rtc_clk),
  1117. DEF_LOOKUP("bustr", &bustr_clk),
  1118. DEF_LOOKUP("evhist", &evhist_clk),
  1119. DEF_LOOKUP("timer", &timer_clk),
  1120. #ifdef CONFIG_MACH_U300_BS335
  1121. DEF_LOOKUP("ppm", &ppm_clk),
  1122. #endif
  1123. };
  1124. static void __init clk_register(void)
  1125. {
  1126. int i;
  1127. /* Register the lookups */
  1128. for (i = 0; i < ARRAY_SIZE(lookups); i++)
  1129. clkdev_add(&lookups[i]);
  1130. }
  1131. /*
  1132. * These are the clocks for cells registered as primecell drivers
  1133. * on the AMBA bus. These must be on during AMBA device registration
  1134. * since the bus probe will attempt to read magic configuration
  1135. * registers for these devices. If they are deactivated these probes
  1136. * will fail.
  1137. *
  1138. *
  1139. * Please note that on emif, both RAM and NAND is connected in dual
  1140. * RAM phones. On single RAM phones, ram is on semi and NAND on emif.
  1141. *
  1142. */
  1143. void u300_clock_primecells(void)
  1144. {
  1145. clk_enable(&intcon_clk);
  1146. clk_enable(&uart_clk);
  1147. #ifdef CONFIG_MACH_U300_BS335
  1148. clk_enable(&uart1_clk);
  1149. #endif
  1150. clk_enable(&spi_clk);
  1151. clk_enable(&mmcsd_clk);
  1152. }
  1153. EXPORT_SYMBOL(u300_clock_primecells);
  1154. void u300_unclock_primecells(void)
  1155. {
  1156. clk_disable(&intcon_clk);
  1157. clk_disable(&uart_clk);
  1158. #ifdef CONFIG_MACH_U300_BS335
  1159. clk_disable(&uart1_clk);
  1160. #endif
  1161. clk_disable(&spi_clk);
  1162. clk_disable(&mmcsd_clk);
  1163. }
  1164. EXPORT_SYMBOL(u300_unclock_primecells);
  1165. /*
  1166. * The interrupt controller is enabled before the clock API is registered.
  1167. */
  1168. void u300_enable_intcon_clock(void)
  1169. {
  1170. clk_enable(&intcon_clk);
  1171. }
  1172. EXPORT_SYMBOL(u300_enable_intcon_clock);
  1173. /*
  1174. * The timer is enabled before the clock API is registered.
  1175. */
  1176. void u300_enable_timer_clock(void)
  1177. {
  1178. clk_enable(&app_timer_clk);
  1179. }
  1180. EXPORT_SYMBOL(u300_enable_timer_clock);
  1181. #if (defined(CONFIG_DEBUG_FS) && defined(CONFIG_U300_DEBUG))
  1182. /*
  1183. * The following makes it possible to view the status (especially
  1184. * reference count and reset status) for the clocks in the platform
  1185. * by looking into the special file <debugfs>/u300_clocks
  1186. */
  1187. /* A list of all clocks in the platform */
  1188. static struct clk *clks[] = {
  1189. /* Top node clock for the AMBA bus */
  1190. &amba_clk,
  1191. /* Connected directly to the AMBA bus */
  1192. &cpu_clk,
  1193. &nandif_clk,
  1194. &semi_clk,
  1195. #ifdef CONFIG_MACH_U300_BS335
  1196. &isp_clk,
  1197. &cds_clk,
  1198. #endif
  1199. &dma_clk,
  1200. &aaif_clk,
  1201. &apex_clk,
  1202. &video_enc_clk,
  1203. &xgam_clk,
  1204. &ahb_clk,
  1205. /* AHB bridge clocks */
  1206. &ahb_subsys_clk,
  1207. &intcon_clk,
  1208. &mspro_clk,
  1209. &emif_clk,
  1210. /* FAST bridge clocks */
  1211. &fast_clk,
  1212. &mmcsd_clk,
  1213. &i2s0_clk,
  1214. &i2s1_clk,
  1215. &i2c0_clk,
  1216. &i2c1_clk,
  1217. &spi_clk,
  1218. #ifdef CONFIG_MACH_U300_BS335
  1219. &uart1_clk,
  1220. #endif
  1221. /* SLOW bridge clocks */
  1222. &slow_clk,
  1223. &wdog_clk,
  1224. &uart_clk,
  1225. &app_timer_clk,
  1226. &keypad_clk,
  1227. &gpio_clk,
  1228. &rtc_clk,
  1229. &bustr_clk,
  1230. &evhist_clk,
  1231. &timer_clk,
  1232. #ifdef CONFIG_MACH_U300_BS335
  1233. &ppm_clk,
  1234. #endif
  1235. };
  1236. static int u300_clocks_show(struct seq_file *s, void *data)
  1237. {
  1238. struct clk *clk;
  1239. int i;
  1240. seq_printf(s, "CLOCK DEVICE RESET STATE\t" \
  1241. "ACTIVE\tUSERS\tHW CTRL FREQ\n");
  1242. seq_printf(s, "---------------------------------------------" \
  1243. "-----------------------------------------\n");
  1244. for (i = 0; i < ARRAY_SIZE(clks); i++) {
  1245. clk = clks[i];
  1246. if (clk != ERR_PTR(-ENOENT)) {
  1247. /* Format clock and device name nicely */
  1248. char cdp[33];
  1249. int chars;
  1250. chars = snprintf(&cdp[0], 17, "%s", clk->name);
  1251. while (chars < 16) {
  1252. cdp[chars] = ' ';
  1253. chars++;
  1254. }
  1255. chars = snprintf(&cdp[16], 17, "%s", clk->dev ?
  1256. dev_name(clk->dev) : "N/A");
  1257. while (chars < 16) {
  1258. cdp[chars+16] = ' ';
  1259. chars++;
  1260. }
  1261. cdp[32] = '\0';
  1262. if (clk->get_rate)
  1263. seq_printf(s,
  1264. "%s%s\t%s\t%d\t%s\t%lu Hz\n",
  1265. &cdp[0],
  1266. clk->reset ?
  1267. "ASSERTED" : "RELEASED",
  1268. clk->usecount ? "ON" : "OFF",
  1269. clk->usecount,
  1270. clk->hw_ctrld ? "YES" : "NO ",
  1271. clk->get_rate(clk));
  1272. else
  1273. seq_printf(s,
  1274. "%s%s\t%s\t%d\t%s\t" \
  1275. "(unknown rate)\n",
  1276. &cdp[0],
  1277. clk->reset ?
  1278. "ASSERTED" : "RELEASED",
  1279. clk->usecount ? "ON" : "OFF",
  1280. clk->usecount,
  1281. clk->hw_ctrld ? "YES" : "NO ");
  1282. }
  1283. }
  1284. return 0;
  1285. }
  1286. static int u300_clocks_open(struct inode *inode, struct file *file)
  1287. {
  1288. return single_open(file, u300_clocks_show, NULL);
  1289. }
  1290. static const struct file_operations u300_clocks_operations = {
  1291. .open = u300_clocks_open,
  1292. .read = seq_read,
  1293. .llseek = seq_lseek,
  1294. .release = single_release,
  1295. };
  1296. static void init_clk_read_procfs(void)
  1297. {
  1298. /* Expose a simple debugfs interface to view all clocks */
  1299. (void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO,
  1300. NULL, NULL, &u300_clocks_operations);
  1301. }
  1302. #else
  1303. static inline void init_clk_read_procfs(void)
  1304. {
  1305. }
  1306. #endif
  1307. static int __init u300_clock_init(void)
  1308. {
  1309. u16 val;
  1310. /*
  1311. * FIXME: shall all this powermanagement stuff really live here???
  1312. */
  1313. /* Set system to run at PLL208, max performance, a known state. */
  1314. val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR);
  1315. val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
  1316. writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR);
  1317. /* Wait for the PLL208 to lock if not locked in yet */
  1318. while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) &
  1319. U300_SYSCON_CSR_PLL208_LOCK_IND));
  1320. /* Power management enable */
  1321. val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR);
  1322. val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE;
  1323. writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR);
  1324. clk_register();
  1325. init_clk_read_procfs();
  1326. /*
  1327. * Some of these may be on when we boot the system so make sure they
  1328. * are turned OFF.
  1329. */
  1330. syscon_block_reset_enable(&timer_clk);
  1331. timer_clk.disable(&timer_clk);
  1332. /*
  1333. * These shall be turned on by default when we boot the system
  1334. * so make sure they are ON. (Adding CPU here is a bit too much.)
  1335. * These clocks will be claimed by drivers later.
  1336. */
  1337. syscon_block_reset_disable(&semi_clk);
  1338. syscon_block_reset_disable(&emif_clk);
  1339. semi_clk.enable(&semi_clk);
  1340. emif_clk.enable(&emif_clk);
  1341. return 0;
  1342. }
  1343. /* initialize clocking early to be available later in the boot */
  1344. core_initcall(u300_clock_init);