xref: /linux/drivers/clk/aspeed/clk-aspeed.h (revision 13c916af3abf98f4a2a00b9463d2fc00cc6bc00e)
1*03b3faa1SRyan Chen /* SPDX-License-Identifier: GPL-2.0-or-later */
2*03b3faa1SRyan Chen /*
3*03b3faa1SRyan Chen  * Structures used by ASPEED clock drivers
4*03b3faa1SRyan Chen  *
5*03b3faa1SRyan Chen  * Copyright 2019 IBM Corp.
6*03b3faa1SRyan Chen  */
7*03b3faa1SRyan Chen 
8*03b3faa1SRyan Chen #include <linux/clk-provider.h>
9*03b3faa1SRyan Chen #include <linux/kernel.h>
10*03b3faa1SRyan Chen #include <linux/reset-controller.h>
11*03b3faa1SRyan Chen #include <linux/spinlock.h>
12*03b3faa1SRyan Chen 
13*03b3faa1SRyan Chen struct clk_div_table;
14*03b3faa1SRyan Chen struct regmap;
15*03b3faa1SRyan Chen 
16*03b3faa1SRyan Chen /**
17*03b3faa1SRyan Chen  * struct aspeed_gate_data - Aspeed gated clocks
18*03b3faa1SRyan Chen  * @clock_idx: bit used to gate this clock in the clock register
19*03b3faa1SRyan Chen  * @reset_idx: bit used to reset this IP in the reset register. -1 if no
20*03b3faa1SRyan Chen  *             reset is required when enabling the clock
21*03b3faa1SRyan Chen  * @name: the clock name
22*03b3faa1SRyan Chen  * @parent_name: the name of the parent clock
23*03b3faa1SRyan Chen  * @flags: standard clock framework flags
24*03b3faa1SRyan Chen  */
25*03b3faa1SRyan Chen struct aspeed_gate_data {
26*03b3faa1SRyan Chen 	u8		clock_idx;
27*03b3faa1SRyan Chen 	s8		reset_idx;
28*03b3faa1SRyan Chen 	const char	*name;
29*03b3faa1SRyan Chen 	const char	*parent_name;
30*03b3faa1SRyan Chen 	unsigned long	flags;
31*03b3faa1SRyan Chen };
32*03b3faa1SRyan Chen 
33*03b3faa1SRyan Chen /**
34*03b3faa1SRyan Chen  * struct aspeed_clk_gate - Aspeed specific clk_gate structure
35*03b3faa1SRyan Chen  * @hw:		handle between common and hardware-specific interfaces
36*03b3faa1SRyan Chen  * @reg:	register controlling gate
37*03b3faa1SRyan Chen  * @clock_idx:	bit used to gate this clock in the clock register
38*03b3faa1SRyan Chen  * @reset_idx:	bit used to reset this IP in the reset register. -1 if no
39*03b3faa1SRyan Chen  *		reset is required when enabling the clock
40*03b3faa1SRyan Chen  * @flags:	hardware-specific flags
41*03b3faa1SRyan Chen  * @lock:	register lock
42*03b3faa1SRyan Chen  *
43*03b3faa1SRyan Chen  * Some of the clocks in the Aspeed SoC must be put in reset before enabling.
44*03b3faa1SRyan Chen  * This modified version of clk_gate allows an optional reset bit to be
45*03b3faa1SRyan Chen  * specified.
46*03b3faa1SRyan Chen  */
47*03b3faa1SRyan Chen struct aspeed_clk_gate {
48*03b3faa1SRyan Chen 	struct clk_hw	hw;
49*03b3faa1SRyan Chen 	struct regmap	*map;
50*03b3faa1SRyan Chen 	u8		clock_idx;
51*03b3faa1SRyan Chen 	s8		reset_idx;
52*03b3faa1SRyan Chen 	u8		flags;
53*03b3faa1SRyan Chen 	spinlock_t	*lock;
54*03b3faa1SRyan Chen };
55*03b3faa1SRyan Chen 
56*03b3faa1SRyan Chen #define to_aspeed_clk_gate(_hw) container_of(_hw, struct aspeed_clk_gate, hw)
57*03b3faa1SRyan Chen 
58*03b3faa1SRyan Chen /**
59*03b3faa1SRyan Chen  * struct aspeed_reset - Aspeed reset controller
60*03b3faa1SRyan Chen  * @map: regmap to access the containing system controller
61*03b3faa1SRyan Chen  * @rcdev: reset controller device
62*03b3faa1SRyan Chen  */
63*03b3faa1SRyan Chen struct aspeed_reset {
64*03b3faa1SRyan Chen 	struct regmap			*map;
65*03b3faa1SRyan Chen 	struct reset_controller_dev	rcdev;
66*03b3faa1SRyan Chen };
67*03b3faa1SRyan Chen 
68*03b3faa1SRyan Chen #define to_aspeed_reset(p) container_of((p), struct aspeed_reset, rcdev)
69*03b3faa1SRyan Chen 
70*03b3faa1SRyan Chen /**
71*03b3faa1SRyan Chen  * struct aspeed_clk_soc_data - Aspeed SoC specific divisor information
72*03b3faa1SRyan Chen  * @div_table: Common divider lookup table
73*03b3faa1SRyan Chen  * @eclk_div_table: Divider lookup table for ECLK
74*03b3faa1SRyan Chen  * @mac_div_table: Divider lookup table for MAC (Ethernet) clocks
75*03b3faa1SRyan Chen  * @calc_pll: Callback to maculate common PLL settings
76*03b3faa1SRyan Chen  */
77*03b3faa1SRyan Chen struct aspeed_clk_soc_data {
78*03b3faa1SRyan Chen 	const struct clk_div_table *div_table;
79*03b3faa1SRyan Chen 	const struct clk_div_table *eclk_div_table;
80*03b3faa1SRyan Chen 	const struct clk_div_table *mac_div_table;
81*03b3faa1SRyan Chen 	struct clk_hw *(*calc_pll)(const char *name, u32 val);
82*03b3faa1SRyan Chen };
83