/* 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_ */
