diff options
Diffstat (limited to 'drivers/clk/hisilicon/clk.h')
-rw-r--r-- | drivers/clk/hisilicon/clk.h | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/drivers/clk/hisilicon/clk.h b/drivers/clk/hisilicon/clk.h index 20d64afe4ad8..4e1d1affc6f5 100644 --- a/drivers/clk/hisilicon/clk.h +++ b/drivers/clk/hisilicon/clk.h | |||
@@ -30,6 +30,8 @@ | |||
30 | #include <linux/io.h> | 30 | #include <linux/io.h> |
31 | #include <linux/spinlock.h> | 31 | #include <linux/spinlock.h> |
32 | 32 | ||
33 | struct platform_device; | ||
34 | |||
33 | struct hisi_clock_data { | 35 | struct hisi_clock_data { |
34 | struct clk_onecell_data clk_data; | 36 | struct clk_onecell_data clk_data; |
35 | void __iomem *base; | 37 | void __iomem *base; |
@@ -110,19 +112,41 @@ struct clk *hi6220_register_clkdiv(struct device *dev, const char *name, | |||
110 | const char *parent_name, unsigned long flags, void __iomem *reg, | 112 | const char *parent_name, unsigned long flags, void __iomem *reg, |
111 | u8 shift, u8 width, u32 mask_bit, spinlock_t *lock); | 113 | u8 shift, u8 width, u32 mask_bit, spinlock_t *lock); |
112 | 114 | ||
115 | struct hisi_clock_data *hisi_clk_alloc(struct platform_device *, int); | ||
113 | struct hisi_clock_data *hisi_clk_init(struct device_node *, int); | 116 | struct hisi_clock_data *hisi_clk_init(struct device_node *, int); |
114 | void hisi_clk_register_fixed_rate(const struct hisi_fixed_rate_clock *, | 117 | int hisi_clk_register_fixed_rate(const struct hisi_fixed_rate_clock *, |
115 | int, struct hisi_clock_data *); | 118 | int, struct hisi_clock_data *); |
116 | void hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *, | 119 | int hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *, |
117 | int, struct hisi_clock_data *); | 120 | int, struct hisi_clock_data *); |
118 | void hisi_clk_register_mux(const struct hisi_mux_clock *, int, | 121 | int hisi_clk_register_mux(const struct hisi_mux_clock *, int, |
119 | struct hisi_clock_data *); | 122 | struct hisi_clock_data *); |
120 | void hisi_clk_register_divider(const struct hisi_divider_clock *, | 123 | int hisi_clk_register_divider(const struct hisi_divider_clock *, |
121 | int, struct hisi_clock_data *); | 124 | int, struct hisi_clock_data *); |
122 | void hisi_clk_register_gate(const struct hisi_gate_clock *, | 125 | int hisi_clk_register_gate(const struct hisi_gate_clock *, |
123 | int, struct hisi_clock_data *); | 126 | int, struct hisi_clock_data *); |
124 | void hisi_clk_register_gate_sep(const struct hisi_gate_clock *, | 127 | void hisi_clk_register_gate_sep(const struct hisi_gate_clock *, |
125 | int, struct hisi_clock_data *); | 128 | int, struct hisi_clock_data *); |
126 | void hi6220_clk_register_divider(const struct hi6220_divider_clock *, | 129 | void hi6220_clk_register_divider(const struct hi6220_divider_clock *, |
127 | int, struct hisi_clock_data *); | 130 | int, struct hisi_clock_data *); |
131 | |||
132 | #define hisi_clk_unregister(type) \ | ||
133 | static inline \ | ||
134 | void hisi_clk_unregister_##type(const struct hisi_##type##_clock *clks, \ | ||
135 | int nums, struct hisi_clock_data *data) \ | ||
136 | { \ | ||
137 | struct clk **clocks = data->clk_data.clks; \ | ||
138 | int i; \ | ||
139 | for (i = 0; i < nums; i++) { \ | ||
140 | int id = clks[i].id; \ | ||
141 | if (clocks[id]) \ | ||
142 | clk_unregister_##type(clocks[id]); \ | ||
143 | } \ | ||
144 | } | ||
145 | |||
146 | hisi_clk_unregister(fixed_rate) | ||
147 | hisi_clk_unregister(fixed_factor) | ||
148 | hisi_clk_unregister(mux) | ||
149 | hisi_clk_unregister(divider) | ||
150 | hisi_clk_unregister(gate) | ||
151 | |||
128 | #endif /* __HISI_CLK_H */ | 152 | #endif /* __HISI_CLK_H */ |