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 Grafint 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 Grafint 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