89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
//
 | 
						|
// Spreadtrum multiplexer clock driver
 | 
						|
//
 | 
						|
// Copyright (C) 2017 Spreadtrum, Inc.
 | 
						|
// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
 | 
						|
 | 
						|
#ifndef _SPRD_MUX_H_
 | 
						|
#define _SPRD_MUX_H_
 | 
						|
 | 
						|
#include "common.h"
 | 
						|
 | 
						|
/**
 | 
						|
 * struct sprd_mux_ssel - Mux clock's source select bits in its register
 | 
						|
 * @shift: Bit offset of the divider in its register
 | 
						|
 * @width: Width of the divider field in its register
 | 
						|
 * @table: For some mux clocks, not all sources are used on some special
 | 
						|
 *	   chips, this matches the value of mux clock's register and the
 | 
						|
 *	   sources which are used for this mux clock
 | 
						|
 */
 | 
						|
struct sprd_mux_ssel {
 | 
						|
	u8		shift;
 | 
						|
	u8		width;
 | 
						|
	const u8	*table;
 | 
						|
};
 | 
						|
 | 
						|
struct sprd_mux {
 | 
						|
	struct sprd_mux_ssel mux;
 | 
						|
	struct sprd_clk_common	common;
 | 
						|
};
 | 
						|
 | 
						|
#define _SPRD_MUX_CLK(_shift, _width, _table)		\
 | 
						|
	{						\
 | 
						|
		.shift	= _shift,			\
 | 
						|
		.width	= _width,			\
 | 
						|
		.table	= _table,			\
 | 
						|
	}
 | 
						|
 | 
						|
#define SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table,	\
 | 
						|
				_reg, _shift, _width, _flags, _fn)	\
 | 
						|
	struct sprd_mux _struct = {					\
 | 
						|
		.mux	= _SPRD_MUX_CLK(_shift, _width, _table),	\
 | 
						|
		.common	= {						\
 | 
						|
			.regmap		= NULL,				\
 | 
						|
			.reg		= _reg,				\
 | 
						|
			.hw.init = _fn(_name, _parents,			\
 | 
						|
				       &sprd_mux_ops, _flags),		\
 | 
						|
		}							\
 | 
						|
	}
 | 
						|
 | 
						|
#define SPRD_MUX_CLK_TABLE(_struct, _name, _parents, _table,		\
 | 
						|
			   _reg, _shift, _width, _flags)		\
 | 
						|
	SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table,	\
 | 
						|
				_reg, _shift, _width, _flags,		\
 | 
						|
				CLK_HW_INIT_PARENTS)
 | 
						|
 | 
						|
#define SPRD_MUX_CLK(_struct, _name, _parents, _reg,		\
 | 
						|
		     _shift, _width, _flags)			\
 | 
						|
	SPRD_MUX_CLK_TABLE(_struct, _name, _parents, NULL,	\
 | 
						|
			   _reg, _shift, _width, _flags)
 | 
						|
 | 
						|
#define SPRD_MUX_CLK_DATA_TABLE(_struct, _name, _parents, _table,	\
 | 
						|
				_reg, _shift, _width, _flags)		\
 | 
						|
	SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table,	\
 | 
						|
				_reg, _shift, _width, _flags,		\
 | 
						|
				CLK_HW_INIT_PARENTS_DATA)
 | 
						|
 | 
						|
#define SPRD_MUX_CLK_DATA(_struct, _name, _parents, _reg,		\
 | 
						|
			  _shift, _width, _flags)			\
 | 
						|
	SPRD_MUX_CLK_DATA_TABLE(_struct, _name, _parents, NULL,		\
 | 
						|
				_reg, _shift, _width, _flags)
 | 
						|
 | 
						|
static inline struct sprd_mux *hw_to_sprd_mux(const struct clk_hw *hw)
 | 
						|
{
 | 
						|
	struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
 | 
						|
 | 
						|
	return container_of(common, struct sprd_mux, common);
 | 
						|
}
 | 
						|
 | 
						|
extern const struct clk_ops sprd_mux_ops;
 | 
						|
 | 
						|
u8 sprd_mux_helper_get_parent(const struct sprd_clk_common *common,
 | 
						|
			      const struct sprd_mux_ssel *mux);
 | 
						|
int sprd_mux_helper_set_parent(const struct sprd_clk_common *common,
 | 
						|
			       const struct sprd_mux_ssel *mux,
 | 
						|
			       u8 index);
 | 
						|
 | 
						|
#endif /* _SPRD_MUX_H_ */
 |