1*3bb16560SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 255b8fd4fSViresh Kumar /* 355b8fd4fSViresh Kumar * Clock framework definitions for SPEAr platform 455b8fd4fSViresh Kumar * 555b8fd4fSViresh Kumar * Copyright (C) 2012 ST Microelectronics 6da89947bSViresh Kumar * Viresh Kumar <vireshk@kernel.org> 755b8fd4fSViresh Kumar */ 855b8fd4fSViresh Kumar 955b8fd4fSViresh Kumar #ifndef __SPEAR_CLK_H 1055b8fd4fSViresh Kumar #define __SPEAR_CLK_H 1155b8fd4fSViresh Kumar 1255b8fd4fSViresh Kumar #include <linux/clk-provider.h> 1355b8fd4fSViresh Kumar #include <linux/spinlock_types.h> 1455b8fd4fSViresh Kumar #include <linux/types.h> 1555b8fd4fSViresh Kumar 165335a639SViresh Kumar /* Auxiliary Synth clk */ 175335a639SViresh Kumar /* Default masks */ 185335a639SViresh Kumar #define AUX_EQ_SEL_SHIFT 30 195335a639SViresh Kumar #define AUX_EQ_SEL_MASK 1 205335a639SViresh Kumar #define AUX_EQ1_SEL 0 215335a639SViresh Kumar #define AUX_EQ2_SEL 1 225335a639SViresh Kumar #define AUX_XSCALE_SHIFT 16 235335a639SViresh Kumar #define AUX_XSCALE_MASK 0xFFF 245335a639SViresh Kumar #define AUX_YSCALE_SHIFT 0 255335a639SViresh Kumar #define AUX_YSCALE_MASK 0xFFF 265335a639SViresh Kumar #define AUX_SYNT_ENB 31 275335a639SViresh Kumar 285335a639SViresh Kumar struct aux_clk_masks { 295335a639SViresh Kumar u32 eq_sel_mask; 305335a639SViresh Kumar u32 eq_sel_shift; 315335a639SViresh Kumar u32 eq1_mask; 325335a639SViresh Kumar u32 eq2_mask; 335335a639SViresh Kumar u32 xscale_sel_mask; 345335a639SViresh Kumar u32 xscale_sel_shift; 355335a639SViresh Kumar u32 yscale_sel_mask; 365335a639SViresh Kumar u32 yscale_sel_shift; 375335a639SViresh Kumar u32 enable_bit; 385335a639SViresh Kumar }; 395335a639SViresh Kumar 405335a639SViresh Kumar struct aux_rate_tbl { 415335a639SViresh Kumar u16 xscale; 425335a639SViresh Kumar u16 yscale; 435335a639SViresh Kumar u8 eq; 445335a639SViresh Kumar }; 455335a639SViresh Kumar 465335a639SViresh Kumar struct clk_aux { 475335a639SViresh Kumar struct clk_hw hw; 485335a639SViresh Kumar void __iomem *reg; 4971bf5ab8SBhumika Goyal const struct aux_clk_masks *masks; 505335a639SViresh Kumar struct aux_rate_tbl *rtbl; 515335a639SViresh Kumar u8 rtbl_cnt; 525335a639SViresh Kumar spinlock_t *lock; 535335a639SViresh Kumar }; 545335a639SViresh Kumar 55270b9f42SViresh Kumar /* Fractional Synth clk */ 56270b9f42SViresh Kumar struct frac_rate_tbl { 57270b9f42SViresh Kumar u32 div; 58270b9f42SViresh Kumar }; 59270b9f42SViresh Kumar 60270b9f42SViresh Kumar struct clk_frac { 61270b9f42SViresh Kumar struct clk_hw hw; 62270b9f42SViresh Kumar void __iomem *reg; 63270b9f42SViresh Kumar struct frac_rate_tbl *rtbl; 64270b9f42SViresh Kumar u8 rtbl_cnt; 65270b9f42SViresh Kumar spinlock_t *lock; 66270b9f42SViresh Kumar }; 67270b9f42SViresh Kumar 68a45896bdSViresh Kumar /* GPT clk */ 69a45896bdSViresh Kumar struct gpt_rate_tbl { 70a45896bdSViresh Kumar u16 mscale; 71a45896bdSViresh Kumar u16 nscale; 72a45896bdSViresh Kumar }; 73a45896bdSViresh Kumar 74a45896bdSViresh Kumar struct clk_gpt { 75a45896bdSViresh Kumar struct clk_hw hw; 76a45896bdSViresh Kumar void __iomem *reg; 77a45896bdSViresh Kumar struct gpt_rate_tbl *rtbl; 78a45896bdSViresh Kumar u8 rtbl_cnt; 79a45896bdSViresh Kumar spinlock_t *lock; 80a45896bdSViresh Kumar }; 81a45896bdSViresh Kumar 8255b8fd4fSViresh Kumar /* VCO-PLL clk */ 8355b8fd4fSViresh Kumar struct pll_rate_tbl { 8455b8fd4fSViresh Kumar u8 mode; 8555b8fd4fSViresh Kumar u16 m; 8655b8fd4fSViresh Kumar u8 n; 8755b8fd4fSViresh Kumar u8 p; 8855b8fd4fSViresh Kumar }; 8955b8fd4fSViresh Kumar 9055b8fd4fSViresh Kumar struct clk_vco { 9155b8fd4fSViresh Kumar struct clk_hw hw; 9255b8fd4fSViresh Kumar void __iomem *mode_reg; 9355b8fd4fSViresh Kumar void __iomem *cfg_reg; 9455b8fd4fSViresh Kumar struct pll_rate_tbl *rtbl; 9555b8fd4fSViresh Kumar u8 rtbl_cnt; 9655b8fd4fSViresh Kumar spinlock_t *lock; 9755b8fd4fSViresh Kumar }; 9855b8fd4fSViresh Kumar 9955b8fd4fSViresh Kumar struct clk_pll { 10055b8fd4fSViresh Kumar struct clk_hw hw; 10155b8fd4fSViresh Kumar struct clk_vco *vco; 10255b8fd4fSViresh Kumar const char *parent[1]; 10355b8fd4fSViresh Kumar spinlock_t *lock; 10455b8fd4fSViresh Kumar }; 10555b8fd4fSViresh Kumar 10655b8fd4fSViresh Kumar typedef unsigned long (*clk_calc_rate)(struct clk_hw *hw, unsigned long prate, 10755b8fd4fSViresh Kumar int index); 10855b8fd4fSViresh Kumar 10955b8fd4fSViresh Kumar /* clk register routines */ 1105335a639SViresh Kumar struct clk *clk_register_aux(const char *aux_name, const char *gate_name, 1115335a639SViresh Kumar const char *parent_name, unsigned long flags, void __iomem *reg, 11271bf5ab8SBhumika Goyal const struct aux_clk_masks *masks, struct aux_rate_tbl *rtbl, 1135335a639SViresh Kumar u8 rtbl_cnt, spinlock_t *lock, struct clk **gate_clk); 114270b9f42SViresh Kumar struct clk *clk_register_frac(const char *name, const char *parent_name, 115270b9f42SViresh Kumar unsigned long flags, void __iomem *reg, 116270b9f42SViresh Kumar struct frac_rate_tbl *rtbl, u8 rtbl_cnt, spinlock_t *lock); 117a45896bdSViresh Kumar struct clk *clk_register_gpt(const char *name, const char *parent_name, unsigned 118a45896bdSViresh Kumar long flags, void __iomem *reg, struct gpt_rate_tbl *rtbl, u8 119a45896bdSViresh Kumar rtbl_cnt, spinlock_t *lock); 12055b8fd4fSViresh Kumar struct clk *clk_register_vco_pll(const char *vco_name, const char *pll_name, 12155b8fd4fSViresh Kumar const char *vco_gate_name, const char *parent_name, 12255b8fd4fSViresh Kumar unsigned long flags, void __iomem *mode_reg, void __iomem 12355b8fd4fSViresh Kumar *cfg_reg, struct pll_rate_tbl *rtbl, u8 rtbl_cnt, 12455b8fd4fSViresh Kumar spinlock_t *lock, struct clk **pll_clk, 12555b8fd4fSViresh Kumar struct clk **vco_gate_clk); 12655b8fd4fSViresh Kumar 12755b8fd4fSViresh Kumar long clk_round_rate_index(struct clk_hw *hw, unsigned long drate, 12855b8fd4fSViresh Kumar unsigned long parent_rate, clk_calc_rate calc_rate, u8 rtbl_cnt, 12955b8fd4fSViresh Kumar int *index); 13055b8fd4fSViresh Kumar 13155b8fd4fSViresh Kumar #endif /* __SPEAR_CLK_H */ 132