xref: /rk3399_rockchip-uboot/arch/arm/mach-sunxi/clock.c (revision 48d2fc47c9feac54fdc0e2e0462f13b1a8689ece)
1e6e505b9SAlexander Graf /*
2e6e505b9SAlexander Graf  * (C) Copyright 2007-2012
3e6e505b9SAlexander Graf  * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
4e6e505b9SAlexander Graf  * Tom Cubie <tangliang@allwinnertech.com>
5e6e505b9SAlexander Graf  *
6e6e505b9SAlexander Graf  * (C) Copyright 2013 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
7e6e505b9SAlexander Graf  *
8e6e505b9SAlexander Graf  * SPDX-License-Identifier:	GPL-2.0+
9e6e505b9SAlexander Graf  */
10e6e505b9SAlexander Graf 
11e6e505b9SAlexander Graf #include <common.h>
12e6e505b9SAlexander Graf #include <asm/io.h>
13e6e505b9SAlexander Graf #include <asm/arch/clock.h>
14e6e505b9SAlexander Graf #include <asm/arch/gpio.h>
15e6e505b9SAlexander Graf #include <asm/arch/prcm.h>
16*ea1af9f2SPhilipp Tomsich #include <asm/arch/gtbus.h>
17e6e505b9SAlexander Graf #include <asm/arch/sys_proto.h>
18e6e505b9SAlexander Graf 
clock_init_sec(void)19e6e505b9SAlexander Graf __weak void clock_init_sec(void)
20e6e505b9SAlexander Graf {
21e6e505b9SAlexander Graf }
22e6e505b9SAlexander Graf 
gtbus_init(void)23*ea1af9f2SPhilipp Tomsich __weak void gtbus_init(void)
24*ea1af9f2SPhilipp Tomsich {
25*ea1af9f2SPhilipp Tomsich }
26*ea1af9f2SPhilipp Tomsich 
clock_init(void)27e6e505b9SAlexander Graf int clock_init(void)
28e6e505b9SAlexander Graf {
29e6e505b9SAlexander Graf #ifdef CONFIG_SPL_BUILD
30e6e505b9SAlexander Graf 	clock_init_safe();
31*ea1af9f2SPhilipp Tomsich 	gtbus_init();
32e6e505b9SAlexander Graf #endif
33e6e505b9SAlexander Graf 	clock_init_uart();
34e6e505b9SAlexander Graf 	clock_init_sec();
35e6e505b9SAlexander Graf 
36e6e505b9SAlexander Graf 	return 0;
37e6e505b9SAlexander Graf }
38e6e505b9SAlexander Graf 
39e6e505b9SAlexander Graf /* These functions are shared between various SoCs so put them here. */
40e6e505b9SAlexander Graf #if defined CONFIG_SUNXI_GEN_SUN6I && !defined CONFIG_MACH_SUN9I
clock_twi_onoff(int port,int state)41e6e505b9SAlexander Graf int clock_twi_onoff(int port, int state)
42e6e505b9SAlexander Graf {
43e6e505b9SAlexander Graf 	struct sunxi_ccm_reg *const ccm =
44e6e505b9SAlexander Graf 		(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
45e6e505b9SAlexander Graf 
46e6e505b9SAlexander Graf 	if (port == 5) {
47e6e505b9SAlexander Graf 		if (state)
48e6e505b9SAlexander Graf 			prcm_apb0_enable(
49e6e505b9SAlexander Graf 				PRCM_APB0_GATE_PIO | PRCM_APB0_GATE_I2C);
50e6e505b9SAlexander Graf 		else
51e6e505b9SAlexander Graf 			prcm_apb0_disable(
52e6e505b9SAlexander Graf 				PRCM_APB0_GATE_PIO | PRCM_APB0_GATE_I2C);
53e6e505b9SAlexander Graf 		return 0;
54e6e505b9SAlexander Graf 	}
55e6e505b9SAlexander Graf 
56e6e505b9SAlexander Graf 	/* set the apb clock gate and reset for twi */
57e6e505b9SAlexander Graf 	if (state) {
58e6e505b9SAlexander Graf 		setbits_le32(&ccm->apb2_gate,
59e6e505b9SAlexander Graf 			     CLK_GATE_OPEN << (APB2_GATE_TWI_SHIFT + port));
60e6e505b9SAlexander Graf 		setbits_le32(&ccm->apb2_reset_cfg,
61e6e505b9SAlexander Graf 			     1 << (APB2_RESET_TWI_SHIFT + port));
62e6e505b9SAlexander Graf 	} else {
63e6e505b9SAlexander Graf 		clrbits_le32(&ccm->apb2_reset_cfg,
64e6e505b9SAlexander Graf 			     1 << (APB2_RESET_TWI_SHIFT + port));
65e6e505b9SAlexander Graf 		clrbits_le32(&ccm->apb2_gate,
66e6e505b9SAlexander Graf 			     CLK_GATE_OPEN << (APB2_GATE_TWI_SHIFT + port));
67e6e505b9SAlexander Graf 	}
68e6e505b9SAlexander Graf 
69e6e505b9SAlexander Graf 	return 0;
70e6e505b9SAlexander Graf }
71e6e505b9SAlexander Graf #endif
72