1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2013 Stefan Roese <sr@denx.de>
9 #include <asm/arch/sys_proto.h>
10 #include <asm/global_data.h>
11 #include <linux/delay.h>
12 #include <linux/errno.h>
14 #include <asm/mach-imx/regs-common.h>
16 DECLARE_GLOBAL_DATA_PTR;
18 /* 1 second delay should be plenty of time for block reset. */
19 #define RESET_MAX_TIMEOUT 1000000
21 #define MXS_BLOCK_SFTRST (1 << 31)
22 #define MXS_BLOCK_CLKGATE (1 << 30)
24 int mxs_wait_mask_set(struct mxs_register_32 *reg, uint32_t mask, unsigned
28 if ((readl(®->reg) & mask) == mask)
36 int mxs_wait_mask_clr(struct mxs_register_32 *reg, uint32_t mask, unsigned
40 if ((readl(®->reg) & mask) == 0)
48 int mxs_reset_block(struct mxs_register_32 *reg)
51 writel(MXS_BLOCK_SFTRST, ®->reg_clr);
53 if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
57 writel(MXS_BLOCK_CLKGATE, ®->reg_clr);
60 writel(MXS_BLOCK_SFTRST, ®->reg_set);
62 /* Wait for CLKGATE being set */
63 if (mxs_wait_mask_set(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))
67 writel(MXS_BLOCK_SFTRST, ®->reg_clr);
69 if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))
73 writel(MXS_BLOCK_CLKGATE, ®->reg_clr);
75 if (mxs_wait_mask_clr(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))