Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 //
0003 // Actions Semi Owl SoCs Reset Management Unit driver
0004 //
0005 // Copyright (c) 2018 Linaro Ltd.
0006 // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
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, &reg);
0051     if (ret)
0052         return ret;
0053 
0054     /*
0055      * The reset control API expects 0 if reset is not asserted,
0056      * which is the opposite of what our hardware uses.
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 };