owl-common.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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/of_address.h>
  11. #include <linux/of_platform.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/regmap.h>
  14. #include "owl-common.h"
  15. static const struct regmap_config owl_regmap_config = {
  16. .reg_bits = 32,
  17. .reg_stride = 4,
  18. .val_bits = 32,
  19. .max_register = 0x00cc,
  20. .fast_io = true,
  21. };
  22. static void owl_clk_set_regmap(const struct owl_clk_desc *desc,
  23. struct regmap *regmap)
  24. {
  25. int i;
  26. struct owl_clk_common *clks;
  27. for (i = 0; i < desc->num_clks; i++) {
  28. clks = desc->clks[i];
  29. if (!clks)
  30. continue;
  31. clks->regmap = regmap;
  32. }
  33. }
  34. int owl_clk_regmap_init(struct platform_device *pdev,
  35. struct owl_clk_desc *desc)
  36. {
  37. void __iomem *base;
  38. struct regmap *regmap;
  39. struct resource *res;
  40. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  41. base = devm_ioremap_resource(&pdev->dev, res);
  42. if (IS_ERR(base))
  43. return PTR_ERR(base);
  44. regmap = devm_regmap_init_mmio(&pdev->dev, base, &owl_regmap_config);
  45. if (IS_ERR(regmap)) {
  46. pr_err("failed to init regmap\n");
  47. return PTR_ERR(regmap);
  48. }
  49. owl_clk_set_regmap(desc, regmap);
  50. desc->regmap = regmap;
  51. return 0;
  52. }
  53. int owl_clk_probe(struct device *dev, struct clk_hw_onecell_data *hw_clks)
  54. {
  55. int i, ret;
  56. struct clk_hw *hw;
  57. for (i = 0; i < hw_clks->num; i++) {
  58. const char *name;
  59. hw = hw_clks->hws[i];
  60. if (IS_ERR_OR_NULL(hw))
  61. continue;
  62. name = hw->init->name;
  63. ret = devm_clk_hw_register(dev, hw);
  64. if (ret) {
  65. dev_err(dev, "Couldn't register clock %d - %s\n",
  66. i, name);
  67. return ret;
  68. }
  69. }
  70. ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, hw_clks);
  71. if (ret)
  72. dev_err(dev, "Failed to add clock provider\n");
  73. return ret;
  74. }