// SPDX-License-Identifier: GPL-2.0+ /* * Copyright 2021, Heinrich Schuchardt */ #include #include #include #include #include #include static enum sbi_srst_reset_type reset_type_map[SYSRESET_COUNT] = { [SYSRESET_WARM] = SBI_SRST_RESET_TYPE_WARM_REBOOT, [SYSRESET_COLD] = SBI_SRST_RESET_TYPE_COLD_REBOOT, [SYSRESET_POWER] = SBI_SRST_RESET_TYPE_COLD_REBOOT, [SYSRESET_POWER_OFF] = SBI_SRST_RESET_TYPE_SHUTDOWN, }; static int sbi_sysreset_request(struct udevice *dev, enum sysreset_t type) { enum sbi_srst_reset_type reset_type; reset_type = reset_type_map[type]; sbi_srst_reset(reset_type, SBI_SRST_RESET_REASON_NONE); return -EINPROGRESS; } static int sbi_sysreset_probe(struct udevice *dev) { long have_reset; have_reset = sbi_probe_extension(SBI_EXT_SRST); if (have_reset) return 0; log_warning("SBI has no system reset extension\n"); return -ENOENT; } static struct sysreset_ops sbi_sysreset_ops = { .request = sbi_sysreset_request, }; U_BOOT_DRIVER(sbi_sysreset) = { .name = "sbi-sysreset", .id = UCLASS_SYSRESET, .ops = &sbi_sysreset_ops, .probe = sbi_sysreset_probe, };