xref: /rk3399_ARM-atf/plat/imx/common/imx_clock.c (revision 82e350830030cf9f5000be89a2a52982330b93c6)
1*82e35083SBryan O'Donoghue /*
2*82e35083SBryan O'Donoghue  * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
3*82e35083SBryan O'Donoghue  *
4*82e35083SBryan O'Donoghue  * SPDX-License-Identifier: BSD-3-Clause
5*82e35083SBryan O'Donoghue  */
6*82e35083SBryan O'Donoghue #include <arch.h>
7*82e35083SBryan O'Donoghue #include <mmio.h>
8*82e35083SBryan O'Donoghue #include <stdint.h>
9*82e35083SBryan O'Donoghue #include <stdbool.h>
10*82e35083SBryan O'Donoghue #include <imx_regs.h>
11*82e35083SBryan O'Donoghue #include <imx_clock.h>
12*82e35083SBryan O'Donoghue 
13*82e35083SBryan O'Donoghue void imx_clock_target_set(unsigned int id, uint32_t val)
14*82e35083SBryan O'Donoghue {
15*82e35083SBryan O'Donoghue 	struct ccm *ccm = ((struct ccm *)CCM_BASE);
16*82e35083SBryan O'Donoghue 	uintptr_t addr;
17*82e35083SBryan O'Donoghue 
18*82e35083SBryan O'Donoghue 	if (id > CCM_ROOT_CTRL_NUM)
19*82e35083SBryan O'Donoghue 		return;
20*82e35083SBryan O'Donoghue 
21*82e35083SBryan O'Donoghue 	addr = (uintptr_t)&ccm->ccm_root_ctrl[id].ccm_target_root;
22*82e35083SBryan O'Donoghue 	mmio_write_32(addr, val);
23*82e35083SBryan O'Donoghue }
24*82e35083SBryan O'Donoghue 
25*82e35083SBryan O'Donoghue void imx_clock_target_clr(unsigned int id, uint32_t val)
26*82e35083SBryan O'Donoghue {
27*82e35083SBryan O'Donoghue 	struct ccm *ccm = ((struct ccm *)CCM_BASE);
28*82e35083SBryan O'Donoghue 	uintptr_t addr;
29*82e35083SBryan O'Donoghue 
30*82e35083SBryan O'Donoghue 	if (id > CCM_ROOT_CTRL_NUM)
31*82e35083SBryan O'Donoghue 		return;
32*82e35083SBryan O'Donoghue 
33*82e35083SBryan O'Donoghue 	addr = (uintptr_t)&ccm->ccm_root_ctrl[id].ccm_target_root_clr;
34*82e35083SBryan O'Donoghue 	mmio_write_32(addr, val);
35*82e35083SBryan O'Donoghue }
36*82e35083SBryan O'Donoghue 
37*82e35083SBryan O'Donoghue void imx_clock_gate_enable(unsigned int id, bool enable)
38*82e35083SBryan O'Donoghue {
39*82e35083SBryan O'Donoghue 	struct ccm *ccm = ((struct ccm *)CCM_BASE);
40*82e35083SBryan O'Donoghue 	uintptr_t addr;
41*82e35083SBryan O'Donoghue 
42*82e35083SBryan O'Donoghue 	if (id > CCM_CLK_GATE_CTRL_NUM)
43*82e35083SBryan O'Donoghue 		return;
44*82e35083SBryan O'Donoghue 
45*82e35083SBryan O'Donoghue 	/* TODO: add support for more than DOMAIN0 clocks */
46*82e35083SBryan O'Donoghue 	if (enable)
47*82e35083SBryan O'Donoghue 		addr = (uintptr_t)&ccm->ccm_clk_gate_ctrl[id].ccm_ccgr_set;
48*82e35083SBryan O'Donoghue 	else
49*82e35083SBryan O'Donoghue 		addr = (uintptr_t)&ccm->ccm_clk_gate_ctrl[id].ccm_ccgr_clr;
50*82e35083SBryan O'Donoghue 
51*82e35083SBryan O'Donoghue 	mmio_write_32(addr, CCM_CCGR_SETTING0_DOM_CLK_ALWAYS);
52*82e35083SBryan O'Donoghue }
53