18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2013, The Linux Foundation. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/bitops.h> 78c2ecf20Sopenharmony_ci#include <linux/export.h> 88c2ecf20Sopenharmony_ci#include <linux/regmap.h> 98c2ecf20Sopenharmony_ci#include <linux/reset-controller.h> 108c2ecf20Sopenharmony_ci#include <linux/delay.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include "reset.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistatic int qcom_reset(struct reset_controller_dev *rcdev, unsigned long id) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci struct qcom_reset_controller *rst = to_qcom_reset_controller(rcdev); 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci rcdev->ops->assert(rcdev, id); 198c2ecf20Sopenharmony_ci fsleep(rst->reset_map[id].udelay ?: 1); /* use 1 us as default */ 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci rcdev->ops->deassert(rcdev, id); 228c2ecf20Sopenharmony_ci return 0; 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic int 268c2ecf20Sopenharmony_ciqcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci struct qcom_reset_controller *rst; 298c2ecf20Sopenharmony_ci const struct qcom_reset_map *map; 308c2ecf20Sopenharmony_ci u32 mask; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci rst = to_qcom_reset_controller(rcdev); 338c2ecf20Sopenharmony_ci map = &rst->reset_map[id]; 348c2ecf20Sopenharmony_ci mask = map->bitmask ? map->bitmask : BIT(map->bit); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci return regmap_update_bits(rst->regmap, map->reg, mask, mask); 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic int 408c2ecf20Sopenharmony_ciqcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci struct qcom_reset_controller *rst; 438c2ecf20Sopenharmony_ci const struct qcom_reset_map *map; 448c2ecf20Sopenharmony_ci u32 mask; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci rst = to_qcom_reset_controller(rcdev); 478c2ecf20Sopenharmony_ci map = &rst->reset_map[id]; 488c2ecf20Sopenharmony_ci mask = map->bitmask ? map->bitmask : BIT(map->bit); 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci return regmap_update_bits(rst->regmap, map->reg, mask, 0); 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ciconst struct reset_control_ops qcom_reset_ops = { 548c2ecf20Sopenharmony_ci .reset = qcom_reset, 558c2ecf20Sopenharmony_ci .assert = qcom_reset_assert, 568c2ecf20Sopenharmony_ci .deassert = qcom_reset_deassert, 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(qcom_reset_ops); 59