10Sstevel@tonic-gate/* SPDX-License-Identifier: GPL-2.0 */ 20Sstevel@tonic-gate// 30Sstevel@tonic-gate// Spreadtrum gate clock driver 40Sstevel@tonic-gate// 51103Sjbeloro// Copyright (C) 2017 Spreadtrum, Inc. 61103Sjbeloro// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com> 70Sstevel@tonic-gate 80Sstevel@tonic-gate#ifndef _SPRD_GATE_H_ 90Sstevel@tonic-gate#define _SPRD_GATE_H_ 100Sstevel@tonic-gate 110Sstevel@tonic-gate#include "common.h" 120Sstevel@tonic-gate 130Sstevel@tonic-gatestruct sprd_gate { 140Sstevel@tonic-gate u32 enable_mask; 150Sstevel@tonic-gate u16 flags; 160Sstevel@tonic-gate u16 sc_offset; 170Sstevel@tonic-gate u16 udelay; 180Sstevel@tonic-gate 190Sstevel@tonic-gate struct sprd_clk_common common; 200Sstevel@tonic-gate}; 211103Sjbeloro 220Sstevel@tonic-gate/* 238574SJason.Beloro@Sun.COM * sprd_gate->flags is used for: 240Sstevel@tonic-gate * CLK_GATE_SET_TO_DISABLE BIT(0) 250Sstevel@tonic-gate * CLK_GATE_HIWORD_MASK BIT(1) 260Sstevel@tonic-gate * CLK_GATE_BIG_ENDIAN BIT(2) 270Sstevel@tonic-gate * so we define new flags from BIT(3) 280Sstevel@tonic-gate */ 290Sstevel@tonic-gate#define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */ 300Sstevel@tonic-gate 310Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 320Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 330Sstevel@tonic-gate _gate_flags, _udelay, _ops, _fn) \ 340Sstevel@tonic-gate struct sprd_gate _struct = { \ 350Sstevel@tonic-gate .enable_mask = _enable_mask, \ 360Sstevel@tonic-gate .sc_offset = _sc_offset, \ 370Sstevel@tonic-gate .flags = _gate_flags, \ 380Sstevel@tonic-gate .udelay = _udelay, \ 390Sstevel@tonic-gate .common = { \ 400Sstevel@tonic-gate .regmap = NULL, \ 410Sstevel@tonic-gate .reg = _reg, \ 420Sstevel@tonic-gate .hw.init = _fn(_name, _parent, \ 430Sstevel@tonic-gate _ops, _flags), \ 440Sstevel@tonic-gate } \ 450Sstevel@tonic-gate } 460Sstevel@tonic-gate 470Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 480Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 490Sstevel@tonic-gate _gate_flags, _udelay, _ops) \ 500Sstevel@tonic-gate SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 510Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 529249SJaven.Wu@Sun.COM _gate_flags, _udelay, _ops, CLK_HW_INIT) 530Sstevel@tonic-gate 540Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 550Sstevel@tonic-gate _enable_mask, _flags, _gate_flags, _ops) \ 560Sstevel@tonic-gate SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 570Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 580Sstevel@tonic-gate _gate_flags, 0, _ops) 590Sstevel@tonic-gate 600Sstevel@tonic-gate#define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \ 610Sstevel@tonic-gate _enable_mask, _flags, _gate_flags) \ 620Sstevel@tonic-gate SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \ 630Sstevel@tonic-gate _enable_mask, _flags, _gate_flags, \ 640Sstevel@tonic-gate &sprd_sc_gate_ops) 650Sstevel@tonic-gate 660Sstevel@tonic-gate#define SPRD_GATE_CLK(_struct, _name, _parent, _reg, \ 670Sstevel@tonic-gate _enable_mask, _flags, _gate_flags) \ 680Sstevel@tonic-gate SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0, \ 690Sstevel@tonic-gate _enable_mask, _flags, _gate_flags, \ 700Sstevel@tonic-gate &sprd_gate_ops) 710Sstevel@tonic-gate 720Sstevel@tonic-gate#define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \ 730Sstevel@tonic-gate _enable_mask, _flags, _gate_flags, \ 740Sstevel@tonic-gate _udelay) \ 750Sstevel@tonic-gate SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \ 760Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 770Sstevel@tonic-gate _gate_flags, _udelay, \ 780Sstevel@tonic-gate &sprd_pll_sc_gate_ops) 790Sstevel@tonic-gate 800Sstevel@tonic-gate 810Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 820Sstevel@tonic-gate _sc_offset, _enable_mask, \ 830Sstevel@tonic-gate _flags, _gate_flags, \ 840Sstevel@tonic-gate _udelay, _ops) \ 850Sstevel@tonic-gate SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 860Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 870Sstevel@tonic-gate _gate_flags, _udelay, _ops, \ 88944Svenki CLK_HW_INIT_HW) 890Sstevel@tonic-gate 900Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \ 910Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 920Sstevel@tonic-gate _gate_flags, _ops) \ 930Sstevel@tonic-gate SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 940Sstevel@tonic-gate _sc_offset, _enable_mask, \ 950Sstevel@tonic-gate _flags, _gate_flags, 0, _ops) 960Sstevel@tonic-gate 970Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 980Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 990Sstevel@tonic-gate _gate_flags) \ 1000Sstevel@tonic-gate SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \ 1010Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 1020Sstevel@tonic-gate _gate_flags, &sprd_sc_gate_ops) 1030Sstevel@tonic-gate 1040Sstevel@tonic-gate#define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 1050Sstevel@tonic-gate _enable_mask, _flags, _gate_flags) \ 1060Sstevel@tonic-gate SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0, \ 1070Sstevel@tonic-gate _enable_mask, _flags, _gate_flags, \ 1080Sstevel@tonic-gate &sprd_gate_ops) 1091103Sjbeloro 1107834SMichael.Bergknoff@Sun.COM#define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \ 1110Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 1120Sstevel@tonic-gate _gate_flags, _udelay) \ 1133941Svenki SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \ 1143941Svenki _sc_offset, _enable_mask, \ 1153941Svenki _flags, _gate_flags, _udelay, \ 1163941Svenki &sprd_pll_sc_gate_ops) 1173941Svenki 1183941Svenki#define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 1193941Svenki _reg, _sc_offset, \ 1203941Svenki _enable_mask, _flags, \ 1213941Svenki _gate_flags, _udelay, _ops) \ 1223941Svenki SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ 1233941Svenki _sc_offset, _enable_mask, _flags, \ 1243941Svenki _gate_flags, _udelay, _ops, \ 1253941Svenki CLK_HW_INIT_FW_NAME) 1263941Svenki 1273941Svenki#define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \ 1283941Svenki _sc_offset, _enable_mask, _flags, \ 1293941Svenki _gate_flags, _ops) \ 1303941Svenki SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 1313941Svenki _reg, _sc_offset, \ 1323941Svenki _enable_mask, _flags, \ 1333941Svenki _gate_flags, 0, _ops) 1340Sstevel@tonic-gate 1350Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 1360Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 1370Sstevel@tonic-gate _gate_flags) \ 1380Sstevel@tonic-gate SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \ 1390Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 1400Sstevel@tonic-gate _gate_flags, &sprd_sc_gate_ops) 1410Sstevel@tonic-gate 1420Sstevel@tonic-gate#define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 1430Sstevel@tonic-gate _enable_mask, _flags, _gate_flags) \ 1440Sstevel@tonic-gate SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0, \ 1450Sstevel@tonic-gate _enable_mask, _flags, _gate_flags, \ 1460Sstevel@tonic-gate &sprd_gate_ops) 1470Sstevel@tonic-gate 1480Sstevel@tonic-gate#define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \ 1490Sstevel@tonic-gate _sc_offset, _enable_mask, _flags, \ 1500Sstevel@tonic-gate _gate_flags, _udelay) \ 1510Sstevel@tonic-gate SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \ 1520Sstevel@tonic-gate _reg, _sc_offset, \ 1530Sstevel@tonic-gate _enable_mask, _flags, \ 1540Sstevel@tonic-gate _gate_flags, _udelay, \ 1550Sstevel@tonic-gate &sprd_pll_sc_gate_ops) 1560Sstevel@tonic-gate 1570Sstevel@tonic-gatestatic inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw) 1580Sstevel@tonic-gate{ 1590Sstevel@tonic-gate struct sprd_clk_common *common = hw_to_sprd_clk_common(hw); 1600Sstevel@tonic-gate 1610Sstevel@tonic-gate return container_of(common, struct sprd_gate, common); 1620Sstevel@tonic-gate} 1630Sstevel@tonic-gate 1640Sstevel@tonic-gateextern const struct clk_ops sprd_gate_ops; 1650Sstevel@tonic-gateextern const struct clk_ops sprd_sc_gate_ops; 1660Sstevel@tonic-gateextern const struct clk_ops sprd_pll_sc_gate_ops; 1670Sstevel@tonic-gate 1680Sstevel@tonic-gate#endif /* _SPRD_GATE_H_ */ 1690Sstevel@tonic-gate