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