clock.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. /*
  2. *
  3. * Copyright (C) 2010 Google, Inc.
  4. *
  5. * Author:
  6. * Colin Cross <ccross@google.com>
  7. *
  8. * This software is licensed under the terms of the GNU General Public
  9. * License version 2, as published by the Free Software Foundation, and
  10. * may be copied, distributed, and modified under those terms.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. */
  18. #include <linux/kernel.h>
  19. #include <linux/clk.h>
  20. #include <linux/list.h>
  21. #include <linux/init.h>
  22. #include <linux/module.h>
  23. #include <linux/debugfs.h>
  24. #include <linux/slab.h>
  25. #include <linux/seq_file.h>
  26. #include <linux/regulator/consumer.h>
  27. #include <linux/clkdev.h>
  28. #include "clock.h"
  29. #include "board.h"
  30. #include "fuse.h"
  31. static LIST_HEAD(clocks);
  32. static DEFINE_SPINLOCK(clock_lock);
  33. static DEFINE_MUTEX(dvfs_lock);
  34. static int clk_is_dvfs(struct clk *c)
  35. {
  36. return (c->dvfs != NULL);
  37. };
  38. static int dvfs_set_rate(struct dvfs *d, unsigned long rate)
  39. {
  40. struct dvfs_table *t;
  41. if (d->table == NULL)
  42. return -ENODEV;
  43. for (t = d->table; t->rate != 0; t++) {
  44. if (rate <= t->rate) {
  45. if (!d->reg)
  46. return 0;
  47. return regulator_set_voltage(d->reg,
  48. t->millivolts * 1000,
  49. d->max_millivolts * 1000);
  50. }
  51. }
  52. return -EINVAL;
  53. }
  54. static void dvfs_init(struct clk *c)
  55. {
  56. int process_id;
  57. int i;
  58. struct dvfs_table *table;
  59. process_id = c->dvfs->cpu ? tegra_core_process_id() :
  60. tegra_cpu_process_id();
  61. for (i = 0; i < c->dvfs->process_id_table_length; i++)
  62. if (process_id == c->dvfs->process_id_table[i].process_id)
  63. c->dvfs->table = c->dvfs->process_id_table[i].table;
  64. if (c->dvfs->table == NULL) {
  65. pr_err("Failed to find dvfs table for clock %s process %d\n",
  66. c->name, process_id);
  67. return;
  68. }
  69. c->dvfs->max_millivolts = 0;
  70. for (table = c->dvfs->table; table->rate != 0; table++)
  71. if (c->dvfs->max_millivolts < table->millivolts)
  72. c->dvfs->max_millivolts = table->millivolts;
  73. c->dvfs->reg = regulator_get(NULL, c->dvfs->reg_id);
  74. if (IS_ERR(c->dvfs->reg)) {
  75. pr_err("Failed to get regulator %s for clock %s\n",
  76. c->dvfs->reg_id, c->name);
  77. c->dvfs->reg = NULL;
  78. return;
  79. }
  80. if (c->refcnt > 0)
  81. dvfs_set_rate(c->dvfs, c->rate);
  82. }
  83. struct clk *tegra_get_clock_by_name(const char *name)
  84. {
  85. struct clk *c;
  86. struct clk *ret = NULL;
  87. unsigned long flags;
  88. spin_lock_irqsave(&clock_lock, flags);
  89. list_for_each_entry(c, &clocks, node) {
  90. if (strcmp(c->name, name) == 0) {
  91. ret = c;
  92. break;
  93. }
  94. }
  95. spin_unlock_irqrestore(&clock_lock, flags);
  96. return ret;
  97. }
  98. static void clk_recalculate_rate(struct clk *c)
  99. {
  100. u64 rate;
  101. if (!c->parent)
  102. return;
  103. rate = c->parent->rate;
  104. if (c->mul != 0 && c->div != 0) {
  105. rate = rate * c->mul;
  106. do_div(rate, c->div);
  107. }
  108. if (rate > c->max_rate)
  109. pr_warn("clocks: Set clock %s to rate %llu, max is %lu\n",
  110. c->name, rate, c->max_rate);
  111. c->rate = rate;
  112. }
  113. int clk_reparent(struct clk *c, struct clk *parent)
  114. {
  115. pr_debug("%s: %s\n", __func__, c->name);
  116. c->parent = parent;
  117. list_del(&c->sibling);
  118. list_add_tail(&c->sibling, &parent->children);
  119. return 0;
  120. }
  121. static void propagate_rate(struct clk *c)
  122. {
  123. struct clk *clkp;
  124. pr_debug("%s: %s\n", __func__, c->name);
  125. list_for_each_entry(clkp, &c->children, sibling) {
  126. pr_debug(" %s\n", clkp->name);
  127. clk_recalculate_rate(clkp);
  128. propagate_rate(clkp);
  129. }
  130. }
  131. void clk_init(struct clk *c)
  132. {
  133. unsigned long flags;
  134. pr_debug("%s: %s\n", __func__, c->name);
  135. spin_lock_irqsave(&clock_lock, flags);
  136. INIT_LIST_HEAD(&c->children);
  137. INIT_LIST_HEAD(&c->sibling);
  138. if (c->ops && c->ops->init)
  139. c->ops->init(c);
  140. clk_recalculate_rate(c);
  141. list_add(&c->node, &clocks);
  142. if (c->parent)
  143. list_add_tail(&c->sibling, &c->parent->children);
  144. spin_unlock_irqrestore(&clock_lock, flags);
  145. }
  146. int clk_enable_locked(struct clk *c)
  147. {
  148. int ret;
  149. pr_debug("%s: %s\n", __func__, c->name);
  150. if (c->refcnt == 0) {
  151. if (c->parent) {
  152. ret = clk_enable_locked(c->parent);
  153. if (ret)
  154. return ret;
  155. }
  156. if (c->ops && c->ops->enable) {
  157. ret = c->ops->enable(c);
  158. if (ret) {
  159. if (c->parent)
  160. clk_disable_locked(c->parent);
  161. return ret;
  162. }
  163. c->state = ON;
  164. #ifdef CONFIG_DEBUG_FS
  165. c->set = 1;
  166. #endif
  167. }
  168. }
  169. c->refcnt++;
  170. return 0;
  171. }
  172. int clk_enable_cansleep(struct clk *c)
  173. {
  174. int ret;
  175. unsigned long flags;
  176. mutex_lock(&dvfs_lock);
  177. if (clk_is_dvfs(c) && c->refcnt > 0)
  178. dvfs_set_rate(c->dvfs, c->rate);
  179. spin_lock_irqsave(&clock_lock, flags);
  180. ret = clk_enable_locked(c);
  181. spin_unlock_irqrestore(&clock_lock, flags);
  182. mutex_unlock(&dvfs_lock);
  183. return ret;
  184. }
  185. EXPORT_SYMBOL(clk_enable_cansleep);
  186. int clk_enable(struct clk *c)
  187. {
  188. int ret;
  189. unsigned long flags;
  190. if (clk_is_dvfs(c))
  191. BUG();
  192. spin_lock_irqsave(&clock_lock, flags);
  193. ret = clk_enable_locked(c);
  194. spin_unlock_irqrestore(&clock_lock, flags);
  195. return ret;
  196. }
  197. EXPORT_SYMBOL(clk_enable);
  198. void clk_disable_locked(struct clk *c)
  199. {
  200. pr_debug("%s: %s\n", __func__, c->name);
  201. if (c->refcnt == 0) {
  202. WARN(1, "Attempting to disable clock %s with refcnt 0", c->name);
  203. return;
  204. }
  205. if (c->refcnt == 1) {
  206. if (c->ops && c->ops->disable)
  207. c->ops->disable(c);
  208. if (c->parent)
  209. clk_disable_locked(c->parent);
  210. c->state = OFF;
  211. }
  212. c->refcnt--;
  213. }
  214. void clk_disable_cansleep(struct clk *c)
  215. {
  216. unsigned long flags;
  217. mutex_lock(&dvfs_lock);
  218. spin_lock_irqsave(&clock_lock, flags);
  219. clk_disable_locked(c);
  220. spin_unlock_irqrestore(&clock_lock, flags);
  221. if (clk_is_dvfs(c) && c->refcnt == 0)
  222. dvfs_set_rate(c->dvfs, c->rate);
  223. mutex_unlock(&dvfs_lock);
  224. }
  225. EXPORT_SYMBOL(clk_disable_cansleep);
  226. void clk_disable(struct clk *c)
  227. {
  228. unsigned long flags;
  229. if (clk_is_dvfs(c))
  230. BUG();
  231. spin_lock_irqsave(&clock_lock, flags);
  232. clk_disable_locked(c);
  233. spin_unlock_irqrestore(&clock_lock, flags);
  234. }
  235. EXPORT_SYMBOL(clk_disable);
  236. int clk_set_parent_locked(struct clk *c, struct clk *parent)
  237. {
  238. int ret;
  239. pr_debug("%s: %s\n", __func__, c->name);
  240. if (!c->ops || !c->ops->set_parent)
  241. return -ENOSYS;
  242. ret = c->ops->set_parent(c, parent);
  243. if (ret)
  244. return ret;
  245. clk_recalculate_rate(c);
  246. propagate_rate(c);
  247. return 0;
  248. }
  249. int clk_set_parent(struct clk *c, struct clk *parent)
  250. {
  251. int ret;
  252. unsigned long flags;
  253. spin_lock_irqsave(&clock_lock, flags);
  254. ret = clk_set_parent_locked(c, parent);
  255. spin_unlock_irqrestore(&clock_lock, flags);
  256. return ret;
  257. }
  258. EXPORT_SYMBOL(clk_set_parent);
  259. struct clk *clk_get_parent(struct clk *c)
  260. {
  261. return c->parent;
  262. }
  263. EXPORT_SYMBOL(clk_get_parent);
  264. int clk_set_rate_locked(struct clk *c, unsigned long rate)
  265. {
  266. int ret;
  267. if (rate > c->max_rate)
  268. rate = c->max_rate;
  269. if (!c->ops || !c->ops->set_rate)
  270. return -ENOSYS;
  271. ret = c->ops->set_rate(c, rate);
  272. if (ret)
  273. return ret;
  274. clk_recalculate_rate(c);
  275. propagate_rate(c);
  276. return 0;
  277. }
  278. int clk_set_rate_cansleep(struct clk *c, unsigned long rate)
  279. {
  280. int ret = 0;
  281. unsigned long flags;
  282. pr_debug("%s: %s\n", __func__, c->name);
  283. mutex_lock(&dvfs_lock);
  284. if (rate > c->rate)
  285. ret = dvfs_set_rate(c->dvfs, rate);
  286. if (ret)
  287. goto out;
  288. spin_lock_irqsave(&clock_lock, flags);
  289. ret = clk_set_rate_locked(c, rate);
  290. spin_unlock_irqrestore(&clock_lock, flags);
  291. if (ret)
  292. goto out;
  293. ret = dvfs_set_rate(c->dvfs, rate);
  294. out:
  295. mutex_unlock(&dvfs_lock);
  296. return ret;
  297. }
  298. EXPORT_SYMBOL(clk_set_rate_cansleep);
  299. int clk_set_rate(struct clk *c, unsigned long rate)
  300. {
  301. int ret = 0;
  302. unsigned long flags;
  303. pr_debug("%s: %s\n", __func__, c->name);
  304. if (clk_is_dvfs(c))
  305. BUG();
  306. spin_lock_irqsave(&clock_lock, flags);
  307. ret = clk_set_rate_locked(c, rate);
  308. spin_unlock_irqrestore(&clock_lock, flags);
  309. return ret;
  310. }
  311. EXPORT_SYMBOL(clk_set_rate);
  312. unsigned long clk_get_rate(struct clk *c)
  313. {
  314. unsigned long flags;
  315. unsigned long ret;
  316. spin_lock_irqsave(&clock_lock, flags);
  317. pr_debug("%s: %s\n", __func__, c->name);
  318. ret = c->rate;
  319. spin_unlock_irqrestore(&clock_lock, flags);
  320. return ret;
  321. }
  322. EXPORT_SYMBOL(clk_get_rate);
  323. long clk_round_rate(struct clk *c, unsigned long rate)
  324. {
  325. pr_debug("%s: %s\n", __func__, c->name);
  326. if (!c->ops || !c->ops->round_rate)
  327. return -ENOSYS;
  328. if (rate > c->max_rate)
  329. rate = c->max_rate;
  330. return c->ops->round_rate(c, rate);
  331. }
  332. EXPORT_SYMBOL(clk_round_rate);
  333. static int tegra_clk_init_one_from_table(struct tegra_clk_init_table *table)
  334. {
  335. struct clk *c;
  336. struct clk *p;
  337. int ret = 0;
  338. c = tegra_get_clock_by_name(table->name);
  339. if (!c) {
  340. pr_warning("Unable to initialize clock %s\n",
  341. table->name);
  342. return -ENODEV;
  343. }
  344. if (table->parent) {
  345. p = tegra_get_clock_by_name(table->parent);
  346. if (!p) {
  347. pr_warning("Unable to find parent %s of clock %s\n",
  348. table->parent, table->name);
  349. return -ENODEV;
  350. }
  351. if (c->parent != p) {
  352. ret = clk_set_parent(c, p);
  353. if (ret) {
  354. pr_warning("Unable to set parent %s of clock %s: %d\n",
  355. table->parent, table->name, ret);
  356. return -EINVAL;
  357. }
  358. }
  359. }
  360. if (table->rate && table->rate != clk_get_rate(c)) {
  361. ret = clk_set_rate(c, table->rate);
  362. if (ret) {
  363. pr_warning("Unable to set clock %s to rate %lu: %d\n",
  364. table->name, table->rate, ret);
  365. return -EINVAL;
  366. }
  367. }
  368. if (table->enabled) {
  369. ret = clk_enable(c);
  370. if (ret) {
  371. pr_warning("Unable to enable clock %s: %d\n",
  372. table->name, ret);
  373. return -EINVAL;
  374. }
  375. }
  376. return 0;
  377. }
  378. void tegra_clk_init_from_table(struct tegra_clk_init_table *table)
  379. {
  380. for (; table->name; table++)
  381. tegra_clk_init_one_from_table(table);
  382. }
  383. EXPORT_SYMBOL(tegra_clk_init_from_table);
  384. void tegra_periph_reset_deassert(struct clk *c)
  385. {
  386. tegra2_periph_reset_deassert(c);
  387. }
  388. EXPORT_SYMBOL(tegra_periph_reset_deassert);
  389. void tegra_periph_reset_assert(struct clk *c)
  390. {
  391. tegra2_periph_reset_assert(c);
  392. }
  393. EXPORT_SYMBOL(tegra_periph_reset_assert);
  394. void __init tegra_init_clock(void)
  395. {
  396. tegra2_init_clocks();
  397. }
  398. int __init tegra_init_dvfs(void)
  399. {
  400. struct clk *c, *safe;
  401. mutex_lock(&dvfs_lock);
  402. list_for_each_entry_safe(c, safe, &clocks, node)
  403. if (c->dvfs)
  404. dvfs_init(c);
  405. mutex_unlock(&dvfs_lock);
  406. return 0;
  407. }
  408. late_initcall(tegra_init_dvfs);
  409. #ifdef CONFIG_DEBUG_FS
  410. static struct dentry *clk_debugfs_root;
  411. static void clock_tree_show_one(struct seq_file *s, struct clk *c, int level)
  412. {
  413. struct clk *child;
  414. struct clk *safe;
  415. const char *state = "uninit";
  416. char div[8] = {0};
  417. if (c->state == ON)
  418. state = "on";
  419. else if (c->state == OFF)
  420. state = "off";
  421. if (c->mul != 0 && c->div != 0) {
  422. if (c->mul > c->div) {
  423. int mul = c->mul / c->div;
  424. int mul2 = (c->mul * 10 / c->div) % 10;
  425. int mul3 = (c->mul * 10) % c->div;
  426. if (mul2 == 0 && mul3 == 0)
  427. snprintf(div, sizeof(div), "x%d", mul);
  428. else if (mul3 == 0)
  429. snprintf(div, sizeof(div), "x%d.%d", mul, mul2);
  430. else
  431. snprintf(div, sizeof(div), "x%d.%d..", mul, mul2);
  432. } else {
  433. snprintf(div, sizeof(div), "%d%s", c->div / c->mul,
  434. (c->div % c->mul) ? ".5" : "");
  435. }
  436. }
  437. seq_printf(s, "%*s%c%c%-*s %-6s %-3d %-8s %-10lu\n",
  438. level * 3 + 1, "",
  439. c->rate > c->max_rate ? '!' : ' ',
  440. !c->set ? '*' : ' ',
  441. 30 - level * 3, c->name,
  442. state, c->refcnt, div, c->rate);
  443. list_for_each_entry_safe(child, safe, &c->children, sibling) {
  444. clock_tree_show_one(s, child, level + 1);
  445. }
  446. }
  447. static int clock_tree_show(struct seq_file *s, void *data)
  448. {
  449. struct clk *c;
  450. unsigned long flags;
  451. seq_printf(s, " clock state ref div rate\n");
  452. seq_printf(s, "--------------------------------------------------------------\n");
  453. spin_lock_irqsave(&clock_lock, flags);
  454. list_for_each_entry(c, &clocks, node)
  455. if (c->parent == NULL)
  456. clock_tree_show_one(s, c, 0);
  457. spin_unlock_irqrestore(&clock_lock, flags);
  458. return 0;
  459. }
  460. static int clock_tree_open(struct inode *inode, struct file *file)
  461. {
  462. return single_open(file, clock_tree_show, inode->i_private);
  463. }
  464. static const struct file_operations clock_tree_fops = {
  465. .open = clock_tree_open,
  466. .read = seq_read,
  467. .llseek = seq_lseek,
  468. .release = single_release,
  469. };
  470. static int possible_parents_show(struct seq_file *s, void *data)
  471. {
  472. struct clk *c = s->private;
  473. int i;
  474. for (i = 0; c->inputs[i].input; i++) {
  475. char *first = (i == 0) ? "" : " ";
  476. seq_printf(s, "%s%s", first, c->inputs[i].input->name);
  477. }
  478. seq_printf(s, "\n");
  479. return 0;
  480. }
  481. static int possible_parents_open(struct inode *inode, struct file *file)
  482. {
  483. return single_open(file, possible_parents_show, inode->i_private);
  484. }
  485. static const struct file_operations possible_parents_fops = {
  486. .open = possible_parents_open,
  487. .read = seq_read,
  488. .llseek = seq_lseek,
  489. .release = single_release,
  490. };
  491. static int clk_debugfs_register_one(struct clk *c)
  492. {
  493. struct dentry *d, *child, *child_tmp;
  494. d = debugfs_create_dir(c->name, clk_debugfs_root);
  495. if (!d)
  496. return -ENOMEM;
  497. c->dent = d;
  498. d = debugfs_create_u8("refcnt", S_IRUGO, c->dent, (u8 *)&c->refcnt);
  499. if (!d)
  500. goto err_out;
  501. d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate);
  502. if (!d)
  503. goto err_out;
  504. d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags);
  505. if (!d)
  506. goto err_out;
  507. if (c->inputs) {
  508. d = debugfs_create_file("possible_parents", S_IRUGO, c->dent,
  509. c, &possible_parents_fops);
  510. if (!d)
  511. goto err_out;
  512. }
  513. return 0;
  514. err_out:
  515. d = c->dent;
  516. list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child)
  517. debugfs_remove(child);
  518. debugfs_remove(c->dent);
  519. return -ENOMEM;
  520. }
  521. static int clk_debugfs_register(struct clk *c)
  522. {
  523. int err;
  524. struct clk *pa = c->parent;
  525. if (pa && !pa->dent) {
  526. err = clk_debugfs_register(pa);
  527. if (err)
  528. return err;
  529. }
  530. if (!c->dent) {
  531. err = clk_debugfs_register_one(c);
  532. if (err)
  533. return err;
  534. }
  535. return 0;
  536. }
  537. static int __init clk_debugfs_init(void)
  538. {
  539. struct clk *c;
  540. struct dentry *d;
  541. int err = -ENOMEM;
  542. d = debugfs_create_dir("clock", NULL);
  543. if (!d)
  544. return -ENOMEM;
  545. clk_debugfs_root = d;
  546. d = debugfs_create_file("clock_tree", S_IRUGO, clk_debugfs_root, NULL,
  547. &clock_tree_fops);
  548. if (!d)
  549. goto err_out;
  550. list_for_each_entry(c, &clocks, node) {
  551. err = clk_debugfs_register(c);
  552. if (err)
  553. goto err_out;
  554. }
  555. return 0;
  556. err_out:
  557. debugfs_remove_recursive(clk_debugfs_root);
  558. return err;
  559. }
  560. late_initcall(clk_debugfs_init);
  561. #endif