xref: /openbmc/linux/drivers/clk/spear/clk.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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