162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Clock framework definitions for SPEAr platform 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2012 ST Microelectronics 662306a36Sopenharmony_ci * Viresh Kumar <vireshk@kernel.org> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __SPEAR_CLK_H 1062306a36Sopenharmony_ci#define __SPEAR_CLK_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/clk-provider.h> 1362306a36Sopenharmony_ci#include <linux/spinlock_types.h> 1462306a36Sopenharmony_ci#include <linux/types.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Auxiliary Synth clk */ 1762306a36Sopenharmony_ci/* Default masks */ 1862306a36Sopenharmony_ci#define AUX_EQ_SEL_SHIFT 30 1962306a36Sopenharmony_ci#define AUX_EQ_SEL_MASK 1 2062306a36Sopenharmony_ci#define AUX_EQ1_SEL 0 2162306a36Sopenharmony_ci#define AUX_EQ2_SEL 1 2262306a36Sopenharmony_ci#define AUX_XSCALE_SHIFT 16 2362306a36Sopenharmony_ci#define AUX_XSCALE_MASK 0xFFF 2462306a36Sopenharmony_ci#define AUX_YSCALE_SHIFT 0 2562306a36Sopenharmony_ci#define AUX_YSCALE_MASK 0xFFF 2662306a36Sopenharmony_ci#define AUX_SYNT_ENB 31 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct aux_clk_masks { 2962306a36Sopenharmony_ci u32 eq_sel_mask; 3062306a36Sopenharmony_ci u32 eq_sel_shift; 3162306a36Sopenharmony_ci u32 eq1_mask; 3262306a36Sopenharmony_ci u32 eq2_mask; 3362306a36Sopenharmony_ci u32 xscale_sel_mask; 3462306a36Sopenharmony_ci u32 xscale_sel_shift; 3562306a36Sopenharmony_ci u32 yscale_sel_mask; 3662306a36Sopenharmony_ci u32 yscale_sel_shift; 3762306a36Sopenharmony_ci u32 enable_bit; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct aux_rate_tbl { 4162306a36Sopenharmony_ci u16 xscale; 4262306a36Sopenharmony_ci u16 yscale; 4362306a36Sopenharmony_ci u8 eq; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct clk_aux { 4762306a36Sopenharmony_ci struct clk_hw hw; 4862306a36Sopenharmony_ci void __iomem *reg; 4962306a36Sopenharmony_ci const struct aux_clk_masks *masks; 5062306a36Sopenharmony_ci struct aux_rate_tbl *rtbl; 5162306a36Sopenharmony_ci u8 rtbl_cnt; 5262306a36Sopenharmony_ci spinlock_t *lock; 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* Fractional Synth clk */ 5662306a36Sopenharmony_cistruct frac_rate_tbl { 5762306a36Sopenharmony_ci u32 div; 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistruct clk_frac { 6162306a36Sopenharmony_ci struct clk_hw hw; 6262306a36Sopenharmony_ci void __iomem *reg; 6362306a36Sopenharmony_ci struct frac_rate_tbl *rtbl; 6462306a36Sopenharmony_ci u8 rtbl_cnt; 6562306a36Sopenharmony_ci spinlock_t *lock; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* GPT clk */ 6962306a36Sopenharmony_cistruct gpt_rate_tbl { 7062306a36Sopenharmony_ci u16 mscale; 7162306a36Sopenharmony_ci u16 nscale; 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistruct clk_gpt { 7562306a36Sopenharmony_ci struct clk_hw hw; 7662306a36Sopenharmony_ci void __iomem *reg; 7762306a36Sopenharmony_ci struct gpt_rate_tbl *rtbl; 7862306a36Sopenharmony_ci u8 rtbl_cnt; 7962306a36Sopenharmony_ci spinlock_t *lock; 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* VCO-PLL clk */ 8362306a36Sopenharmony_cistruct pll_rate_tbl { 8462306a36Sopenharmony_ci u8 mode; 8562306a36Sopenharmony_ci u16 m; 8662306a36Sopenharmony_ci u8 n; 8762306a36Sopenharmony_ci u8 p; 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct clk_vco { 9162306a36Sopenharmony_ci struct clk_hw hw; 9262306a36Sopenharmony_ci void __iomem *mode_reg; 9362306a36Sopenharmony_ci void __iomem *cfg_reg; 9462306a36Sopenharmony_ci struct pll_rate_tbl *rtbl; 9562306a36Sopenharmony_ci u8 rtbl_cnt; 9662306a36Sopenharmony_ci spinlock_t *lock; 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistruct clk_pll { 10062306a36Sopenharmony_ci struct clk_hw hw; 10162306a36Sopenharmony_ci struct clk_vco *vco; 10262306a36Sopenharmony_ci const char *parent[1]; 10362306a36Sopenharmony_ci spinlock_t *lock; 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_citypedef unsigned long (*clk_calc_rate)(struct clk_hw *hw, unsigned long prate, 10762306a36Sopenharmony_ci int index); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* clk register routines */ 11062306a36Sopenharmony_cistruct clk *clk_register_aux(const char *aux_name, const char *gate_name, 11162306a36Sopenharmony_ci const char *parent_name, unsigned long flags, void __iomem *reg, 11262306a36Sopenharmony_ci const struct aux_clk_masks *masks, struct aux_rate_tbl *rtbl, 11362306a36Sopenharmony_ci u8 rtbl_cnt, spinlock_t *lock, struct clk **gate_clk); 11462306a36Sopenharmony_cistruct clk *clk_register_frac(const char *name, const char *parent_name, 11562306a36Sopenharmony_ci unsigned long flags, void __iomem *reg, 11662306a36Sopenharmony_ci struct frac_rate_tbl *rtbl, u8 rtbl_cnt, spinlock_t *lock); 11762306a36Sopenharmony_cistruct clk *clk_register_gpt(const char *name, const char *parent_name, unsigned 11862306a36Sopenharmony_ci long flags, void __iomem *reg, struct gpt_rate_tbl *rtbl, u8 11962306a36Sopenharmony_ci rtbl_cnt, spinlock_t *lock); 12062306a36Sopenharmony_cistruct clk *clk_register_vco_pll(const char *vco_name, const char *pll_name, 12162306a36Sopenharmony_ci const char *vco_gate_name, const char *parent_name, 12262306a36Sopenharmony_ci unsigned long flags, void __iomem *mode_reg, void __iomem 12362306a36Sopenharmony_ci *cfg_reg, struct pll_rate_tbl *rtbl, u8 rtbl_cnt, 12462306a36Sopenharmony_ci spinlock_t *lock, struct clk **pll_clk, 12562306a36Sopenharmony_ci struct clk **vco_gate_clk); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cilong clk_round_rate_index(struct clk_hw *hw, unsigned long drate, 12862306a36Sopenharmony_ci unsigned long parent_rate, clk_calc_rate calc_rate, u8 rtbl_cnt, 12962306a36Sopenharmony_ci int *index); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#endif /* __SPEAR_CLK_H */ 132