From: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
To: Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@codeaurora.org>,
Rob Herring <robh+dt@kernel.org>,
Mark Rutland <mark.rutland@arm.com>
Cc: <linux-clk@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<devicetree@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
Arnd Bergmann <arnd@arndb.de>, Mark Brown <broonie@kernel.org>,
Xiaolong Zhang <xiaolong.zhang@spreadtrum.com>,
Orson Zhai <orson.zhai@spreadtrum.com>,
Geng Ren <geng.ren@spreadtrum.com>,
Chunyan Zhang <zhang.lyra@gmail.com>,
Chunyan Zhang <chunyan.zhang@spreadtrum.com>
Subject: [PATCH V1 3/9] clk: sprd: add gate clock support
Date: Sun, 18 Jun 2017 09:58:49 +0800 [thread overview]
Message-ID: <20170618015855.27738-4-chunyan.zhang@spreadtrum.com> (raw)
In-Reply-To: <20170618015855.27738-1-chunyan.zhang@spreadtrum.com>
Some clocks on the Spreadtrum's SoCs are just simple gates. Add
support for those clocks.
Also, some gate clocks are orphan, so this patch also added
registration code for those.
Signed-off-by: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
---
drivers/clk/sprd/Makefile | 2 +-
drivers/clk/sprd/ccu_gate.c | 102 ++++++++++++++++++++++++++++++++++++++++++++
drivers/clk/sprd/ccu_gate.h | 73 +++++++++++++++++++++++++++++++
3 files changed, 176 insertions(+), 1 deletion(-)
create mode 100644 drivers/clk/sprd/ccu_gate.c
create mode 100644 drivers/clk/sprd/ccu_gate.h
diff --git a/drivers/clk/sprd/Makefile b/drivers/clk/sprd/Makefile
index 8f802b2..333e2b2 100644
--- a/drivers/clk/sprd/Makefile
+++ b/drivers/clk/sprd/Makefile
@@ -1,3 +1,3 @@
ifneq ($(CONFIG_OF),)
-obj-y += ccu_common.o
+obj-y += ccu_common.o ccu_gate.o
endif
diff --git a/drivers/clk/sprd/ccu_gate.c b/drivers/clk/sprd/ccu_gate.c
new file mode 100644
index 0000000..3d27615
--- /dev/null
+++ b/drivers/clk/sprd/ccu_gate.c
@@ -0,0 +1,102 @@
+/*
+ * Spreadtrum gate clock driver
+ *
+ * Copyright (C) 2017 Spreadtrum, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <linux/clk-provider.h>
+
+#include "ccu_gate.h"
+
+DEFINE_SPINLOCK(gate_lock);
+
+static void ccu_gate_endisable(struct ccu_gate *cg, u32 en)
+{
+ struct ccu_common *common = &cg->common;
+ unsigned long flags = 0;
+ u32 reg;
+ int set = cg->flags & CLK_GATE_SET_TO_DISABLE ? 1 : 0;
+
+ set ^= en;
+
+ spin_lock_irqsave(common->lock, flags);
+
+ reg = ccu_readl(common);
+
+ if (set)
+ reg |= cg->op_bit;
+ else
+ reg &= ~cg->op_bit;
+
+ ccu_writel(reg, common);
+
+ spin_unlock_irqrestore(common->lock, flags);
+}
+
+static void ccu_sc_gate_endisable(struct ccu_gate *cg, u32 en)
+{
+ struct ccu_common *common = &cg->common;
+ unsigned long flags = 0;
+ int set = cg->flags & CLK_GATE_SET_TO_DISABLE ? 1 : 0;
+ u32 offset;
+
+ set ^= en;
+
+ /*
+ * Each set/clear gate clock has three registers:
+ * common->reg - base register
+ * common->reg + offset - set register
+ * common->reg + 2 * offset - clear register
+ */
+ offset = set ? cg->sc_offset : cg->sc_offset * 2;
+
+ spin_lock_irqsave(common->lock, flags);
+ ccu_writel_offset(cg->op_bit, common, offset);
+ spin_unlock_irqrestore(common->lock, flags);
+}
+
+static void ccu_gate_disable(struct clk_hw *hw)
+{
+ struct ccu_gate *cg = hw_to_ccu_gate(hw);
+
+ if (cg->sc_offset)
+ ccu_sc_gate_endisable(cg, 0);
+ else
+ ccu_gate_endisable(cg, 0);
+}
+
+static int ccu_gate_enable(struct clk_hw *hw)
+{
+ struct ccu_gate *cg = hw_to_ccu_gate(hw);
+
+ if (cg->sc_offset)
+ ccu_sc_gate_endisable(cg, 1);
+ else
+ ccu_gate_endisable(cg, 1);
+
+ return 0;
+}
+
+static int ccu_gate_is_enabled(struct clk_hw *hw)
+{
+ struct ccu_gate *cg = hw_to_ccu_gate(hw);
+ struct ccu_common *common = &cg->common;
+ u32 reg;
+
+ reg = ccu_readl(common);
+
+ if (cg->flags & CLK_GATE_SET_TO_DISABLE)
+ reg ^= cg->op_bit;
+
+ reg &= cg->op_bit;
+
+ return reg ? 1 : 0;
+}
+
+const struct clk_ops ccu_gate_ops = {
+ .disable = ccu_gate_disable,
+ .enable = ccu_gate_enable,
+ .is_enabled = ccu_gate_is_enabled,
+};
diff --git a/drivers/clk/sprd/ccu_gate.h b/drivers/clk/sprd/ccu_gate.h
new file mode 100644
index 0000000..bc40169
--- /dev/null
+++ b/drivers/clk/sprd/ccu_gate.h
@@ -0,0 +1,73 @@
+/*
+ * Spreadtrum gate clock driver
+ *
+ * Copyright (C) 2017 Spreadtrum, Inc.
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#ifndef _CCU_GATE_H_
+#define _CCU_GATE_H_
+
+#include "ccu_common.h"
+
+struct ccu_gate {
+ u32 op_bit;
+ u16 flags;
+ u16 sc_offset;
+
+ struct ccu_common common;
+};
+
+#define SPRD_CCU_GATE(_struct, _name, _parent, _reg, _sc_offset, \
+ _op_bit, _flags, _gate_flags) \
+ struct ccu_gate _struct = { \
+ .op_bit = _op_bit, \
+ .sc_offset = _sc_offset, \
+ .flags = _gate_flags, \
+ .common = { \
+ .reg = _reg, \
+ .lock = &gate_lock, \
+ .hw.init = CLK_HW_INIT(_name, \
+ _parent, \
+ &ccu_gate_ops, \
+ _flags), \
+ } \
+ }
+
+#define SPRD_CCU_GATE_NO_PARENT(_struct, _name, _reg, _sc_offset, \
+ _op_bit, _flags, _gate_flags) \
+ struct ccu_gate _struct = { \
+ .op_bit = _op_bit, \
+ .sc_offset = _sc_offset, \
+ .flags = _gate_flags, \
+ .common = { \
+ .reg = _reg, \
+ .lock = &gate_lock, \
+ .hw.init = CLK_HW_INIT_NO_PARENT(_name, \
+ &ccu_gate_ops, \
+ _flags), \
+ } \
+ }
+
+static inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
+{
+ struct ccu_common *common = hw_to_ccu_common(hw);
+
+ return container_of(common, struct ccu_gate, common);
+}
+
+static inline void ccu_writel_offset(u32 val,
+ struct ccu_common *common, u32 offset)
+{
+ writel(val, common->base + common->reg + offset);
+}
+
+void ccu_gate_helper_disable(struct ccu_common *common, u32 gate);
+int ccu_gate_helper_enable(struct ccu_common *common, u32 gate);
+int ccu_gate_helper_is_enabled(struct ccu_common *common, u32 gate);
+
+extern const struct clk_ops ccu_gate_ops;
+extern spinlock_t gate_lock;
+
+#endif /* _CCU_GATE_H_ */
--
2.7.4
next prev parent reply other threads:[~2017-06-18 2:02 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-18 1:58 [PATCH V1 0/9] add clock driver for Spreadtrum platforms Chunyan Zhang
2017-06-18 1:58 ` [PATCH V1 1/9] dt-bindings: Add Spreadtrum CCU binding documentation Chunyan Zhang
2017-06-23 20:05 ` Rob Herring
2017-06-18 1:58 ` [PATCH V1 2/9] clk: sprd: Add common infrastructure Chunyan Zhang
2017-06-20 1:29 ` Stephen Boyd
2017-06-22 10:12 ` Chunyan Zhang
2017-06-18 1:58 ` Chunyan Zhang [this message]
2017-06-20 1:31 ` [PATCH V1 3/9] clk: sprd: add gate clock support Stephen Boyd
2017-06-22 10:16 ` Chunyan Zhang
2017-06-30 1:43 ` Stephen Boyd
2017-06-18 1:58 ` [PATCH V1 4/9] clk: sprd: add mux " Chunyan Zhang
2017-06-18 1:58 ` [PATCH V1 5/9] clk: sprd: add divider " Chunyan Zhang
2017-06-18 1:58 ` [PATCH V1 6/9] clk: sprd: add composite " Chunyan Zhang
2017-06-19 0:13 ` kbuild test robot
2017-06-18 1:58 ` [PATCH V1 7/9] clk: sprd: add adjustable pll support Chunyan Zhang
2017-06-20 1:37 ` Stephen Boyd
2017-06-22 10:17 ` Chunyan Zhang
2017-06-22 11:15 ` Arnd Bergmann
2017-06-22 12:06 ` Chunyan Zhang
2017-06-30 1:44 ` Stephen Boyd
2017-06-30 7:55 ` Chunyan Zhang
2017-06-30 19:22 ` Stephen Boyd
2017-07-03 7:41 ` Chunyan Zhang
2017-06-18 1:58 ` [PATCH V1 8/9] clk: sprd: add clocks support for SC9860 Chunyan Zhang
2017-06-20 1:41 ` Stephen Boyd
2017-06-22 10:21 ` Chunyan Zhang
2017-06-30 1:41 ` Stephen Boyd
2017-06-18 1:58 ` [PATCH V1 9/9] arm64: dts: add ccu " Chunyan Zhang
2017-06-20 1:24 ` Stephen Boyd
2017-06-22 10:24 ` Chunyan Zhang
2017-06-30 0:57 ` Stephen Boyd
2017-06-30 7:37 ` Chunyan Zhang
2017-06-20 1:25 ` [PATCH V1 0/9] add clock driver for Spreadtrum platforms Stephen Boyd
2017-06-22 10:07 ` Chunyan Zhang
2017-06-30 0:45 ` Stephen Boyd
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170618015855.27738-4-chunyan.zhang@spreadtrum.com \
--to=chunyan.zhang@spreadtrum.com \
--cc=arnd@arndb.de \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=geng.ren@spreadtrum.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mturquette@baylibre.com \
--cc=orson.zhai@spreadtrum.com \
--cc=robh+dt@kernel.org \
--cc=sboyd@codeaurora.org \
--cc=xiaolong.zhang@spreadtrum.com \
--cc=zhang.lyra@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®