cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clk.h (3954B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * Hisilicon Hi3620 clock gate driver
      4 *
      5 * Copyright (c) 2012-2013 Hisilicon Limited.
      6 * Copyright (c) 2012-2013 Linaro Limited.
      7 *
      8 * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
      9 *	   Xin Li <li.xin@linaro.org>
     10 */
     11
     12#ifndef	__HISI_CLK_H
     13#define	__HISI_CLK_H
     14
     15#include <linux/clk-provider.h>
     16#include <linux/io.h>
     17#include <linux/spinlock.h>
     18
     19struct platform_device;
     20
     21struct hisi_clock_data {
     22	struct clk_onecell_data	clk_data;
     23	void __iomem		*base;
     24};
     25
     26struct hisi_fixed_rate_clock {
     27	unsigned int		id;
     28	char			*name;
     29	const char		*parent_name;
     30	unsigned long		flags;
     31	unsigned long		fixed_rate;
     32};
     33
     34struct hisi_fixed_factor_clock {
     35	unsigned int		id;
     36	char			*name;
     37	const char		*parent_name;
     38	unsigned long		mult;
     39	unsigned long		div;
     40	unsigned long		flags;
     41};
     42
     43struct hisi_mux_clock {
     44	unsigned int		id;
     45	const char		*name;
     46	const char		*const *parent_names;
     47	u8			num_parents;
     48	unsigned long		flags;
     49	unsigned long		offset;
     50	u8			shift;
     51	u8			width;
     52	u8			mux_flags;
     53	const u32		*table;
     54	const char		*alias;
     55};
     56
     57struct hisi_phase_clock {
     58	unsigned int		id;
     59	const char		*name;
     60	const char		*parent_names;
     61	unsigned long		flags;
     62	unsigned long		offset;
     63	u8			shift;
     64	u8			width;
     65	u32			*phase_degrees;
     66	u32			*phase_regvals;
     67	u8			phase_num;
     68};
     69
     70struct hisi_divider_clock {
     71	unsigned int		id;
     72	const char		*name;
     73	const char		*parent_name;
     74	unsigned long		flags;
     75	unsigned long		offset;
     76	u8			shift;
     77	u8			width;
     78	u8			div_flags;
     79	struct clk_div_table	*table;
     80	const char		*alias;
     81};
     82
     83struct hi6220_divider_clock {
     84	unsigned int		id;
     85	const char		*name;
     86	const char		*parent_name;
     87	unsigned long		flags;
     88	unsigned long		offset;
     89	u8			shift;
     90	u8			width;
     91	u32			mask_bit;
     92	const char		*alias;
     93};
     94
     95struct hisi_gate_clock {
     96	unsigned int		id;
     97	const char		*name;
     98	const char		*parent_name;
     99	unsigned long		flags;
    100	unsigned long		offset;
    101	u8			bit_idx;
    102	u8			gate_flags;
    103	const char		*alias;
    104};
    105
    106struct clk *hisi_register_clkgate_sep(struct device *, const char *,
    107				const char *, unsigned long,
    108				void __iomem *, u8,
    109				u8, spinlock_t *);
    110struct clk *hi6220_register_clkdiv(struct device *dev, const char *name,
    111	const char *parent_name, unsigned long flags, void __iomem *reg,
    112	u8 shift, u8 width, u32 mask_bit, spinlock_t *lock);
    113
    114struct hisi_clock_data *hisi_clk_alloc(struct platform_device *, int);
    115struct hisi_clock_data *hisi_clk_init(struct device_node *, int);
    116int hisi_clk_register_fixed_rate(const struct hisi_fixed_rate_clock *,
    117				int, struct hisi_clock_data *);
    118int hisi_clk_register_fixed_factor(const struct hisi_fixed_factor_clock *,
    119				int, struct hisi_clock_data *);
    120int hisi_clk_register_mux(const struct hisi_mux_clock *, int,
    121				struct hisi_clock_data *);
    122struct clk *clk_register_hisi_phase(struct device *dev,
    123				const struct hisi_phase_clock *clks,
    124				void __iomem *base, spinlock_t *lock);
    125int hisi_clk_register_phase(struct device *dev,
    126				const struct hisi_phase_clock *clks,
    127				int nums, struct hisi_clock_data *data);
    128int hisi_clk_register_divider(const struct hisi_divider_clock *,
    129				int, struct hisi_clock_data *);
    130int hisi_clk_register_gate(const struct hisi_gate_clock *,
    131				int, struct hisi_clock_data *);
    132void hisi_clk_register_gate_sep(const struct hisi_gate_clock *,
    133				int, struct hisi_clock_data *);
    134void hi6220_clk_register_divider(const struct hi6220_divider_clock *,
    135				int, struct hisi_clock_data *);
    136
    137#define hisi_clk_unregister(type) \
    138static inline \
    139void hisi_clk_unregister_##type(const struct hisi_##type##_clock *clks, \
    140				int nums, struct hisi_clock_data *data) \
    141{ \
    142	struct clk **clocks = data->clk_data.clks; \
    143	int i; \
    144	for (i = 0; i < nums; i++) { \
    145		int id = clks[i].id; \
    146		if (clocks[id])  \
    147			clk_unregister_##type(clocks[id]); \
    148	} \
    149}
    150
    151hisi_clk_unregister(fixed_rate)
    152hisi_clk_unregister(fixed_factor)
    153hisi_clk_unregister(mux)
    154hisi_clk_unregister(divider)
    155hisi_clk_unregister(gate)
    156
    157#endif	/* __HISI_CLK_H */