A syscon device may need to be taken out of reset before functioning - this change adds a facility to attach a reset control to a mmio regmap, and performs the necessary deassert/assert operations on the reset controller on attach/detach. Signed-off-by: Jeremy Kerr <jk@xxxxxxxxxxxxxxxxxxxx> --- drivers/base/regmap/regmap-mmio.c | 22 ++++++++++++++++++++++ include/linux/regmap.h | 3 +++ 2 files changed, 25 insertions(+) diff --git a/drivers/base/regmap/regmap-mmio.c b/drivers/base/regmap/regmap-mmio.c index 3ccdd86a97e7..e2611de73b42 100644 --- a/drivers/base/regmap/regmap-mmio.c +++ b/drivers/base/regmap/regmap-mmio.c @@ -8,6 +8,7 @@ #include <linux/err.h> #include <linux/io.h> #include <linux/module.h> +#include <linux/reset.h> #include <linux/regmap.h> #include <linux/slab.h> #include <linux/swab.h> @@ -22,6 +23,8 @@ struct regmap_mmio_context { bool attached_clk; struct clk *clk; + struct reset_control *reset; + void (*reg_write)(struct regmap_mmio_context *ctx, unsigned int reg, unsigned int val); unsigned int (*reg_read)(struct regmap_mmio_context *ctx, @@ -633,4 +636,23 @@ void regmap_mmio_detach_clk(struct regmap *map) } EXPORT_SYMBOL_GPL(regmap_mmio_detach_clk); +int regmap_mmio_attach_reset(struct regmap *map, struct reset_control *reset) +{ + struct regmap_mmio_context *ctx = map->bus_context; + + ctx->reset = reset; + + return reset_control_deassert(ctx->reset); +} +EXPORT_SYMBOL_GPL(regmap_mmio_attach_reset); + +void regmap_mmio_detach_reset(struct regmap *map) +{ + struct regmap_mmio_context *ctx = map->bus_context; + + reset_control_assert(ctx->reset); + ctx->reset = NULL; +} +EXPORT_SYMBOL_GPL(regmap_mmio_detach_reset); + MODULE_LICENSE("GPL v2"); diff --git a/include/linux/regmap.h b/include/linux/regmap.h index ca3434dca3a0..b0c7a747c06f 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -34,6 +34,7 @@ struct spmi_device; struct regmap; struct regmap_range_cfg; struct regmap_field; +struct reset_control; struct snd_ac97; struct sdw_slave; @@ -1150,6 +1151,8 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg); int regmap_mmio_attach_clk(struct regmap *map, struct clk *clk); void regmap_mmio_detach_clk(struct regmap *map); +int regmap_mmio_attach_reset(struct regmap *map, struct reset_control *reset); +void regmap_mmio_detach_reset(struct regmap *map); void regmap_exit(struct regmap *map); int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config); -- 2.35.1