xref: /rk3399_ARM-atf/plat/imx/common/imx_clock.c (revision dcd54e9b4cbe0e771e63f0e53f2d3a59198b48d3)
182e35083SBryan O'Donoghue /*
282e35083SBryan O'Donoghue  * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
382e35083SBryan O'Donoghue  *
482e35083SBryan O'Donoghue  * SPDX-License-Identifier: BSD-3-Clause
582e35083SBryan O'Donoghue  */
682e35083SBryan O'Donoghue #include <arch.h>
782e35083SBryan O'Donoghue #include <mmio.h>
882e35083SBryan O'Donoghue #include <stdint.h>
982e35083SBryan O'Donoghue #include <stdbool.h>
1082e35083SBryan O'Donoghue #include <imx_regs.h>
1182e35083SBryan O'Donoghue #include <imx_clock.h>
1282e35083SBryan O'Donoghue 
1382e35083SBryan O'Donoghue void imx_clock_target_set(unsigned int id, uint32_t val)
1482e35083SBryan O'Donoghue {
1582e35083SBryan O'Donoghue 	struct ccm *ccm = ((struct ccm *)CCM_BASE);
1682e35083SBryan O'Donoghue 	uintptr_t addr;
1782e35083SBryan O'Donoghue 
1882e35083SBryan O'Donoghue 	if (id > CCM_ROOT_CTRL_NUM)
1982e35083SBryan O'Donoghue 		return;
2082e35083SBryan O'Donoghue 
2182e35083SBryan O'Donoghue 	addr = (uintptr_t)&ccm->ccm_root_ctrl[id].ccm_target_root;
2282e35083SBryan O'Donoghue 	mmio_write_32(addr, val);
2382e35083SBryan O'Donoghue }
2482e35083SBryan O'Donoghue 
2582e35083SBryan O'Donoghue void imx_clock_target_clr(unsigned int id, uint32_t val)
2682e35083SBryan O'Donoghue {
2782e35083SBryan O'Donoghue 	struct ccm *ccm = ((struct ccm *)CCM_BASE);
2882e35083SBryan O'Donoghue 	uintptr_t addr;
2982e35083SBryan O'Donoghue 
3082e35083SBryan O'Donoghue 	if (id > CCM_ROOT_CTRL_NUM)
3182e35083SBryan O'Donoghue 		return;
3282e35083SBryan O'Donoghue 
3382e35083SBryan O'Donoghue 	addr = (uintptr_t)&ccm->ccm_root_ctrl[id].ccm_target_root_clr;
3482e35083SBryan O'Donoghue 	mmio_write_32(addr, val);
3582e35083SBryan O'Donoghue }
3682e35083SBryan O'Donoghue 
3782e35083SBryan O'Donoghue void imx_clock_gate_enable(unsigned int id, bool enable)
3882e35083SBryan O'Donoghue {
3982e35083SBryan O'Donoghue 	struct ccm *ccm = ((struct ccm *)CCM_BASE);
4082e35083SBryan O'Donoghue 	uintptr_t addr;
4182e35083SBryan O'Donoghue 
4282e35083SBryan O'Donoghue 	if (id > CCM_CLK_GATE_CTRL_NUM)
4382e35083SBryan O'Donoghue 		return;
4482e35083SBryan O'Donoghue 
4582e35083SBryan O'Donoghue 	/* TODO: add support for more than DOMAIN0 clocks */
4682e35083SBryan O'Donoghue 	if (enable)
4782e35083SBryan O'Donoghue 		addr = (uintptr_t)&ccm->ccm_clk_gate_ctrl[id].ccm_ccgr_set;
4882e35083SBryan O'Donoghue 	else
4982e35083SBryan O'Donoghue 		addr = (uintptr_t)&ccm->ccm_clk_gate_ctrl[id].ccm_ccgr_clr;
5082e35083SBryan O'Donoghue 
5182e35083SBryan O'Donoghue 	mmio_write_32(addr, CCM_CCGR_SETTING0_DOM_CLK_ALWAYS);
5282e35083SBryan O'Donoghue }
53*dcd54e9bSBryan O'Donoghue 
54*dcd54e9bSBryan O'Donoghue void imx_clock_enable_uart(unsigned int uart_id, uint32_t uart_clk_en_bits)
55*dcd54e9bSBryan O'Donoghue {
56*dcd54e9bSBryan O'Donoghue 	unsigned int ccm_trgt_id = CCM_TRT_ID_UART1_CLK_ROOT + uart_id;
57*dcd54e9bSBryan O'Donoghue 	unsigned int ccm_ccgr_id = CCM_CCGR_ID_UART1 + uart_id;
58*dcd54e9bSBryan O'Donoghue 
59*dcd54e9bSBryan O'Donoghue 	/* Check for error */
60*dcd54e9bSBryan O'Donoghue 	if (uart_id > MXC_MAX_UART_NUM)
61*dcd54e9bSBryan O'Donoghue 		return;
62*dcd54e9bSBryan O'Donoghue 
63*dcd54e9bSBryan O'Donoghue 	/* Set target register values */
64*dcd54e9bSBryan O'Donoghue 	imx_clock_target_set(ccm_trgt_id, uart_clk_en_bits);
65*dcd54e9bSBryan O'Donoghue 
66*dcd54e9bSBryan O'Donoghue 	/* Enable the clock gate */
67*dcd54e9bSBryan O'Donoghue 	imx_clock_gate_enable(ccm_ccgr_id, true);
68*dcd54e9bSBryan O'Donoghue }
69*dcd54e9bSBryan O'Donoghue 
70*dcd54e9bSBryan O'Donoghue void imx_clock_disable_uart(unsigned int uart_id)
71*dcd54e9bSBryan O'Donoghue {
72*dcd54e9bSBryan O'Donoghue 	unsigned int ccm_trgt_id = CCM_TRT_ID_UART1_CLK_ROOT + uart_id;
73*dcd54e9bSBryan O'Donoghue 	unsigned int ccm_ccgr_id = CCM_CCGR_ID_UART1 + uart_id;
74*dcd54e9bSBryan O'Donoghue 
75*dcd54e9bSBryan O'Donoghue 	/* Check for error */
76*dcd54e9bSBryan O'Donoghue 	if (uart_id > MXC_MAX_UART_NUM)
77*dcd54e9bSBryan O'Donoghue 		return;
78*dcd54e9bSBryan O'Donoghue 
79*dcd54e9bSBryan O'Donoghue 	/* Disable the clock gate */
80*dcd54e9bSBryan O'Donoghue 	imx_clock_gate_enable(ccm_ccgr_id, false);
81*dcd54e9bSBryan O'Donoghue 
82*dcd54e9bSBryan O'Donoghue 	/* Clear the target */
83*dcd54e9bSBryan O'Donoghue 	imx_clock_target_clr(ccm_trgt_id, 0xFFFFFFFF);
84*dcd54e9bSBryan O'Donoghue }
85