owl-reset.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. //
  3. // Actions Semi Owl SoCs Reset Management Unit driver
  4. //
  5. // Copyright (c) 2018 Linaro Ltd.
  6. // Author: Manivannan Sadhasivam <[email protected]>
  7. #include <linux/delay.h>
  8. #include <linux/regmap.h>
  9. #include <linux/reset-controller.h>
  10. #include "owl-reset.h"
  11. static int owl_reset_assert(struct reset_controller_dev *rcdev,
  12. unsigned long id)
  13. {
  14. struct owl_reset *reset = to_owl_reset(rcdev);
  15. const struct owl_reset_map *map = &reset->reset_map[id];
  16. return regmap_update_bits(reset->regmap, map->reg, map->bit, 0);
  17. }
  18. static int owl_reset_deassert(struct reset_controller_dev *rcdev,
  19. unsigned long id)
  20. {
  21. struct owl_reset *reset = to_owl_reset(rcdev);
  22. const struct owl_reset_map *map = &reset->reset_map[id];
  23. return regmap_update_bits(reset->regmap, map->reg, map->bit, map->bit);
  24. }
  25. static int owl_reset_reset(struct reset_controller_dev *rcdev,
  26. unsigned long id)
  27. {
  28. owl_reset_assert(rcdev, id);
  29. udelay(1);
  30. owl_reset_deassert(rcdev, id);
  31. return 0;
  32. }
  33. static int owl_reset_status(struct reset_controller_dev *rcdev,
  34. unsigned long id)
  35. {
  36. struct owl_reset *reset = to_owl_reset(rcdev);
  37. const struct owl_reset_map *map = &reset->reset_map[id];
  38. u32 reg;
  39. int ret;
  40. ret = regmap_read(reset->regmap, map->reg, &reg);
  41. if (ret)
  42. return ret;
  43. /*
  44. * The reset control API expects 0 if reset is not asserted,
  45. * which is the opposite of what our hardware uses.
  46. */
  47. return !(map->bit & reg);
  48. }
  49. const struct reset_control_ops owl_reset_ops = {
  50. .assert = owl_reset_assert,
  51. .deassert = owl_reset_deassert,
  52. .reset = owl_reset_reset,
  53. .status = owl_reset_status,
  54. };