clk-tegra20.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256
  1. /*
  2. * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms and conditions of the GNU General Public License,
  6. * version 2, as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope it will be useful, but WITHOUT
  9. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11. * more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include <linux/io.h>
  17. #include <linux/clk.h>
  18. #include <linux/clk-provider.h>
  19. #include <linux/clkdev.h>
  20. #include <linux/of.h>
  21. #include <linux/of_address.h>
  22. #include <linux/clk/tegra.h>
  23. #include "clk.h"
  24. #define RST_DEVICES_L 0x004
  25. #define RST_DEVICES_H 0x008
  26. #define RST_DEVICES_U 0x00c
  27. #define RST_DEVICES_SET_L 0x300
  28. #define RST_DEVICES_CLR_L 0x304
  29. #define RST_DEVICES_SET_H 0x308
  30. #define RST_DEVICES_CLR_H 0x30c
  31. #define RST_DEVICES_SET_U 0x310
  32. #define RST_DEVICES_CLR_U 0x314
  33. #define RST_DEVICES_NUM 3
  34. #define CLK_OUT_ENB_L 0x010
  35. #define CLK_OUT_ENB_H 0x014
  36. #define CLK_OUT_ENB_U 0x018
  37. #define CLK_OUT_ENB_SET_L 0x320
  38. #define CLK_OUT_ENB_CLR_L 0x324
  39. #define CLK_OUT_ENB_SET_H 0x328
  40. #define CLK_OUT_ENB_CLR_H 0x32c
  41. #define CLK_OUT_ENB_SET_U 0x330
  42. #define CLK_OUT_ENB_CLR_U 0x334
  43. #define CLK_OUT_ENB_NUM 3
  44. #define OSC_CTRL 0x50
  45. #define OSC_CTRL_OSC_FREQ_MASK (3<<30)
  46. #define OSC_CTRL_OSC_FREQ_13MHZ (0<<30)
  47. #define OSC_CTRL_OSC_FREQ_19_2MHZ (1<<30)
  48. #define OSC_CTRL_OSC_FREQ_12MHZ (2<<30)
  49. #define OSC_CTRL_OSC_FREQ_26MHZ (3<<30)
  50. #define OSC_CTRL_MASK (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
  51. #define OSC_CTRL_PLL_REF_DIV_MASK (3<<28)
  52. #define OSC_CTRL_PLL_REF_DIV_1 (0<<28)
  53. #define OSC_CTRL_PLL_REF_DIV_2 (1<<28)
  54. #define OSC_CTRL_PLL_REF_DIV_4 (2<<28)
  55. #define OSC_FREQ_DET 0x58
  56. #define OSC_FREQ_DET_TRIG (1<<31)
  57. #define OSC_FREQ_DET_STATUS 0x5c
  58. #define OSC_FREQ_DET_BUSY (1<<31)
  59. #define OSC_FREQ_DET_CNT_MASK 0xFFFF
  60. #define PLLS_BASE 0xf0
  61. #define PLLS_MISC 0xf4
  62. #define PLLC_BASE 0x80
  63. #define PLLC_MISC 0x8c
  64. #define PLLM_BASE 0x90
  65. #define PLLM_MISC 0x9c
  66. #define PLLP_BASE 0xa0
  67. #define PLLP_MISC 0xac
  68. #define PLLA_BASE 0xb0
  69. #define PLLA_MISC 0xbc
  70. #define PLLU_BASE 0xc0
  71. #define PLLU_MISC 0xcc
  72. #define PLLD_BASE 0xd0
  73. #define PLLD_MISC 0xdc
  74. #define PLLX_BASE 0xe0
  75. #define PLLX_MISC 0xe4
  76. #define PLLE_BASE 0xe8
  77. #define PLLE_MISC 0xec
  78. #define PLL_BASE_LOCK 27
  79. #define PLLE_MISC_LOCK 11
  80. #define PLL_MISC_LOCK_ENABLE 18
  81. #define PLLDU_MISC_LOCK_ENABLE 22
  82. #define PLLE_MISC_LOCK_ENABLE 9
  83. #define PLLC_OUT 0x84
  84. #define PLLM_OUT 0x94
  85. #define PLLP_OUTA 0xa4
  86. #define PLLP_OUTB 0xa8
  87. #define PLLA_OUT 0xb4
  88. #define CCLK_BURST_POLICY 0x20
  89. #define SUPER_CCLK_DIVIDER 0x24
  90. #define SCLK_BURST_POLICY 0x28
  91. #define SUPER_SCLK_DIVIDER 0x2c
  92. #define CLK_SYSTEM_RATE 0x30
  93. #define CLK_SOURCE_I2S1 0x100
  94. #define CLK_SOURCE_I2S2 0x104
  95. #define CLK_SOURCE_SPDIF_OUT 0x108
  96. #define CLK_SOURCE_SPDIF_IN 0x10c
  97. #define CLK_SOURCE_PWM 0x110
  98. #define CLK_SOURCE_SPI 0x114
  99. #define CLK_SOURCE_SBC1 0x134
  100. #define CLK_SOURCE_SBC2 0x118
  101. #define CLK_SOURCE_SBC3 0x11c
  102. #define CLK_SOURCE_SBC4 0x1b4
  103. #define CLK_SOURCE_XIO 0x120
  104. #define CLK_SOURCE_TWC 0x12c
  105. #define CLK_SOURCE_IDE 0x144
  106. #define CLK_SOURCE_NDFLASH 0x160
  107. #define CLK_SOURCE_VFIR 0x168
  108. #define CLK_SOURCE_SDMMC1 0x150
  109. #define CLK_SOURCE_SDMMC2 0x154
  110. #define CLK_SOURCE_SDMMC3 0x1bc
  111. #define CLK_SOURCE_SDMMC4 0x164
  112. #define CLK_SOURCE_CVE 0x140
  113. #define CLK_SOURCE_TVO 0x188
  114. #define CLK_SOURCE_TVDAC 0x194
  115. #define CLK_SOURCE_HDMI 0x18c
  116. #define CLK_SOURCE_DISP1 0x138
  117. #define CLK_SOURCE_DISP2 0x13c
  118. #define CLK_SOURCE_CSITE 0x1d4
  119. #define CLK_SOURCE_LA 0x1f8
  120. #define CLK_SOURCE_OWR 0x1cc
  121. #define CLK_SOURCE_NOR 0x1d0
  122. #define CLK_SOURCE_MIPI 0x174
  123. #define CLK_SOURCE_I2C1 0x124
  124. #define CLK_SOURCE_I2C2 0x198
  125. #define CLK_SOURCE_I2C3 0x1b8
  126. #define CLK_SOURCE_DVC 0x128
  127. #define CLK_SOURCE_UARTA 0x178
  128. #define CLK_SOURCE_UARTB 0x17c
  129. #define CLK_SOURCE_UARTC 0x1a0
  130. #define CLK_SOURCE_UARTD 0x1c0
  131. #define CLK_SOURCE_UARTE 0x1c4
  132. #define CLK_SOURCE_3D 0x158
  133. #define CLK_SOURCE_2D 0x15c
  134. #define CLK_SOURCE_MPE 0x170
  135. #define CLK_SOURCE_EPP 0x16c
  136. #define CLK_SOURCE_HOST1X 0x180
  137. #define CLK_SOURCE_VDE 0x1c8
  138. #define CLK_SOURCE_VI 0x148
  139. #define CLK_SOURCE_VI_SENSOR 0x1a8
  140. #define CLK_SOURCE_EMC 0x19c
  141. #define AUDIO_SYNC_CLK 0x38
  142. #define PMC_CTRL 0x0
  143. #define PMC_CTRL_BLINK_ENB 7
  144. #define PMC_DPD_PADS_ORIDE 0x1c
  145. #define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
  146. #define PMC_BLINK_TIMER 0x40
  147. /* Tegra CPU clock and reset control regs */
  148. #define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX 0x4c
  149. #define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET 0x340
  150. #define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR 0x344
  151. #define CPU_CLOCK(cpu) (0x1 << (8 + cpu))
  152. #define CPU_RESET(cpu) (0x1111ul << (cpu))
  153. static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32];
  154. static void __iomem *clk_base;
  155. static void __iomem *pmc_base;
  156. static DEFINE_SPINLOCK(pll_div_lock);
  157. #define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset, \
  158. _clk_num, _regs, _gate_flags, _clk_id) \
  159. TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
  160. 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \
  161. _regs, _clk_num, periph_clk_enb_refcnt, \
  162. _gate_flags, _clk_id)
  163. #define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset, \
  164. _clk_num, _regs, _gate_flags, _clk_id) \
  165. TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
  166. 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs, \
  167. _clk_num, periph_clk_enb_refcnt, _gate_flags, \
  168. _clk_id)
  169. #define TEGRA_INIT_DATA_DIV16(_name, _con_id, _dev_id, _parents, _offset, \
  170. _clk_num, _regs, _gate_flags, _clk_id) \
  171. TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
  172. 30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, _regs, \
  173. _clk_num, periph_clk_enb_refcnt, _gate_flags, \
  174. _clk_id)
  175. #define TEGRA_INIT_DATA_NODIV(_name, _con_id, _dev_id, _parents, _offset, \
  176. _mux_shift, _mux_width, _clk_num, _regs, \
  177. _gate_flags, _clk_id) \
  178. TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset, \
  179. _mux_shift, _mux_width, 0, 0, 0, 0, 0, _regs, \
  180. _clk_num, periph_clk_enb_refcnt, _gate_flags, \
  181. _clk_id)
  182. /* IDs assigned here must be in sync with DT bindings definition
  183. * for Tegra20 clocks .
  184. */
  185. enum tegra20_clk {
  186. cpu, ac97 = 3, rtc, timer, uarta, gpio = 8, sdmmc2, i2s1 = 11, i2c1,
  187. ndflash, sdmmc1, sdmmc4, twc, pwm, i2s2, epp, gr2d = 21, usbd, isp,
  188. gr3d, ide, disp2, disp1, host1x, vcp, cache2 = 31, mem, ahbdma, apbdma,
  189. kbc = 36, stat_mon, pmc, fuse, kfuse, sbc1, nor, spi, sbc2, xio, sbc3,
  190. dvc, dsi, mipi = 50, hdmi, csi, tvdac, i2c2, uartc, emc = 57, usb2,
  191. usb3, mpe, vde, bsea, bsev, speedo, uartd, uarte, i2c3, sbc4, sdmmc3,
  192. pex, owr, afi, csite, pcie_xclk, avpucq = 75, la, irama = 84, iramb,
  193. iramc, iramd, cram2, audio_2x, clk_d, csus = 92, cdev1, cdev2,
  194. uartb = 96, vfir, spdif_in, spdif_out, vi, vi_sensor, tvo, cve,
  195. osc, clk_32k, clk_m, sclk, cclk, hclk, pclk, blink, pll_a, pll_a_out0,
  196. pll_c, pll_c_out1, pll_d, pll_d_out0, pll_e, pll_m, pll_m_out1,
  197. pll_p, pll_p_out1, pll_p_out2, pll_p_out3, pll_p_out4, pll_u,
  198. pll_x, audio, pll_ref, twd, clk_max,
  199. };
  200. static struct clk *clks[clk_max];
  201. static struct clk_onecell_data clk_data;
  202. static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
  203. { 12000000, 600000000, 600, 12, 1, 8 },
  204. { 13000000, 600000000, 600, 13, 1, 8 },
  205. { 19200000, 600000000, 500, 16, 1, 6 },
  206. { 26000000, 600000000, 600, 26, 1, 8 },
  207. { 0, 0, 0, 0, 0, 0 },
  208. };
  209. static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
  210. { 12000000, 666000000, 666, 12, 1, 8},
  211. { 13000000, 666000000, 666, 13, 1, 8},
  212. { 19200000, 666000000, 555, 16, 1, 8},
  213. { 26000000, 666000000, 666, 26, 1, 8},
  214. { 12000000, 600000000, 600, 12, 1, 8},
  215. { 13000000, 600000000, 600, 13, 1, 8},
  216. { 19200000, 600000000, 375, 12, 1, 6},
  217. { 26000000, 600000000, 600, 26, 1, 8},
  218. { 0, 0, 0, 0, 0, 0 },
  219. };
  220. static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
  221. { 12000000, 216000000, 432, 12, 2, 8},
  222. { 13000000, 216000000, 432, 13, 2, 8},
  223. { 19200000, 216000000, 90, 4, 2, 1},
  224. { 26000000, 216000000, 432, 26, 2, 8},
  225. { 12000000, 432000000, 432, 12, 1, 8},
  226. { 13000000, 432000000, 432, 13, 1, 8},
  227. { 19200000, 432000000, 90, 4, 1, 1},
  228. { 26000000, 432000000, 432, 26, 1, 8},
  229. { 0, 0, 0, 0, 0, 0 },
  230. };
  231. static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
  232. { 28800000, 56448000, 49, 25, 1, 1},
  233. { 28800000, 73728000, 64, 25, 1, 1},
  234. { 28800000, 24000000, 5, 6, 1, 1},
  235. { 0, 0, 0, 0, 0, 0 },
  236. };
  237. static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
  238. { 12000000, 216000000, 216, 12, 1, 4},
  239. { 13000000, 216000000, 216, 13, 1, 4},
  240. { 19200000, 216000000, 135, 12, 1, 3},
  241. { 26000000, 216000000, 216, 26, 1, 4},
  242. { 12000000, 594000000, 594, 12, 1, 8},
  243. { 13000000, 594000000, 594, 13, 1, 8},
  244. { 19200000, 594000000, 495, 16, 1, 8},
  245. { 26000000, 594000000, 594, 26, 1, 8},
  246. { 12000000, 1000000000, 1000, 12, 1, 12},
  247. { 13000000, 1000000000, 1000, 13, 1, 12},
  248. { 19200000, 1000000000, 625, 12, 1, 8},
  249. { 26000000, 1000000000, 1000, 26, 1, 12},
  250. { 0, 0, 0, 0, 0, 0 },
  251. };
  252. static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
  253. { 12000000, 480000000, 960, 12, 2, 0},
  254. { 13000000, 480000000, 960, 13, 2, 0},
  255. { 19200000, 480000000, 200, 4, 2, 0},
  256. { 26000000, 480000000, 960, 26, 2, 0},
  257. { 0, 0, 0, 0, 0, 0 },
  258. };
  259. static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
  260. /* 1 GHz */
  261. { 12000000, 1000000000, 1000, 12, 1, 12},
  262. { 13000000, 1000000000, 1000, 13, 1, 12},
  263. { 19200000, 1000000000, 625, 12, 1, 8},
  264. { 26000000, 1000000000, 1000, 26, 1, 12},
  265. /* 912 MHz */
  266. { 12000000, 912000000, 912, 12, 1, 12},
  267. { 13000000, 912000000, 912, 13, 1, 12},
  268. { 19200000, 912000000, 760, 16, 1, 8},
  269. { 26000000, 912000000, 912, 26, 1, 12},
  270. /* 816 MHz */
  271. { 12000000, 816000000, 816, 12, 1, 12},
  272. { 13000000, 816000000, 816, 13, 1, 12},
  273. { 19200000, 816000000, 680, 16, 1, 8},
  274. { 26000000, 816000000, 816, 26, 1, 12},
  275. /* 760 MHz */
  276. { 12000000, 760000000, 760, 12, 1, 12},
  277. { 13000000, 760000000, 760, 13, 1, 12},
  278. { 19200000, 760000000, 950, 24, 1, 8},
  279. { 26000000, 760000000, 760, 26, 1, 12},
  280. /* 750 MHz */
  281. { 12000000, 750000000, 750, 12, 1, 12},
  282. { 13000000, 750000000, 750, 13, 1, 12},
  283. { 19200000, 750000000, 625, 16, 1, 8},
  284. { 26000000, 750000000, 750, 26, 1, 12},
  285. /* 608 MHz */
  286. { 12000000, 608000000, 608, 12, 1, 12},
  287. { 13000000, 608000000, 608, 13, 1, 12},
  288. { 19200000, 608000000, 380, 12, 1, 8},
  289. { 26000000, 608000000, 608, 26, 1, 12},
  290. /* 456 MHz */
  291. { 12000000, 456000000, 456, 12, 1, 12},
  292. { 13000000, 456000000, 456, 13, 1, 12},
  293. { 19200000, 456000000, 380, 16, 1, 8},
  294. { 26000000, 456000000, 456, 26, 1, 12},
  295. /* 312 MHz */
  296. { 12000000, 312000000, 312, 12, 1, 12},
  297. { 13000000, 312000000, 312, 13, 1, 12},
  298. { 19200000, 312000000, 260, 16, 1, 8},
  299. { 26000000, 312000000, 312, 26, 1, 12},
  300. { 0, 0, 0, 0, 0, 0 },
  301. };
  302. static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
  303. { 12000000, 100000000, 200, 24, 1, 0 },
  304. { 0, 0, 0, 0, 0, 0 },
  305. };
  306. /* PLL parameters */
  307. static struct tegra_clk_pll_params pll_c_params = {
  308. .input_min = 2000000,
  309. .input_max = 31000000,
  310. .cf_min = 1000000,
  311. .cf_max = 6000000,
  312. .vco_min = 20000000,
  313. .vco_max = 1400000000,
  314. .base_reg = PLLC_BASE,
  315. .misc_reg = PLLC_MISC,
  316. .lock_bit_idx = PLL_BASE_LOCK,
  317. .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
  318. .lock_delay = 300,
  319. };
  320. static struct tegra_clk_pll_params pll_m_params = {
  321. .input_min = 2000000,
  322. .input_max = 31000000,
  323. .cf_min = 1000000,
  324. .cf_max = 6000000,
  325. .vco_min = 20000000,
  326. .vco_max = 1200000000,
  327. .base_reg = PLLM_BASE,
  328. .misc_reg = PLLM_MISC,
  329. .lock_bit_idx = PLL_BASE_LOCK,
  330. .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
  331. .lock_delay = 300,
  332. };
  333. static struct tegra_clk_pll_params pll_p_params = {
  334. .input_min = 2000000,
  335. .input_max = 31000000,
  336. .cf_min = 1000000,
  337. .cf_max = 6000000,
  338. .vco_min = 20000000,
  339. .vco_max = 1400000000,
  340. .base_reg = PLLP_BASE,
  341. .misc_reg = PLLP_MISC,
  342. .lock_bit_idx = PLL_BASE_LOCK,
  343. .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
  344. .lock_delay = 300,
  345. };
  346. static struct tegra_clk_pll_params pll_a_params = {
  347. .input_min = 2000000,
  348. .input_max = 31000000,
  349. .cf_min = 1000000,
  350. .cf_max = 6000000,
  351. .vco_min = 20000000,
  352. .vco_max = 1400000000,
  353. .base_reg = PLLA_BASE,
  354. .misc_reg = PLLA_MISC,
  355. .lock_bit_idx = PLL_BASE_LOCK,
  356. .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
  357. .lock_delay = 300,
  358. };
  359. static struct tegra_clk_pll_params pll_d_params = {
  360. .input_min = 2000000,
  361. .input_max = 40000000,
  362. .cf_min = 1000000,
  363. .cf_max = 6000000,
  364. .vco_min = 40000000,
  365. .vco_max = 1000000000,
  366. .base_reg = PLLD_BASE,
  367. .misc_reg = PLLD_MISC,
  368. .lock_bit_idx = PLL_BASE_LOCK,
  369. .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
  370. .lock_delay = 1000,
  371. };
  372. static struct tegra_clk_pll_params pll_u_params = {
  373. .input_min = 2000000,
  374. .input_max = 40000000,
  375. .cf_min = 1000000,
  376. .cf_max = 6000000,
  377. .vco_min = 48000000,
  378. .vco_max = 960000000,
  379. .base_reg = PLLU_BASE,
  380. .misc_reg = PLLU_MISC,
  381. .lock_bit_idx = PLL_BASE_LOCK,
  382. .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
  383. .lock_delay = 1000,
  384. };
  385. static struct tegra_clk_pll_params pll_x_params = {
  386. .input_min = 2000000,
  387. .input_max = 31000000,
  388. .cf_min = 1000000,
  389. .cf_max = 6000000,
  390. .vco_min = 20000000,
  391. .vco_max = 1200000000,
  392. .base_reg = PLLX_BASE,
  393. .misc_reg = PLLX_MISC,
  394. .lock_bit_idx = PLL_BASE_LOCK,
  395. .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
  396. .lock_delay = 300,
  397. };
  398. static struct tegra_clk_pll_params pll_e_params = {
  399. .input_min = 12000000,
  400. .input_max = 12000000,
  401. .cf_min = 0,
  402. .cf_max = 0,
  403. .vco_min = 0,
  404. .vco_max = 0,
  405. .base_reg = PLLE_BASE,
  406. .misc_reg = PLLE_MISC,
  407. .lock_bit_idx = PLLE_MISC_LOCK,
  408. .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
  409. .lock_delay = 0,
  410. };
  411. /* Peripheral clock registers */
  412. static struct tegra_clk_periph_regs periph_l_regs = {
  413. .enb_reg = CLK_OUT_ENB_L,
  414. .enb_set_reg = CLK_OUT_ENB_SET_L,
  415. .enb_clr_reg = CLK_OUT_ENB_CLR_L,
  416. .rst_reg = RST_DEVICES_L,
  417. .rst_set_reg = RST_DEVICES_SET_L,
  418. .rst_clr_reg = RST_DEVICES_CLR_L,
  419. };
  420. static struct tegra_clk_periph_regs periph_h_regs = {
  421. .enb_reg = CLK_OUT_ENB_H,
  422. .enb_set_reg = CLK_OUT_ENB_SET_H,
  423. .enb_clr_reg = CLK_OUT_ENB_CLR_H,
  424. .rst_reg = RST_DEVICES_H,
  425. .rst_set_reg = RST_DEVICES_SET_H,
  426. .rst_clr_reg = RST_DEVICES_CLR_H,
  427. };
  428. static struct tegra_clk_periph_regs periph_u_regs = {
  429. .enb_reg = CLK_OUT_ENB_U,
  430. .enb_set_reg = CLK_OUT_ENB_SET_U,
  431. .enb_clr_reg = CLK_OUT_ENB_CLR_U,
  432. .rst_reg = RST_DEVICES_U,
  433. .rst_set_reg = RST_DEVICES_SET_U,
  434. .rst_clr_reg = RST_DEVICES_CLR_U,
  435. };
  436. static unsigned long tegra20_clk_measure_input_freq(void)
  437. {
  438. u32 osc_ctrl = readl_relaxed(clk_base + OSC_CTRL);
  439. u32 auto_clk_control = osc_ctrl & OSC_CTRL_OSC_FREQ_MASK;
  440. u32 pll_ref_div = osc_ctrl & OSC_CTRL_PLL_REF_DIV_MASK;
  441. unsigned long input_freq;
  442. switch (auto_clk_control) {
  443. case OSC_CTRL_OSC_FREQ_12MHZ:
  444. BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
  445. input_freq = 12000000;
  446. break;
  447. case OSC_CTRL_OSC_FREQ_13MHZ:
  448. BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
  449. input_freq = 13000000;
  450. break;
  451. case OSC_CTRL_OSC_FREQ_19_2MHZ:
  452. BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
  453. input_freq = 19200000;
  454. break;
  455. case OSC_CTRL_OSC_FREQ_26MHZ:
  456. BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
  457. input_freq = 26000000;
  458. break;
  459. default:
  460. pr_err("Unexpected clock autodetect value %d",
  461. auto_clk_control);
  462. BUG();
  463. return 0;
  464. }
  465. return input_freq;
  466. }
  467. static unsigned int tegra20_get_pll_ref_div(void)
  468. {
  469. u32 pll_ref_div = readl_relaxed(clk_base + OSC_CTRL) &
  470. OSC_CTRL_PLL_REF_DIV_MASK;
  471. switch (pll_ref_div) {
  472. case OSC_CTRL_PLL_REF_DIV_1:
  473. return 1;
  474. case OSC_CTRL_PLL_REF_DIV_2:
  475. return 2;
  476. case OSC_CTRL_PLL_REF_DIV_4:
  477. return 4;
  478. default:
  479. pr_err("Invalied pll ref divider %d\n", pll_ref_div);
  480. BUG();
  481. }
  482. return 0;
  483. }
  484. static void tegra20_pll_init(void)
  485. {
  486. struct clk *clk;
  487. /* PLLC */
  488. clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, NULL, 0,
  489. 0, &pll_c_params, TEGRA_PLL_HAS_CPCON,
  490. pll_c_freq_table, NULL);
  491. clk_register_clkdev(clk, "pll_c", NULL);
  492. clks[pll_c] = clk;
  493. /* PLLC_OUT1 */
  494. clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
  495. clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
  496. 8, 8, 1, NULL);
  497. clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
  498. clk_base + PLLC_OUT, 1, 0, CLK_SET_RATE_PARENT,
  499. 0, NULL);
  500. clk_register_clkdev(clk, "pll_c_out1", NULL);
  501. clks[pll_c_out1] = clk;
  502. /* PLLP */
  503. clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, NULL, 0,
  504. 216000000, &pll_p_params, TEGRA_PLL_FIXED |
  505. TEGRA_PLL_HAS_CPCON, pll_p_freq_table, NULL);
  506. clk_register_clkdev(clk, "pll_p", NULL);
  507. clks[pll_p] = clk;
  508. /* PLLP_OUT1 */
  509. clk = tegra_clk_register_divider("pll_p_out1_div", "pll_p",
  510. clk_base + PLLP_OUTA, 0,
  511. TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
  512. 8, 8, 1, &pll_div_lock);
  513. clk = tegra_clk_register_pll_out("pll_p_out1", "pll_p_out1_div",
  514. clk_base + PLLP_OUTA, 1, 0,
  515. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
  516. &pll_div_lock);
  517. clk_register_clkdev(clk, "pll_p_out1", NULL);
  518. clks[pll_p_out1] = clk;
  519. /* PLLP_OUT2 */
  520. clk = tegra_clk_register_divider("pll_p_out2_div", "pll_p",
  521. clk_base + PLLP_OUTA, 0,
  522. TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
  523. 24, 8, 1, &pll_div_lock);
  524. clk = tegra_clk_register_pll_out("pll_p_out2", "pll_p_out2_div",
  525. clk_base + PLLP_OUTA, 17, 16,
  526. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
  527. &pll_div_lock);
  528. clk_register_clkdev(clk, "pll_p_out2", NULL);
  529. clks[pll_p_out2] = clk;
  530. /* PLLP_OUT3 */
  531. clk = tegra_clk_register_divider("pll_p_out3_div", "pll_p",
  532. clk_base + PLLP_OUTB, 0,
  533. TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
  534. 8, 8, 1, &pll_div_lock);
  535. clk = tegra_clk_register_pll_out("pll_p_out3", "pll_p_out3_div",
  536. clk_base + PLLP_OUTB, 1, 0,
  537. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
  538. &pll_div_lock);
  539. clk_register_clkdev(clk, "pll_p_out3", NULL);
  540. clks[pll_p_out3] = clk;
  541. /* PLLP_OUT4 */
  542. clk = tegra_clk_register_divider("pll_p_out4_div", "pll_p",
  543. clk_base + PLLP_OUTB, 0,
  544. TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
  545. 24, 8, 1, &pll_div_lock);
  546. clk = tegra_clk_register_pll_out("pll_p_out4", "pll_p_out4_div",
  547. clk_base + PLLP_OUTB, 17, 16,
  548. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
  549. &pll_div_lock);
  550. clk_register_clkdev(clk, "pll_p_out4", NULL);
  551. clks[pll_p_out4] = clk;
  552. /* PLLM */
  553. clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, NULL,
  554. CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0,
  555. &pll_m_params, TEGRA_PLL_HAS_CPCON,
  556. pll_m_freq_table, NULL);
  557. clk_register_clkdev(clk, "pll_m", NULL);
  558. clks[pll_m] = clk;
  559. /* PLLM_OUT1 */
  560. clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m",
  561. clk_base + PLLM_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
  562. 8, 8, 1, NULL);
  563. clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div",
  564. clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED |
  565. CLK_SET_RATE_PARENT, 0, NULL);
  566. clk_register_clkdev(clk, "pll_m_out1", NULL);
  567. clks[pll_m_out1] = clk;
  568. /* PLLX */
  569. clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, NULL, 0,
  570. 0, &pll_x_params, TEGRA_PLL_HAS_CPCON,
  571. pll_x_freq_table, NULL);
  572. clk_register_clkdev(clk, "pll_x", NULL);
  573. clks[pll_x] = clk;
  574. /* PLLU */
  575. clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, NULL, 0,
  576. 0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON,
  577. pll_u_freq_table, NULL);
  578. clk_register_clkdev(clk, "pll_u", NULL);
  579. clks[pll_u] = clk;
  580. /* PLLD */
  581. clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, NULL, 0,
  582. 0, &pll_d_params, TEGRA_PLL_HAS_CPCON,
  583. pll_d_freq_table, NULL);
  584. clk_register_clkdev(clk, "pll_d", NULL);
  585. clks[pll_d] = clk;
  586. /* PLLD_OUT0 */
  587. clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
  588. CLK_SET_RATE_PARENT, 1, 2);
  589. clk_register_clkdev(clk, "pll_d_out0", NULL);
  590. clks[pll_d_out0] = clk;
  591. /* PLLA */
  592. clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, NULL, 0,
  593. 0, &pll_a_params, TEGRA_PLL_HAS_CPCON,
  594. pll_a_freq_table, NULL);
  595. clk_register_clkdev(clk, "pll_a", NULL);
  596. clks[pll_a] = clk;
  597. /* PLLA_OUT0 */
  598. clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a",
  599. clk_base + PLLA_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
  600. 8, 8, 1, NULL);
  601. clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div",
  602. clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED |
  603. CLK_SET_RATE_PARENT, 0, NULL);
  604. clk_register_clkdev(clk, "pll_a_out0", NULL);
  605. clks[pll_a_out0] = clk;
  606. /* PLLE */
  607. clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, NULL,
  608. 0, 100000000, &pll_e_params,
  609. 0, pll_e_freq_table, NULL);
  610. clk_register_clkdev(clk, "pll_e", NULL);
  611. clks[pll_e] = clk;
  612. }
  613. static const char *cclk_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
  614. "pll_p_cclk", "pll_p_out4_cclk",
  615. "pll_p_out3_cclk", "clk_d", "pll_x" };
  616. static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4",
  617. "pll_p_out3", "pll_p_out2", "clk_d",
  618. "clk_32k", "pll_m_out1" };
  619. static void tegra20_super_clk_init(void)
  620. {
  621. struct clk *clk;
  622. /*
  623. * DIV_U71 dividers for CCLK, these dividers are used only
  624. * if parent clock is fixed rate.
  625. */
  626. /*
  627. * Clock input to cclk divided from pll_p using
  628. * U71 divider of cclk.
  629. */
  630. clk = tegra_clk_register_divider("pll_p_cclk", "pll_p",
  631. clk_base + SUPER_CCLK_DIVIDER, 0,
  632. TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
  633. clk_register_clkdev(clk, "pll_p_cclk", NULL);
  634. /*
  635. * Clock input to cclk divided from pll_p_out3 using
  636. * U71 divider of cclk.
  637. */
  638. clk = tegra_clk_register_divider("pll_p_out3_cclk", "pll_p_out3",
  639. clk_base + SUPER_CCLK_DIVIDER, 0,
  640. TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
  641. clk_register_clkdev(clk, "pll_p_out3_cclk", NULL);
  642. /*
  643. * Clock input to cclk divided from pll_p_out4 using
  644. * U71 divider of cclk.
  645. */
  646. clk = tegra_clk_register_divider("pll_p_out4_cclk", "pll_p_out4",
  647. clk_base + SUPER_CCLK_DIVIDER, 0,
  648. TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
  649. clk_register_clkdev(clk, "pll_p_out4_cclk", NULL);
  650. /* CCLK */
  651. clk = tegra_clk_register_super_mux("cclk", cclk_parents,
  652. ARRAY_SIZE(cclk_parents), CLK_SET_RATE_PARENT,
  653. clk_base + CCLK_BURST_POLICY, 0, 4, 0, 0, NULL);
  654. clk_register_clkdev(clk, "cclk", NULL);
  655. clks[cclk] = clk;
  656. /* SCLK */
  657. clk = tegra_clk_register_super_mux("sclk", sclk_parents,
  658. ARRAY_SIZE(sclk_parents), CLK_SET_RATE_PARENT,
  659. clk_base + SCLK_BURST_POLICY, 0, 4, 0, 0, NULL);
  660. clk_register_clkdev(clk, "sclk", NULL);
  661. clks[sclk] = clk;
  662. /* HCLK */
  663. clk = clk_register_divider(NULL, "hclk_div", "sclk", 0,
  664. clk_base + CLK_SYSTEM_RATE, 4, 2, 0, NULL);
  665. clk = clk_register_gate(NULL, "hclk", "hclk_div", CLK_SET_RATE_PARENT,
  666. clk_base + CLK_SYSTEM_RATE, 7,
  667. CLK_GATE_SET_TO_DISABLE, NULL);
  668. clk_register_clkdev(clk, "hclk", NULL);
  669. clks[hclk] = clk;
  670. /* PCLK */
  671. clk = clk_register_divider(NULL, "pclk_div", "hclk", 0,
  672. clk_base + CLK_SYSTEM_RATE, 0, 2, 0, NULL);
  673. clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT,
  674. clk_base + CLK_SYSTEM_RATE, 3,
  675. CLK_GATE_SET_TO_DISABLE, NULL);
  676. clk_register_clkdev(clk, "pclk", NULL);
  677. clks[pclk] = clk;
  678. /* twd */
  679. clk = clk_register_fixed_factor(NULL, "twd", "cclk", 0, 1, 4);
  680. clk_register_clkdev(clk, "twd", NULL);
  681. clks[twd] = clk;
  682. }
  683. static const char *audio_parents[] = {"spdif_in", "i2s1", "i2s2", "unused",
  684. "pll_a_out0", "unused", "unused",
  685. "unused"};
  686. static void __init tegra20_audio_clk_init(void)
  687. {
  688. struct clk *clk;
  689. /* audio */
  690. clk = clk_register_mux(NULL, "audio_mux", audio_parents,
  691. ARRAY_SIZE(audio_parents), 0,
  692. clk_base + AUDIO_SYNC_CLK, 0, 3, 0, NULL);
  693. clk = clk_register_gate(NULL, "audio", "audio_mux", 0,
  694. clk_base + AUDIO_SYNC_CLK, 4,
  695. CLK_GATE_SET_TO_DISABLE, NULL);
  696. clk_register_clkdev(clk, "audio", NULL);
  697. clks[audio] = clk;
  698. /* audio_2x */
  699. clk = clk_register_fixed_factor(NULL, "audio_doubler", "audio",
  700. CLK_SET_RATE_PARENT, 2, 1);
  701. clk = tegra_clk_register_periph_gate("audio_2x", "audio_doubler",
  702. TEGRA_PERIPH_NO_RESET, clk_base,
  703. CLK_SET_RATE_PARENT, 89, &periph_u_regs,
  704. periph_clk_enb_refcnt);
  705. clk_register_clkdev(clk, "audio_2x", NULL);
  706. clks[audio_2x] = clk;
  707. }
  708. static const char *i2s1_parents[] = {"pll_a_out0", "audio_2x", "pll_p",
  709. "clk_m"};
  710. static const char *i2s2_parents[] = {"pll_a_out0", "audio_2x", "pll_p",
  711. "clk_m"};
  712. static const char *spdif_out_parents[] = {"pll_a_out0", "audio_2x", "pll_p",
  713. "clk_m"};
  714. static const char *spdif_in_parents[] = {"pll_p", "pll_c", "pll_m"};
  715. static const char *pwm_parents[] = {"pll_p", "pll_c", "audio", "clk_m",
  716. "clk_32k"};
  717. static const char *mux_pllpcm_clkm[] = {"pll_p", "pll_c", "pll_m", "clk_m"};
  718. static const char *mux_pllmcpa[] = {"pll_m", "pll_c", "pll_c", "pll_a"};
  719. static const char *mux_pllpdc_clkm[] = {"pll_p", "pll_d_out0", "pll_c",
  720. "clk_m"};
  721. static const char *mux_pllmcp_clkm[] = {"pll_m", "pll_c", "pll_p", "clk_m"};
  722. static struct tegra_periph_init_data tegra_periph_clk_list[] = {
  723. TEGRA_INIT_DATA_MUX("i2s1", NULL, "tegra20-i2s.0", i2s1_parents, CLK_SOURCE_I2S1, 11, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s1),
  724. TEGRA_INIT_DATA_MUX("i2s2", NULL, "tegra20-i2s.1", i2s2_parents, CLK_SOURCE_I2S2, 18, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s2),
  725. TEGRA_INIT_DATA_MUX("spdif_out", "spdif_out", "tegra20-spdif", spdif_out_parents, CLK_SOURCE_SPDIF_OUT, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_out),
  726. TEGRA_INIT_DATA_MUX("spdif_in", "spdif_in", "tegra20-spdif", spdif_in_parents, CLK_SOURCE_SPDIF_IN, 10, &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_in),
  727. TEGRA_INIT_DATA_MUX("sbc1", NULL, "spi_tegra.0", mux_pllpcm_clkm, CLK_SOURCE_SBC1, 41, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc1),
  728. TEGRA_INIT_DATA_MUX("sbc2", NULL, "spi_tegra.1", mux_pllpcm_clkm, CLK_SOURCE_SBC2, 44, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc2),
  729. TEGRA_INIT_DATA_MUX("sbc3", NULL, "spi_tegra.2", mux_pllpcm_clkm, CLK_SOURCE_SBC3, 46, &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc3),
  730. TEGRA_INIT_DATA_MUX("sbc4", NULL, "spi_tegra.3", mux_pllpcm_clkm, CLK_SOURCE_SBC4, 68, &periph_u_regs, TEGRA_PERIPH_ON_APB, sbc4),
  731. TEGRA_INIT_DATA_MUX("spi", NULL, "spi", mux_pllpcm_clkm, CLK_SOURCE_SPI, 43, &periph_h_regs, TEGRA_PERIPH_ON_APB, spi),
  732. TEGRA_INIT_DATA_MUX("xio", NULL, "xio", mux_pllpcm_clkm, CLK_SOURCE_XIO, 45, &periph_h_regs, 0, xio),
  733. TEGRA_INIT_DATA_MUX("twc", NULL, "twc", mux_pllpcm_clkm, CLK_SOURCE_TWC, 16, &periph_l_regs, TEGRA_PERIPH_ON_APB, twc),
  734. TEGRA_INIT_DATA_MUX("ide", NULL, "ide", mux_pllpcm_clkm, CLK_SOURCE_XIO, 25, &periph_l_regs, 0, ide),
  735. TEGRA_INIT_DATA_MUX("ndflash", NULL, "tegra_nand", mux_pllpcm_clkm, CLK_SOURCE_NDFLASH, 13, &periph_l_regs, 0, ndflash),
  736. TEGRA_INIT_DATA_MUX("vfir", NULL, "vfir", mux_pllpcm_clkm, CLK_SOURCE_VFIR, 7, &periph_l_regs, TEGRA_PERIPH_ON_APB, vfir),
  737. TEGRA_INIT_DATA_MUX("csite", NULL, "csite", mux_pllpcm_clkm, CLK_SOURCE_CSITE, 73, &periph_u_regs, 0, csite),
  738. TEGRA_INIT_DATA_MUX("la", NULL, "la", mux_pllpcm_clkm, CLK_SOURCE_LA, 76, &periph_u_regs, 0, la),
  739. TEGRA_INIT_DATA_MUX("owr", NULL, "tegra_w1", mux_pllpcm_clkm, CLK_SOURCE_OWR, 71, &periph_u_regs, TEGRA_PERIPH_ON_APB, owr),
  740. TEGRA_INIT_DATA_MUX("mipi", NULL, "mipi", mux_pllpcm_clkm, CLK_SOURCE_MIPI, 50, &periph_h_regs, TEGRA_PERIPH_ON_APB, mipi),
  741. TEGRA_INIT_DATA_MUX("vde", NULL, "vde", mux_pllpcm_clkm, CLK_SOURCE_VDE, 61, &periph_h_regs, 0, vde),
  742. TEGRA_INIT_DATA_MUX("vi", "vi", "tegra_camera", mux_pllmcpa, CLK_SOURCE_VI, 20, &periph_l_regs, 0, vi),
  743. TEGRA_INIT_DATA_MUX("epp", NULL, "epp", mux_pllmcpa, CLK_SOURCE_EPP, 19, &periph_l_regs, 0, epp),
  744. TEGRA_INIT_DATA_MUX("mpe", NULL, "mpe", mux_pllmcpa, CLK_SOURCE_MPE, 60, &periph_h_regs, 0, mpe),
  745. TEGRA_INIT_DATA_MUX("host1x", NULL, "host1x", mux_pllmcpa, CLK_SOURCE_HOST1X, 28, &periph_l_regs, 0, host1x),
  746. TEGRA_INIT_DATA_MUX("3d", NULL, "3d", mux_pllmcpa, CLK_SOURCE_3D, 24, &periph_l_regs, TEGRA_PERIPH_MANUAL_RESET, gr3d),
  747. TEGRA_INIT_DATA_MUX("2d", NULL, "2d", mux_pllmcpa, CLK_SOURCE_2D, 21, &periph_l_regs, 0, gr2d),
  748. TEGRA_INIT_DATA_MUX("nor", NULL, "tegra-nor", mux_pllpcm_clkm, CLK_SOURCE_NOR, 42, &periph_h_regs, 0, nor),
  749. TEGRA_INIT_DATA_MUX("sdmmc1", NULL, "sdhci-tegra.0", mux_pllpcm_clkm, CLK_SOURCE_SDMMC1, 14, &periph_l_regs, 0, sdmmc1),
  750. TEGRA_INIT_DATA_MUX("sdmmc2", NULL, "sdhci-tegra.1", mux_pllpcm_clkm, CLK_SOURCE_SDMMC2, 9, &periph_l_regs, 0, sdmmc2),
  751. TEGRA_INIT_DATA_MUX("sdmmc3", NULL, "sdhci-tegra.2", mux_pllpcm_clkm, CLK_SOURCE_SDMMC3, 69, &periph_u_regs, 0, sdmmc3),
  752. TEGRA_INIT_DATA_MUX("sdmmc4", NULL, "sdhci-tegra.3", mux_pllpcm_clkm, CLK_SOURCE_SDMMC4, 15, &periph_l_regs, 0, sdmmc4),
  753. TEGRA_INIT_DATA_MUX("cve", NULL, "cve", mux_pllpdc_clkm, CLK_SOURCE_CVE, 49, &periph_h_regs, 0, cve),
  754. TEGRA_INIT_DATA_MUX("tvo", NULL, "tvo", mux_pllpdc_clkm, CLK_SOURCE_TVO, 49, &periph_h_regs, 0, tvo),
  755. TEGRA_INIT_DATA_MUX("tvdac", NULL, "tvdac", mux_pllpdc_clkm, CLK_SOURCE_TVDAC, 53, &periph_h_regs, 0, tvdac),
  756. TEGRA_INIT_DATA_MUX("vi_sensor", "vi_sensor", "tegra_camera", mux_pllmcpa, CLK_SOURCE_VI_SENSOR, 20, &periph_l_regs, TEGRA_PERIPH_NO_RESET, vi_sensor),
  757. TEGRA_INIT_DATA_DIV16("i2c1", "div-clk", "tegra-i2c.0", mux_pllpcm_clkm, CLK_SOURCE_I2C1, 12, &periph_l_regs, TEGRA_PERIPH_ON_APB, i2c1),
  758. TEGRA_INIT_DATA_DIV16("i2c2", "div-clk", "tegra-i2c.1", mux_pllpcm_clkm, CLK_SOURCE_I2C2, 54, &periph_h_regs, TEGRA_PERIPH_ON_APB, i2c2),
  759. TEGRA_INIT_DATA_DIV16("i2c3", "div-clk", "tegra-i2c.2", mux_pllpcm_clkm, CLK_SOURCE_I2C3, 67, &periph_u_regs, TEGRA_PERIPH_ON_APB, i2c3),
  760. TEGRA_INIT_DATA_DIV16("dvc", "div-clk", "tegra-i2c.3", mux_pllpcm_clkm, CLK_SOURCE_DVC, 47, &periph_h_regs, TEGRA_PERIPH_ON_APB, dvc),
  761. TEGRA_INIT_DATA_MUX("hdmi", NULL, "hdmi", mux_pllpdc_clkm, CLK_SOURCE_HDMI, 51, &periph_h_regs, 0, hdmi),
  762. TEGRA_INIT_DATA("pwm", NULL, "tegra-pwm", pwm_parents, CLK_SOURCE_PWM, 28, 3, 0, 0, 8, 1, 0, &periph_l_regs, 17, periph_clk_enb_refcnt, TEGRA_PERIPH_ON_APB, pwm),
  763. };
  764. static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = {
  765. TEGRA_INIT_DATA_NODIV("uarta", NULL, "tegra_uart.0", mux_pllpcm_clkm, CLK_SOURCE_UARTA, 30, 2, 6, &periph_l_regs, TEGRA_PERIPH_ON_APB, uarta),
  766. TEGRA_INIT_DATA_NODIV("uartb", NULL, "tegra_uart.1", mux_pllpcm_clkm, CLK_SOURCE_UARTB, 30, 2, 7, &periph_l_regs, TEGRA_PERIPH_ON_APB, uartb),
  767. TEGRA_INIT_DATA_NODIV("uartc", NULL, "tegra_uart.2", mux_pllpcm_clkm, CLK_SOURCE_UARTC, 30, 2, 55, &periph_h_regs, TEGRA_PERIPH_ON_APB, uartc),
  768. TEGRA_INIT_DATA_NODIV("uartd", NULL, "tegra_uart.3", mux_pllpcm_clkm, CLK_SOURCE_UARTD, 30, 2, 65, &periph_u_regs, TEGRA_PERIPH_ON_APB, uartd),
  769. TEGRA_INIT_DATA_NODIV("uarte", NULL, "tegra_uart.4", mux_pllpcm_clkm, CLK_SOURCE_UARTE, 30, 2, 66, &periph_u_regs, TEGRA_PERIPH_ON_APB, uarte),
  770. TEGRA_INIT_DATA_NODIV("disp1", NULL, "tegradc.0", mux_pllpdc_clkm, CLK_SOURCE_DISP1, 30, 2, 27, &periph_l_regs, 0, disp1),
  771. TEGRA_INIT_DATA_NODIV("disp2", NULL, "tegradc.1", mux_pllpdc_clkm, CLK_SOURCE_DISP2, 30, 2, 26, &periph_l_regs, 0, disp2),
  772. };
  773. static void __init tegra20_periph_clk_init(void)
  774. {
  775. struct tegra_periph_init_data *data;
  776. struct clk *clk;
  777. int i;
  778. /* apbdma */
  779. clk = tegra_clk_register_periph_gate("apbdma", "pclk", 0, clk_base,
  780. 0, 34, &periph_h_regs,
  781. periph_clk_enb_refcnt);
  782. clk_register_clkdev(clk, NULL, "tegra-apbdma");
  783. clks[apbdma] = clk;
  784. /* rtc */
  785. clk = tegra_clk_register_periph_gate("rtc", "clk_32k",
  786. TEGRA_PERIPH_NO_RESET,
  787. clk_base, 0, 4, &periph_l_regs,
  788. periph_clk_enb_refcnt);
  789. clk_register_clkdev(clk, NULL, "rtc-tegra");
  790. clks[rtc] = clk;
  791. /* timer */
  792. clk = tegra_clk_register_periph_gate("timer", "clk_m", 0, clk_base,
  793. 0, 5, &periph_l_regs,
  794. periph_clk_enb_refcnt);
  795. clk_register_clkdev(clk, NULL, "timer");
  796. clks[timer] = clk;
  797. /* kbc */
  798. clk = tegra_clk_register_periph_gate("kbc", "clk_32k",
  799. TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB,
  800. clk_base, 0, 36, &periph_h_regs,
  801. periph_clk_enb_refcnt);
  802. clk_register_clkdev(clk, NULL, "tegra-kbc");
  803. clks[kbc] = clk;
  804. /* csus */
  805. clk = tegra_clk_register_periph_gate("csus", "clk_m",
  806. TEGRA_PERIPH_NO_RESET,
  807. clk_base, 0, 92, &periph_u_regs,
  808. periph_clk_enb_refcnt);
  809. clk_register_clkdev(clk, "csus", "tengra_camera");
  810. clks[csus] = clk;
  811. /* vcp */
  812. clk = tegra_clk_register_periph_gate("vcp", "clk_m", 0,
  813. clk_base, 0, 29, &periph_l_regs,
  814. periph_clk_enb_refcnt);
  815. clk_register_clkdev(clk, "vcp", "tegra-avp");
  816. clks[vcp] = clk;
  817. /* bsea */
  818. clk = tegra_clk_register_periph_gate("bsea", "clk_m", 0,
  819. clk_base, 0, 62, &periph_h_regs,
  820. periph_clk_enb_refcnt);
  821. clk_register_clkdev(clk, "bsea", "tegra-avp");
  822. clks[bsea] = clk;
  823. /* bsev */
  824. clk = tegra_clk_register_periph_gate("bsev", "clk_m", 0,
  825. clk_base, 0, 63, &periph_h_regs,
  826. periph_clk_enb_refcnt);
  827. clk_register_clkdev(clk, "bsev", "tegra-aes");
  828. clks[bsev] = clk;
  829. /* emc */
  830. clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm,
  831. ARRAY_SIZE(mux_pllmcp_clkm), 0,
  832. clk_base + CLK_SOURCE_EMC,
  833. 30, 2, 0, NULL);
  834. clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0,
  835. 57, &periph_h_regs, periph_clk_enb_refcnt);
  836. clk_register_clkdev(clk, "emc", NULL);
  837. clks[emc] = clk;
  838. /* usbd */
  839. clk = tegra_clk_register_periph_gate("usbd", "clk_m", 0, clk_base, 0,
  840. 22, &periph_l_regs, periph_clk_enb_refcnt);
  841. clk_register_clkdev(clk, NULL, "fsl-tegra-udc");
  842. clks[usbd] = clk;
  843. /* usb2 */
  844. clk = tegra_clk_register_periph_gate("usb2", "clk_m", 0, clk_base, 0,
  845. 58, &periph_h_regs, periph_clk_enb_refcnt);
  846. clk_register_clkdev(clk, NULL, "tegra-ehci.1");
  847. clks[usb2] = clk;
  848. /* usb3 */
  849. clk = tegra_clk_register_periph_gate("usb3", "clk_m", 0, clk_base, 0,
  850. 59, &periph_h_regs, periph_clk_enb_refcnt);
  851. clk_register_clkdev(clk, NULL, "tegra-ehci.2");
  852. clks[usb3] = clk;
  853. /* dsi */
  854. clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0,
  855. 48, &periph_h_regs, periph_clk_enb_refcnt);
  856. clk_register_clkdev(clk, NULL, "dsi");
  857. clks[dsi] = clk;
  858. /* csi */
  859. clk = tegra_clk_register_periph_gate("csi", "pll_p_out3", 0, clk_base,
  860. 0, 52, &periph_h_regs,
  861. periph_clk_enb_refcnt);
  862. clk_register_clkdev(clk, "csi", "tegra_camera");
  863. clks[csi] = clk;
  864. /* isp */
  865. clk = tegra_clk_register_periph_gate("isp", "clk_m", 0, clk_base, 0, 23,
  866. &periph_l_regs, periph_clk_enb_refcnt);
  867. clk_register_clkdev(clk, "isp", "tegra_camera");
  868. clks[isp] = clk;
  869. /* pex */
  870. clk = tegra_clk_register_periph_gate("pex", "clk_m", 0, clk_base, 0, 70,
  871. &periph_u_regs, periph_clk_enb_refcnt);
  872. clk_register_clkdev(clk, "pex", NULL);
  873. clks[pex] = clk;
  874. /* afi */
  875. clk = tegra_clk_register_periph_gate("afi", "clk_m", 0, clk_base, 0, 72,
  876. &periph_u_regs, periph_clk_enb_refcnt);
  877. clk_register_clkdev(clk, "afi", NULL);
  878. clks[afi] = clk;
  879. /* pcie_xclk */
  880. clk = tegra_clk_register_periph_gate("pcie_xclk", "clk_m", 0, clk_base,
  881. 0, 74, &periph_u_regs,
  882. periph_clk_enb_refcnt);
  883. clk_register_clkdev(clk, "pcie_xclk", NULL);
  884. clks[pcie_xclk] = clk;
  885. /* cdev1 */
  886. clk = clk_register_fixed_rate(NULL, "cdev1_fixed", NULL, CLK_IS_ROOT,
  887. 26000000);
  888. clk = tegra_clk_register_periph_gate("cdev1", "cdev1_fixed", 0,
  889. clk_base, 0, 94, &periph_u_regs,
  890. periph_clk_enb_refcnt);
  891. clk_register_clkdev(clk, "cdev1", NULL);
  892. clks[cdev1] = clk;
  893. /* cdev2 */
  894. clk = clk_register_fixed_rate(NULL, "cdev2_fixed", NULL, CLK_IS_ROOT,
  895. 26000000);
  896. clk = tegra_clk_register_periph_gate("cdev2", "cdev2_fixed", 0,
  897. clk_base, 0, 93, &periph_u_regs,
  898. periph_clk_enb_refcnt);
  899. clk_register_clkdev(clk, "cdev2", NULL);
  900. clks[cdev2] = clk;
  901. for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) {
  902. data = &tegra_periph_clk_list[i];
  903. clk = tegra_clk_register_periph(data->name, data->parent_names,
  904. data->num_parents, &data->periph,
  905. clk_base, data->offset);
  906. clk_register_clkdev(clk, data->con_id, data->dev_id);
  907. clks[data->clk_id] = clk;
  908. }
  909. for (i = 0; i < ARRAY_SIZE(tegra_periph_nodiv_clk_list); i++) {
  910. data = &tegra_periph_nodiv_clk_list[i];
  911. clk = tegra_clk_register_periph_nodiv(data->name,
  912. data->parent_names,
  913. data->num_parents, &data->periph,
  914. clk_base, data->offset);
  915. clk_register_clkdev(clk, data->con_id, data->dev_id);
  916. clks[data->clk_id] = clk;
  917. }
  918. }
  919. static void __init tegra20_fixed_clk_init(void)
  920. {
  921. struct clk *clk;
  922. /* clk_32k */
  923. clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, CLK_IS_ROOT,
  924. 32768);
  925. clk_register_clkdev(clk, "clk_32k", NULL);
  926. clks[clk_32k] = clk;
  927. }
  928. static void __init tegra20_pmc_clk_init(void)
  929. {
  930. struct clk *clk;
  931. /* blink */
  932. writel_relaxed(0, pmc_base + PMC_BLINK_TIMER);
  933. clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0,
  934. pmc_base + PMC_DPD_PADS_ORIDE,
  935. PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL);
  936. clk = clk_register_gate(NULL, "blink", "blink_override", 0,
  937. pmc_base + PMC_CTRL,
  938. PMC_CTRL_BLINK_ENB, 0, NULL);
  939. clk_register_clkdev(clk, "blink", NULL);
  940. clks[blink] = clk;
  941. }
  942. static void __init tegra20_osc_clk_init(void)
  943. {
  944. struct clk *clk;
  945. unsigned long input_freq;
  946. unsigned int pll_ref_div;
  947. input_freq = tegra20_clk_measure_input_freq();
  948. /* clk_m */
  949. clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT |
  950. CLK_IGNORE_UNUSED, input_freq);
  951. clk_register_clkdev(clk, "clk_m", NULL);
  952. clks[clk_m] = clk;
  953. /* pll_ref */
  954. pll_ref_div = tegra20_get_pll_ref_div();
  955. clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m",
  956. CLK_SET_RATE_PARENT, 1, pll_ref_div);
  957. clk_register_clkdev(clk, "pll_ref", NULL);
  958. clks[pll_ref] = clk;
  959. }
  960. /* Tegra20 CPU clock and reset control functions */
  961. static void tegra20_wait_cpu_in_reset(u32 cpu)
  962. {
  963. unsigned int reg;
  964. do {
  965. reg = readl(clk_base +
  966. TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
  967. cpu_relax();
  968. } while (!(reg & (1 << cpu))); /* check CPU been reset or not */
  969. return;
  970. }
  971. static void tegra20_put_cpu_in_reset(u32 cpu)
  972. {
  973. writel(CPU_RESET(cpu),
  974. clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
  975. dmb();
  976. }
  977. static void tegra20_cpu_out_of_reset(u32 cpu)
  978. {
  979. writel(CPU_RESET(cpu),
  980. clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
  981. wmb();
  982. }
  983. static void tegra20_enable_cpu_clock(u32 cpu)
  984. {
  985. unsigned int reg;
  986. reg = readl(clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
  987. writel(reg & ~CPU_CLOCK(cpu),
  988. clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
  989. barrier();
  990. reg = readl(clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
  991. }
  992. static void tegra20_disable_cpu_clock(u32 cpu)
  993. {
  994. unsigned int reg;
  995. reg = readl(clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
  996. writel(reg | CPU_CLOCK(cpu),
  997. clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
  998. }
  999. static struct tegra_cpu_car_ops tegra20_cpu_car_ops = {
  1000. .wait_for_reset = tegra20_wait_cpu_in_reset,
  1001. .put_in_reset = tegra20_put_cpu_in_reset,
  1002. .out_of_reset = tegra20_cpu_out_of_reset,
  1003. .enable_clock = tegra20_enable_cpu_clock,
  1004. .disable_clock = tegra20_disable_cpu_clock,
  1005. };
  1006. static __initdata struct tegra_clk_init_table init_table[] = {
  1007. {pll_p, clk_max, 216000000, 1},
  1008. {pll_p_out1, clk_max, 28800000, 1},
  1009. {pll_p_out2, clk_max, 48000000, 1},
  1010. {pll_p_out3, clk_max, 72000000, 1},
  1011. {pll_p_out4, clk_max, 24000000, 1},
  1012. {pll_c, clk_max, 600000000, 1},
  1013. {pll_c_out1, clk_max, 120000000, 1},
  1014. {sclk, pll_c_out1, 0, 1},
  1015. {hclk, clk_max, 0, 1},
  1016. {pclk, clk_max, 60000000, 1},
  1017. {csite, clk_max, 0, 1},
  1018. {emc, clk_max, 0, 1},
  1019. {cclk, clk_max, 0, 1},
  1020. {uarta, pll_p, 0, 1},
  1021. {uartd, pll_p, 0, 1},
  1022. {usbd, clk_max, 12000000, 0},
  1023. {usb2, clk_max, 12000000, 0},
  1024. {usb3, clk_max, 12000000, 0},
  1025. {pll_a, clk_max, 56448000, 1},
  1026. {pll_a_out0, clk_max, 11289600, 1},
  1027. {cdev1, clk_max, 0, 1},
  1028. {blink, clk_max, 32768, 1},
  1029. {i2s1, pll_a_out0, 11289600, 0},
  1030. {i2s2, pll_a_out0, 11289600, 0},
  1031. {sdmmc1, pll_p, 48000000, 0},
  1032. {sdmmc3, pll_p, 48000000, 0},
  1033. {sdmmc4, pll_p, 48000000, 0},
  1034. {spi, pll_p, 20000000, 0},
  1035. {sbc1, pll_p, 100000000, 0},
  1036. {sbc2, pll_p, 100000000, 0},
  1037. {sbc3, pll_p, 100000000, 0},
  1038. {sbc4, pll_p, 100000000, 0},
  1039. {host1x, pll_c, 150000000, 0},
  1040. {disp1, pll_p, 600000000, 0},
  1041. {disp2, pll_p, 600000000, 0},
  1042. {clk_max, clk_max, 0, 0}, /* This MUST be the last entry */
  1043. };
  1044. /*
  1045. * Some clocks may be used by different drivers depending on the board
  1046. * configuration. List those here to register them twice in the clock lookup
  1047. * table under two names.
  1048. */
  1049. static struct tegra_clk_duplicate tegra_clk_duplicates[] = {
  1050. TEGRA_CLK_DUPLICATE(usbd, "utmip-pad", NULL),
  1051. TEGRA_CLK_DUPLICATE(usbd, "tegra-ehci.0", NULL),
  1052. TEGRA_CLK_DUPLICATE(usbd, "tegra-otg", NULL),
  1053. TEGRA_CLK_DUPLICATE(cclk, NULL, "cpu"),
  1054. TEGRA_CLK_DUPLICATE(twd, "smp_twd", NULL),
  1055. TEGRA_CLK_DUPLICATE(clk_max, NULL, NULL), /* Must be the last entry */
  1056. };
  1057. static const struct of_device_id pmc_match[] __initconst = {
  1058. { .compatible = "nvidia,tegra20-pmc" },
  1059. {},
  1060. };
  1061. void __init tegra20_clock_init(struct device_node *np)
  1062. {
  1063. int i;
  1064. struct device_node *node;
  1065. clk_base = of_iomap(np, 0);
  1066. if (!clk_base) {
  1067. pr_err("Can't map CAR registers\n");
  1068. BUG();
  1069. }
  1070. node = of_find_matching_node(NULL, pmc_match);
  1071. if (!node) {
  1072. pr_err("Failed to find pmc node\n");
  1073. BUG();
  1074. }
  1075. pmc_base = of_iomap(node, 0);
  1076. if (!pmc_base) {
  1077. pr_err("Can't map pmc registers\n");
  1078. BUG();
  1079. }
  1080. tegra20_osc_clk_init();
  1081. tegra20_pmc_clk_init();
  1082. tegra20_fixed_clk_init();
  1083. tegra20_pll_init();
  1084. tegra20_super_clk_init();
  1085. tegra20_periph_clk_init();
  1086. tegra20_audio_clk_init();
  1087. for (i = 0; i < ARRAY_SIZE(clks); i++) {
  1088. if (IS_ERR(clks[i])) {
  1089. pr_err("Tegra20 clk %d: register failed with %ld\n",
  1090. i, PTR_ERR(clks[i]));
  1091. BUG();
  1092. }
  1093. if (!clks[i])
  1094. clks[i] = ERR_PTR(-EINVAL);
  1095. }
  1096. tegra_init_dup_clks(tegra_clk_duplicates, clks, clk_max);
  1097. clk_data.clks = clks;
  1098. clk_data.clk_num = ARRAY_SIZE(clks);
  1099. of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
  1100. tegra_init_from_table(init_table, clks, clk_max);
  1101. tegra_cpu_car_ops = &tegra20_cpu_car_ops;
  1102. }