clk: sunxi-ng: mux: Allow muxes to have keys
authorSamuel Holland <samuel@sholland.org>
Thu, 3 Feb 2022 02:17:34 +0000 (20:17 -0600)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 23 Mar 2022 18:58:38 +0000 (19:58 +0100)
The muxes in the RTC can only be updated when setting a key field to a
specific value. Add a feature flag to denote muxes with this property.

Since so far the key value is always the same, it does not need to be
provided separately for each mux.

Signed-off-by: Samuel Holland <samuel@sholland.org>
Acked-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20220203021736.13434-5-samuel@sholland.org
drivers/clk/sunxi-ng/ccu_common.h
drivers/clk/sunxi-ng/ccu_mux.c

index 98a1834..fbf16c6 100644 (file)
@@ -17,6 +17,7 @@
 #define CCU_FEATURE_LOCK_REG           BIT(5)
 #define CCU_FEATURE_MMC_TIMING_SWITCH  BIT(6)
 #define CCU_FEATURE_SIGMA_DELTA_MOD    BIT(7)
+#define CCU_FEATURE_KEY_FIELD          BIT(8)
 
 /* MMC timing mode switch bit */
 #define CCU_MMC_NEW_TIMING_MODE                BIT(30)
index 2306a1c..1d557e3 100644 (file)
@@ -12,6 +12,8 @@
 #include "ccu_gate.h"
 #include "ccu_mux.h"
 
+#define CCU_MUX_KEY_VALUE              0x16aa0000
+
 static u16 ccu_mux_get_prediv(struct ccu_common *common,
                              struct ccu_mux_internal *cm,
                              int parent_index)
@@ -191,6 +193,11 @@ int ccu_mux_helper_set_parent(struct ccu_common *common,
        spin_lock_irqsave(common->lock, flags);
 
        reg = readl(common->base + common->reg);
+
+       /* The key field always reads as zero. */
+       if (common->features & CCU_FEATURE_KEY_FIELD)
+               reg |= CCU_MUX_KEY_VALUE;
+
        reg &= ~GENMASK(cm->width + cm->shift - 1, cm->shift);
        writel(reg | (index << cm->shift), common->base + common->reg);