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