linux/drivers/clk/actions/owl-reset.c
<<
>>
Prefs
   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 <manivannan.sadhasivam@linaro.org>
   7
   8#include <linux/delay.h>
   9#include <linux/regmap.h>
  10#include <linux/reset-controller.h>
  11
  12#include "owl-reset.h"
  13
  14static int owl_reset_assert(struct reset_controller_dev *rcdev,
  15                            unsigned long id)
  16{
  17        struct owl_reset *reset = to_owl_reset(rcdev);
  18        const struct owl_reset_map *map = &reset->reset_map[id];
  19
  20        return regmap_update_bits(reset->regmap, map->reg, map->bit, 0);
  21}
  22
  23static int owl_reset_deassert(struct reset_controller_dev *rcdev,
  24                              unsigned long id)
  25{
  26        struct owl_reset *reset = to_owl_reset(rcdev);
  27        const struct owl_reset_map *map = &reset->reset_map[id];
  28
  29        return regmap_update_bits(reset->regmap, map->reg, map->bit, map->bit);
  30}
  31
  32static int owl_reset_reset(struct reset_controller_dev *rcdev,
  33                           unsigned long id)
  34{
  35        owl_reset_assert(rcdev, id);
  36        udelay(1);
  37        owl_reset_deassert(rcdev, id);
  38
  39        return 0;
  40}
  41
  42static int owl_reset_status(struct reset_controller_dev *rcdev,
  43                            unsigned long id)
  44{
  45        struct owl_reset *reset = to_owl_reset(rcdev);
  46        const struct owl_reset_map *map = &reset->reset_map[id];
  47        u32 reg;
  48        int ret;
  49
  50        ret = regmap_read(reset->regmap, map->reg, &reg);
  51        if (ret)
  52                return ret;
  53
  54        /*
  55         * The reset control API expects 0 if reset is not asserted,
  56         * which is the opposite of what our hardware uses.
  57         */
  58        return !(map->bit & reg);
  59}
  60
  61const struct reset_control_ops owl_reset_ops = {
  62        .assert         = owl_reset_assert,
  63        .deassert       = owl_reset_deassert,
  64        .reset          = owl_reset_reset,
  65        .status         = owl_reset_status,
  66};
  67