owl-common.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // SPDX-License-Identifier: GPL-2.0+
  2. //
  3. // OWL common clock driver
  4. //
  5. // Copyright (c) 2014 Actions Semi Inc.
  6. // Author: David Liu <liuwei@actions-semi.com>
  7. //
  8. // Copyright (c) 2018 Linaro Ltd.
  9. // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  10. #include <linux/platform_device.h>
  11. #include <linux/regmap.h>
  12. #include "owl-common.h"
  13. static const struct regmap_config owl_regmap_config = {
  14. .reg_bits = 32,
  15. .reg_stride = 4,
  16. .val_bits = 32,
  17. .max_register = 0x00cc,
  18. .fast_io = true,
  19. };
  20. static void owl_clk_set_regmap(const struct owl_clk_desc *desc,
  21. struct regmap *regmap)
  22. {
  23. int i;
  24. struct owl_clk_common *clks;
  25. for (i = 0; i < desc->num_clks; i++) {
  26. clks = desc->clks[i];
  27. if (!clks)
  28. continue;
  29. clks->regmap = regmap;
  30. }
  31. }
  32. int owl_clk_regmap_init(struct platform_device *pdev,
  33. struct owl_clk_desc *desc)
  34. {
  35. void __iomem *base;
  36. struct regmap *regmap;
  37. base = devm_platform_ioremap_resource(pdev, 0);
  38. if (IS_ERR(base))
  39. return PTR_ERR(base);
  40. regmap = devm_regmap_init_mmio(&pdev->dev, base, &owl_regmap_config);
  41. if (IS_ERR(regmap)) {
  42. pr_err("failed to init regmap\n");
  43. return PTR_ERR(regmap);
  44. }
  45. owl_clk_set_regmap(desc, regmap);
  46. desc->regmap = regmap;
  47. return 0;
  48. }
  49. int owl_clk_probe(struct device *dev, struct clk_hw_onecell_data *hw_clks)
  50. {
  51. int i, ret;
  52. struct clk_hw *hw;
  53. for (i = 0; i < hw_clks->num; i++) {
  54. const char *name;
  55. hw = hw_clks->hws[i];
  56. if (IS_ERR_OR_NULL(hw))
  57. continue;
  58. name = hw->init->name;
  59. ret = devm_clk_hw_register(dev, hw);
  60. if (ret) {
  61. dev_err(dev, "Couldn't register clock %d - %s\n",
  62. i, name);
  63. return ret;
  64. }
  65. }
  66. ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, hw_clks);
  67. if (ret)
  68. dev_err(dev, "Failed to add clock provider\n");
  69. return ret;
  70. }