/* SPDX-License-Identifier: GPL-2.0 */ /* * (C) Copyright 2015 Google, Inc */ #ifndef _ASM_ARCH_CLOCK_H #define _ASM_ARCH_CLOCK_H /* define pll mode */ #define RKCLK_PLL_MODE_SLOW 0 #define RKCLK_PLL_MODE_NORMAL 1 enum { ROCKCHIP_SYSCON_NOC, ROCKCHIP_SYSCON_GRF, ROCKCHIP_SYSCON_SGRF, ROCKCHIP_SYSCON_PMU, ROCKCHIP_SYSCON_PMUGRF, ROCKCHIP_SYSCON_PMUSGRF, ROCKCHIP_SYSCON_CIC, ROCKCHIP_SYSCON_MSCH, }; /* Standard Rockchip clock numbers */ enum rk_clk_id { CLK_OSC, CLK_ARM, CLK_DDR, CLK_CODEC, CLK_GENERAL, CLK_NEW, CLK_COUNT, }; static inline int rk_pll_id(enum rk_clk_id clk_id) { return clk_id - 1; } struct sysreset_reg { unsigned int glb_srst_fst_value; unsigned int glb_srst_snd_value; }; struct softreset_reg { void __iomem *base; unsigned int sf_reset_offset; unsigned int sf_reset_num; }; /** * clk_get_divisor() - Calculate the required clock divisior * * Given an input rate and a required output_rate, calculate the Rockchip * divisor needed to achieve this. * * @input_rate: Input clock rate in Hz * @output_rate: Output clock rate in Hz * @return divisor register value to use */ static inline u32 clk_get_divisor(ulong input_rate, uint output_rate) { uint clk_div; clk_div = input_rate / output_rate; clk_div = (clk_div + 1) & 0xfffe; return clk_div; } /** * rockchip_get_cru() - get a pointer to the clock/reset unit registers * * @return pointer to registers, or -ve error on error */ void *rockchip_get_cru(void); /** * rockchip_get_pmucru() - get a pointer to the clock/reset unit registers * * @return pointer to registers, or -ve error on error */ void *rockchip_get_pmucru(void); struct rk3288_cru; struct rk3288_grf; void rk3288_clk_configure_cpu(struct rk3288_cru *cru, struct rk3288_grf *grf); int rockchip_get_clk(struct udevice **devp); /* * rockchip_reset_bind() - Bind soft reset device as child of clock device * * @pdev: clock udevice * @reg_offset: the first offset in cru for softreset registers * @reg_number: the reg numbers of softreset registers * @return 0 success, or error value */ int rockchip_reset_bind(struct udevice *pdev, u32 reg_offset, u32 reg_number); #endif