18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci// 38c2ecf20Sopenharmony_ci// Spreadtrum gate clock driver 48c2ecf20Sopenharmony_ci// 58c2ecf20Sopenharmony_ci// Copyright (C) 2017 Spreadtrum, Inc. 68c2ecf20Sopenharmony_ci// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com> 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _SPRD_GATE_H_ 98c2ecf20Sopenharmony_ci#define _SPRD_GATE_H_ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "common.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistruct sprd_gate { 148c2ecf20Sopenharmony_ci u32 enable_mask; 158c2ecf20Sopenharmony_ci u16 flags; 168c2ecf20Sopenharmony_ci u16 sc_offset; 178c2ecf20Sopenharmony_ci u16 udelay; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci struct sprd_clk_common common; 208c2ecf20Sopenharmony_ci}; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci/* 238c2ecf20Sopenharmony_ci * sprd_gate->flags is used for: 248c2ecf20Sopenharmony_ci * CLK_GATE_SET_TO_DISABLE BIT(0) 258c2ecf20Sopenharmony_ci * CLK_GATE_HIWORD_MASK BIT(1) 268c2ecf20Sopenharmony_ci * CLK_GATE_BIG_ENDIAN BIT(2) 278c2ecf20Sopenharmony_ci * so we define new flags from BIT(3) 288c2ecf20Sopenharmony_ci */ 298c2ecf20Sopenharmony_ci#define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */ 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 328c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 338c2ecf20Sopenharmony_ci _gate_flags, _udelay, _ops, _fn) \ 348c2ecf20Sopenharmony_ci struct sprd_gate _struct = { \ 358c2ecf20Sopenharmony_ci .enable_mask = _enable_mask, \ 368c2ecf20Sopenharmony_ci .sc_offset = _sc_offset, \ 378c2ecf20Sopenharmony_ci .flags = _gate_flags, \ 388c2ecf20Sopenharmony_ci .udelay = _udelay, \ 398c2ecf20Sopenharmony_ci .common = { \ 408c2ecf20Sopenharmony_ci .regmap = NULL, \ 418c2ecf20Sopenharmony_ci .reg = _reg, \ 428c2ecf20Sopenharmony_ci .hw.init = _fn(_name, _parent, \ 438c2ecf20Sopenharmony_ci _ops, _flags), \ 448c2ecf20Sopenharmony_ci } \ 458c2ecf20Sopenharmony_ci } 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 488c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 498c2ecf20Sopenharmony_ci _gate_flags, _udelay, _ops) \ 508c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 518c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 528c2ecf20Sopenharmony_ci _gate_flags, _udelay, _ops, CLK_HW_INIT) 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 558c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags, _ops) \ 568c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 578c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 588c2ecf20Sopenharmony_ci _gate_flags, 0, _ops) 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \ 618c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags) \ 628c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 638c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags, \ 648c2ecf20Sopenharmony_ci &sprd_sc_gate_ops) 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci#define SPRD_GATE_CLK(_struct, _name, _parent, _reg, \ 678c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags) \ 688c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0, \ 698c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags, \ 708c2ecf20Sopenharmony_ci &sprd_gate_ops) 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \ 738c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags, \ 748c2ecf20Sopenharmony_ci _udelay) \ 758c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 768c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 778c2ecf20Sopenharmony_ci _gate_flags, _udelay, \ 788c2ecf20Sopenharmony_ci &sprd_pll_sc_gate_ops) 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 828c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, \ 838c2ecf20Sopenharmony_ci _flags, _gate_flags, \ 848c2ecf20Sopenharmony_ci _udelay, _ops) \ 858c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 868c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 878c2ecf20Sopenharmony_ci _gate_flags, _udelay, _ops, \ 888c2ecf20Sopenharmony_ci CLK_HW_INIT_HW) 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \ 918c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 928c2ecf20Sopenharmony_ci _gate_flags, _ops) \ 938c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 948c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, \ 958c2ecf20Sopenharmony_ci _flags, _gate_flags, 0, _ops) 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 988c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 998c2ecf20Sopenharmony_ci _gate_flags) \ 1008c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \ 1018c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 1028c2ecf20Sopenharmony_ci _gate_flags, &sprd_sc_gate_ops) 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci#define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 1058c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags) \ 1068c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0, \ 1078c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags, \ 1088c2ecf20Sopenharmony_ci &sprd_gate_ops) 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci#define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 1118c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 1128c2ecf20Sopenharmony_ci _gate_flags, _udelay) \ 1138c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 1148c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, \ 1158c2ecf20Sopenharmony_ci _flags, _gate_flags, _udelay, \ 1168c2ecf20Sopenharmony_ci &sprd_pll_sc_gate_ops) 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 1198c2ecf20Sopenharmony_ci _reg, _sc_offset, \ 1208c2ecf20Sopenharmony_ci _enable_mask, _flags, \ 1218c2ecf20Sopenharmony_ci _gate_flags, _udelay, _ops) \ 1228c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 1238c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 1248c2ecf20Sopenharmony_ci _gate_flags, _udelay, _ops, \ 1258c2ecf20Sopenharmony_ci CLK_HW_INIT_FW_NAME) 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \ 1288c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 1298c2ecf20Sopenharmony_ci _gate_flags, _ops) \ 1308c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 1318c2ecf20Sopenharmony_ci _reg, _sc_offset, \ 1328c2ecf20Sopenharmony_ci _enable_mask, _flags, \ 1338c2ecf20Sopenharmony_ci _gate_flags, 0, _ops) 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 1368c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 1378c2ecf20Sopenharmony_ci _gate_flags) \ 1388c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \ 1398c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 1408c2ecf20Sopenharmony_ci _gate_flags, &sprd_sc_gate_ops) 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci#define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 1438c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags) \ 1448c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0, \ 1458c2ecf20Sopenharmony_ci _enable_mask, _flags, _gate_flags, \ 1468c2ecf20Sopenharmony_ci &sprd_gate_ops) 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci#define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 1498c2ecf20Sopenharmony_ci _sc_offset, _enable_mask, _flags, \ 1508c2ecf20Sopenharmony_ci _gate_flags, _udelay) \ 1518c2ecf20Sopenharmony_ci SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 1528c2ecf20Sopenharmony_ci _reg, _sc_offset, \ 1538c2ecf20Sopenharmony_ci _enable_mask, _flags, \ 1548c2ecf20Sopenharmony_ci _gate_flags, _udelay, \ 1558c2ecf20Sopenharmony_ci &sprd_pll_sc_gate_ops) 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_cistatic inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw) 1588c2ecf20Sopenharmony_ci{ 1598c2ecf20Sopenharmony_ci struct sprd_clk_common *common = hw_to_sprd_clk_common(hw); 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci return container_of(common, struct sprd_gate, common); 1628c2ecf20Sopenharmony_ci} 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ciextern const struct clk_ops sprd_gate_ops; 1658c2ecf20Sopenharmony_ciextern const struct clk_ops sprd_sc_gate_ops; 1668c2ecf20Sopenharmony_ciextern const struct clk_ops sprd_pll_sc_gate_ops; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci#endif /* _SPRD_GATE_H_ */ 169