Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: rockchip: add lookup table support

Add support for mapping reset IDs to register offsets
to support gapless continous platform reset IDs.

Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Link: https://lore.kernel.org/r/20221018151407.63395-9-sebastian.reichel@collabora.com
Signed-off-by: Heiko Stuebner <heiko@sntech.de>

authored by

Sebastian Reichel and committed by
Heiko Stuebner
ada8f95b ff94c866

+40 -15
+15 -6
drivers/clk/rockchip/clk.h
··· 958 958 spinlock_t *lock); 959 959 960 960 #ifdef CONFIG_RESET_CONTROLLER 961 - void rockchip_register_softrst(struct device_node *np, 962 - unsigned int num_regs, 963 - void __iomem *base, u8 flags); 961 + void rockchip_register_softrst_lut(struct device_node *np, 962 + const int *lookup_table, 963 + unsigned int num_regs, 964 + void __iomem *base, u8 flags); 964 965 #else 965 - static inline void rockchip_register_softrst(struct device_node *np, 966 - unsigned int num_regs, 967 - void __iomem *base, u8 flags) 966 + static inline void rockchip_register_softrst_lut(struct device_node *np, 967 + const int *lookup_table, 968 + unsigned int num_regs, 969 + void __iomem *base, u8 flags) 968 970 { 969 971 } 970 972 #endif 973 + 974 + static inline void rockchip_register_softrst(struct device_node *np, 975 + unsigned int num_regs, 976 + void __iomem *base, u8 flags) 977 + { 978 + return rockchip_register_softrst_lut(np, NULL, num_regs, base, flags); 979 + } 971 980 972 981 #endif
+25 -9
drivers/clk/rockchip/softrst.c
··· 12 12 13 13 struct rockchip_softrst { 14 14 struct reset_controller_dev rcdev; 15 + const int *lut; 15 16 void __iomem *reg_base; 16 17 int num_regs; 17 18 int num_per_reg; ··· 26 25 struct rockchip_softrst *softrst = container_of(rcdev, 27 26 struct rockchip_softrst, 28 27 rcdev); 29 - int bank = id / softrst->num_per_reg; 30 - int offset = id % softrst->num_per_reg; 28 + int bank, offset; 29 + 30 + if (softrst->lut) 31 + id = softrst->lut[id]; 32 + 33 + bank = id / softrst->num_per_reg; 34 + offset = id % softrst->num_per_reg; 31 35 32 36 if (softrst->flags & ROCKCHIP_SOFTRST_HIWORD_MASK) { 33 37 writel(BIT(offset) | (BIT(offset) << 16), ··· 58 52 struct rockchip_softrst *softrst = container_of(rcdev, 59 53 struct rockchip_softrst, 60 54 rcdev); 61 - int bank = id / softrst->num_per_reg; 62 - int offset = id % softrst->num_per_reg; 55 + int bank, offset; 56 + 57 + if (softrst->lut) 58 + id = softrst->lut[id]; 59 + 60 + bank = id / softrst->num_per_reg; 61 + offset = id % softrst->num_per_reg; 63 62 64 63 if (softrst->flags & ROCKCHIP_SOFTRST_HIWORD_MASK) { 65 64 writel((BIT(offset) << 16), softrst->reg_base + (bank * 4)); ··· 88 77 .deassert = rockchip_softrst_deassert, 89 78 }; 90 79 91 - void rockchip_register_softrst(struct device_node *np, 92 - unsigned int num_regs, 93 - void __iomem *base, u8 flags) 80 + void rockchip_register_softrst_lut(struct device_node *np, 81 + const int *lookup_table, 82 + unsigned int num_regs, 83 + void __iomem *base, u8 flags) 94 84 { 95 85 struct rockchip_softrst *softrst; 96 86 int ret; ··· 103 91 spin_lock_init(&softrst->lock); 104 92 105 93 softrst->reg_base = base; 94 + softrst->lut = lookup_table; 106 95 softrst->flags = flags; 107 96 softrst->num_regs = num_regs; 108 97 softrst->num_per_reg = (flags & ROCKCHIP_SOFTRST_HIWORD_MASK) ? 16 109 98 : 32; 110 99 111 100 softrst->rcdev.owner = THIS_MODULE; 112 - softrst->rcdev.nr_resets = num_regs * softrst->num_per_reg; 101 + if (lookup_table) 102 + softrst->rcdev.nr_resets = num_regs; 103 + else 104 + softrst->rcdev.nr_resets = num_regs * softrst->num_per_reg; 113 105 softrst->rcdev.ops = &rockchip_softrst_ops; 114 106 softrst->rcdev.of_node = np; 115 107 ret = reset_controller_register(&softrst->rcdev); ··· 123 107 kfree(softrst); 124 108 } 125 109 }; 126 - EXPORT_SYMBOL_GPL(rockchip_register_softrst); 110 + EXPORT_SYMBOL_GPL(rockchip_register_softrst_lut);