0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/delay.h>
0009 #include <linux/regmap.h>
0010 #include <linux/reset-controller.h>
0011
0012 #include "owl-reset.h"
0013
0014 static int owl_reset_assert(struct reset_controller_dev *rcdev,
0015 unsigned long id)
0016 {
0017 struct owl_reset *reset = to_owl_reset(rcdev);
0018 const struct owl_reset_map *map = &reset->reset_map[id];
0019
0020 return regmap_update_bits(reset->regmap, map->reg, map->bit, 0);
0021 }
0022
0023 static int owl_reset_deassert(struct reset_controller_dev *rcdev,
0024 unsigned long id)
0025 {
0026 struct owl_reset *reset = to_owl_reset(rcdev);
0027 const struct owl_reset_map *map = &reset->reset_map[id];
0028
0029 return regmap_update_bits(reset->regmap, map->reg, map->bit, map->bit);
0030 }
0031
0032 static int owl_reset_reset(struct reset_controller_dev *rcdev,
0033 unsigned long id)
0034 {
0035 owl_reset_assert(rcdev, id);
0036 udelay(1);
0037 owl_reset_deassert(rcdev, id);
0038
0039 return 0;
0040 }
0041
0042 static int owl_reset_status(struct reset_controller_dev *rcdev,
0043 unsigned long id)
0044 {
0045 struct owl_reset *reset = to_owl_reset(rcdev);
0046 const struct owl_reset_map *map = &reset->reset_map[id];
0047 u32 reg;
0048 int ret;
0049
0050 ret = regmap_read(reset->regmap, map->reg, ®);
0051 if (ret)
0052 return ret;
0053
0054
0055
0056
0057
0058 return !(map->bit & reg);
0059 }
0060
0061 const struct reset_control_ops owl_reset_ops = {
0062 .assert = owl_reset_assert,
0063 .deassert = owl_reset_deassert,
0064 .reset = owl_reset_reset,
0065 .status = owl_reset_status,
0066 };