clk.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms and conditions of the GNU General Public License,
  6. * version 2, as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope it will be useful, but WITHOUT
  9. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11. * more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include <linux/clk.h>
  17. #include <linux/clk-provider.h>
  18. #include <linux/of.h>
  19. #include <linux/clk/tegra.h>
  20. #include "clk.h"
  21. /* Global data of Tegra CPU CAR ops */
  22. struct tegra_cpu_car_ops *tegra_cpu_car_ops;
  23. void __init tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list,
  24. struct clk *clks[], int clk_max)
  25. {
  26. struct clk *clk;
  27. for (; dup_list->clk_id < clk_max; dup_list++) {
  28. clk = clks[dup_list->clk_id];
  29. dup_list->lookup.clk = clk;
  30. clkdev_add(&dup_list->lookup);
  31. }
  32. }
  33. void __init tegra_init_from_table(struct tegra_clk_init_table *tbl,
  34. struct clk *clks[], int clk_max)
  35. {
  36. struct clk *clk;
  37. for (; tbl->clk_id < clk_max; tbl++) {
  38. clk = clks[tbl->clk_id];
  39. if (IS_ERR_OR_NULL(clk))
  40. return;
  41. if (tbl->parent_id < clk_max) {
  42. struct clk *parent = clks[tbl->parent_id];
  43. if (clk_set_parent(clk, parent)) {
  44. pr_err("%s: Failed to set parent %s of %s\n",
  45. __func__, __clk_get_name(parent),
  46. __clk_get_name(clk));
  47. WARN_ON(1);
  48. }
  49. }
  50. if (tbl->rate)
  51. if (clk_set_rate(clk, tbl->rate)) {
  52. pr_err("%s: Failed to set rate %lu of %s\n",
  53. __func__, tbl->rate,
  54. __clk_get_name(clk));
  55. WARN_ON(1);
  56. }
  57. if (tbl->state)
  58. if (clk_prepare_enable(clk)) {
  59. pr_err("%s: Failed to enable %s\n", __func__,
  60. __clk_get_name(clk));
  61. WARN_ON(1);
  62. }
  63. }
  64. }
  65. static const struct of_device_id tegra_dt_clk_match[] = {
  66. { .compatible = "nvidia,tegra20-car", .data = tegra20_clock_init },
  67. { .compatible = "nvidia,tegra30-car", .data = tegra30_clock_init },
  68. { }
  69. };
  70. void __init tegra_clocks_init(void)
  71. {
  72. of_clk_init(tegra_dt_clk_match);
  73. }