tegra20_clocks.c 38 KB

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