1*b25732c2SMax Filippov /* 2*b25732c2SMax Filippov * Qualcomm APQ8016 reset controller driver 3*b25732c2SMax Filippov * 4*b25732c2SMax Filippov * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com> 5*b25732c2SMax Filippov * 6*b25732c2SMax Filippov * SPDX-License-Identifier: GPL-2.0+ 7*b25732c2SMax Filippov */ 8*b25732c2SMax Filippov 9*b25732c2SMax Filippov #include <common.h> 10*b25732c2SMax Filippov #include <dm.h> 11*b25732c2SMax Filippov #include <errno.h> 12*b25732c2SMax Filippov #include <sysreset.h> 13*b25732c2SMax Filippov #include <asm/io.h> 14*b25732c2SMax Filippov 15*b25732c2SMax Filippov DECLARE_GLOBAL_DATA_PTR; 16*b25732c2SMax Filippov 17*b25732c2SMax Filippov static int msm_sysreset_request(struct udevice *dev, enum sysreset_t type) 18*b25732c2SMax Filippov { 19*b25732c2SMax Filippov phys_addr_t addr = dev_get_addr(dev); 20*b25732c2SMax Filippov if (!addr) 21*b25732c2SMax Filippov return -EINVAL; 22*b25732c2SMax Filippov writel(0, addr); 23*b25732c2SMax Filippov return -EINPROGRESS; 24*b25732c2SMax Filippov } 25*b25732c2SMax Filippov 26*b25732c2SMax Filippov static struct sysreset_ops msm_sysreset_ops = { 27*b25732c2SMax Filippov .request = msm_sysreset_request, 28*b25732c2SMax Filippov }; 29*b25732c2SMax Filippov 30*b25732c2SMax Filippov static const struct udevice_id msm_sysreset_ids[] = { 31*b25732c2SMax Filippov { .compatible = "qcom,pshold" }, 32*b25732c2SMax Filippov { } 33*b25732c2SMax Filippov }; 34*b25732c2SMax Filippov 35*b25732c2SMax Filippov U_BOOT_DRIVER(msm_reset) = { 36*b25732c2SMax Filippov .name = "msm_sysreset", 37*b25732c2SMax Filippov .id = UCLASS_SYSRESET, 38*b25732c2SMax Filippov .of_match = msm_sysreset_ids, 39*b25732c2SMax Filippov .ops = &msm_sysreset_ops, 40*b25732c2SMax Filippov }; 41