brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · f3cc31d Raw
89 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2//3// Spreadtrum multiplexer clock driver4//5// Copyright (C) 2017 Spreadtrum, Inc.6// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>7 8#ifndef _SPRD_MUX_H_9#define _SPRD_MUX_H_10 11#include "common.h"12 13/**14 * struct sprd_mux_ssel - Mux clock's source select bits in its register15 * @shift: Bit offset of the divider in its register16 * @width: Width of the divider field in its register17 * @table: For some mux clocks, not all sources are used on some special18 *	   chips, this matches the value of mux clock's register and the19 *	   sources which are used for this mux clock20 */21struct sprd_mux_ssel {22	u8		shift;23	u8		width;24	const u8	*table;25};26 27struct sprd_mux {28	struct sprd_mux_ssel mux;29	struct sprd_clk_common	common;30};31 32#define _SPRD_MUX_CLK(_shift, _width, _table)		\33	{						\34		.shift	= _shift,			\35		.width	= _width,			\36		.table	= _table,			\37	}38 39#define SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table,	\40				_reg, _shift, _width, _flags, _fn)	\41	struct sprd_mux _struct = {					\42		.mux	= _SPRD_MUX_CLK(_shift, _width, _table),	\43		.common	= {						\44			.regmap		= NULL,				\45			.reg		= _reg,				\46			.hw.init = _fn(_name, _parents,			\47				       &sprd_mux_ops, _flags),		\48		}							\49	}50 51#define SPRD_MUX_CLK_TABLE(_struct, _name, _parents, _table,		\52			   _reg, _shift, _width, _flags)		\53	SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table,	\54				_reg, _shift, _width, _flags,		\55				CLK_HW_INIT_PARENTS)56 57#define SPRD_MUX_CLK(_struct, _name, _parents, _reg,		\58		     _shift, _width, _flags)			\59	SPRD_MUX_CLK_TABLE(_struct, _name, _parents, NULL,	\60			   _reg, _shift, _width, _flags)61 62#define SPRD_MUX_CLK_DATA_TABLE(_struct, _name, _parents, _table,	\63				_reg, _shift, _width, _flags)		\64	SPRD_MUX_CLK_HW_INIT_FN(_struct, _name, _parents, _table,	\65				_reg, _shift, _width, _flags,		\66				CLK_HW_INIT_PARENTS_DATA)67 68#define SPRD_MUX_CLK_DATA(_struct, _name, _parents, _reg,		\69			  _shift, _width, _flags)			\70	SPRD_MUX_CLK_DATA_TABLE(_struct, _name, _parents, NULL,		\71				_reg, _shift, _width, _flags)72 73static inline struct sprd_mux *hw_to_sprd_mux(const struct clk_hw *hw)74{75	struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);76 77	return container_of(common, struct sprd_mux, common);78}79 80extern const struct clk_ops sprd_mux_ops;81 82u8 sprd_mux_helper_get_parent(const struct sprd_clk_common *common,83			      const struct sprd_mux_ssel *mux);84int sprd_mux_helper_set_parent(const struct sprd_clk_common *common,85			       const struct sprd_mux_ssel *mux,86			       u8 index);87 88#endif /* _SPRD_MUX_H_ */89