clk.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * Copyright (C) 2014 Google, Inc.
  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. #include <linux/clk.h>
  9. #include <linux/clk-provider.h>
  10. #include <linux/kernel.h>
  11. #include <linux/of.h>
  12. #include <linux/of_address.h>
  13. #include <linux/slab.h>
  14. #include "clk.h"
  15. struct pistachio_clk_provider *
  16. pistachio_clk_alloc_provider(struct device_node *node, unsigned int num_clks)
  17. {
  18. struct pistachio_clk_provider *p;
  19. p = kzalloc(sizeof(*p), GFP_KERNEL);
  20. if (!p)
  21. return p;
  22. p->clk_data.clks = kcalloc(num_clks, sizeof(struct clk *), GFP_KERNEL);
  23. if (!p->clk_data.clks)
  24. goto free_provider;
  25. p->clk_data.clk_num = num_clks;
  26. p->node = node;
  27. p->base = of_iomap(node, 0);
  28. if (!p->base) {
  29. pr_err("Failed to map clock provider registers\n");
  30. goto free_clks;
  31. }
  32. return p;
  33. free_clks:
  34. kfree(p->clk_data.clks);
  35. free_provider:
  36. kfree(p);
  37. return NULL;
  38. }
  39. void pistachio_clk_register_provider(struct pistachio_clk_provider *p)
  40. {
  41. unsigned int i;
  42. for (i = 0; i < p->clk_data.clk_num; i++) {
  43. if (IS_ERR(p->clk_data.clks[i]))
  44. pr_warn("Failed to register clock %d: %ld\n", i,
  45. PTR_ERR(p->clk_data.clks[i]));
  46. }
  47. of_clk_add_provider(p->node, of_clk_src_onecell_get, &p->clk_data);
  48. }
  49. void pistachio_clk_register_gate(struct pistachio_clk_provider *p,
  50. struct pistachio_gate *gate,
  51. unsigned int num)
  52. {
  53. struct clk *clk;
  54. unsigned int i;
  55. for (i = 0; i < num; i++) {
  56. clk = clk_register_gate(NULL, gate[i].name, gate[i].parent,
  57. CLK_SET_RATE_PARENT,
  58. p->base + gate[i].reg, gate[i].shift,
  59. 0, NULL);
  60. p->clk_data.clks[gate[i].id] = clk;
  61. }
  62. }
  63. void pistachio_clk_register_mux(struct pistachio_clk_provider *p,
  64. struct pistachio_mux *mux,
  65. unsigned int num)
  66. {
  67. struct clk *clk;
  68. unsigned int i;
  69. for (i = 0; i < num; i++) {
  70. clk = clk_register_mux(NULL, mux[i].name, mux[i].parents,
  71. mux[i].num_parents,
  72. CLK_SET_RATE_NO_REPARENT,
  73. p->base + mux[i].reg, mux[i].shift,
  74. get_count_order(mux[i].num_parents),
  75. 0, NULL);
  76. p->clk_data.clks[mux[i].id] = clk;
  77. }
  78. }
  79. void pistachio_clk_register_div(struct pistachio_clk_provider *p,
  80. struct pistachio_div *div,
  81. unsigned int num)
  82. {
  83. struct clk *clk;
  84. unsigned int i;
  85. for (i = 0; i < num; i++) {
  86. clk = clk_register_divider(NULL, div[i].name, div[i].parent,
  87. 0, p->base + div[i].reg, 0,
  88. div[i].width, div[i].div_flags,
  89. NULL);
  90. p->clk_data.clks[div[i].id] = clk;
  91. }
  92. }
  93. void pistachio_clk_register_fixed_factor(struct pistachio_clk_provider *p,
  94. struct pistachio_fixed_factor *ff,
  95. unsigned int num)
  96. {
  97. struct clk *clk;
  98. unsigned int i;
  99. for (i = 0; i < num; i++) {
  100. clk = clk_register_fixed_factor(NULL, ff[i].name, ff[i].parent,
  101. 0, 1, ff[i].div);
  102. p->clk_data.clks[ff[i].id] = clk;
  103. }
  104. }
  105. void pistachio_clk_force_enable(struct pistachio_clk_provider *p,
  106. unsigned int *clk_ids, unsigned int num)
  107. {
  108. unsigned int i;
  109. int err;
  110. for (i = 0; i < num; i++) {
  111. struct clk *clk = p->clk_data.clks[clk_ids[i]];
  112. if (IS_ERR(clk))
  113. continue;
  114. err = clk_prepare_enable(clk);
  115. if (err)
  116. pr_err("Failed to enable clock %s: %d\n",
  117. __clk_get_name(clk), err);
  118. }
  119. }