128 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (c) 2016 Maxime Ripard. All rights reserved.4 */5 6#ifndef _CCU_GATE_H_7#define _CCU_GATE_H_8 9#include <linux/clk-provider.h>10 11#include "ccu_common.h"12 13struct ccu_gate {14 u32 enable;15 16 struct ccu_common common;17};18 19#define SUNXI_CCU_GATE(_struct, _name, _parent, _reg, _gate, _flags) \20 struct ccu_gate _struct = { \21 .enable = _gate, \22 .common = { \23 .reg = _reg, \24 .hw.init = CLK_HW_INIT(_name, \25 _parent, \26 &ccu_gate_ops, \27 _flags), \28 } \29 }30 31#define SUNXI_CCU_GATE_HW(_struct, _name, _parent, _reg, _gate, _flags) \32 struct ccu_gate _struct = { \33 .enable = _gate, \34 .common = { \35 .reg = _reg, \36 .hw.init = CLK_HW_INIT_HW(_name, \37 _parent, \38 &ccu_gate_ops, \39 _flags), \40 } \41 }42 43#define SUNXI_CCU_GATE_FW(_struct, _name, _parent, _reg, _gate, _flags) \44 struct ccu_gate _struct = { \45 .enable = _gate, \46 .common = { \47 .reg = _reg, \48 .hw.init = CLK_HW_INIT_FW_NAME(_name, \49 _parent, \50 &ccu_gate_ops, \51 _flags), \52 } \53 }54 55/*56 * The following macros allow the re-use of the data structure57 * holding the parent info.58 */59#define SUNXI_CCU_GATE_HWS(_struct, _name, _parent, _reg, _gate, _flags) \60 struct ccu_gate _struct = { \61 .enable = _gate, \62 .common = { \63 .reg = _reg, \64 .hw.init = CLK_HW_INIT_HWS(_name, \65 _parent, \66 &ccu_gate_ops, \67 _flags), \68 } \69 }70 71#define SUNXI_CCU_GATE_HWS_WITH_PREDIV(_struct, _name, _parent, _reg, \72 _gate, _prediv, _flags) \73 struct ccu_gate _struct = { \74 .enable = _gate, \75 .common = { \76 .reg = _reg, \77 .prediv = _prediv, \78 .features = CCU_FEATURE_ALL_PREDIV, \79 .hw.init = CLK_HW_INIT_HWS(_name, \80 _parent, \81 &ccu_gate_ops, \82 _flags), \83 } \84 }85 86#define SUNXI_CCU_GATE_DATA(_struct, _name, _data, _reg, _gate, _flags) \87 struct ccu_gate _struct = { \88 .enable = _gate, \89 .common = { \90 .reg = _reg, \91 .hw.init = \92 CLK_HW_INIT_PARENTS_DATA(_name, \93 _data, \94 &ccu_gate_ops, \95 _flags), \96 } \97 }98 99#define SUNXI_CCU_GATE_DATA_WITH_PREDIV(_struct, _name, _parent, _reg, \100 _gate, _prediv, _flags) \101 struct ccu_gate _struct = { \102 .enable = _gate, \103 .common = { \104 .reg = _reg, \105 .prediv = _prediv, \106 .features = CCU_FEATURE_ALL_PREDIV, \107 .hw.init = CLK_HW_INIT_PARENTS_DATA(_name, \108 _parent, \109 &ccu_gate_ops, \110 _flags), \111 } \112 }113 114static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)115{116 struct ccu_common *common = hw_to_ccu_common(hw);117 118 return container_of(common, struct ccu_gate, common);119}120 121void ccu_gate_helper_disable(struct ccu_common *common, u32 gate);122int ccu_gate_helper_enable(struct ccu_common *common, u32 gate);123int ccu_gate_helper_is_enabled(struct ccu_common *common, u32 gate);124 125extern const struct clk_ops ccu_gate_ops;126 127#endif /* _CCU_GATE_H_ */128