1*4697abeaSmaxims@google.com /* 2*4697abeaSmaxims@google.com * (C) Copyright 2016 Google, Inc 3*4697abeaSmaxims@google.com * 4*4697abeaSmaxims@google.com * SPDX-License-Identifier: GPL-2.0 5*4697abeaSmaxims@google.com */ 6*4697abeaSmaxims@google.com 7*4697abeaSmaxims@google.com #include <common.h> 8*4697abeaSmaxims@google.com #include <dm.h> 9*4697abeaSmaxims@google.com #include <errno.h> 10*4697abeaSmaxims@google.com #include <sysreset.h> 11*4697abeaSmaxims@google.com #include <asm/io.h> 12*4697abeaSmaxims@google.com #include <asm/arch/wdt.h> 13*4697abeaSmaxims@google.com #include <linux/err.h> 14*4697abeaSmaxims@google.com 15*4697abeaSmaxims@google.com /* Number of Watchdog Timer ticks before reset */ 16*4697abeaSmaxims@google.com #define AST_WDT_RESET_TIMEOUT 10 17*4697abeaSmaxims@google.com #define AST_WDT_FOR_RESET 0 18*4697abeaSmaxims@google.com 19*4697abeaSmaxims@google.com static int ast_sysreset_request(struct udevice *dev, enum sysreset_t type) 20*4697abeaSmaxims@google.com { 21*4697abeaSmaxims@google.com struct ast_wdt *wdt = ast_get_wdt(AST_WDT_FOR_RESET); 22*4697abeaSmaxims@google.com u32 reset_mode = 0; 23*4697abeaSmaxims@google.com 24*4697abeaSmaxims@google.com if (IS_ERR(wdt)) 25*4697abeaSmaxims@google.com return PTR_ERR(wdt); 26*4697abeaSmaxims@google.com 27*4697abeaSmaxims@google.com switch (type) { 28*4697abeaSmaxims@google.com case SYSRESET_WARM: 29*4697abeaSmaxims@google.com reset_mode = WDT_CTRL_RESET_CPU; 30*4697abeaSmaxims@google.com break; 31*4697abeaSmaxims@google.com case SYSRESET_COLD: 32*4697abeaSmaxims@google.com reset_mode = WDT_CTRL_RESET_CHIP; 33*4697abeaSmaxims@google.com break; 34*4697abeaSmaxims@google.com default: 35*4697abeaSmaxims@google.com return -EPROTONOSUPPORT; 36*4697abeaSmaxims@google.com } 37*4697abeaSmaxims@google.com 38*4697abeaSmaxims@google.com /* Clear reset mode bits */ 39*4697abeaSmaxims@google.com clrsetbits_le32(&wdt->ctrl, 40*4697abeaSmaxims@google.com (WDT_CTRL_RESET_MODE_MASK << WDT_CTRL_RESET_MODE_SHIFT), 41*4697abeaSmaxims@google.com (reset_mode << WDT_CTRL_RESET_MODE_SHIFT)); 42*4697abeaSmaxims@google.com wdt_start(wdt, AST_WDT_RESET_TIMEOUT); 43*4697abeaSmaxims@google.com 44*4697abeaSmaxims@google.com return -EINPROGRESS; 45*4697abeaSmaxims@google.com } 46*4697abeaSmaxims@google.com 47*4697abeaSmaxims@google.com static struct sysreset_ops ast_sysreset = { 48*4697abeaSmaxims@google.com .request = ast_sysreset_request, 49*4697abeaSmaxims@google.com }; 50*4697abeaSmaxims@google.com 51*4697abeaSmaxims@google.com U_BOOT_DRIVER(sysreset_ast) = { 52*4697abeaSmaxims@google.com .name = "ast_sysreset", 53*4697abeaSmaxims@google.com .id = UCLASS_SYSRESET, 54*4697abeaSmaxims@google.com .ops = &ast_sysreset, 55*4697abeaSmaxims@google.com }; 56