xref: /linux/drivers/clk/visconti/clkc.h (revision b4cbe606dc3674b25cb661e7cd1a1c6ddaaafaaa)
1*b4cbe606SNobuhiro Iwamatsu /* SPDX-License-Identifier: GPL-2.0-only */
2*b4cbe606SNobuhiro Iwamatsu /*
3*b4cbe606SNobuhiro Iwamatsu  * Toshiba Visconti clock controller
4*b4cbe606SNobuhiro Iwamatsu  *
5*b4cbe606SNobuhiro Iwamatsu  * Copyright (c) 2021 TOSHIBA CORPORATION
6*b4cbe606SNobuhiro Iwamatsu  * Copyright (c) 2021 Toshiba Electronic Devices & Storage Corporation
7*b4cbe606SNobuhiro Iwamatsu  *
8*b4cbe606SNobuhiro Iwamatsu  * Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
9*b4cbe606SNobuhiro Iwamatsu  */
10*b4cbe606SNobuhiro Iwamatsu 
11*b4cbe606SNobuhiro Iwamatsu #ifndef _VISCONTI_CLKC_H_
12*b4cbe606SNobuhiro Iwamatsu #define _VISCONTI_CLKC_H_
13*b4cbe606SNobuhiro Iwamatsu 
14*b4cbe606SNobuhiro Iwamatsu #include <linux/mfd/syscon.h>
15*b4cbe606SNobuhiro Iwamatsu #include <linux/clk-provider.h>
16*b4cbe606SNobuhiro Iwamatsu #include <linux/of.h>
17*b4cbe606SNobuhiro Iwamatsu #include <linux/of_address.h>
18*b4cbe606SNobuhiro Iwamatsu #include <linux/delay.h>
19*b4cbe606SNobuhiro Iwamatsu #include <linux/regmap.h>
20*b4cbe606SNobuhiro Iwamatsu #include <linux/slab.h>
21*b4cbe606SNobuhiro Iwamatsu #include <linux/string.h>
22*b4cbe606SNobuhiro Iwamatsu #include <linux/io.h>
23*b4cbe606SNobuhiro Iwamatsu #include <linux/spinlock.h>
24*b4cbe606SNobuhiro Iwamatsu 
25*b4cbe606SNobuhiro Iwamatsu #include "reset.h"
26*b4cbe606SNobuhiro Iwamatsu 
27*b4cbe606SNobuhiro Iwamatsu struct visconti_clk_provider {
28*b4cbe606SNobuhiro Iwamatsu 	struct device		*dev;
29*b4cbe606SNobuhiro Iwamatsu 	struct regmap		*regmap;
30*b4cbe606SNobuhiro Iwamatsu 	struct clk_hw_onecell_data clk_data;
31*b4cbe606SNobuhiro Iwamatsu };
32*b4cbe606SNobuhiro Iwamatsu 
33*b4cbe606SNobuhiro Iwamatsu struct visconti_clk_gate_table {
34*b4cbe606SNobuhiro Iwamatsu 	unsigned int	id;
35*b4cbe606SNobuhiro Iwamatsu 	const char	*name;
36*b4cbe606SNobuhiro Iwamatsu 	const struct clk_parent_data *parent_data;
37*b4cbe606SNobuhiro Iwamatsu 	u8		num_parents;
38*b4cbe606SNobuhiro Iwamatsu 	u8		flags;
39*b4cbe606SNobuhiro Iwamatsu 	u32		ckon_offset;
40*b4cbe606SNobuhiro Iwamatsu 	u32		ckoff_offset;
41*b4cbe606SNobuhiro Iwamatsu 	u8		ck_idx;
42*b4cbe606SNobuhiro Iwamatsu 	unsigned int	div;
43*b4cbe606SNobuhiro Iwamatsu 	u8		rs_id;
44*b4cbe606SNobuhiro Iwamatsu };
45*b4cbe606SNobuhiro Iwamatsu 
46*b4cbe606SNobuhiro Iwamatsu struct visconti_fixed_clk {
47*b4cbe606SNobuhiro Iwamatsu 	unsigned int	id;
48*b4cbe606SNobuhiro Iwamatsu 	const char	*name;
49*b4cbe606SNobuhiro Iwamatsu 	const char	*parent;
50*b4cbe606SNobuhiro Iwamatsu 	unsigned long	flag;
51*b4cbe606SNobuhiro Iwamatsu 	unsigned int	mult;
52*b4cbe606SNobuhiro Iwamatsu 	unsigned int	div;
53*b4cbe606SNobuhiro Iwamatsu };
54*b4cbe606SNobuhiro Iwamatsu 
55*b4cbe606SNobuhiro Iwamatsu struct visconti_clk_gate {
56*b4cbe606SNobuhiro Iwamatsu 	struct clk_hw	hw;
57*b4cbe606SNobuhiro Iwamatsu 	struct regmap	*regmap;
58*b4cbe606SNobuhiro Iwamatsu 	u32		ckon_offset;
59*b4cbe606SNobuhiro Iwamatsu 	u32		ckoff_offset;
60*b4cbe606SNobuhiro Iwamatsu 	u8		ck_idx;
61*b4cbe606SNobuhiro Iwamatsu 	u8		flags;
62*b4cbe606SNobuhiro Iwamatsu 	u32		rson_offset;
63*b4cbe606SNobuhiro Iwamatsu 	u32		rsoff_offset;
64*b4cbe606SNobuhiro Iwamatsu 	u8		rs_idx;
65*b4cbe606SNobuhiro Iwamatsu 	spinlock_t	*lock;
66*b4cbe606SNobuhiro Iwamatsu };
67*b4cbe606SNobuhiro Iwamatsu 
68*b4cbe606SNobuhiro Iwamatsu struct visconti_clk_provider *visconti_init_clk(struct device *dev,
69*b4cbe606SNobuhiro Iwamatsu 						struct regmap *regmap,
70*b4cbe606SNobuhiro Iwamatsu 						unsigned long nr_clks);
71*b4cbe606SNobuhiro Iwamatsu int visconti_clk_register_gates(struct visconti_clk_provider *data,
72*b4cbe606SNobuhiro Iwamatsu 				 const struct visconti_clk_gate_table *clks,
73*b4cbe606SNobuhiro Iwamatsu 				 int num_gate,
74*b4cbe606SNobuhiro Iwamatsu 				 const struct visconti_reset_data *reset,
75*b4cbe606SNobuhiro Iwamatsu 				 spinlock_t *lock);
76*b4cbe606SNobuhiro Iwamatsu #endif /* _VISCONTI_CLKC_H_ */
77