tegra20_clocks.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554
  1. /*
  2. * arch/arm/mach-tegra/tegra20_clocks.c
  3. *
  4. * Copyright (C) 2010 Google, Inc.
  5. * Copyright (c) 2010-2012 NVIDIA CORPORATION. All rights reserved.
  6. *
  7. * Author:
  8. * Colin Cross <ccross@google.com>
  9. *
  10. * This software is licensed under the terms of the GNU General Public
  11. * License version 2, as published by the Free Software Foundation, and
  12. * may be copied, distributed, and modified under those terms.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. */
  20. #include <linux/kernel.h>
  21. #include <linux/module.h>
  22. #include <linux/list.h>
  23. #include <linux/spinlock.h>
  24. #include <linux/delay.h>
  25. #include <linux/io.h>
  26. #include <linux/clkdev.h>
  27. #include <linux/clk.h>
  28. #include <mach/iomap.h>
  29. #include "clock.h"
  30. #include "fuse.h"
  31. #include "tegra2_emc.h"
  32. #define RST_DEVICES 0x004
  33. #define RST_DEVICES_SET 0x300
  34. #define RST_DEVICES_CLR 0x304
  35. #define RST_DEVICES_NUM 3
  36. #define CLK_OUT_ENB 0x010
  37. #define CLK_OUT_ENB_SET 0x320
  38. #define CLK_OUT_ENB_CLR 0x324
  39. #define CLK_OUT_ENB_NUM 3
  40. #define CLK_MASK_ARM 0x44
  41. #define MISC_CLK_ENB 0x48
  42. #define OSC_CTRL 0x50
  43. #define OSC_CTRL_OSC_FREQ_MASK (3<<30)
  44. #define OSC_CTRL_OSC_FREQ_13MHZ (0<<30)
  45. #define OSC_CTRL_OSC_FREQ_19_2MHZ (1<<30)
  46. #define OSC_CTRL_OSC_FREQ_12MHZ (2<<30)
  47. #define OSC_CTRL_OSC_FREQ_26MHZ (3<<30)
  48. #define OSC_CTRL_MASK (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
  49. #define OSC_FREQ_DET 0x58
  50. #define OSC_FREQ_DET_TRIG (1<<31)
  51. #define OSC_FREQ_DET_STATUS 0x5C
  52. #define OSC_FREQ_DET_BUSY (1<<31)
  53. #define OSC_FREQ_DET_CNT_MASK 0xFFFF
  54. #define PERIPH_CLK_SOURCE_I2S1 0x100
  55. #define PERIPH_CLK_SOURCE_EMC 0x19c
  56. #define PERIPH_CLK_SOURCE_OSC 0x1fc
  57. #define PERIPH_CLK_SOURCE_NUM \
  58. ((PERIPH_CLK_SOURCE_OSC - PERIPH_CLK_SOURCE_I2S1) / 4)
  59. #define PERIPH_CLK_SOURCE_MASK (3<<30)
  60. #define PERIPH_CLK_SOURCE_SHIFT 30
  61. #define PERIPH_CLK_SOURCE_PWM_MASK (7<<28)
  62. #define PERIPH_CLK_SOURCE_PWM_SHIFT 28
  63. #define PERIPH_CLK_SOURCE_ENABLE (1<<28)
  64. #define PERIPH_CLK_SOURCE_DIVU71_MASK 0xFF
  65. #define PERIPH_CLK_SOURCE_DIVU16_MASK 0xFFFF
  66. #define PERIPH_CLK_SOURCE_DIV_SHIFT 0
  67. #define SDMMC_CLK_INT_FB_SEL (1 << 23)
  68. #define SDMMC_CLK_INT_FB_DLY_SHIFT 16
  69. #define SDMMC_CLK_INT_FB_DLY_MASK (0xF << SDMMC_CLK_INT_FB_DLY_SHIFT)
  70. #define PLL_BASE 0x0
  71. #define PLL_BASE_BYPASS (1<<31)
  72. #define PLL_BASE_ENABLE (1<<30)
  73. #define PLL_BASE_REF_ENABLE (1<<29)
  74. #define PLL_BASE_OVERRIDE (1<<28)
  75. #define PLL_BASE_DIVP_MASK (0x7<<20)
  76. #define PLL_BASE_DIVP_SHIFT 20
  77. #define PLL_BASE_DIVN_MASK (0x3FF<<8)
  78. #define PLL_BASE_DIVN_SHIFT 8
  79. #define PLL_BASE_DIVM_MASK (0x1F)
  80. #define PLL_BASE_DIVM_SHIFT 0
  81. #define PLL_OUT_RATIO_MASK (0xFF<<8)
  82. #define PLL_OUT_RATIO_SHIFT 8
  83. #define PLL_OUT_OVERRIDE (1<<2)
  84. #define PLL_OUT_CLKEN (1<<1)
  85. #define PLL_OUT_RESET_DISABLE (1<<0)
  86. #define PLL_MISC(c) (((c)->flags & PLL_ALT_MISC_REG) ? 0x4 : 0xc)
  87. #define PLL_MISC_DCCON_SHIFT 20
  88. #define PLL_MISC_CPCON_SHIFT 8
  89. #define PLL_MISC_CPCON_MASK (0xF<<PLL_MISC_CPCON_SHIFT)
  90. #define PLL_MISC_LFCON_SHIFT 4
  91. #define PLL_MISC_LFCON_MASK (0xF<<PLL_MISC_LFCON_SHIFT)
  92. #define PLL_MISC_VCOCON_SHIFT 0
  93. #define PLL_MISC_VCOCON_MASK (0xF<<PLL_MISC_VCOCON_SHIFT)
  94. #define PLLU_BASE_POST_DIV (1<<20)
  95. #define PLLD_MISC_CLKENABLE (1<<30)
  96. #define PLLD_MISC_DIV_RST (1<<23)
  97. #define PLLD_MISC_DCCON_SHIFT 12
  98. #define PLLE_MISC_READY (1 << 15)
  99. #define PERIPH_CLK_TO_ENB_REG(c) ((c->u.periph.clk_num / 32) * 4)
  100. #define PERIPH_CLK_TO_ENB_SET_REG(c) ((c->u.periph.clk_num / 32) * 8)
  101. #define PERIPH_CLK_TO_ENB_BIT(c) (1 << (c->u.periph.clk_num % 32))
  102. #define SUPER_CLK_MUX 0x00
  103. #define SUPER_STATE_SHIFT 28
  104. #define SUPER_STATE_MASK (0xF << SUPER_STATE_SHIFT)
  105. #define SUPER_STATE_STANDBY (0x0 << SUPER_STATE_SHIFT)
  106. #define SUPER_STATE_IDLE (0x1 << SUPER_STATE_SHIFT)
  107. #define SUPER_STATE_RUN (0x2 << SUPER_STATE_SHIFT)
  108. #define SUPER_STATE_IRQ (0x3 << SUPER_STATE_SHIFT)
  109. #define SUPER_STATE_FIQ (0x4 << SUPER_STATE_SHIFT)
  110. #define SUPER_SOURCE_MASK 0xF
  111. #define SUPER_FIQ_SOURCE_SHIFT 12
  112. #define SUPER_IRQ_SOURCE_SHIFT 8
  113. #define SUPER_RUN_SOURCE_SHIFT 4
  114. #define SUPER_IDLE_SOURCE_SHIFT 0
  115. #define SUPER_CLK_DIVIDER 0x04
  116. #define BUS_CLK_DISABLE (1<<3)
  117. #define BUS_CLK_DIV_MASK 0x3
  118. #define PMC_CTRL 0x0
  119. #define PMC_CTRL_BLINK_ENB (1 << 7)
  120. #define PMC_DPD_PADS_ORIDE 0x1c
  121. #define PMC_DPD_PADS_ORIDE_BLINK_ENB (1 << 20)
  122. #define PMC_BLINK_TIMER_DATA_ON_SHIFT 0
  123. #define PMC_BLINK_TIMER_DATA_ON_MASK 0x7fff
  124. #define PMC_BLINK_TIMER_ENB (1 << 15)
  125. #define PMC_BLINK_TIMER_DATA_OFF_SHIFT 16
  126. #define PMC_BLINK_TIMER_DATA_OFF_MASK 0xffff
  127. static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
  128. static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
  129. /*
  130. * Some clocks share a register with other clocks. Any clock op that
  131. * non-atomically modifies a register used by another clock must lock
  132. * clock_register_lock first.
  133. */
  134. static DEFINE_SPINLOCK(clock_register_lock);
  135. /*
  136. * Some peripheral clocks share an enable bit, so refcount the enable bits
  137. * in registers CLK_ENABLE_L, CLK_ENABLE_H, and CLK_ENABLE_U
  138. */
  139. static int tegra_periph_clk_enable_refcount[3 * 32];
  140. #define clk_writel(value, reg) \
  141. __raw_writel(value, reg_clk_base + (reg))
  142. #define clk_readl(reg) \
  143. __raw_readl(reg_clk_base + (reg))
  144. #define pmc_writel(value, reg) \
  145. __raw_writel(value, reg_pmc_base + (reg))
  146. #define pmc_readl(reg) \
  147. __raw_readl(reg_pmc_base + (reg))
  148. static unsigned long clk_measure_input_freq(void)
  149. {
  150. u32 clock_autodetect;
  151. clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET);
  152. do {} while (clk_readl(OSC_FREQ_DET_STATUS) & OSC_FREQ_DET_BUSY);
  153. clock_autodetect = clk_readl(OSC_FREQ_DET_STATUS);
  154. if (clock_autodetect >= 732 - 3 && clock_autodetect <= 732 + 3) {
  155. return 12000000;
  156. } else if (clock_autodetect >= 794 - 3 && clock_autodetect <= 794 + 3) {
  157. return 13000000;
  158. } else if (clock_autodetect >= 1172 - 3 && clock_autodetect <= 1172 + 3) {
  159. return 19200000;
  160. } else if (clock_autodetect >= 1587 - 3 && clock_autodetect <= 1587 + 3) {
  161. return 26000000;
  162. } else {
  163. pr_err("%s: Unexpected clock autodetect value %d",
  164. __func__, clock_autodetect);
  165. BUG();
  166. return 0;
  167. }
  168. }
  169. static int clk_div71_get_divider(unsigned long parent_rate, unsigned long rate)
  170. {
  171. s64 divider_u71 = parent_rate * 2;
  172. divider_u71 += rate - 1;
  173. do_div(divider_u71, rate);
  174. if (divider_u71 - 2 < 0)
  175. return 0;
  176. if (divider_u71 - 2 > 255)
  177. return -EINVAL;
  178. return divider_u71 - 2;
  179. }
  180. static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
  181. {
  182. s64 divider_u16;
  183. divider_u16 = parent_rate;
  184. divider_u16 += rate - 1;
  185. do_div(divider_u16, rate);
  186. if (divider_u16 - 1 < 0)
  187. return 0;
  188. if (divider_u16 - 1 > 0xFFFF)
  189. return -EINVAL;
  190. return divider_u16 - 1;
  191. }
  192. static unsigned long tegra_clk_fixed_recalc_rate(struct clk_hw *hw,
  193. unsigned long parent_rate)
  194. {
  195. return to_clk_tegra(hw)->fixed_rate;
  196. }
  197. struct clk_ops tegra_clk_32k_ops = {
  198. .recalc_rate = tegra_clk_fixed_recalc_rate,
  199. };
  200. /* clk_m functions */
  201. static unsigned long tegra20_clk_m_recalc_rate(struct clk_hw *hw,
  202. unsigned long prate)
  203. {
  204. if (!to_clk_tegra(hw)->fixed_rate)
  205. to_clk_tegra(hw)->fixed_rate = clk_measure_input_freq();
  206. return to_clk_tegra(hw)->fixed_rate;
  207. }
  208. static void tegra20_clk_m_init(struct clk_hw *hw)
  209. {
  210. struct clk_tegra *c = to_clk_tegra(hw);
  211. u32 osc_ctrl = clk_readl(OSC_CTRL);
  212. u32 auto_clock_control = osc_ctrl & ~OSC_CTRL_OSC_FREQ_MASK;
  213. switch (c->fixed_rate) {
  214. case 12000000:
  215. auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
  216. break;
  217. case 13000000:
  218. auto_clock_control |= OSC_CTRL_OSC_FREQ_13MHZ;
  219. break;
  220. case 19200000:
  221. auto_clock_control |= OSC_CTRL_OSC_FREQ_19_2MHZ;
  222. break;
  223. case 26000000:
  224. auto_clock_control |= OSC_CTRL_OSC_FREQ_26MHZ;
  225. break;
  226. default:
  227. BUG();
  228. }
  229. clk_writel(auto_clock_control, OSC_CTRL);
  230. }
  231. struct clk_ops tegra_clk_m_ops = {
  232. .init = tegra20_clk_m_init,
  233. .recalc_rate = tegra20_clk_m_recalc_rate,
  234. };
  235. /* super clock functions */
  236. /* "super clocks" on tegra have two-stage muxes and a clock skipping
  237. * super divider. We will ignore the clock skipping divider, since we
  238. * can't lower the voltage when using the clock skip, but we can if we
  239. * lower the PLL frequency.
  240. */
  241. static int tegra20_super_clk_is_enabled(struct clk_hw *hw)
  242. {
  243. struct clk_tegra *c = to_clk_tegra(hw);
  244. u32 val;
  245. val = clk_readl(c->reg + SUPER_CLK_MUX);
  246. BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
  247. ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
  248. c->state = ON;
  249. return c->state;
  250. }
  251. static int tegra20_super_clk_enable(struct clk_hw *hw)
  252. {
  253. struct clk_tegra *c = to_clk_tegra(hw);
  254. clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
  255. return 0;
  256. }
  257. static void tegra20_super_clk_disable(struct clk_hw *hw)
  258. {
  259. pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
  260. /* oops - don't disable the CPU clock! */
  261. BUG();
  262. }
  263. static u8 tegra20_super_clk_get_parent(struct clk_hw *hw)
  264. {
  265. struct clk_tegra *c = to_clk_tegra(hw);
  266. int val = clk_readl(c->reg + SUPER_CLK_MUX);
  267. int source;
  268. int shift;
  269. BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
  270. ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
  271. shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
  272. SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
  273. source = (val >> shift) & SUPER_SOURCE_MASK;
  274. return source;
  275. }
  276. static int tegra20_super_clk_set_parent(struct clk_hw *hw, u8 index)
  277. {
  278. struct clk_tegra *c = to_clk_tegra(hw);
  279. u32 val = clk_readl(c->reg + SUPER_CLK_MUX);
  280. int shift;
  281. BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
  282. ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
  283. shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
  284. SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
  285. val &= ~(SUPER_SOURCE_MASK << shift);
  286. val |= index << shift;
  287. clk_writel(val, c->reg);
  288. return 0;
  289. }
  290. /* FIX ME: Need to switch parents to change the source PLL rate */
  291. static unsigned long tegra20_super_clk_recalc_rate(struct clk_hw *hw,
  292. unsigned long prate)
  293. {
  294. return prate;
  295. }
  296. static long tegra20_super_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  297. unsigned long *prate)
  298. {
  299. return *prate;
  300. }
  301. static int tegra20_super_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  302. unsigned long parent_rate)
  303. {
  304. return 0;
  305. }
  306. struct clk_ops tegra_super_ops = {
  307. .is_enabled = tegra20_super_clk_is_enabled,
  308. .enable = tegra20_super_clk_enable,
  309. .disable = tegra20_super_clk_disable,
  310. .set_parent = tegra20_super_clk_set_parent,
  311. .get_parent = tegra20_super_clk_get_parent,
  312. .set_rate = tegra20_super_clk_set_rate,
  313. .round_rate = tegra20_super_clk_round_rate,
  314. .recalc_rate = tegra20_super_clk_recalc_rate,
  315. };
  316. static unsigned long tegra20_twd_clk_recalc_rate(struct clk_hw *hw,
  317. unsigned long parent_rate)
  318. {
  319. struct clk_tegra *c = to_clk_tegra(hw);
  320. u64 rate = parent_rate;
  321. if (c->mul != 0 && c->div != 0) {
  322. rate *= c->mul;
  323. rate += c->div - 1; /* round up */
  324. do_div(rate, c->div);
  325. }
  326. return rate;
  327. }
  328. struct clk_ops tegra_twd_ops = {
  329. .recalc_rate = tegra20_twd_clk_recalc_rate,
  330. };
  331. static u8 tegra20_cop_clk_get_parent(struct clk_hw *hw)
  332. {
  333. return 0;
  334. }
  335. struct clk_ops tegra_cop_ops = {
  336. .get_parent = tegra20_cop_clk_get_parent,
  337. };
  338. /* virtual cop clock functions. Used to acquire the fake 'cop' clock to
  339. * reset the COP block (i.e. AVP) */
  340. void tegra2_cop_clk_reset(struct clk_hw *hw, bool assert)
  341. {
  342. unsigned long reg = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
  343. pr_debug("%s %s\n", __func__, assert ? "assert" : "deassert");
  344. clk_writel(1 << 1, reg);
  345. }
  346. /* bus clock functions */
  347. static int tegra20_bus_clk_is_enabled(struct clk_hw *hw)
  348. {
  349. struct clk_tegra *c = to_clk_tegra(hw);
  350. u32 val = clk_readl(c->reg);
  351. c->state = ((val >> c->reg_shift) & BUS_CLK_DISABLE) ? OFF : ON;
  352. return c->state;
  353. }
  354. static int tegra20_bus_clk_enable(struct clk_hw *hw)
  355. {
  356. struct clk_tegra *c = to_clk_tegra(hw);
  357. unsigned long flags;
  358. u32 val;
  359. spin_lock_irqsave(&clock_register_lock, flags);
  360. val = clk_readl(c->reg);
  361. val &= ~(BUS_CLK_DISABLE << c->reg_shift);
  362. clk_writel(val, c->reg);
  363. spin_unlock_irqrestore(&clock_register_lock, flags);
  364. return 0;
  365. }
  366. static void tegra20_bus_clk_disable(struct clk_hw *hw)
  367. {
  368. struct clk_tegra *c = to_clk_tegra(hw);
  369. unsigned long flags;
  370. u32 val;
  371. spin_lock_irqsave(&clock_register_lock, flags);
  372. val = clk_readl(c->reg);
  373. val |= BUS_CLK_DISABLE << c->reg_shift;
  374. clk_writel(val, c->reg);
  375. spin_unlock_irqrestore(&clock_register_lock, flags);
  376. }
  377. static unsigned long tegra20_bus_clk_recalc_rate(struct clk_hw *hw,
  378. unsigned long prate)
  379. {
  380. struct clk_tegra *c = to_clk_tegra(hw);
  381. u32 val = clk_readl(c->reg);
  382. u64 rate = prate;
  383. c->div = ((val >> c->reg_shift) & BUS_CLK_DIV_MASK) + 1;
  384. c->mul = 1;
  385. if (c->mul != 0 && c->div != 0) {
  386. rate *= c->mul;
  387. rate += c->div - 1; /* round up */
  388. do_div(rate, c->div);
  389. }
  390. return rate;
  391. }
  392. static int tegra20_bus_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  393. unsigned long parent_rate)
  394. {
  395. struct clk_tegra *c = to_clk_tegra(hw);
  396. int ret = -EINVAL;
  397. unsigned long flags;
  398. u32 val;
  399. int i;
  400. spin_lock_irqsave(&clock_register_lock, flags);
  401. val = clk_readl(c->reg);
  402. for (i = 1; i <= 4; i++) {
  403. if (rate == parent_rate / i) {
  404. val &= ~(BUS_CLK_DIV_MASK << c->reg_shift);
  405. val |= (i - 1) << c->reg_shift;
  406. clk_writel(val, c->reg);
  407. c->div = i;
  408. c->mul = 1;
  409. ret = 0;
  410. break;
  411. }
  412. }
  413. spin_unlock_irqrestore(&clock_register_lock, flags);
  414. return ret;
  415. }
  416. static long tegra20_bus_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  417. unsigned long *prate)
  418. {
  419. unsigned long parent_rate = *prate;
  420. s64 divider;
  421. if (rate >= parent_rate)
  422. return rate;
  423. divider = parent_rate;
  424. divider += rate - 1;
  425. do_div(divider, rate);
  426. if (divider < 0)
  427. return divider;
  428. if (divider > 4)
  429. divider = 4;
  430. do_div(parent_rate, divider);
  431. return parent_rate;
  432. }
  433. struct clk_ops tegra_bus_ops = {
  434. .is_enabled = tegra20_bus_clk_is_enabled,
  435. .enable = tegra20_bus_clk_enable,
  436. .disable = tegra20_bus_clk_disable,
  437. .set_rate = tegra20_bus_clk_set_rate,
  438. .round_rate = tegra20_bus_clk_round_rate,
  439. .recalc_rate = tegra20_bus_clk_recalc_rate,
  440. };
  441. /* Blink output functions */
  442. static int tegra20_blink_clk_is_enabled(struct clk_hw *hw)
  443. {
  444. struct clk_tegra *c = to_clk_tegra(hw);
  445. u32 val;
  446. val = pmc_readl(PMC_CTRL);
  447. c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
  448. return c->state;
  449. }
  450. static unsigned long tegra20_blink_clk_recalc_rate(struct clk_hw *hw,
  451. unsigned long prate)
  452. {
  453. struct clk_tegra *c = to_clk_tegra(hw);
  454. u64 rate = prate;
  455. u32 val;
  456. c->mul = 1;
  457. val = pmc_readl(c->reg);
  458. if (val & PMC_BLINK_TIMER_ENB) {
  459. unsigned int on_off;
  460. on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
  461. PMC_BLINK_TIMER_DATA_ON_MASK;
  462. val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
  463. val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
  464. on_off += val;
  465. /* each tick in the blink timer is 4 32KHz clocks */
  466. c->div = on_off * 4;
  467. } else {
  468. c->div = 1;
  469. }
  470. if (c->mul != 0 && c->div != 0) {
  471. rate *= c->mul;
  472. rate += c->div - 1; /* round up */
  473. do_div(rate, c->div);
  474. }
  475. return rate;
  476. }
  477. static int tegra20_blink_clk_enable(struct clk_hw *hw)
  478. {
  479. u32 val;
  480. val = pmc_readl(PMC_DPD_PADS_ORIDE);
  481. pmc_writel(val | PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
  482. val = pmc_readl(PMC_CTRL);
  483. pmc_writel(val | PMC_CTRL_BLINK_ENB, PMC_CTRL);
  484. return 0;
  485. }
  486. static void tegra20_blink_clk_disable(struct clk_hw *hw)
  487. {
  488. u32 val;
  489. val = pmc_readl(PMC_CTRL);
  490. pmc_writel(val & ~PMC_CTRL_BLINK_ENB, PMC_CTRL);
  491. val = pmc_readl(PMC_DPD_PADS_ORIDE);
  492. pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
  493. }
  494. static int tegra20_blink_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  495. unsigned long parent_rate)
  496. {
  497. struct clk_tegra *c = to_clk_tegra(hw);
  498. if (rate >= parent_rate) {
  499. c->div = 1;
  500. pmc_writel(0, c->reg);
  501. } else {
  502. unsigned int on_off;
  503. u32 val;
  504. on_off = DIV_ROUND_UP(parent_rate / 8, rate);
  505. c->div = on_off * 8;
  506. val = (on_off & PMC_BLINK_TIMER_DATA_ON_MASK) <<
  507. PMC_BLINK_TIMER_DATA_ON_SHIFT;
  508. on_off &= PMC_BLINK_TIMER_DATA_OFF_MASK;
  509. on_off <<= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
  510. val |= on_off;
  511. val |= PMC_BLINK_TIMER_ENB;
  512. pmc_writel(val, c->reg);
  513. }
  514. return 0;
  515. }
  516. static long tegra20_blink_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  517. unsigned long *prate)
  518. {
  519. int div;
  520. int mul;
  521. long round_rate = *prate;
  522. mul = 1;
  523. if (rate >= *prate) {
  524. div = 1;
  525. } else {
  526. div = DIV_ROUND_UP(*prate / 8, rate);
  527. div *= 8;
  528. }
  529. round_rate *= mul;
  530. round_rate += div - 1;
  531. do_div(round_rate, div);
  532. return round_rate;
  533. }
  534. struct clk_ops tegra_blink_clk_ops = {
  535. .is_enabled = tegra20_blink_clk_is_enabled,
  536. .enable = tegra20_blink_clk_enable,
  537. .disable = tegra20_blink_clk_disable,
  538. .set_rate = tegra20_blink_clk_set_rate,
  539. .round_rate = tegra20_blink_clk_round_rate,
  540. .recalc_rate = tegra20_blink_clk_recalc_rate,
  541. };
  542. /* PLL Functions */
  543. static int tegra20_pll_clk_wait_for_lock(struct clk_tegra *c)
  544. {
  545. udelay(c->u.pll.lock_delay);
  546. return 0;
  547. }
  548. static int tegra20_pll_clk_is_enabled(struct clk_hw *hw)
  549. {
  550. struct clk_tegra *c = to_clk_tegra(hw);
  551. u32 val = clk_readl(c->reg + PLL_BASE);
  552. c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
  553. return c->state;
  554. }
  555. static unsigned long tegra20_pll_clk_recalc_rate(struct clk_hw *hw,
  556. unsigned long prate)
  557. {
  558. struct clk_tegra *c = to_clk_tegra(hw);
  559. u32 val = clk_readl(c->reg + PLL_BASE);
  560. u64 rate = prate;
  561. if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
  562. const struct clk_pll_freq_table *sel;
  563. for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
  564. if (sel->input_rate == prate &&
  565. sel->output_rate == c->u.pll.fixed_rate) {
  566. c->mul = sel->n;
  567. c->div = sel->m * sel->p;
  568. break;
  569. }
  570. }
  571. pr_err("Clock %s has unknown fixed frequency\n",
  572. __clk_get_name(hw->clk));
  573. BUG();
  574. } else if (val & PLL_BASE_BYPASS) {
  575. c->mul = 1;
  576. c->div = 1;
  577. } else {
  578. c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
  579. c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
  580. if (c->flags & PLLU)
  581. c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
  582. else
  583. c->div *= (val & PLL_BASE_DIVP_MASK) ? 2 : 1;
  584. }
  585. if (c->mul != 0 && c->div != 0) {
  586. rate *= c->mul;
  587. rate += c->div - 1; /* round up */
  588. do_div(rate, c->div);
  589. }
  590. return rate;
  591. }
  592. static int tegra20_pll_clk_enable(struct clk_hw *hw)
  593. {
  594. struct clk_tegra *c = to_clk_tegra(hw);
  595. u32 val;
  596. pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
  597. val = clk_readl(c->reg + PLL_BASE);
  598. val &= ~PLL_BASE_BYPASS;
  599. val |= PLL_BASE_ENABLE;
  600. clk_writel(val, c->reg + PLL_BASE);
  601. tegra20_pll_clk_wait_for_lock(c);
  602. return 0;
  603. }
  604. static void tegra20_pll_clk_disable(struct clk_hw *hw)
  605. {
  606. struct clk_tegra *c = to_clk_tegra(hw);
  607. u32 val;
  608. pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
  609. val = clk_readl(c->reg);
  610. val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
  611. clk_writel(val, c->reg);
  612. }
  613. static int tegra20_pll_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  614. unsigned long parent_rate)
  615. {
  616. struct clk_tegra *c = to_clk_tegra(hw);
  617. unsigned long input_rate = parent_rate;
  618. const struct clk_pll_freq_table *sel;
  619. u32 val;
  620. pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
  621. if (c->flags & PLL_FIXED) {
  622. int ret = 0;
  623. if (rate != c->u.pll.fixed_rate) {
  624. pr_err("%s: Can not change %s fixed rate %lu to %lu\n",
  625. __func__, __clk_get_name(hw->clk),
  626. c->u.pll.fixed_rate, rate);
  627. ret = -EINVAL;
  628. }
  629. return ret;
  630. }
  631. for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
  632. if (sel->input_rate == input_rate && sel->output_rate == rate) {
  633. c->mul = sel->n;
  634. c->div = sel->m * sel->p;
  635. val = clk_readl(c->reg + PLL_BASE);
  636. if (c->flags & PLL_FIXED)
  637. val |= PLL_BASE_OVERRIDE;
  638. val &= ~(PLL_BASE_DIVP_MASK | PLL_BASE_DIVN_MASK |
  639. PLL_BASE_DIVM_MASK);
  640. val |= (sel->m << PLL_BASE_DIVM_SHIFT) |
  641. (sel->n << PLL_BASE_DIVN_SHIFT);
  642. BUG_ON(sel->p < 1 || sel->p > 2);
  643. if (c->flags & PLLU) {
  644. if (sel->p == 1)
  645. val |= PLLU_BASE_POST_DIV;
  646. } else {
  647. if (sel->p == 2)
  648. val |= 1 << PLL_BASE_DIVP_SHIFT;
  649. }
  650. clk_writel(val, c->reg + PLL_BASE);
  651. if (c->flags & PLL_HAS_CPCON) {
  652. val = clk_readl(c->reg + PLL_MISC(c));
  653. val &= ~PLL_MISC_CPCON_MASK;
  654. val |= sel->cpcon << PLL_MISC_CPCON_SHIFT;
  655. clk_writel(val, c->reg + PLL_MISC(c));
  656. }
  657. if (c->state == ON)
  658. tegra20_pll_clk_enable(hw);
  659. return 0;
  660. }
  661. }
  662. return -EINVAL;
  663. }
  664. static long tegra20_pll_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  665. unsigned long *prate)
  666. {
  667. struct clk_tegra *c = to_clk_tegra(hw);
  668. const struct clk_pll_freq_table *sel;
  669. unsigned long input_rate = *prate;
  670. u64 output_rate = *prate;
  671. int mul;
  672. int div;
  673. if (c->flags & PLL_FIXED)
  674. return c->u.pll.fixed_rate;
  675. for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++)
  676. if (sel->input_rate == input_rate && sel->output_rate == rate) {
  677. mul = sel->n;
  678. div = sel->m * sel->p;
  679. break;
  680. }
  681. if (sel->input_rate == 0)
  682. return -EINVAL;
  683. output_rate *= mul;
  684. output_rate += div - 1; /* round up */
  685. do_div(output_rate, div);
  686. return output_rate;
  687. }
  688. struct clk_ops tegra_pll_ops = {
  689. .is_enabled = tegra20_pll_clk_is_enabled,
  690. .enable = tegra20_pll_clk_enable,
  691. .disable = tegra20_pll_clk_disable,
  692. .set_rate = tegra20_pll_clk_set_rate,
  693. .recalc_rate = tegra20_pll_clk_recalc_rate,
  694. .round_rate = tegra20_pll_clk_round_rate,
  695. };
  696. static void tegra20_pllx_clk_init(struct clk_hw *hw)
  697. {
  698. struct clk_tegra *c = to_clk_tegra(hw);
  699. if (tegra_sku_id == 7)
  700. c->max_rate = 750000000;
  701. }
  702. struct clk_ops tegra_pllx_ops = {
  703. .init = tegra20_pllx_clk_init,
  704. .is_enabled = tegra20_pll_clk_is_enabled,
  705. .enable = tegra20_pll_clk_enable,
  706. .disable = tegra20_pll_clk_disable,
  707. .set_rate = tegra20_pll_clk_set_rate,
  708. .recalc_rate = tegra20_pll_clk_recalc_rate,
  709. .round_rate = tegra20_pll_clk_round_rate,
  710. };
  711. static int tegra20_plle_clk_enable(struct clk_hw *hw)
  712. {
  713. struct clk_tegra *c = to_clk_tegra(hw);
  714. u32 val;
  715. pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
  716. mdelay(1);
  717. val = clk_readl(c->reg + PLL_BASE);
  718. if (!(val & PLLE_MISC_READY))
  719. return -EBUSY;
  720. val = clk_readl(c->reg + PLL_BASE);
  721. val |= PLL_BASE_ENABLE | PLL_BASE_BYPASS;
  722. clk_writel(val, c->reg + PLL_BASE);
  723. return 0;
  724. }
  725. struct clk_ops tegra_plle_ops = {
  726. .is_enabled = tegra20_pll_clk_is_enabled,
  727. .enable = tegra20_plle_clk_enable,
  728. .set_rate = tegra20_pll_clk_set_rate,
  729. .recalc_rate = tegra20_pll_clk_recalc_rate,
  730. .round_rate = tegra20_pll_clk_round_rate,
  731. };
  732. /* Clock divider ops */
  733. static int tegra20_pll_div_clk_is_enabled(struct clk_hw *hw)
  734. {
  735. struct clk_tegra *c = to_clk_tegra(hw);
  736. u32 val = clk_readl(c->reg);
  737. val >>= c->reg_shift;
  738. c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
  739. if (!(val & PLL_OUT_RESET_DISABLE))
  740. c->state = OFF;
  741. return c->state;
  742. }
  743. static unsigned long tegra20_pll_div_clk_recalc_rate(struct clk_hw *hw,
  744. unsigned long prate)
  745. {
  746. struct clk_tegra *c = to_clk_tegra(hw);
  747. u64 rate = prate;
  748. u32 val = clk_readl(c->reg);
  749. u32 divu71;
  750. val >>= c->reg_shift;
  751. if (c->flags & DIV_U71) {
  752. divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
  753. c->div = (divu71 + 2);
  754. c->mul = 2;
  755. } else if (c->flags & DIV_2) {
  756. c->div = 2;
  757. c->mul = 1;
  758. } else {
  759. c->div = 1;
  760. c->mul = 1;
  761. }
  762. rate *= c->mul;
  763. rate += c->div - 1; /* round up */
  764. do_div(rate, c->div);
  765. return rate;
  766. }
  767. static int tegra20_pll_div_clk_enable(struct clk_hw *hw)
  768. {
  769. struct clk_tegra *c = to_clk_tegra(hw);
  770. unsigned long flags;
  771. u32 new_val;
  772. u32 val;
  773. pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
  774. if (c->flags & DIV_U71) {
  775. spin_lock_irqsave(&clock_register_lock, flags);
  776. val = clk_readl(c->reg);
  777. new_val = val >> c->reg_shift;
  778. new_val &= 0xFFFF;
  779. new_val |= PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE;
  780. val &= ~(0xFFFF << c->reg_shift);
  781. val |= new_val << c->reg_shift;
  782. clk_writel(val, c->reg);
  783. spin_unlock_irqrestore(&clock_register_lock, flags);
  784. return 0;
  785. } else if (c->flags & DIV_2) {
  786. BUG_ON(!(c->flags & PLLD));
  787. spin_lock_irqsave(&clock_register_lock, flags);
  788. val = clk_readl(c->reg);
  789. val &= ~PLLD_MISC_DIV_RST;
  790. clk_writel(val, c->reg);
  791. spin_unlock_irqrestore(&clock_register_lock, flags);
  792. return 0;
  793. }
  794. return -EINVAL;
  795. }
  796. static void tegra20_pll_div_clk_disable(struct clk_hw *hw)
  797. {
  798. struct clk_tegra *c = to_clk_tegra(hw);
  799. unsigned long flags;
  800. u32 new_val;
  801. u32 val;
  802. pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
  803. if (c->flags & DIV_U71) {
  804. spin_lock_irqsave(&clock_register_lock, flags);
  805. val = clk_readl(c->reg);
  806. new_val = val >> c->reg_shift;
  807. new_val &= 0xFFFF;
  808. new_val &= ~(PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE);
  809. val &= ~(0xFFFF << c->reg_shift);
  810. val |= new_val << c->reg_shift;
  811. clk_writel(val, c->reg);
  812. spin_unlock_irqrestore(&clock_register_lock, flags);
  813. } else if (c->flags & DIV_2) {
  814. BUG_ON(!(c->flags & PLLD));
  815. spin_lock_irqsave(&clock_register_lock, flags);
  816. val = clk_readl(c->reg);
  817. val |= PLLD_MISC_DIV_RST;
  818. clk_writel(val, c->reg);
  819. spin_unlock_irqrestore(&clock_register_lock, flags);
  820. }
  821. }
  822. static int tegra20_pll_div_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  823. unsigned long parent_rate)
  824. {
  825. struct clk_tegra *c = to_clk_tegra(hw);
  826. unsigned long flags;
  827. int divider_u71;
  828. u32 new_val;
  829. u32 val;
  830. pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
  831. if (c->flags & DIV_U71) {
  832. divider_u71 = clk_div71_get_divider(parent_rate, rate);
  833. if (divider_u71 >= 0) {
  834. spin_lock_irqsave(&clock_register_lock, flags);
  835. val = clk_readl(c->reg);
  836. new_val = val >> c->reg_shift;
  837. new_val &= 0xFFFF;
  838. if (c->flags & DIV_U71_FIXED)
  839. new_val |= PLL_OUT_OVERRIDE;
  840. new_val &= ~PLL_OUT_RATIO_MASK;
  841. new_val |= divider_u71 << PLL_OUT_RATIO_SHIFT;
  842. val &= ~(0xFFFF << c->reg_shift);
  843. val |= new_val << c->reg_shift;
  844. clk_writel(val, c->reg);
  845. c->div = divider_u71 + 2;
  846. c->mul = 2;
  847. spin_unlock_irqrestore(&clock_register_lock, flags);
  848. return 0;
  849. }
  850. } else if (c->flags & DIV_2) {
  851. if (parent_rate == rate * 2)
  852. return 0;
  853. }
  854. return -EINVAL;
  855. }
  856. static long tegra20_pll_div_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  857. unsigned long *prate)
  858. {
  859. struct clk_tegra *c = to_clk_tegra(hw);
  860. unsigned long parent_rate = *prate;
  861. int divider;
  862. pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
  863. if (c->flags & DIV_U71) {
  864. divider = clk_div71_get_divider(parent_rate, rate);
  865. if (divider < 0)
  866. return divider;
  867. return DIV_ROUND_UP(parent_rate * 2, divider + 2);
  868. } else if (c->flags & DIV_2) {
  869. return DIV_ROUND_UP(parent_rate, 2);
  870. }
  871. return -EINVAL;
  872. }
  873. struct clk_ops tegra_pll_div_ops = {
  874. .is_enabled = tegra20_pll_div_clk_is_enabled,
  875. .enable = tegra20_pll_div_clk_enable,
  876. .disable = tegra20_pll_div_clk_disable,
  877. .set_rate = tegra20_pll_div_clk_set_rate,
  878. .round_rate = tegra20_pll_div_clk_round_rate,
  879. .recalc_rate = tegra20_pll_div_clk_recalc_rate,
  880. };
  881. /* Periph clk ops */
  882. static int tegra20_periph_clk_is_enabled(struct clk_hw *hw)
  883. {
  884. struct clk_tegra *c = to_clk_tegra(hw);
  885. c->state = ON;
  886. if (!c->u.periph.clk_num)
  887. goto out;
  888. if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
  889. PERIPH_CLK_TO_ENB_BIT(c)))
  890. c->state = OFF;
  891. if (!(c->flags & PERIPH_NO_RESET))
  892. if (clk_readl(RST_DEVICES + PERIPH_CLK_TO_ENB_REG(c)) &
  893. PERIPH_CLK_TO_ENB_BIT(c))
  894. c->state = OFF;
  895. out:
  896. return c->state;
  897. }
  898. static int tegra20_periph_clk_enable(struct clk_hw *hw)
  899. {
  900. struct clk_tegra *c = to_clk_tegra(hw);
  901. unsigned long flags;
  902. u32 val;
  903. pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
  904. if (!c->u.periph.clk_num)
  905. return 0;
  906. tegra_periph_clk_enable_refcount[c->u.periph.clk_num]++;
  907. if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 1)
  908. return 0;
  909. spin_lock_irqsave(&clock_register_lock, flags);
  910. clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
  911. CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
  912. if (!(c->flags & PERIPH_NO_RESET) && !(c->flags & PERIPH_MANUAL_RESET))
  913. clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
  914. RST_DEVICES_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
  915. if (c->flags & PERIPH_EMC_ENB) {
  916. /* The EMC peripheral clock has 2 extra enable bits */
  917. /* FIXME: Do they need to be disabled? */
  918. val = clk_readl(c->reg);
  919. val |= 0x3 << 24;
  920. clk_writel(val, c->reg);
  921. }
  922. spin_unlock_irqrestore(&clock_register_lock, flags);
  923. return 0;
  924. }
  925. static void tegra20_periph_clk_disable(struct clk_hw *hw)
  926. {
  927. struct clk_tegra *c = to_clk_tegra(hw);
  928. unsigned long flags;
  929. pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
  930. if (!c->u.periph.clk_num)
  931. return;
  932. tegra_periph_clk_enable_refcount[c->u.periph.clk_num]--;
  933. if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 0)
  934. return;
  935. spin_lock_irqsave(&clock_register_lock, flags);
  936. clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
  937. CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
  938. spin_unlock_irqrestore(&clock_register_lock, flags);
  939. }
  940. void tegra2_periph_clk_reset(struct clk_hw *hw, bool assert)
  941. {
  942. struct clk_tegra *c = to_clk_tegra(hw);
  943. unsigned long base = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
  944. pr_debug("%s %s on clock %s\n", __func__,
  945. assert ? "assert" : "deassert", __clk_get_name(hw->clk));
  946. BUG_ON(!c->u.periph.clk_num);
  947. if (!(c->flags & PERIPH_NO_RESET))
  948. clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
  949. base + PERIPH_CLK_TO_ENB_SET_REG(c));
  950. }
  951. static int tegra20_periph_clk_set_parent(struct clk_hw *hw, u8 index)
  952. {
  953. struct clk_tegra *c = to_clk_tegra(hw);
  954. u32 val;
  955. u32 mask;
  956. u32 shift;
  957. pr_debug("%s: %s %d\n", __func__, __clk_get_name(hw->clk), index);
  958. if (c->flags & MUX_PWM) {
  959. shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
  960. mask = PERIPH_CLK_SOURCE_PWM_MASK;
  961. } else {
  962. shift = PERIPH_CLK_SOURCE_SHIFT;
  963. mask = PERIPH_CLK_SOURCE_MASK;
  964. }
  965. val = clk_readl(c->reg);
  966. val &= ~mask;
  967. val |= (index) << shift;
  968. clk_writel(val, c->reg);
  969. return 0;
  970. }
  971. static u8 tegra20_periph_clk_get_parent(struct clk_hw *hw)
  972. {
  973. struct clk_tegra *c = to_clk_tegra(hw);
  974. u32 val = clk_readl(c->reg);
  975. u32 mask;
  976. u32 shift;
  977. if (c->flags & MUX_PWM) {
  978. shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
  979. mask = PERIPH_CLK_SOURCE_PWM_MASK;
  980. } else {
  981. shift = PERIPH_CLK_SOURCE_SHIFT;
  982. mask = PERIPH_CLK_SOURCE_MASK;
  983. }
  984. if (c->flags & MUX)
  985. return (val & mask) >> shift;
  986. else
  987. return 0;
  988. }
  989. static unsigned long tegra20_periph_clk_recalc_rate(struct clk_hw *hw,
  990. unsigned long prate)
  991. {
  992. struct clk_tegra *c = to_clk_tegra(hw);
  993. unsigned long rate = prate;
  994. u32 val = clk_readl(c->reg);
  995. if (c->flags & DIV_U71) {
  996. u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
  997. c->div = divu71 + 2;
  998. c->mul = 2;
  999. } else if (c->flags & DIV_U16) {
  1000. u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
  1001. c->div = divu16 + 1;
  1002. c->mul = 1;
  1003. } else {
  1004. c->div = 1;
  1005. c->mul = 1;
  1006. return rate;
  1007. }
  1008. if (c->mul != 0 && c->div != 0) {
  1009. rate *= c->mul;
  1010. rate += c->div - 1; /* round up */
  1011. do_div(rate, c->div);
  1012. }
  1013. return rate;
  1014. }
  1015. static int tegra20_periph_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  1016. unsigned long parent_rate)
  1017. {
  1018. struct clk_tegra *c = to_clk_tegra(hw);
  1019. u32 val;
  1020. int divider;
  1021. val = clk_readl(c->reg);
  1022. if (c->flags & DIV_U71) {
  1023. divider = clk_div71_get_divider(parent_rate, rate);
  1024. if (divider >= 0) {
  1025. val = clk_readl(c->reg);
  1026. val &= ~PERIPH_CLK_SOURCE_DIVU71_MASK;
  1027. val |= divider;
  1028. clk_writel(val, c->reg);
  1029. c->div = divider + 2;
  1030. c->mul = 2;
  1031. return 0;
  1032. }
  1033. } else if (c->flags & DIV_U16) {
  1034. divider = clk_div16_get_divider(parent_rate, rate);
  1035. if (divider >= 0) {
  1036. val = clk_readl(c->reg);
  1037. val &= ~PERIPH_CLK_SOURCE_DIVU16_MASK;
  1038. val |= divider;
  1039. clk_writel(val, c->reg);
  1040. c->div = divider + 1;
  1041. c->mul = 1;
  1042. return 0;
  1043. }
  1044. } else if (parent_rate <= rate) {
  1045. c->div = 1;
  1046. c->mul = 1;
  1047. return 0;
  1048. }
  1049. return -EINVAL;
  1050. }
  1051. static long tegra20_periph_clk_round_rate(struct clk_hw *hw,
  1052. unsigned long rate, unsigned long *prate)
  1053. {
  1054. struct clk_tegra *c = to_clk_tegra(hw);
  1055. unsigned long parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
  1056. int divider;
  1057. pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
  1058. if (prate)
  1059. parent_rate = *prate;
  1060. if (c->flags & DIV_U71) {
  1061. divider = clk_div71_get_divider(parent_rate, rate);
  1062. if (divider < 0)
  1063. return divider;
  1064. return DIV_ROUND_UP(parent_rate * 2, divider + 2);
  1065. } else if (c->flags & DIV_U16) {
  1066. divider = clk_div16_get_divider(parent_rate, rate);
  1067. if (divider < 0)
  1068. return divider;
  1069. return DIV_ROUND_UP(parent_rate, divider + 1);
  1070. }
  1071. return -EINVAL;
  1072. }
  1073. struct clk_ops tegra_periph_clk_ops = {
  1074. .is_enabled = tegra20_periph_clk_is_enabled,
  1075. .enable = tegra20_periph_clk_enable,
  1076. .disable = tegra20_periph_clk_disable,
  1077. .set_parent = tegra20_periph_clk_set_parent,
  1078. .get_parent = tegra20_periph_clk_get_parent,
  1079. .set_rate = tegra20_periph_clk_set_rate,
  1080. .round_rate = tegra20_periph_clk_round_rate,
  1081. .recalc_rate = tegra20_periph_clk_recalc_rate,
  1082. };
  1083. /* External memory controller clock ops */
  1084. static void tegra20_emc_clk_init(struct clk_hw *hw)
  1085. {
  1086. struct clk_tegra *c = to_clk_tegra(hw);
  1087. c->max_rate = __clk_get_rate(hw->clk);
  1088. }
  1089. static long tegra20_emc_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  1090. unsigned long *prate)
  1091. {
  1092. struct clk_tegra *c = to_clk_tegra(hw);
  1093. long emc_rate;
  1094. long clk_rate;
  1095. /*
  1096. * The slowest entry in the EMC clock table that is at least as
  1097. * fast as rate.
  1098. */
  1099. emc_rate = tegra_emc_round_rate(rate);
  1100. if (emc_rate < 0)
  1101. return c->max_rate;
  1102. /*
  1103. * The fastest rate the PLL will generate that is at most the
  1104. * requested rate.
  1105. */
  1106. clk_rate = tegra20_periph_clk_round_rate(hw, emc_rate, NULL);
  1107. /*
  1108. * If this fails, and emc_rate > clk_rate, it's because the maximum
  1109. * rate in the EMC tables is larger than the maximum rate of the EMC
  1110. * clock. The EMC clock's max rate is the rate it was running when the
  1111. * kernel booted. Such a mismatch is probably due to using the wrong
  1112. * BCT, i.e. using a Tegra20 BCT with an EMC table written for Tegra25.
  1113. */
  1114. WARN_ONCE(emc_rate != clk_rate,
  1115. "emc_rate %ld != clk_rate %ld",
  1116. emc_rate, clk_rate);
  1117. return emc_rate;
  1118. }
  1119. static int tegra20_emc_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  1120. unsigned long parent_rate)
  1121. {
  1122. int ret;
  1123. /*
  1124. * The Tegra2 memory controller has an interlock with the clock
  1125. * block that allows memory shadowed registers to be updated,
  1126. * and then transfer them to the main registers at the same
  1127. * time as the clock update without glitches.
  1128. */
  1129. ret = tegra_emc_set_rate(rate);
  1130. if (ret < 0)
  1131. return ret;
  1132. ret = tegra20_periph_clk_set_rate(hw, rate, parent_rate);
  1133. udelay(1);
  1134. return ret;
  1135. }
  1136. struct clk_ops tegra_emc_clk_ops = {
  1137. .init = tegra20_emc_clk_init,
  1138. .is_enabled = tegra20_periph_clk_is_enabled,
  1139. .enable = tegra20_periph_clk_enable,
  1140. .disable = tegra20_periph_clk_disable,
  1141. .set_parent = tegra20_periph_clk_set_parent,
  1142. .get_parent = tegra20_periph_clk_get_parent,
  1143. .set_rate = tegra20_emc_clk_set_rate,
  1144. .round_rate = tegra20_emc_clk_round_rate,
  1145. .recalc_rate = tegra20_periph_clk_recalc_rate,
  1146. };
  1147. /* Clock doubler ops */
  1148. static int tegra20_clk_double_is_enabled(struct clk_hw *hw)
  1149. {
  1150. struct clk_tegra *c = to_clk_tegra(hw);
  1151. c->state = ON;
  1152. if (!c->u.periph.clk_num)
  1153. goto out;
  1154. if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
  1155. PERIPH_CLK_TO_ENB_BIT(c)))
  1156. c->state = OFF;
  1157. out:
  1158. return c->state;
  1159. };
  1160. static unsigned long tegra20_clk_double_recalc_rate(struct clk_hw *hw,
  1161. unsigned long prate)
  1162. {
  1163. struct clk_tegra *c = to_clk_tegra(hw);
  1164. u64 rate = prate;
  1165. c->mul = 2;
  1166. c->div = 1;
  1167. rate *= c->mul;
  1168. rate += c->div - 1; /* round up */
  1169. do_div(rate, c->div);
  1170. return rate;
  1171. }
  1172. static long tegra20_clk_double_round_rate(struct clk_hw *hw, unsigned long rate,
  1173. unsigned long *prate)
  1174. {
  1175. unsigned long output_rate = *prate;
  1176. do_div(output_rate, 2);
  1177. return output_rate;
  1178. }
  1179. static int tegra20_clk_double_set_rate(struct clk_hw *hw, unsigned long rate,
  1180. unsigned long parent_rate)
  1181. {
  1182. if (rate != 2 * parent_rate)
  1183. return -EINVAL;
  1184. return 0;
  1185. }
  1186. struct clk_ops tegra_clk_double_ops = {
  1187. .is_enabled = tegra20_clk_double_is_enabled,
  1188. .enable = tegra20_periph_clk_enable,
  1189. .disable = tegra20_periph_clk_disable,
  1190. .set_rate = tegra20_clk_double_set_rate,
  1191. .recalc_rate = tegra20_clk_double_recalc_rate,
  1192. .round_rate = tegra20_clk_double_round_rate,
  1193. };
  1194. /* Audio sync clock ops */
  1195. static int tegra20_audio_sync_clk_is_enabled(struct clk_hw *hw)
  1196. {
  1197. struct clk_tegra *c = to_clk_tegra(hw);
  1198. u32 val = clk_readl(c->reg);
  1199. c->state = (val & (1<<4)) ? OFF : ON;
  1200. return c->state;
  1201. }
  1202. static int tegra20_audio_sync_clk_enable(struct clk_hw *hw)
  1203. {
  1204. struct clk_tegra *c = to_clk_tegra(hw);
  1205. clk_writel(0, c->reg);
  1206. return 0;
  1207. }
  1208. static void tegra20_audio_sync_clk_disable(struct clk_hw *hw)
  1209. {
  1210. struct clk_tegra *c = to_clk_tegra(hw);
  1211. clk_writel(1, c->reg);
  1212. }
  1213. static u8 tegra20_audio_sync_clk_get_parent(struct clk_hw *hw)
  1214. {
  1215. struct clk_tegra *c = to_clk_tegra(hw);
  1216. u32 val = clk_readl(c->reg);
  1217. int source;
  1218. source = val & 0xf;
  1219. return source;
  1220. }
  1221. static int tegra20_audio_sync_clk_set_parent(struct clk_hw *hw, u8 index)
  1222. {
  1223. struct clk_tegra *c = to_clk_tegra(hw);
  1224. u32 val;
  1225. val = clk_readl(c->reg);
  1226. val &= ~0xf;
  1227. val |= index;
  1228. clk_writel(val, c->reg);
  1229. return 0;
  1230. }
  1231. struct clk_ops tegra_audio_sync_clk_ops = {
  1232. .is_enabled = tegra20_audio_sync_clk_is_enabled,
  1233. .enable = tegra20_audio_sync_clk_enable,
  1234. .disable = tegra20_audio_sync_clk_disable,
  1235. .set_parent = tegra20_audio_sync_clk_set_parent,
  1236. .get_parent = tegra20_audio_sync_clk_get_parent,
  1237. };
  1238. /* cdev1 and cdev2 (dap_mclk1 and dap_mclk2) ops */
  1239. static int tegra20_cdev_clk_is_enabled(struct clk_hw *hw)
  1240. {
  1241. struct clk_tegra *c = to_clk_tegra(hw);
  1242. /* We could un-tristate the cdev1 or cdev2 pingroup here; this is
  1243. * currently done in the pinmux code. */
  1244. c->state = ON;
  1245. BUG_ON(!c->u.periph.clk_num);
  1246. if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
  1247. PERIPH_CLK_TO_ENB_BIT(c)))
  1248. c->state = OFF;
  1249. return c->state;
  1250. }
  1251. static int tegra20_cdev_clk_enable(struct clk_hw *hw)
  1252. {
  1253. struct clk_tegra *c = to_clk_tegra(hw);
  1254. BUG_ON(!c->u.periph.clk_num);
  1255. clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
  1256. CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
  1257. return 0;
  1258. }
  1259. static void tegra20_cdev_clk_disable(struct clk_hw *hw)
  1260. {
  1261. struct clk_tegra *c = to_clk_tegra(hw);
  1262. BUG_ON(!c->u.periph.clk_num);
  1263. clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
  1264. CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
  1265. }
  1266. static unsigned long tegra20_cdev_recalc_rate(struct clk_hw *hw,
  1267. unsigned long prate)
  1268. {
  1269. return to_clk_tegra(hw)->fixed_rate;
  1270. }
  1271. struct clk_ops tegra_cdev_clk_ops = {
  1272. .is_enabled = tegra20_cdev_clk_is_enabled,
  1273. .enable = tegra20_cdev_clk_enable,
  1274. .disable = tegra20_cdev_clk_disable,
  1275. .recalc_rate = tegra20_cdev_recalc_rate,
  1276. };