318 lines
7.0 KiB
C
318 lines
7.0 KiB
C
|
/*
|
||
|
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* ZynqMP system level PM-API functions for clock control.
|
||
|
*/
|
||
|
|
||
|
#ifndef PM_API_CLOCK_H
|
||
|
#define PM_API_CLOCK_H
|
||
|
|
||
|
#include <lib/utils_def.h>
|
||
|
|
||
|
#include "pm_common.h"
|
||
|
|
||
|
#define CLK_NAME_LEN U(15)
|
||
|
#define MAX_PARENTS U(100)
|
||
|
#define CLK_NA_PARENT -1
|
||
|
#define CLK_DUMMY_PARENT -2
|
||
|
|
||
|
/* Flags for parent id */
|
||
|
#define PARENT_CLK_SELF U(0)
|
||
|
#define PARENT_CLK_NODE1 U(1)
|
||
|
#define PARENT_CLK_NODE2 U(2)
|
||
|
#define PARENT_CLK_NODE3 U(3)
|
||
|
#define PARENT_CLK_NODE4 U(4)
|
||
|
#define PARENT_CLK_EXTERNAL U(5)
|
||
|
#define PARENT_CLK_MIO0_MIO77 U(6)
|
||
|
|
||
|
#define CLK_SET_RATE_GATE BIT(0) /* must be gated across rate change */
|
||
|
#define CLK_SET_PARENT_GATE BIT(1) /* must be gated across re-parent */
|
||
|
#define CLK_SET_RATE_PARENT BIT(2) /* propagate rate change up one level */
|
||
|
#define CLK_IGNORE_UNUSED BIT(3) /* do not gate even if unused */
|
||
|
/* unused */
|
||
|
#define CLK_IS_BASIC BIT(5) /* Basic clk, can't do a to_clk_foo() */
|
||
|
#define CLK_GET_RATE_NOCACHE BIT(6) /* do not use the cached clk rate */
|
||
|
#define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */
|
||
|
#define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */
|
||
|
#define CLK_RECALC_NEW_RATES BIT(9) /* recalc rates after notifications */
|
||
|
#define CLK_SET_RATE_UNGATE BIT(10) /* clock needs to run to set rate */
|
||
|
#define CLK_IS_CRITICAL BIT(11) /* do not gate, ever */
|
||
|
/* parents need enable during gate/ungate, set rate and re-parent */
|
||
|
#define CLK_OPS_PARENT_ENABLE BIT(12)
|
||
|
#define CLK_FRAC BIT(13)
|
||
|
|
||
|
#define CLK_DIVIDER_ONE_BASED BIT(0)
|
||
|
#define CLK_DIVIDER_POWER_OF_TWO BIT(1)
|
||
|
#define CLK_DIVIDER_ALLOW_ZERO BIT(2)
|
||
|
#define CLK_DIVIDER_HIWORD_MASK BIT(3)
|
||
|
#define CLK_DIVIDER_ROUND_CLOSEST BIT(4)
|
||
|
#define CLK_DIVIDER_READ_ONLY BIT(5)
|
||
|
#define CLK_DIVIDER_MAX_AT_ZERO BIT(6)
|
||
|
|
||
|
#define END_OF_CLK "END_OF_CLK"
|
||
|
|
||
|
//CLock Ids
|
||
|
enum clock_id {
|
||
|
CLK_IOPLL,
|
||
|
CLK_RPLL,
|
||
|
CLK_APLL,
|
||
|
CLK_DPLL,
|
||
|
CLK_VPLL,
|
||
|
CLK_IOPLL_TO_FPD,
|
||
|
CLK_RPLL_TO_FPD,
|
||
|
CLK_APLL_TO_LPD,
|
||
|
CLK_DPLL_TO_LPD,
|
||
|
CLK_VPLL_TO_LPD,
|
||
|
CLK_ACPU,
|
||
|
CLK_ACPU_HALF,
|
||
|
CLK_DBG_FPD,
|
||
|
CLK_DBG_LPD,
|
||
|
CLK_DBG_TRACE,
|
||
|
CLK_DBG_TSTMP,
|
||
|
CLK_DP_VIDEO_REF,
|
||
|
CLK_DP_AUDIO_REF,
|
||
|
CLK_DP_STC_REF,
|
||
|
CLK_GDMA_REF,
|
||
|
CLK_DPDMA_REF,
|
||
|
CLK_DDR_REF,
|
||
|
CLK_SATA_REF,
|
||
|
CLK_PCIE_REF,
|
||
|
CLK_GPU_REF,
|
||
|
CLK_GPU_PP0_REF,
|
||
|
CLK_GPU_PP1_REF,
|
||
|
CLK_TOPSW_MAIN,
|
||
|
CLK_TOPSW_LSBUS,
|
||
|
CLK_GTGREF0_REF,
|
||
|
CLK_LPD_SWITCH,
|
||
|
CLK_LPD_LSBUS,
|
||
|
CLK_USB0_BUS_REF,
|
||
|
CLK_USB1_BUS_REF,
|
||
|
CLK_USB3_DUAL_REF,
|
||
|
CLK_USB0,
|
||
|
CLK_USB1,
|
||
|
CLK_CPU_R5,
|
||
|
CLK_CPU_R5_CORE,
|
||
|
CLK_CSU_SPB,
|
||
|
CLK_CSU_PLL,
|
||
|
CLK_PCAP,
|
||
|
CLK_IOU_SWITCH,
|
||
|
CLK_GEM_TSU_REF,
|
||
|
CLK_GEM_TSU,
|
||
|
CLK_GEM0_REF,
|
||
|
CLK_GEM1_REF,
|
||
|
CLK_GEM2_REF,
|
||
|
CLK_GEM3_REF,
|
||
|
CLK_GEM0_TX,
|
||
|
CLK_GEM1_TX,
|
||
|
CLK_GEM2_TX,
|
||
|
CLK_GEM3_TX,
|
||
|
CLK_QSPI_REF,
|
||
|
CLK_SDIO0_REF,
|
||
|
CLK_SDIO1_REF,
|
||
|
CLK_UART0_REF,
|
||
|
CLK_UART1_REF,
|
||
|
CLK_SPI0_REF,
|
||
|
CLK_SPI1_REF,
|
||
|
CLK_NAND_REF,
|
||
|
CLK_I2C0_REF,
|
||
|
CLK_I2C1_REF,
|
||
|
CLK_CAN0_REF,
|
||
|
CLK_CAN1_REF,
|
||
|
CLK_CAN0,
|
||
|
CLK_CAN1,
|
||
|
CLK_DLL_REF,
|
||
|
CLK_ADMA_REF,
|
||
|
CLK_TIMESTAMP_REF,
|
||
|
CLK_AMS_REF,
|
||
|
CLK_PL0_REF,
|
||
|
CLK_PL1_REF,
|
||
|
CLK_PL2_REF,
|
||
|
CLK_PL3_REF,
|
||
|
CLK_WDT,
|
||
|
CLK_IOPLL_INT,
|
||
|
CLK_IOPLL_PRE_SRC,
|
||
|
CLK_IOPLL_HALF,
|
||
|
CLK_IOPLL_INT_MUX,
|
||
|
CLK_IOPLL_POST_SRC,
|
||
|
CLK_RPLL_INT,
|
||
|
CLK_RPLL_PRE_SRC,
|
||
|
CLK_RPLL_HALF,
|
||
|
CLK_RPLL_INT_MUX,
|
||
|
CLK_RPLL_POST_SRC,
|
||
|
CLK_APLL_INT,
|
||
|
CLK_APLL_PRE_SRC,
|
||
|
CLK_APLL_HALF,
|
||
|
CLK_APLL_INT_MUX,
|
||
|
CLK_APLL_POST_SRC,
|
||
|
CLK_DPLL_INT,
|
||
|
CLK_DPLL_PRE_SRC,
|
||
|
CLK_DPLL_HALF,
|
||
|
CLK_DPLL_INT_MUX,
|
||
|
CLK_DPLL_POST_SRC,
|
||
|
CLK_VPLL_INT,
|
||
|
CLK_VPLL_PRE_SRC,
|
||
|
CLK_VPLL_HALF,
|
||
|
CLK_VPLL_INT_MUX,
|
||
|
CLK_VPLL_POST_SRC,
|
||
|
CLK_CAN0_MIO,
|
||
|
CLK_CAN1_MIO,
|
||
|
CLK_ACPU_FULL,
|
||
|
END_OF_OUTPUT_CLKS,
|
||
|
};
|
||
|
|
||
|
#define CLK_MAX_OUTPUT_CLK (unsigned int)(END_OF_OUTPUT_CLKS)
|
||
|
|
||
|
//External clock ids
|
||
|
enum {
|
||
|
EXT_CLK_PSS_REF = END_OF_OUTPUT_CLKS,
|
||
|
EXT_CLK_VIDEO,
|
||
|
EXT_CLK_PSS_ALT_REF,
|
||
|
EXT_CLK_AUX_REF,
|
||
|
EXT_CLK_GT_CRX_REF,
|
||
|
EXT_CLK_SWDT0,
|
||
|
EXT_CLK_SWDT1,
|
||
|
EXT_CLK_GEM0_EMIO,
|
||
|
EXT_CLK_GEM1_EMIO,
|
||
|
EXT_CLK_GEM2_EMIO,
|
||
|
EXT_CLK_GEM3_EMIO,
|
||
|
EXT_CLK_MIO50_OR_MIO51,
|
||
|
EXT_CLK_MIO0,
|
||
|
EXT_CLK_MIO1,
|
||
|
EXT_CLK_MIO2,
|
||
|
EXT_CLK_MIO3,
|
||
|
EXT_CLK_MIO4,
|
||
|
EXT_CLK_MIO5,
|
||
|
EXT_CLK_MIO6,
|
||
|
EXT_CLK_MIO7,
|
||
|
EXT_CLK_MIO8,
|
||
|
EXT_CLK_MIO9,
|
||
|
EXT_CLK_MIO10,
|
||
|
EXT_CLK_MIO11,
|
||
|
EXT_CLK_MIO12,
|
||
|
EXT_CLK_MIO13,
|
||
|
EXT_CLK_MIO14,
|
||
|
EXT_CLK_MIO15,
|
||
|
EXT_CLK_MIO16,
|
||
|
EXT_CLK_MIO17,
|
||
|
EXT_CLK_MIO18,
|
||
|
EXT_CLK_MIO19,
|
||
|
EXT_CLK_MIO20,
|
||
|
EXT_CLK_MIO21,
|
||
|
EXT_CLK_MIO22,
|
||
|
EXT_CLK_MIO23,
|
||
|
EXT_CLK_MIO24,
|
||
|
EXT_CLK_MIO25,
|
||
|
EXT_CLK_MIO26,
|
||
|
EXT_CLK_MIO27,
|
||
|
EXT_CLK_MIO28,
|
||
|
EXT_CLK_MIO29,
|
||
|
EXT_CLK_MIO30,
|
||
|
EXT_CLK_MIO31,
|
||
|
EXT_CLK_MIO32,
|
||
|
EXT_CLK_MIO33,
|
||
|
EXT_CLK_MIO34,
|
||
|
EXT_CLK_MIO35,
|
||
|
EXT_CLK_MIO36,
|
||
|
EXT_CLK_MIO37,
|
||
|
EXT_CLK_MIO38,
|
||
|
EXT_CLK_MIO39,
|
||
|
EXT_CLK_MIO40,
|
||
|
EXT_CLK_MIO41,
|
||
|
EXT_CLK_MIO42,
|
||
|
EXT_CLK_MIO43,
|
||
|
EXT_CLK_MIO44,
|
||
|
EXT_CLK_MIO45,
|
||
|
EXT_CLK_MIO46,
|
||
|
EXT_CLK_MIO47,
|
||
|
EXT_CLK_MIO48,
|
||
|
EXT_CLK_MIO49,
|
||
|
EXT_CLK_MIO50,
|
||
|
EXT_CLK_MIO51,
|
||
|
EXT_CLK_MIO52,
|
||
|
EXT_CLK_MIO53,
|
||
|
EXT_CLK_MIO54,
|
||
|
EXT_CLK_MIO55,
|
||
|
EXT_CLK_MIO56,
|
||
|
EXT_CLK_MIO57,
|
||
|
EXT_CLK_MIO58,
|
||
|
EXT_CLK_MIO59,
|
||
|
EXT_CLK_MIO60,
|
||
|
EXT_CLK_MIO61,
|
||
|
EXT_CLK_MIO62,
|
||
|
EXT_CLK_MIO63,
|
||
|
EXT_CLK_MIO64,
|
||
|
EXT_CLK_MIO65,
|
||
|
EXT_CLK_MIO66,
|
||
|
EXT_CLK_MIO67,
|
||
|
EXT_CLK_MIO68,
|
||
|
EXT_CLK_MIO69,
|
||
|
EXT_CLK_MIO70,
|
||
|
EXT_CLK_MIO71,
|
||
|
EXT_CLK_MIO72,
|
||
|
EXT_CLK_MIO73,
|
||
|
EXT_CLK_MIO74,
|
||
|
EXT_CLK_MIO75,
|
||
|
EXT_CLK_MIO76,
|
||
|
EXT_CLK_MIO77,
|
||
|
END_OF_CLKS,
|
||
|
};
|
||
|
|
||
|
#define CLK_MAX (unsigned int)(END_OF_CLKS)
|
||
|
|
||
|
//CLock types
|
||
|
#define CLK_TYPE_OUTPUT 0U
|
||
|
#define CLK_TYPE_EXTERNAL 1U
|
||
|
|
||
|
//Topology types
|
||
|
#define TYPE_INVALID 0U
|
||
|
#define TYPE_MUX 1U
|
||
|
#define TYPE_PLL 2U
|
||
|
#define TYPE_FIXEDFACTOR 3U
|
||
|
#define TYPE_DIV1 4U
|
||
|
#define TYPE_DIV2 5U
|
||
|
#define TYPE_GATE 6U
|
||
|
|
||
|
struct pm_pll;
|
||
|
struct pm_pll *pm_clock_get_pll(enum clock_id clock_id);
|
||
|
struct pm_pll *pm_clock_get_pll_by_related_clk(enum clock_id clock_id);
|
||
|
uint8_t pm_clock_has_div(unsigned int clock_id, enum pm_clock_div_id div_id);
|
||
|
|
||
|
enum pm_ret_status pm_api_clock_get_name(unsigned int clock_id, char *name);
|
||
|
enum pm_ret_status pm_api_clock_get_num_clocks(unsigned int *nclocks);
|
||
|
enum pm_ret_status pm_api_clock_get_topology(unsigned int clock_id,
|
||
|
unsigned int index,
|
||
|
uint32_t *topology);
|
||
|
enum pm_ret_status pm_api_clock_get_fixedfactor_params(unsigned int clock_id,
|
||
|
uint32_t *mul,
|
||
|
uint32_t *div);
|
||
|
enum pm_ret_status pm_api_clock_get_parents(unsigned int clock_id,
|
||
|
unsigned int index,
|
||
|
uint32_t *parents);
|
||
|
enum pm_ret_status pm_api_clock_get_attributes(unsigned int clock_id,
|
||
|
uint32_t *attr);
|
||
|
|
||
|
enum pm_ret_status pm_clock_get_pll_node_id(enum clock_id clock_id,
|
||
|
enum pm_node_id *node_id);
|
||
|
enum pm_ret_status pm_clock_id_is_valid(unsigned int clock_id);
|
||
|
|
||
|
enum pm_ret_status pm_clock_pll_enable(struct pm_pll *pll);
|
||
|
enum pm_ret_status pm_clock_pll_disable(struct pm_pll *pll);
|
||
|
enum pm_ret_status pm_clock_pll_get_state(struct pm_pll *pll,
|
||
|
unsigned int *state);
|
||
|
enum pm_ret_status pm_clock_pll_set_parent(struct pm_pll *pll,
|
||
|
enum clock_id clock_id,
|
||
|
unsigned int parent_index);
|
||
|
enum pm_ret_status pm_clock_pll_get_parent(struct pm_pll *pll,
|
||
|
enum clock_id clock_id,
|
||
|
unsigned int *parent_index);
|
||
|
enum pm_ret_status pm_clock_set_pll_mode(enum clock_id clock_id,
|
||
|
unsigned int mode);
|
||
|
enum pm_ret_status pm_clock_get_pll_mode(enum clock_id clock_id,
|
||
|
unsigned int *mode);
|
||
|
|
||
|
#endif /* PM_API_CLOCK_H */
|