87 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2//3// Spreadtrum composite clock driver4//5// Copyright (C) 2017 Spreadtrum, Inc.6// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>7 8#ifndef _SPRD_COMPOSITE_H_9#define _SPRD_COMPOSITE_H_10 11#include "common.h"12#include "mux.h"13#include "div.h"14 15struct sprd_comp {16 struct sprd_mux_ssel mux;17 struct sprd_div_internal div;18 struct sprd_clk_common common;19};20 21#define SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \22 _mshift, _mwidth, _doffset, _dshift, \23 _dwidth, _flags, _fn) \24 struct sprd_comp _struct = { \25 .mux = _SPRD_MUX_CLK(_mshift, _mwidth, _table), \26 .div = _SPRD_DIV_CLK(_doffset, _dshift, _dwidth), \27 .common = { \28 .regmap = NULL, \29 .reg = _reg, \30 .hw.init = _fn(_name, _parent, \31 &sprd_comp_ops, _flags), \32 } \33 }34 35#define SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, _table, \36 _mshift, _mwidth, _dshift, _dwidth, _flags) \37 SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \38 _mshift, _mwidth, 0x0, _dshift, \39 _dwidth, _flags, CLK_HW_INIT_PARENTS)40 41#define SPRD_COMP_CLK(_struct, _name, _parent, _reg, _mshift, \42 _mwidth, _dshift, _dwidth, _flags) \43 SPRD_COMP_CLK_TABLE(_struct, _name, _parent, _reg, NULL, \44 _mshift, _mwidth, _dshift, _dwidth, _flags)45 46#define SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, _table, \47 _mshift, _mwidth, _dshift, \48 _dwidth, _flags) \49 SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \50 _mshift, _mwidth, 0x0, _dshift, \51 _dwidth, _flags, \52 CLK_HW_INIT_PARENTS_DATA)53 54#define SPRD_COMP_CLK_DATA(_struct, _name, _parent, _reg, _mshift, \55 _mwidth, _dshift, _dwidth, _flags) \56 SPRD_COMP_CLK_DATA_TABLE(_struct, _name, _parent, _reg, NULL, \57 _mshift, _mwidth, _dshift, _dwidth, \58 _flags)59 60#define SPRD_COMP_CLK_DATA_TABLE_OFFSET(_struct, _name, _parent, _reg, \61 _table, _mshift, _mwidth, \62 _doffset, _dshift, _dwidth, \63 _flags) \64 SPRD_COMP_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, _table, \65 _mshift, _mwidth, _doffset, _dshift, \66 _dwidth, _flags, \67 CLK_HW_INIT_PARENTS_DATA)68 69#define SPRD_COMP_CLK_DATA_OFFSET(_struct, _name, _parent, _reg, \70 _mshift, _mwidth, _doffset, _dshift, \71 _dwidth, _flags) \72 SPRD_COMP_CLK_DATA_TABLE_OFFSET(_struct, _name, _parent, _reg, \73 NULL, _mshift, _mwidth, \74 _doffset, _dshift, _dwidth, \75 _flags)76 77static inline struct sprd_comp *hw_to_sprd_comp(const struct clk_hw *hw)78{79 struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);80 81 return container_of(common, struct sprd_comp, common);82}83 84extern const struct clk_ops sprd_comp_ops;85 86#endif /* _SPRD_COMPOSITE_H_ */87