1b1e0b11cSLionel Debieve /* 2*84ebe2a5SThomas BOURGOIN * Copyright (c) 2019-2025, STMicroelectronics - All Rights Reserved 3b1e0b11cSLionel Debieve * 4b1e0b11cSLionel Debieve * SPDX-License-Identifier: BSD-3-Clause 5b1e0b11cSLionel Debieve */ 6b1e0b11cSLionel Debieve 7b1e0b11cSLionel Debieve #include <assert.h> 8b1e0b11cSLionel Debieve #include <errno.h> 9b1e0b11cSLionel Debieve #include <stdint.h> 10b1e0b11cSLionel Debieve 11b1e0b11cSLionel Debieve #include <arch_helpers.h> 12b1e0b11cSLionel Debieve #include <common/debug.h> 13e9529e46SRaghu Krishnamurthy #include <common/sha_common_macros.h> 1433667d29SYann Gautier #include <drivers/clk.h> 15b1e0b11cSLionel Debieve #include <drivers/delay_timer.h> 16b1e0b11cSLionel Debieve #include <drivers/st/stm32_hash.h> 17b1e0b11cSLionel Debieve #include <drivers/st/stm32mp_reset.h> 18b1e0b11cSLionel Debieve #include <lib/mmio.h> 19b1e0b11cSLionel Debieve #include <lib/utils.h> 2068039f2dSNicolas Toromanoff #include <libfdt.h> 21b1e0b11cSLionel Debieve #include <plat/common/platform.h> 22b1e0b11cSLionel Debieve 2368039f2dSNicolas Toromanoff #include <platform_def.h> 2468039f2dSNicolas Toromanoff 2568039f2dSNicolas Toromanoff #if STM32_HASH_VER == 2 26b1e0b11cSLionel Debieve #define DT_HASH_COMPAT "st,stm32f756-hash" 2768039f2dSNicolas Toromanoff #endif 2868039f2dSNicolas Toromanoff #if STM32_HASH_VER == 4 2968039f2dSNicolas Toromanoff #define DT_HASH_COMPAT "st,stm32mp13-hash" 3068039f2dSNicolas Toromanoff #endif 31b1e0b11cSLionel Debieve 32b1e0b11cSLionel Debieve #define HASH_CR 0x00U 33b1e0b11cSLionel Debieve #define HASH_DIN 0x04U 34b1e0b11cSLionel Debieve #define HASH_STR 0x08U 35b1e0b11cSLionel Debieve #define HASH_SR 0x24U 36b1e0b11cSLionel Debieve #define HASH_HREG(x) (0x310U + ((x) * 0x04U)) 37b1e0b11cSLionel Debieve 38b1e0b11cSLionel Debieve /* Control Register */ 39b1e0b11cSLionel Debieve #define HASH_CR_INIT BIT(2) 40b1e0b11cSLionel Debieve #define HASH_CR_DATATYPE_SHIFT U(4) 4168039f2dSNicolas Toromanoff #if STM32_HASH_VER == 2 42b1e0b11cSLionel Debieve #define HASH_CR_ALGO_SHA1 0x0U 43b1e0b11cSLionel Debieve #define HASH_CR_ALGO_MD5 BIT(7) 44b1e0b11cSLionel Debieve #define HASH_CR_ALGO_SHA224 BIT(18) 45b1e0b11cSLionel Debieve #define HASH_CR_ALGO_SHA256 (BIT(18) | BIT(7)) 4668039f2dSNicolas Toromanoff #endif 4768039f2dSNicolas Toromanoff #if STM32_HASH_VER == 4 4868039f2dSNicolas Toromanoff #define HASH_CR_ALGO_SHIFT U(17) 49*84ebe2a5SThomas BOURGOIN #define HASH_CR_ALGO_SHA1 ((uint32_t)(0x0U) << HASH_CR_ALGO_SHIFT) 50*84ebe2a5SThomas BOURGOIN #define HASH_CR_ALGO_SHA224 ((uint32_t)(0x2U) << HASH_CR_ALGO_SHIFT) 51*84ebe2a5SThomas BOURGOIN #define HASH_CR_ALGO_SHA256 ((uint32_t)(0x3U) << HASH_CR_ALGO_SHIFT) 52*84ebe2a5SThomas BOURGOIN #define HASH_CR_ALGO_SHA384 ((uint32_t)(0xCU) << HASH_CR_ALGO_SHIFT) 53*84ebe2a5SThomas BOURGOIN #define HASH_CR_ALGO_SHA512_224 ((uint32_t)(0xDU) << HASH_CR_ALGO_SHIFT) 54*84ebe2a5SThomas BOURGOIN #define HASH_CR_ALGO_SHA512_256 ((uint32_t)(0xEU) << HASH_CR_ALGO_SHIFT) 55*84ebe2a5SThomas BOURGOIN #define HASH_CR_ALGO_SHA512 ((uint32_t)(0xFU) << HASH_CR_ALGO_SHIFT) 5668039f2dSNicolas Toromanoff #endif 57b1e0b11cSLionel Debieve 58b1e0b11cSLionel Debieve /* Status Flags */ 59b1e0b11cSLionel Debieve #define HASH_SR_DCIS BIT(1) 60b1e0b11cSLionel Debieve #define HASH_SR_BUSY BIT(3) 61b1e0b11cSLionel Debieve 62b1e0b11cSLionel Debieve /* STR Register */ 63b1e0b11cSLionel Debieve #define HASH_STR_NBLW_MASK GENMASK(4, 0) 64b1e0b11cSLionel Debieve #define HASH_STR_DCAL BIT(8) 65b1e0b11cSLionel Debieve 6645c70e68SEtienne Carriere #define RESET_TIMEOUT_US_1MS 1000U 67b1e0b11cSLionel Debieve #define HASH_TIMEOUT_US 10000U 68b1e0b11cSLionel Debieve 69b1e0b11cSLionel Debieve enum stm32_hash_data_format { 70b1e0b11cSLionel Debieve HASH_DATA_32_BITS, 71b1e0b11cSLionel Debieve HASH_DATA_16_BITS, 72b1e0b11cSLionel Debieve HASH_DATA_8_BITS, 73b1e0b11cSLionel Debieve HASH_DATA_1_BIT 74b1e0b11cSLionel Debieve }; 75b1e0b11cSLionel Debieve 76b1e0b11cSLionel Debieve struct stm32_hash_instance { 77b1e0b11cSLionel Debieve uintptr_t base; 78b1e0b11cSLionel Debieve unsigned int clock; 79b1e0b11cSLionel Debieve size_t digest_size; 80b1e0b11cSLionel Debieve }; 81b1e0b11cSLionel Debieve 82b1e0b11cSLionel Debieve struct stm32_hash_remain { 83b1e0b11cSLionel Debieve uint32_t buffer; 84b1e0b11cSLionel Debieve size_t length; 85b1e0b11cSLionel Debieve }; 86b1e0b11cSLionel Debieve 87b1e0b11cSLionel Debieve /* Expect a single HASH peripheral */ 88b1e0b11cSLionel Debieve static struct stm32_hash_instance stm32_hash; 89b1e0b11cSLionel Debieve static struct stm32_hash_remain stm32_remain; 90b1e0b11cSLionel Debieve 91b1e0b11cSLionel Debieve static uintptr_t hash_base(void) 92b1e0b11cSLionel Debieve { 93b1e0b11cSLionel Debieve return stm32_hash.base; 94b1e0b11cSLionel Debieve } 95b1e0b11cSLionel Debieve 96b1e0b11cSLionel Debieve static int hash_wait_busy(void) 97b1e0b11cSLionel Debieve { 98b1e0b11cSLionel Debieve uint64_t timeout = timeout_init_us(HASH_TIMEOUT_US); 99b1e0b11cSLionel Debieve 100b1e0b11cSLionel Debieve while ((mmio_read_32(hash_base() + HASH_SR) & HASH_SR_BUSY) != 0U) { 101b1e0b11cSLionel Debieve if (timeout_elapsed(timeout)) { 102b1e0b11cSLionel Debieve ERROR("%s: busy timeout\n", __func__); 103b1e0b11cSLionel Debieve return -ETIMEDOUT; 104b1e0b11cSLionel Debieve } 105b1e0b11cSLionel Debieve } 106b1e0b11cSLionel Debieve 107b1e0b11cSLionel Debieve return 0; 108b1e0b11cSLionel Debieve } 109b1e0b11cSLionel Debieve 110b1e0b11cSLionel Debieve static int hash_wait_computation(void) 111b1e0b11cSLionel Debieve { 112b1e0b11cSLionel Debieve uint64_t timeout = timeout_init_us(HASH_TIMEOUT_US); 113b1e0b11cSLionel Debieve 114b1e0b11cSLionel Debieve while ((mmio_read_32(hash_base() + HASH_SR) & HASH_SR_DCIS) == 0U) { 115b1e0b11cSLionel Debieve if (timeout_elapsed(timeout)) { 116b1e0b11cSLionel Debieve ERROR("%s: busy timeout\n", __func__); 117b1e0b11cSLionel Debieve return -ETIMEDOUT; 118b1e0b11cSLionel Debieve } 119b1e0b11cSLionel Debieve } 120b1e0b11cSLionel Debieve 121b1e0b11cSLionel Debieve return 0; 122b1e0b11cSLionel Debieve } 123b1e0b11cSLionel Debieve 124b1e0b11cSLionel Debieve static int hash_write_data(uint32_t data) 125b1e0b11cSLionel Debieve { 126b1e0b11cSLionel Debieve int ret; 127b1e0b11cSLionel Debieve 128b1e0b11cSLionel Debieve ret = hash_wait_busy(); 129b1e0b11cSLionel Debieve if (ret != 0) { 130b1e0b11cSLionel Debieve return ret; 131b1e0b11cSLionel Debieve } 132b1e0b11cSLionel Debieve 133b1e0b11cSLionel Debieve mmio_write_32(hash_base() + HASH_DIN, data); 134b1e0b11cSLionel Debieve 135b1e0b11cSLionel Debieve return 0; 136b1e0b11cSLionel Debieve } 137b1e0b11cSLionel Debieve 138b1e0b11cSLionel Debieve static void hash_hw_init(enum stm32_hash_algo_mode mode) 139b1e0b11cSLionel Debieve { 140b1e0b11cSLionel Debieve uint32_t reg; 141b1e0b11cSLionel Debieve 142*84ebe2a5SThomas BOURGOIN reg = HASH_CR_INIT | ((uint32_t)HASH_DATA_8_BITS << HASH_CR_DATATYPE_SHIFT); 143b1e0b11cSLionel Debieve 144b1e0b11cSLionel Debieve switch (mode) { 14568039f2dSNicolas Toromanoff #if STM32_HASH_VER == 2 146b1e0b11cSLionel Debieve case HASH_MD5SUM: 147b1e0b11cSLionel Debieve reg |= HASH_CR_ALGO_MD5; 148b1e0b11cSLionel Debieve stm32_hash.digest_size = MD5_DIGEST_SIZE; 149b1e0b11cSLionel Debieve break; 15068039f2dSNicolas Toromanoff #endif 151b1e0b11cSLionel Debieve case HASH_SHA1: 152b1e0b11cSLionel Debieve reg |= HASH_CR_ALGO_SHA1; 153b1e0b11cSLionel Debieve stm32_hash.digest_size = SHA1_DIGEST_SIZE; 154b1e0b11cSLionel Debieve break; 155b1e0b11cSLionel Debieve case HASH_SHA224: 156b1e0b11cSLionel Debieve reg |= HASH_CR_ALGO_SHA224; 157b1e0b11cSLionel Debieve stm32_hash.digest_size = SHA224_DIGEST_SIZE; 158b1e0b11cSLionel Debieve break; 15968039f2dSNicolas Toromanoff #if STM32_HASH_VER == 4 16068039f2dSNicolas Toromanoff case HASH_SHA384: 16168039f2dSNicolas Toromanoff reg |= HASH_CR_ALGO_SHA384; 16268039f2dSNicolas Toromanoff stm32_hash.digest_size = SHA384_DIGEST_SIZE; 16368039f2dSNicolas Toromanoff break; 16468039f2dSNicolas Toromanoff case HASH_SHA512: 16568039f2dSNicolas Toromanoff reg |= HASH_CR_ALGO_SHA512; 16668039f2dSNicolas Toromanoff stm32_hash.digest_size = SHA512_DIGEST_SIZE; 16768039f2dSNicolas Toromanoff break; 16868039f2dSNicolas Toromanoff #endif 169b1e0b11cSLionel Debieve /* Default selected algo is SHA256 */ 170b1e0b11cSLionel Debieve case HASH_SHA256: 171b1e0b11cSLionel Debieve default: 172b1e0b11cSLionel Debieve reg |= HASH_CR_ALGO_SHA256; 173b1e0b11cSLionel Debieve stm32_hash.digest_size = SHA256_DIGEST_SIZE; 174b1e0b11cSLionel Debieve break; 175b1e0b11cSLionel Debieve } 176b1e0b11cSLionel Debieve 177b1e0b11cSLionel Debieve mmio_write_32(hash_base() + HASH_CR, reg); 178b1e0b11cSLionel Debieve } 179b1e0b11cSLionel Debieve 180b1e0b11cSLionel Debieve static int hash_get_digest(uint8_t *digest) 181b1e0b11cSLionel Debieve { 182b1e0b11cSLionel Debieve int ret; 183b1e0b11cSLionel Debieve uint32_t i; 184b1e0b11cSLionel Debieve uint32_t dsg; 185b1e0b11cSLionel Debieve 186b1e0b11cSLionel Debieve ret = hash_wait_computation(); 187b1e0b11cSLionel Debieve if (ret != 0) { 188b1e0b11cSLionel Debieve return ret; 189b1e0b11cSLionel Debieve } 190b1e0b11cSLionel Debieve 191b1e0b11cSLionel Debieve for (i = 0U; i < (stm32_hash.digest_size / sizeof(uint32_t)); i++) { 192b1e0b11cSLionel Debieve dsg = __builtin_bswap32(mmio_read_32(hash_base() + 193b1e0b11cSLionel Debieve HASH_HREG(i))); 194*84ebe2a5SThomas BOURGOIN (void)(memcpy(&digest[i * sizeof(uint32_t)], (uint8_t *)&dsg, sizeof(uint32_t))); 195b1e0b11cSLionel Debieve } 196b1e0b11cSLionel Debieve 197b1e0b11cSLionel Debieve /* 198b1e0b11cSLionel Debieve * Clean hardware context as HASH could be used later 199b1e0b11cSLionel Debieve * by non-secure software 200b1e0b11cSLionel Debieve */ 201b1e0b11cSLionel Debieve hash_hw_init(HASH_SHA256); 2026b5fc192SLionel Debieve 203b1e0b11cSLionel Debieve return 0; 204b1e0b11cSLionel Debieve } 205b1e0b11cSLionel Debieve 206b1e0b11cSLionel Debieve int stm32_hash_update(const uint8_t *buffer, size_t length) 207b1e0b11cSLionel Debieve { 208b1e0b11cSLionel Debieve size_t remain_length = length; 209*84ebe2a5SThomas BOURGOIN uint8_t *remain_buf = (uint8_t *)&stm32_remain.buffer; 210*84ebe2a5SThomas BOURGOIN const uint8_t *buf = buffer; 211b1e0b11cSLionel Debieve int ret = 0; 212b1e0b11cSLionel Debieve 213b1e0b11cSLionel Debieve if ((length == 0U) || (buffer == NULL)) { 214b1e0b11cSLionel Debieve return 0; 215b1e0b11cSLionel Debieve } 216b1e0b11cSLionel Debieve 217*84ebe2a5SThomas BOURGOIN ret = clk_enable(stm32_hash.clock); 218*84ebe2a5SThomas BOURGOIN if (ret != 0) { 219*84ebe2a5SThomas BOURGOIN return ret; 220*84ebe2a5SThomas BOURGOIN } 221b1e0b11cSLionel Debieve 222b1e0b11cSLionel Debieve if (stm32_remain.length != 0U) { 223b1e0b11cSLionel Debieve uint32_t copysize; 224b1e0b11cSLionel Debieve 225b1e0b11cSLionel Debieve copysize = MIN((sizeof(uint32_t) - stm32_remain.length), 226b1e0b11cSLionel Debieve length); 227*84ebe2a5SThomas BOURGOIN (void)(memcpy(&remain_buf[stm32_remain.length], buf, copysize)); 228b1e0b11cSLionel Debieve remain_length -= copysize; 229*84ebe2a5SThomas BOURGOIN buf = &buf[copysize]; 230b1e0b11cSLionel Debieve if (stm32_remain.length == sizeof(uint32_t)) { 231b1e0b11cSLionel Debieve ret = hash_write_data(stm32_remain.buffer); 232b1e0b11cSLionel Debieve if (ret != 0) { 233b1e0b11cSLionel Debieve goto exit; 234b1e0b11cSLionel Debieve } 235b1e0b11cSLionel Debieve 236b1e0b11cSLionel Debieve zeromem(&stm32_remain, sizeof(stm32_remain)); 237b1e0b11cSLionel Debieve } 238b1e0b11cSLionel Debieve } 239b1e0b11cSLionel Debieve 240b1e0b11cSLionel Debieve while (remain_length / sizeof(uint32_t) != 0U) { 241b1e0b11cSLionel Debieve uint32_t tmp_buf; 242b1e0b11cSLionel Debieve 243*84ebe2a5SThomas BOURGOIN (void)(memcpy((void *)&tmp_buf, buf, sizeof(uint32_t))); 244b1e0b11cSLionel Debieve ret = hash_write_data(tmp_buf); 245b1e0b11cSLionel Debieve if (ret != 0) { 246b1e0b11cSLionel Debieve goto exit; 247b1e0b11cSLionel Debieve } 248b1e0b11cSLionel Debieve 249*84ebe2a5SThomas BOURGOIN buf = &buf[sizeof(uint32_t)]; 250b1e0b11cSLionel Debieve remain_length -= sizeof(uint32_t); 251b1e0b11cSLionel Debieve } 252b1e0b11cSLionel Debieve 253b1e0b11cSLionel Debieve if (remain_length != 0U) { 254b1e0b11cSLionel Debieve assert(stm32_remain.length == 0U); 255b1e0b11cSLionel Debieve 256*84ebe2a5SThomas BOURGOIN (void)(memcpy((uint8_t *)&stm32_remain.buffer, buf, remain_length)); 257b1e0b11cSLionel Debieve stm32_remain.length = remain_length; 258b1e0b11cSLionel Debieve } 259b1e0b11cSLionel Debieve 260b1e0b11cSLionel Debieve exit: 26133667d29SYann Gautier clk_disable(stm32_hash.clock); 262b1e0b11cSLionel Debieve 263b1e0b11cSLionel Debieve return ret; 264b1e0b11cSLionel Debieve } 265b1e0b11cSLionel Debieve 266b1e0b11cSLionel Debieve int stm32_hash_final(uint8_t *digest) 267b1e0b11cSLionel Debieve { 268b1e0b11cSLionel Debieve int ret; 269b1e0b11cSLionel Debieve 270*84ebe2a5SThomas BOURGOIN ret = clk_enable(stm32_hash.clock); 271*84ebe2a5SThomas BOURGOIN if (ret != 0) { 272*84ebe2a5SThomas BOURGOIN return ret; 273*84ebe2a5SThomas BOURGOIN } 274b1e0b11cSLionel Debieve 275b1e0b11cSLionel Debieve if (stm32_remain.length != 0U) { 276b1e0b11cSLionel Debieve ret = hash_write_data(stm32_remain.buffer); 277b1e0b11cSLionel Debieve if (ret != 0) { 27833667d29SYann Gautier clk_disable(stm32_hash.clock); 279b1e0b11cSLionel Debieve return ret; 280b1e0b11cSLionel Debieve } 281b1e0b11cSLionel Debieve 282b1e0b11cSLionel Debieve mmio_clrsetbits_32(hash_base() + HASH_STR, HASH_STR_NBLW_MASK, 283b1e0b11cSLionel Debieve 8U * stm32_remain.length); 284b1e0b11cSLionel Debieve zeromem(&stm32_remain, sizeof(stm32_remain)); 285662c1f5cSLionel Debieve } else { 286662c1f5cSLionel Debieve mmio_clrbits_32(hash_base() + HASH_STR, HASH_STR_NBLW_MASK); 287b1e0b11cSLionel Debieve } 288b1e0b11cSLionel Debieve 289b1e0b11cSLionel Debieve mmio_setbits_32(hash_base() + HASH_STR, HASH_STR_DCAL); 290b1e0b11cSLionel Debieve 291b1e0b11cSLionel Debieve ret = hash_get_digest(digest); 292b1e0b11cSLionel Debieve 29333667d29SYann Gautier clk_disable(stm32_hash.clock); 294b1e0b11cSLionel Debieve 295b1e0b11cSLionel Debieve return ret; 296b1e0b11cSLionel Debieve } 297b1e0b11cSLionel Debieve 298b1e0b11cSLionel Debieve int stm32_hash_final_update(const uint8_t *buffer, uint32_t length, 299b1e0b11cSLionel Debieve uint8_t *digest) 300b1e0b11cSLionel Debieve { 301b1e0b11cSLionel Debieve int ret; 302b1e0b11cSLionel Debieve 303b1e0b11cSLionel Debieve ret = stm32_hash_update(buffer, length); 304b1e0b11cSLionel Debieve if (ret != 0) { 305b1e0b11cSLionel Debieve return ret; 306b1e0b11cSLionel Debieve } 307b1e0b11cSLionel Debieve 308b1e0b11cSLionel Debieve return stm32_hash_final(digest); 309b1e0b11cSLionel Debieve } 310b1e0b11cSLionel Debieve 311b1e0b11cSLionel Debieve void stm32_hash_init(enum stm32_hash_algo_mode mode) 312b1e0b11cSLionel Debieve { 313*84ebe2a5SThomas BOURGOIN if (clk_enable(stm32_hash.clock) != 0) { 314*84ebe2a5SThomas BOURGOIN ERROR("%s: fail to enable clock\n", __func__); 315*84ebe2a5SThomas BOURGOIN panic(); 316*84ebe2a5SThomas BOURGOIN } 317b1e0b11cSLionel Debieve 318b1e0b11cSLionel Debieve hash_hw_init(mode); 319b1e0b11cSLionel Debieve 32033667d29SYann Gautier clk_disable(stm32_hash.clock); 321b1e0b11cSLionel Debieve 322b1e0b11cSLionel Debieve zeromem(&stm32_remain, sizeof(stm32_remain)); 323b1e0b11cSLionel Debieve } 324b1e0b11cSLionel Debieve 325b1e0b11cSLionel Debieve int stm32_hash_register(void) 326b1e0b11cSLionel Debieve { 327b1e0b11cSLionel Debieve struct dt_node_info hash_info; 328b1e0b11cSLionel Debieve int node; 329*84ebe2a5SThomas BOURGOIN int ret; 330b1e0b11cSLionel Debieve 331b1e0b11cSLionel Debieve for (node = dt_get_node(&hash_info, -1, DT_HASH_COMPAT); 332b1e0b11cSLionel Debieve node != -FDT_ERR_NOTFOUND; 333b1e0b11cSLionel Debieve node = dt_get_node(&hash_info, node, DT_HASH_COMPAT)) { 334b1e0b11cSLionel Debieve if (hash_info.status != DT_DISABLED) { 335b1e0b11cSLionel Debieve break; 336b1e0b11cSLionel Debieve } 337b1e0b11cSLionel Debieve } 338b1e0b11cSLionel Debieve 339b1e0b11cSLionel Debieve if (node == -FDT_ERR_NOTFOUND) { 340b1e0b11cSLionel Debieve return -ENODEV; 341b1e0b11cSLionel Debieve } 342b1e0b11cSLionel Debieve 343b1e0b11cSLionel Debieve if (hash_info.clock < 0) { 344b1e0b11cSLionel Debieve return -EINVAL; 345b1e0b11cSLionel Debieve } 346b1e0b11cSLionel Debieve 347b1e0b11cSLionel Debieve stm32_hash.base = hash_info.base; 348b1e0b11cSLionel Debieve stm32_hash.clock = hash_info.clock; 349b1e0b11cSLionel Debieve 350*84ebe2a5SThomas BOURGOIN ret = clk_enable(stm32_hash.clock); 351*84ebe2a5SThomas BOURGOIN if (ret != 0) { 352*84ebe2a5SThomas BOURGOIN return ret; 353*84ebe2a5SThomas BOURGOIN } 354b1e0b11cSLionel Debieve 355b1e0b11cSLionel Debieve if (hash_info.reset >= 0) { 35645c70e68SEtienne Carriere uint32_t id = (uint32_t)hash_info.reset; 35745c70e68SEtienne Carriere 35845c70e68SEtienne Carriere if (stm32mp_reset_assert(id, RESET_TIMEOUT_US_1MS) != 0) { 35945c70e68SEtienne Carriere panic(); 36045c70e68SEtienne Carriere } 361b1e0b11cSLionel Debieve udelay(20); 36245c70e68SEtienne Carriere if (stm32mp_reset_deassert(id, RESET_TIMEOUT_US_1MS) != 0) { 36345c70e68SEtienne Carriere panic(); 36445c70e68SEtienne Carriere } 365b1e0b11cSLionel Debieve } 366b1e0b11cSLionel Debieve 36733667d29SYann Gautier clk_disable(stm32_hash.clock); 368b1e0b11cSLionel Debieve 369b1e0b11cSLionel Debieve return 0; 370b1e0b11cSLionel Debieve } 371