18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2018 MediaTek Inc. 48c2ecf20Sopenharmony_ci * Author: Owen Chen <owen.chen@mediatek.com> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef __DRV_CLK_MTK_MUX_H 88c2ecf20Sopenharmony_ci#define __DRV_CLK_MTK_MUX_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistruct mtk_clk_mux { 138c2ecf20Sopenharmony_ci struct clk_hw hw; 148c2ecf20Sopenharmony_ci struct regmap *regmap; 158c2ecf20Sopenharmony_ci const struct mtk_mux *data; 168c2ecf20Sopenharmony_ci spinlock_t *lock; 178c2ecf20Sopenharmony_ci}; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistruct mtk_mux { 208c2ecf20Sopenharmony_ci int id; 218c2ecf20Sopenharmony_ci const char *name; 228c2ecf20Sopenharmony_ci const char * const *parent_names; 238c2ecf20Sopenharmony_ci unsigned int flags; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci u32 mux_ofs; 268c2ecf20Sopenharmony_ci u32 set_ofs; 278c2ecf20Sopenharmony_ci u32 clr_ofs; 288c2ecf20Sopenharmony_ci u32 upd_ofs; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci u8 mux_shift; 318c2ecf20Sopenharmony_ci u8 mux_width; 328c2ecf20Sopenharmony_ci u8 gate_shift; 338c2ecf20Sopenharmony_ci s8 upd_shift; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci const struct clk_ops *ops; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci signed char num_parents; 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_ops; 418c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_clr_set_upd_ops; 428c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_gate_ops; 438c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_gate_clr_set_upd_ops; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#define GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \ 468c2ecf20Sopenharmony_ci _mux_set_ofs, _mux_clr_ofs, _shift, _width, \ 478c2ecf20Sopenharmony_ci _gate, _upd_ofs, _upd, _flags, _ops) { \ 488c2ecf20Sopenharmony_ci .id = _id, \ 498c2ecf20Sopenharmony_ci .name = _name, \ 508c2ecf20Sopenharmony_ci .mux_ofs = _mux_ofs, \ 518c2ecf20Sopenharmony_ci .set_ofs = _mux_set_ofs, \ 528c2ecf20Sopenharmony_ci .clr_ofs = _mux_clr_ofs, \ 538c2ecf20Sopenharmony_ci .upd_ofs = _upd_ofs, \ 548c2ecf20Sopenharmony_ci .mux_shift = _shift, \ 558c2ecf20Sopenharmony_ci .mux_width = _width, \ 568c2ecf20Sopenharmony_ci .gate_shift = _gate, \ 578c2ecf20Sopenharmony_ci .upd_shift = _upd, \ 588c2ecf20Sopenharmony_ci .parent_names = _parents, \ 598c2ecf20Sopenharmony_ci .num_parents = ARRAY_SIZE(_parents), \ 608c2ecf20Sopenharmony_ci .flags = _flags, \ 618c2ecf20Sopenharmony_ci .ops = &_ops, \ 628c2ecf20Sopenharmony_ci } 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci#define MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \ 658c2ecf20Sopenharmony_ci _mux_set_ofs, _mux_clr_ofs, _shift, _width, \ 668c2ecf20Sopenharmony_ci _gate, _upd_ofs, _upd, _flags) \ 678c2ecf20Sopenharmony_ci GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \ 688c2ecf20Sopenharmony_ci _mux_set_ofs, _mux_clr_ofs, _shift, _width, \ 698c2ecf20Sopenharmony_ci _gate, _upd_ofs, _upd, _flags, \ 708c2ecf20Sopenharmony_ci mtk_mux_gate_clr_set_upd_ops) 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#define MUX_GATE_CLR_SET_UPD(_id, _name, _parents, _mux_ofs, \ 738c2ecf20Sopenharmony_ci _mux_set_ofs, _mux_clr_ofs, _shift, _width, \ 748c2ecf20Sopenharmony_ci _gate, _upd_ofs, _upd) \ 758c2ecf20Sopenharmony_ci MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, \ 768c2ecf20Sopenharmony_ci _mux_ofs, _mux_set_ofs, _mux_clr_ofs, _shift, \ 778c2ecf20Sopenharmony_ci _width, _gate, _upd_ofs, _upd, \ 788c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT) 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistruct clk *mtk_clk_register_mux(const struct mtk_mux *mux, 818c2ecf20Sopenharmony_ci struct regmap *regmap, 828c2ecf20Sopenharmony_ci spinlock_t *lock); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ciint mtk_clk_register_muxes(const struct mtk_mux *muxes, 858c2ecf20Sopenharmony_ci int num, struct device_node *node, 868c2ecf20Sopenharmony_ci spinlock_t *lock, 878c2ecf20Sopenharmony_ci struct clk_onecell_data *clk_data); 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci#endif /* __DRV_CLK_MTK_MUX_H */ 90