1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) ASPEED Technology Inc. 4 */ 5 6 #include <common.h> 7 #include <dm.h> 8 #include <misc.h> 9 #include <reset.h> 10 #include <reset-uclass.h> 11 #include <wdt.h> 12 #include <asm/io.h> 13 #include <asm/arch/wdt.h> 14 #include <asm/arch/scu_ast2600.h> 15 16 struct aspeed_reset_priv { 17 /* WDT used to perform resets. */ 18 struct udevice *wdt; 19 struct ast2600_scu *scu; 20 }; 21 22 static int ast2600_reset_assert(struct reset_ctl *reset_ctl) 23 { 24 struct aspeed_reset_priv *priv = dev_get_priv(reset_ctl->dev); 25 u32 reset_mode, reset_mask; 26 bool reset_sdram; 27 int ret; 28 printf("ast2600_reset_assert reset_ctl->id %d \n", reset_ctl->id); 29 /* 30 * To reset SDRAM, a specifal flag in SYSRESET register 31 * needs to be enabled first 32 */ 33 reset_mode = ast_reset_mode_from_flags(reset_ctl->id); 34 reset_mask = ast_reset_mask_from_flags(reset_ctl->id); 35 reset_sdram = reset_mode == WDT_CTRL_RESET_SOC && 36 (reset_mask & WDT_RESET_SDRAM); 37 #if 0 38 if (reset_sdram) { 39 ast_scu_unlock(priv->scu); 40 setbits_le32(&priv->scu->sysreset_ctrl1, 41 SCU_SYSRESET_SDRAM_WDT); 42 ret = wdt_expire_now(priv->wdt, reset_ctl->id); 43 clrbits_le32(&priv->scu->sysreset_ctrl1, 44 SCU_SYSRESET_SDRAM_WDT); 45 ast_scu_lock(priv->scu); 46 } else { 47 ret = wdt_expire_now(priv->wdt, reset_ctl->id); 48 } 49 #endif 50 return ret; 51 } 52 53 static int ast2600_reset_request(struct reset_ctl *reset_ctl) 54 { 55 printf("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 56 reset_ctl->dev, reset_ctl->id); 57 58 return 0; 59 } 60 61 static int ast2600_reset_probe(struct udevice *dev) 62 { 63 struct aspeed_reset_priv *priv = dev_get_priv(dev); 64 65 priv->scu = ast_get_scu(); 66 67 return 0; 68 } 69 70 static int aspeed_ofdata_to_platdata(struct udevice *dev) 71 { 72 struct aspeed_reset_priv *priv = dev_get_priv(dev); 73 int ret; 74 75 ret = uclass_get_device_by_phandle(UCLASS_WDT, dev, "aspeed,wdt", 76 &priv->wdt); 77 if (ret) { 78 debug("%s: can't find WDT for reset controller", __func__); 79 return ret; 80 } 81 82 return 0; 83 } 84 85 86 static const struct udevice_id aspeed_reset_ids[] = { 87 { .compatible = "aspeed,ast2600-reset" }, 88 { } 89 }; 90 91 struct reset_ops aspeed_reset_ops = { 92 .rst_assert = ast2600_reset_assert, 93 .request = ast2600_reset_request, 94 }; 95 96 U_BOOT_DRIVER(aspeed_reset) = { 97 .name = "aspeed_reset", 98 .id = UCLASS_RESET, 99 .of_match = aspeed_reset_ids, 100 .probe = ast2600_reset_probe, 101 .ops = &aspeed_reset_ops, 102 .ofdata_to_platdata = aspeed_ofdata_to_platdata, 103 .priv_auto_alloc_size = sizeof(struct aspeed_reset_priv), 104 }; 105