clk-regmap.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2014, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/device.h>
  6. #include <linux/clk-provider.h>
  7. #include <linux/regmap.h>
  8. #include <linux/export.h>
  9. #include "clk-regmap.h"
  10. /**
  11. * clk_is_enabled_regmap - standard is_enabled() for regmap users
  12. *
  13. * @hw: clk to operate on
  14. *
  15. * Clocks that use regmap for their register I/O can set the
  16. * enable_reg and enable_mask fields in their struct clk_regmap and then use
  17. * this as their is_enabled operation, saving some code.
  18. */
  19. int clk_is_enabled_regmap(struct clk_hw *hw)
  20. {
  21. struct clk_regmap *rclk = to_clk_regmap(hw);
  22. unsigned int val;
  23. int ret;
  24. ret = regmap_read(rclk->regmap, rclk->enable_reg, &val);
  25. if (ret != 0)
  26. return ret;
  27. if (rclk->enable_is_inverted)
  28. return (val & rclk->enable_mask) == 0;
  29. else
  30. return (val & rclk->enable_mask) != 0;
  31. }
  32. EXPORT_SYMBOL_GPL(clk_is_enabled_regmap);
  33. /**
  34. * clk_enable_regmap - standard enable() for regmap users
  35. *
  36. * @hw: clk to operate on
  37. *
  38. * Clocks that use regmap for their register I/O can set the
  39. * enable_reg and enable_mask fields in their struct clk_regmap and then use
  40. * this as their enable() operation, saving some code.
  41. */
  42. int clk_enable_regmap(struct clk_hw *hw)
  43. {
  44. struct clk_regmap *rclk = to_clk_regmap(hw);
  45. unsigned int val;
  46. if (rclk->enable_is_inverted)
  47. val = 0;
  48. else
  49. val = rclk->enable_mask;
  50. return regmap_update_bits(rclk->regmap, rclk->enable_reg,
  51. rclk->enable_mask, val);
  52. }
  53. EXPORT_SYMBOL_GPL(clk_enable_regmap);
  54. /**
  55. * clk_disable_regmap - standard disable() for regmap users
  56. *
  57. * @hw: clk to operate on
  58. *
  59. * Clocks that use regmap for their register I/O can set the
  60. * enable_reg and enable_mask fields in their struct clk_regmap and then use
  61. * this as their disable() operation, saving some code.
  62. */
  63. void clk_disable_regmap(struct clk_hw *hw)
  64. {
  65. struct clk_regmap *rclk = to_clk_regmap(hw);
  66. unsigned int val;
  67. if (rclk->enable_is_inverted)
  68. val = rclk->enable_mask;
  69. else
  70. val = 0;
  71. regmap_update_bits(rclk->regmap, rclk->enable_reg, rclk->enable_mask,
  72. val);
  73. }
  74. EXPORT_SYMBOL_GPL(clk_disable_regmap);
  75. /**
  76. * devm_clk_register_regmap - register a clk_regmap clock
  77. *
  78. * @rclk: clk to operate on
  79. *
  80. * Clocks that use regmap for their register I/O should register their
  81. * clk_regmap struct via this function so that the regmap is initialized
  82. * and so that the clock is registered with the common clock framework.
  83. */
  84. int devm_clk_register_regmap(struct device *dev, struct clk_regmap *rclk)
  85. {
  86. if (dev && dev_get_regmap(dev, NULL))
  87. rclk->regmap = dev_get_regmap(dev, NULL);
  88. else if (dev && dev->parent)
  89. rclk->regmap = dev_get_regmap(dev->parent, NULL);
  90. return devm_clk_hw_register(dev, &rclk->hw);
  91. }
  92. EXPORT_SYMBOL_GPL(devm_clk_register_regmap);