forked from mirrors/linux
		
	 085a4ea93d
			
		
	
	
		085a4ea93d
		
	
	
	
	
		
			
			Add the peripheral clock controller found in the g12a SoC family Signed-off-by: Jian Hu <jian.hu@amlogic.com> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com> Link: https://lkml.kernel.org/r/20190201145345.6795-4-jbrunet@baylibre.com
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * Copyright (c) 2018 BayLibre, SAS.
 | |
|  * Author: Jerome Brunet <jbrunet@baylibre.com>
 | |
|  */
 | |
| 
 | |
| #ifndef __CLK_REGMAP_H
 | |
| #define __CLK_REGMAP_H
 | |
| 
 | |
| #include <linux/clk-provider.h>
 | |
| #include <linux/regmap.h>
 | |
| 
 | |
| /**
 | |
|  * struct clk_regmap - regmap backed clock
 | |
|  *
 | |
|  * @hw:		handle between common and hardware-specific interfaces
 | |
|  * @map:	pointer to the regmap structure controlling the clock
 | |
|  * @data:	data specific to the clock type
 | |
|  *
 | |
|  * Clock which is controlled by regmap backed registers. The actual type of
 | |
|  * of the clock is controlled by the clock_ops and data.
 | |
|  */
 | |
| struct clk_regmap {
 | |
| 	struct clk_hw	hw;
 | |
| 	struct regmap	*map;
 | |
| 	void		*data;
 | |
| };
 | |
| 
 | |
| #define to_clk_regmap(_hw) container_of(_hw, struct clk_regmap, hw)
 | |
| 
 | |
| /**
 | |
|  * struct clk_regmap_gate_data - regmap backed gate specific data
 | |
|  *
 | |
|  * @offset:	offset of the register controlling gate
 | |
|  * @bit_idx:	single bit controlling gate
 | |
|  * @flags:	hardware-specific flags
 | |
|  *
 | |
|  * Flags:
 | |
|  * Same as clk_gate except CLK_GATE_HIWORD_MASK which is ignored
 | |
|  */
 | |
| struct clk_regmap_gate_data {
 | |
| 	unsigned int	offset;
 | |
| 	u8		bit_idx;
 | |
| 	u8		flags;
 | |
| };
 | |
| 
 | |
| static inline struct clk_regmap_gate_data *
 | |
| clk_get_regmap_gate_data(struct clk_regmap *clk)
 | |
| {
 | |
| 	return (struct clk_regmap_gate_data *)clk->data;
 | |
| }
 | |
| 
 | |
| extern const struct clk_ops clk_regmap_gate_ops;
 | |
| extern const struct clk_ops clk_regmap_gate_ro_ops;
 | |
| 
 | |
| /**
 | |
|  * struct clk_regmap_div_data - regmap backed adjustable divider specific data
 | |
|  *
 | |
|  * @offset:	offset of the register controlling the divider
 | |
|  * @shift:	shift to the divider bit field
 | |
|  * @width:	width of the divider bit field
 | |
|  * @table:	array of value/divider pairs, last entry should have div = 0
 | |
|  *
 | |
|  * Flags:
 | |
|  * Same as clk_divider except CLK_DIVIDER_HIWORD_MASK which is ignored
 | |
|  */
 | |
| struct clk_regmap_div_data {
 | |
| 	unsigned int	offset;
 | |
| 	u8		shift;
 | |
| 	u8		width;
 | |
| 	u8		flags;
 | |
| 	const struct clk_div_table	*table;
 | |
| };
 | |
| 
 | |
| static inline struct clk_regmap_div_data *
 | |
| clk_get_regmap_div_data(struct clk_regmap *clk)
 | |
| {
 | |
| 	return (struct clk_regmap_div_data *)clk->data;
 | |
| }
 | |
| 
 | |
| extern const struct clk_ops clk_regmap_divider_ops;
 | |
| extern const struct clk_ops clk_regmap_divider_ro_ops;
 | |
| 
 | |
| /**
 | |
|  * struct clk_regmap_mux_data - regmap backed multiplexer clock specific data
 | |
|  *
 | |
|  * @hw:		handle between common and hardware-specific interfaces
 | |
|  * @offset:	offset of theregister controlling multiplexer
 | |
|  * @table:	array of parent indexed register values
 | |
|  * @shift:	shift to multiplexer bit field
 | |
|  * @mask:	mask of mutliplexer bit field
 | |
|  * @flags:	hardware-specific flags
 | |
|  *
 | |
|  * Flags:
 | |
|  * Same as clk_divider except CLK_MUX_HIWORD_MASK which is ignored
 | |
|  */
 | |
| struct clk_regmap_mux_data {
 | |
| 	unsigned int	offset;
 | |
| 	u32		*table;
 | |
| 	u32		mask;
 | |
| 	u8		shift;
 | |
| 	u8		flags;
 | |
| };
 | |
| 
 | |
| static inline struct clk_regmap_mux_data *
 | |
| clk_get_regmap_mux_data(struct clk_regmap *clk)
 | |
| {
 | |
| 	return (struct clk_regmap_mux_data *)clk->data;
 | |
| }
 | |
| 
 | |
| extern const struct clk_ops clk_regmap_mux_ops;
 | |
| extern const struct clk_ops clk_regmap_mux_ro_ops;
 | |
| 
 | |
| #define __MESON_GATE(_name, _reg, _bit, _ops)				\
 | |
| struct clk_regmap _name = {						\
 | |
| 	.data = &(struct clk_regmap_gate_data){				\
 | |
| 		.offset = (_reg),					\
 | |
| 		.bit_idx = (_bit),					\
 | |
| 	},								\
 | |
| 	.hw.init = &(struct clk_init_data) {				\
 | |
| 		.name = #_name,						\
 | |
| 		.ops = _ops,						\
 | |
| 		.parent_names = (const char *[]){ "clk81" },		\
 | |
| 		.num_parents = 1,					\
 | |
| 		.flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),	\
 | |
| 	},								\
 | |
| }
 | |
| 
 | |
| #define MESON_GATE(_name, _reg, _bit)	\
 | |
| 	__MESON_GATE(_name, _reg, _bit, &clk_regmap_gate_ops)
 | |
| 
 | |
| #define MESON_GATE_RO(_name, _reg, _bit)	\
 | |
| 	__MESON_GATE(_name, _reg, _bit, &clk_regmap_gate_ro_ops)
 | |
| #endif /* __CLK_REGMAP_H */
 |