},                                                              \
 }
 
+#define AUD_SCLK_WS(_name, _reg, _width, _shift_ph, _shift_ws, _pname, \
+                   _iflags) {                                          \
+       .data = &(struct meson_sclk_ws_inv_data) {                      \
+               .ph = {                                                 \
+                       .reg_off = (_reg),                              \
+                       .shift   = (_shift_ph),                         \
+                       .width   = (_width),                            \
+               },                                                      \
+               .ws = {                                                 \
+                       .reg_off = (_reg),                              \
+                       .shift   = (_shift_ws),                         \
+                       .width   = (_width),                            \
+               },                                                      \
+       },                                                              \
+       .hw.init = &(struct clk_init_data) {                            \
+               .name = "aud_"#_name,                                   \
+               .ops = &meson_clk_phase_ops,                            \
+               .parent_names = (const char *[]){ #_pname },            \
+               .num_parents = 1,                                       \
+               .flags = (_iflags),                                     \
+       },                                                              \
+}
+
 /* Audio Master Clocks */
 static const struct clk_parent_data mst_mux_parent_data[] = {
        { .fw_name = "mst_in0", },
        AUD_PHASE(tdm##_name##_sclk, _reg, 1, 29,                       \
                  aud_tdm##_name##_sclk_post_en,                        \
                  CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT)
+#define AUD_TDM_SCLK_WS(_name, _reg)                                   \
+       AUD_SCLK_WS(tdm##_name##_sclk, _reg, 1, 29, 28,                 \
+                   aud_tdm##_name##_sclk_post_en,                      \
+                   CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT)
 
 #define AUD_TDM_LRLCK(_name, _reg)                                     \
        AUD_MUX(tdm##_name##_lrclk, _reg, 0xf, 20,                      \
        AUD_TDM_SCLK(in_c, AUDIO_CLK_TDMIN_C_CTRL);
 static struct clk_regmap tdmin_lb_sclk =
        AUD_TDM_SCLK(in_lb, AUDIO_CLK_TDMIN_LB_CTRL);
-static struct clk_regmap tdmout_a_sclk =
-       AUD_TDM_SCLK(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
-static struct clk_regmap tdmout_b_sclk =
-       AUD_TDM_SCLK(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
-static struct clk_regmap tdmout_c_sclk =
-       AUD_TDM_SCLK(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
 
 static struct clk_regmap tdmin_a_lrclk =
        AUD_TDM_LRLCK(in_a, AUDIO_CLK_TDMIN_A_CTRL);
 static struct clk_regmap tdmout_c_lrclk =
        AUD_TDM_LRLCK(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
 
+/* AXG Clocks */
+static struct clk_regmap axg_tdmout_a_sclk =
+       AUD_TDM_SCLK(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
+static struct clk_regmap axg_tdmout_b_sclk =
+       AUD_TDM_SCLK(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
+static struct clk_regmap axg_tdmout_c_sclk =
+       AUD_TDM_SCLK(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
+
 /* AXG/G12A Clocks */
 static struct clk_hw axg_aud_top = {
        .init = &(struct clk_init_data) {
 static struct clk_regmap g12a_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL(
        sclk_pad_2, AUDIO_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data);
 
-/* G12a/SM1 clocks */
+static struct clk_regmap g12a_tdmout_a_sclk =
+       AUD_TDM_SCLK_WS(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
+static struct clk_regmap g12a_tdmout_b_sclk =
+       AUD_TDM_SCLK_WS(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
+static struct clk_regmap g12a_tdmout_c_sclk =
+       AUD_TDM_SCLK_WS(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
+
 static struct clk_regmap toram =
        AUD_PCLK_GATE(toram, AUDIO_CLK_GATE_EN, 20);
 static struct clk_regmap spdifout_b =
                [AUD_CLKID_TDMIN_B_SCLK]        = &tdmin_b_sclk.hw,
                [AUD_CLKID_TDMIN_C_SCLK]        = &tdmin_c_sclk.hw,
                [AUD_CLKID_TDMIN_LB_SCLK]       = &tdmin_lb_sclk.hw,
-               [AUD_CLKID_TDMOUT_A_SCLK]       = &tdmout_a_sclk.hw,
-               [AUD_CLKID_TDMOUT_B_SCLK]       = &tdmout_b_sclk.hw,
-               [AUD_CLKID_TDMOUT_C_SCLK]       = &tdmout_c_sclk.hw,
+               [AUD_CLKID_TDMOUT_A_SCLK]       = &axg_tdmout_a_sclk.hw,
+               [AUD_CLKID_TDMOUT_B_SCLK]       = &axg_tdmout_b_sclk.hw,
+               [AUD_CLKID_TDMOUT_C_SCLK]       = &axg_tdmout_c_sclk.hw,
                [AUD_CLKID_TDMIN_A_LRCLK]       = &tdmin_a_lrclk.hw,
                [AUD_CLKID_TDMIN_B_LRCLK]       = &tdmin_b_lrclk.hw,
                [AUD_CLKID_TDMIN_C_LRCLK]       = &tdmin_c_lrclk.hw,
                [AUD_CLKID_TDMIN_B_SCLK]        = &tdmin_b_sclk.hw,
                [AUD_CLKID_TDMIN_C_SCLK]        = &tdmin_c_sclk.hw,
                [AUD_CLKID_TDMIN_LB_SCLK]       = &tdmin_lb_sclk.hw,
-               [AUD_CLKID_TDMOUT_A_SCLK]       = &tdmout_a_sclk.hw,
-               [AUD_CLKID_TDMOUT_B_SCLK]       = &tdmout_b_sclk.hw,
-               [AUD_CLKID_TDMOUT_C_SCLK]       = &tdmout_c_sclk.hw,
+               [AUD_CLKID_TDMOUT_A_SCLK]       = &g12a_tdmout_a_sclk.hw,
+               [AUD_CLKID_TDMOUT_B_SCLK]       = &g12a_tdmout_b_sclk.hw,
+               [AUD_CLKID_TDMOUT_C_SCLK]       = &g12a_tdmout_c_sclk.hw,
                [AUD_CLKID_TDMIN_A_LRCLK]       = &tdmin_a_lrclk.hw,
                [AUD_CLKID_TDMIN_B_LRCLK]       = &tdmin_b_lrclk.hw,
                [AUD_CLKID_TDMIN_C_LRCLK]       = &tdmin_c_lrclk.hw,
                [AUD_CLKID_TDMIN_B_SCLK]        = &tdmin_b_sclk.hw,
                [AUD_CLKID_TDMIN_C_SCLK]        = &tdmin_c_sclk.hw,
                [AUD_CLKID_TDMIN_LB_SCLK]       = &tdmin_lb_sclk.hw,
-               [AUD_CLKID_TDMOUT_A_SCLK]       = &tdmout_a_sclk.hw,
-               [AUD_CLKID_TDMOUT_B_SCLK]       = &tdmout_b_sclk.hw,
-               [AUD_CLKID_TDMOUT_C_SCLK]       = &tdmout_c_sclk.hw,
+               [AUD_CLKID_TDMOUT_A_SCLK]       = &g12a_tdmout_a_sclk.hw,
+               [AUD_CLKID_TDMOUT_B_SCLK]       = &g12a_tdmout_b_sclk.hw,
+               [AUD_CLKID_TDMOUT_C_SCLK]       = &g12a_tdmout_c_sclk.hw,
                [AUD_CLKID_TDMIN_A_LRCLK]       = &tdmin_a_lrclk.hw,
                [AUD_CLKID_TDMIN_B_LRCLK]       = &tdmin_b_lrclk.hw,
                [AUD_CLKID_TDMIN_C_LRCLK]       = &tdmin_c_lrclk.hw,
        &tdmin_b_sclk,
        &tdmin_c_sclk,
        &tdmin_lb_sclk,
-       &tdmout_a_sclk,
-       &tdmout_b_sclk,
-       &tdmout_c_sclk,
+       &axg_tdmout_a_sclk,
+       &axg_tdmout_b_sclk,
+       &axg_tdmout_c_sclk,
        &tdmin_a_lrclk,
        &tdmin_b_lrclk,
        &tdmin_c_lrclk,
        &tdmin_b_sclk,
        &tdmin_c_sclk,
        &tdmin_lb_sclk,
-       &tdmout_a_sclk,
-       &tdmout_b_sclk,
-       &tdmout_c_sclk,
+       &g12a_tdmout_a_sclk,
+       &g12a_tdmout_b_sclk,
+       &g12a_tdmout_c_sclk,
        &tdmin_a_lrclk,
        &tdmin_b_lrclk,
        &tdmin_c_lrclk,
        &tdmin_b_sclk,
        &tdmin_c_sclk,
        &tdmin_lb_sclk,
-       &tdmout_a_sclk,
-       &tdmout_b_sclk,
-       &tdmout_c_sclk,
+       &g12a_tdmout_a_sclk,
+       &g12a_tdmout_b_sclk,
+       &g12a_tdmout_c_sclk,
        &tdmin_a_lrclk,
        &tdmin_b_lrclk,
        &tdmin_c_lrclk,