| /* SPDX-License-Identifier: GPL-2.0-or-later */ | 
 | /* | 
 |  * Structures used by ASPEED clock drivers | 
 |  * | 
 |  * Copyright 2019 IBM Corp. | 
 |  */ | 
 |  | 
 | #include <linux/clk-provider.h> | 
 | #include <linux/kernel.h> | 
 | #include <linux/reset-controller.h> | 
 | #include <linux/spinlock.h> | 
 |  | 
 | struct clk_div_table; | 
 | struct regmap; | 
 |  | 
 | /** | 
 |  * struct aspeed_gate_data - Aspeed gated clocks | 
 |  * @clock_idx: bit used to gate this clock in the clock register | 
 |  * @reset_idx: bit used to reset this IP in the reset register. -1 if no | 
 |  *             reset is required when enabling the clock | 
 |  * @name: the clock name | 
 |  * @parent_name: the name of the parent clock | 
 |  * @flags: standard clock framework flags | 
 |  */ | 
 | struct aspeed_gate_data { | 
 | 	u8		clock_idx; | 
 | 	s8		reset_idx; | 
 | 	const char	*name; | 
 | 	const char	*parent_name; | 
 | 	unsigned long	flags; | 
 | }; | 
 |  | 
 | /** | 
 |  * struct aspeed_clk_gate - Aspeed specific clk_gate structure | 
 |  * @hw:		handle between common and hardware-specific interfaces | 
 |  * @reg:	register controlling gate | 
 |  * @clock_idx:	bit used to gate this clock in the clock register | 
 |  * @reset_idx:	bit used to reset this IP in the reset register. -1 if no | 
 |  *		reset is required when enabling the clock | 
 |  * @flags:	hardware-specific flags | 
 |  * @lock:	register lock | 
 |  * | 
 |  * Some of the clocks in the Aspeed SoC must be put in reset before enabling. | 
 |  * This modified version of clk_gate allows an optional reset bit to be | 
 |  * specified. | 
 |  */ | 
 | struct aspeed_clk_gate { | 
 | 	struct clk_hw	hw; | 
 | 	struct regmap	*map; | 
 | 	u8		clock_idx; | 
 | 	s8		reset_idx; | 
 | 	u8		flags; | 
 | 	spinlock_t	*lock; | 
 | }; | 
 |  | 
 | #define to_aspeed_clk_gate(_hw) container_of(_hw, struct aspeed_clk_gate, hw) | 
 |  | 
 | /** | 
 |  * struct aspeed_reset - Aspeed reset controller | 
 |  * @map: regmap to access the containing system controller | 
 |  * @rcdev: reset controller device | 
 |  */ | 
 | struct aspeed_reset { | 
 | 	struct regmap			*map; | 
 | 	struct reset_controller_dev	rcdev; | 
 | }; | 
 |  | 
 | #define to_aspeed_reset(p) container_of((p), struct aspeed_reset, rcdev) | 
 |  | 
 | /** | 
 |  * struct aspeed_clk_soc_data - Aspeed SoC specific divisor information | 
 |  * @div_table: Common divider lookup table | 
 |  * @eclk_div_table: Divider lookup table for ECLK | 
 |  * @mac_div_table: Divider lookup table for MAC (Ethernet) clocks | 
 |  * @calc_pll: Callback to maculate common PLL settings | 
 |  */ | 
 | struct aspeed_clk_soc_data { | 
 | 	const struct clk_div_table *div_table; | 
 | 	const struct clk_div_table *eclk_div_table; | 
 | 	const struct clk_div_table *mac_div_table; | 
 | 	struct clk_hw *(*calc_pll)(const char *name, u32 val); | 
 | }; |