| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * Toshiba Visconti clock controller |
| * |
| * Copyright (c) 2021 TOSHIBA CORPORATION |
| * Copyright (c) 2021 Toshiba Electronic Devices & Storage Corporation |
| * |
| * Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp> |
| */ |
| |
| #ifndef _VISCONTI_CLKC_H_ |
| #define _VISCONTI_CLKC_H_ |
| |
| #include <linux/mfd/syscon.h> |
| #include <linux/clk-provider.h> |
| #include <linux/of.h> |
| #include <linux/of_address.h> |
| #include <linux/delay.h> |
| #include <linux/regmap.h> |
| #include <linux/slab.h> |
| #include <linux/string.h> |
| #include <linux/io.h> |
| #include <linux/spinlock.h> |
| |
| #include "reset.h" |
| |
| struct visconti_clk_provider { |
| struct device *dev; |
| struct regmap *regmap; |
| struct clk_hw_onecell_data clk_data; |
| }; |
| |
| struct visconti_clk_gate_table { |
| unsigned int id; |
| const char *name; |
| const struct clk_parent_data *parent_data; |
| u8 num_parents; |
| u8 flags; |
| u32 ckon_offset; |
| u32 ckoff_offset; |
| u8 ck_idx; |
| unsigned int div; |
| u8 rs_id; |
| }; |
| |
| struct visconti_fixed_clk { |
| unsigned int id; |
| const char *name; |
| const char *parent; |
| unsigned long flag; |
| unsigned int mult; |
| unsigned int div; |
| }; |
| |
| struct visconti_clk_gate { |
| struct clk_hw hw; |
| struct regmap *regmap; |
| u32 ckon_offset; |
| u32 ckoff_offset; |
| u8 ck_idx; |
| u8 flags; |
| u32 rson_offset; |
| u32 rsoff_offset; |
| u8 rs_idx; |
| spinlock_t *lock; |
| }; |
| |
| struct visconti_clk_provider *visconti_init_clk(struct device *dev, |
| struct regmap *regmap, |
| unsigned long nr_clks); |
| int visconti_clk_register_gates(struct visconti_clk_provider *data, |
| const struct visconti_clk_gate_table *clks, |
| int num_gate, |
| const struct visconti_reset_data *reset, |
| spinlock_t *lock); |
| |
| #define NO_RESET 0xFF |
| |
| #endif /* _VISCONTI_CLKC_H_ */ |