[PATCH 2/2] clk: Add option to restrict clk-gate2 to one bit toggle

Sean Anderson seanga2 at gmail.com
Wed Dec 25 06:17:45 CET 2019


Currently clk-gate2 only works on clocks with a 2-bit enable/disable state. This
patch adds an option to work with clocks with a 1-bit enable.

Signed-off-by: Sean Anderson <seanga2 at gmail.com>
---
 drivers/clk/clk-gate2.c      | 13 ++++++++++---
 include/linux/clk-provider.h |  2 ++
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/clk/clk-gate2.c b/drivers/clk/clk-gate2.c
index cfe21e5496..565d9e49ca 100644
--- a/drivers/clk/clk-gate2.c
+++ b/drivers/clk/clk-gate2.c
@@ -29,8 +29,12 @@ static int clk_gate2_enable(struct clk *clk)
 	u32 reg;

 	reg = readl(gate->reg);
-	reg &= ~(3 << gate->bit_idx);
-	reg |= gate->cgr_val << gate->bit_idx;
+	if (gate->flags & CLK_GATE2_SINGLE_BIT) {
+		reg |= BIT(gate->bit_idx);
+	} else {
+		reg &= ~(3 << gate->bit_idx);
+		reg |= gate->cgr_val << gate->bit_idx;
+	}
 	writel(reg, gate->reg);

 	return 0;
@@ -42,7 +46,10 @@ static int clk_gate2_disable(struct clk *clk)
 	u32 reg;

 	reg = readl(gate->reg);
-	reg &= ~(3 << gate->bit_idx);
+	if (gate->flags & CLK_GATE2_SINGLE_BIT)
+		reg &= ~BIT(gate->bit_idx);
+	else
+		reg &= ~(3 << gate->bit_idx);
 	writel(reg, gate->reg);

 	return 0;
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index f510291018..c904586e2c 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -155,6 +155,8 @@ struct clk_composite {

 #define to_clk_composite(_clk) container_of(_clk, struct clk_composite, clk)

+#define CLK_GATE2_SINGLE_BIT BIT(0)
+
 struct clk_gate2 {
 	struct clk clk;
 	void __iomem	*reg;
-- 
2.24.1



More information about the U-Boot mailing list