0001
0002
0003
0004
0005
0006
0007 #include <linux/clk.h>
0008 #include <linux/clk-provider.h>
0009 #include <linux/init.h>
0010 #include <linux/of_device.h>
0011 #include <linux/module.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/regmap.h>
0014 #include <linux/reset.h>
0015 #include <linux/reset-controller.h>
0016 #include <linux/slab.h>
0017
0018 #include "axg-audio.h"
0019 #include "clk-regmap.h"
0020 #include "clk-phase.h"
0021 #include "sclk-div.h"
0022
0023 #define AUD_GATE(_name, _reg, _bit, _pname, _iflags) { \
0024 .data = &(struct clk_regmap_gate_data){ \
0025 .offset = (_reg), \
0026 .bit_idx = (_bit), \
0027 }, \
0028 .hw.init = &(struct clk_init_data) { \
0029 .name = "aud_"#_name, \
0030 .ops = &clk_regmap_gate_ops, \
0031 .parent_names = (const char *[]){ #_pname }, \
0032 .num_parents = 1, \
0033 .flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \
0034 }, \
0035 }
0036
0037 #define AUD_MUX(_name, _reg, _mask, _shift, _dflags, _pdata, _iflags) { \
0038 .data = &(struct clk_regmap_mux_data){ \
0039 .offset = (_reg), \
0040 .mask = (_mask), \
0041 .shift = (_shift), \
0042 .flags = (_dflags), \
0043 }, \
0044 .hw.init = &(struct clk_init_data){ \
0045 .name = "aud_"#_name, \
0046 .ops = &clk_regmap_mux_ops, \
0047 .parent_data = _pdata, \
0048 .num_parents = ARRAY_SIZE(_pdata), \
0049 .flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \
0050 }, \
0051 }
0052
0053 #define AUD_DIV(_name, _reg, _shift, _width, _dflags, _pname, _iflags) { \
0054 .data = &(struct clk_regmap_div_data){ \
0055 .offset = (_reg), \
0056 .shift = (_shift), \
0057 .width = (_width), \
0058 .flags = (_dflags), \
0059 }, \
0060 .hw.init = &(struct clk_init_data){ \
0061 .name = "aud_"#_name, \
0062 .ops = &clk_regmap_divider_ops, \
0063 .parent_names = (const char *[]){ #_pname }, \
0064 .num_parents = 1, \
0065 .flags = (_iflags), \
0066 }, \
0067 }
0068
0069 #define AUD_PCLK_GATE(_name, _reg, _bit) { \
0070 .data = &(struct clk_regmap_gate_data){ \
0071 .offset = (_reg), \
0072 .bit_idx = (_bit), \
0073 }, \
0074 .hw.init = &(struct clk_init_data) { \
0075 .name = "aud_"#_name, \
0076 .ops = &clk_regmap_gate_ops, \
0077 .parent_names = (const char *[]){ "aud_top" }, \
0078 .num_parents = 1, \
0079 }, \
0080 }
0081
0082 #define AUD_SCLK_DIV(_name, _reg, _div_shift, _div_width, \
0083 _hi_shift, _hi_width, _pname, _iflags) { \
0084 .data = &(struct meson_sclk_div_data) { \
0085 .div = { \
0086 .reg_off = (_reg), \
0087 .shift = (_div_shift), \
0088 .width = (_div_width), \
0089 }, \
0090 .hi = { \
0091 .reg_off = (_reg), \
0092 .shift = (_hi_shift), \
0093 .width = (_hi_width), \
0094 }, \
0095 }, \
0096 .hw.init = &(struct clk_init_data) { \
0097 .name = "aud_"#_name, \
0098 .ops = &meson_sclk_div_ops, \
0099 .parent_names = (const char *[]){ #_pname }, \
0100 .num_parents = 1, \
0101 .flags = (_iflags), \
0102 }, \
0103 }
0104
0105 #define AUD_TRIPHASE(_name, _reg, _width, _shift0, _shift1, _shift2, \
0106 _pname, _iflags) { \
0107 .data = &(struct meson_clk_triphase_data) { \
0108 .ph0 = { \
0109 .reg_off = (_reg), \
0110 .shift = (_shift0), \
0111 .width = (_width), \
0112 }, \
0113 .ph1 = { \
0114 .reg_off = (_reg), \
0115 .shift = (_shift1), \
0116 .width = (_width), \
0117 }, \
0118 .ph2 = { \
0119 .reg_off = (_reg), \
0120 .shift = (_shift2), \
0121 .width = (_width), \
0122 }, \
0123 }, \
0124 .hw.init = &(struct clk_init_data) { \
0125 .name = "aud_"#_name, \
0126 .ops = &meson_clk_triphase_ops, \
0127 .parent_names = (const char *[]){ #_pname }, \
0128 .num_parents = 1, \
0129 .flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \
0130 }, \
0131 }
0132
0133 #define AUD_PHASE(_name, _reg, _width, _shift, _pname, _iflags) { \
0134 .data = &(struct meson_clk_phase_data) { \
0135 .ph = { \
0136 .reg_off = (_reg), \
0137 .shift = (_shift), \
0138 .width = (_width), \
0139 }, \
0140 }, \
0141 .hw.init = &(struct clk_init_data) { \
0142 .name = "aud_"#_name, \
0143 .ops = &meson_clk_phase_ops, \
0144 .parent_names = (const char *[]){ #_pname }, \
0145 .num_parents = 1, \
0146 .flags = (_iflags), \
0147 }, \
0148 }
0149
0150 #define AUD_SCLK_WS(_name, _reg, _width, _shift_ph, _shift_ws, _pname, \
0151 _iflags) { \
0152 .data = &(struct meson_sclk_ws_inv_data) { \
0153 .ph = { \
0154 .reg_off = (_reg), \
0155 .shift = (_shift_ph), \
0156 .width = (_width), \
0157 }, \
0158 .ws = { \
0159 .reg_off = (_reg), \
0160 .shift = (_shift_ws), \
0161 .width = (_width), \
0162 }, \
0163 }, \
0164 .hw.init = &(struct clk_init_data) { \
0165 .name = "aud_"#_name, \
0166 .ops = &meson_clk_phase_ops, \
0167 .parent_names = (const char *[]){ #_pname }, \
0168 .num_parents = 1, \
0169 .flags = (_iflags), \
0170 }, \
0171 }
0172
0173
0174 static const struct clk_parent_data mst_mux_parent_data[] = {
0175 { .fw_name = "mst_in0", },
0176 { .fw_name = "mst_in1", },
0177 { .fw_name = "mst_in2", },
0178 { .fw_name = "mst_in3", },
0179 { .fw_name = "mst_in4", },
0180 { .fw_name = "mst_in5", },
0181 { .fw_name = "mst_in6", },
0182 { .fw_name = "mst_in7", },
0183 };
0184
0185 #define AUD_MST_MUX(_name, _reg, _flag) \
0186 AUD_MUX(_name##_sel, _reg, 0x7, 24, _flag, \
0187 mst_mux_parent_data, 0)
0188 #define AUD_MST_DIV(_name, _reg, _flag) \
0189 AUD_DIV(_name##_div, _reg, 0, 16, _flag, \
0190 aud_##_name##_sel, CLK_SET_RATE_PARENT)
0191 #define AUD_MST_MCLK_GATE(_name, _reg) \
0192 AUD_GATE(_name, _reg, 31, aud_##_name##_div, \
0193 CLK_SET_RATE_PARENT)
0194
0195 #define AUD_MST_MCLK_MUX(_name, _reg) \
0196 AUD_MST_MUX(_name, _reg, CLK_MUX_ROUND_CLOSEST)
0197 #define AUD_MST_MCLK_DIV(_name, _reg) \
0198 AUD_MST_DIV(_name, _reg, CLK_DIVIDER_ROUND_CLOSEST)
0199
0200 #define AUD_MST_SYS_MUX(_name, _reg) \
0201 AUD_MST_MUX(_name, _reg, 0)
0202 #define AUD_MST_SYS_DIV(_name, _reg) \
0203 AUD_MST_DIV(_name, _reg, 0)
0204
0205
0206 #define AUD_MST_SCLK_PRE_EN(_name, _reg) \
0207 AUD_GATE(mst_##_name##_sclk_pre_en, _reg, 31, \
0208 aud_mst_##_name##_mclk, 0)
0209 #define AUD_MST_SCLK_DIV(_name, _reg) \
0210 AUD_SCLK_DIV(mst_##_name##_sclk_div, _reg, 20, 10, 0, 0, \
0211 aud_mst_##_name##_sclk_pre_en, \
0212 CLK_SET_RATE_PARENT)
0213 #define AUD_MST_SCLK_POST_EN(_name, _reg) \
0214 AUD_GATE(mst_##_name##_sclk_post_en, _reg, 30, \
0215 aud_mst_##_name##_sclk_div, CLK_SET_RATE_PARENT)
0216 #define AUD_MST_SCLK(_name, _reg) \
0217 AUD_TRIPHASE(mst_##_name##_sclk, _reg, 1, 0, 2, 4, \
0218 aud_mst_##_name##_sclk_post_en, CLK_SET_RATE_PARENT)
0219
0220 #define AUD_MST_LRCLK_DIV(_name, _reg) \
0221 AUD_SCLK_DIV(mst_##_name##_lrclk_div, _reg, 0, 10, 10, 10, \
0222 aud_mst_##_name##_sclk_post_en, 0)
0223 #define AUD_MST_LRCLK(_name, _reg) \
0224 AUD_TRIPHASE(mst_##_name##_lrclk, _reg, 1, 1, 3, 5, \
0225 aud_mst_##_name##_lrclk_div, CLK_SET_RATE_PARENT)
0226
0227
0228 static const struct clk_parent_data tdm_sclk_parent_data[] = {
0229 { .name = "aud_mst_a_sclk", .index = -1, },
0230 { .name = "aud_mst_b_sclk", .index = -1, },
0231 { .name = "aud_mst_c_sclk", .index = -1, },
0232 { .name = "aud_mst_d_sclk", .index = -1, },
0233 { .name = "aud_mst_e_sclk", .index = -1, },
0234 { .name = "aud_mst_f_sclk", .index = -1, },
0235 { .fw_name = "slv_sclk0", },
0236 { .fw_name = "slv_sclk1", },
0237 { .fw_name = "slv_sclk2", },
0238 { .fw_name = "slv_sclk3", },
0239 { .fw_name = "slv_sclk4", },
0240 { .fw_name = "slv_sclk5", },
0241 { .fw_name = "slv_sclk6", },
0242 { .fw_name = "slv_sclk7", },
0243 { .fw_name = "slv_sclk8", },
0244 { .fw_name = "slv_sclk9", },
0245 };
0246
0247
0248 static const struct clk_parent_data tdm_lrclk_parent_data[] = {
0249 { .name = "aud_mst_a_lrclk", .index = -1, },
0250 { .name = "aud_mst_b_lrclk", .index = -1, },
0251 { .name = "aud_mst_c_lrclk", .index = -1, },
0252 { .name = "aud_mst_d_lrclk", .index = -1, },
0253 { .name = "aud_mst_e_lrclk", .index = -1, },
0254 { .name = "aud_mst_f_lrclk", .index = -1, },
0255 { .fw_name = "slv_lrclk0", },
0256 { .fw_name = "slv_lrclk1", },
0257 { .fw_name = "slv_lrclk2", },
0258 { .fw_name = "slv_lrclk3", },
0259 { .fw_name = "slv_lrclk4", },
0260 { .fw_name = "slv_lrclk5", },
0261 { .fw_name = "slv_lrclk6", },
0262 { .fw_name = "slv_lrclk7", },
0263 { .fw_name = "slv_lrclk8", },
0264 { .fw_name = "slv_lrclk9", },
0265 };
0266
0267 #define AUD_TDM_SCLK_MUX(_name, _reg) \
0268 AUD_MUX(tdm##_name##_sclk_sel, _reg, 0xf, 24, \
0269 CLK_MUX_ROUND_CLOSEST, tdm_sclk_parent_data, 0)
0270 #define AUD_TDM_SCLK_PRE_EN(_name, _reg) \
0271 AUD_GATE(tdm##_name##_sclk_pre_en, _reg, 31, \
0272 aud_tdm##_name##_sclk_sel, CLK_SET_RATE_PARENT)
0273 #define AUD_TDM_SCLK_POST_EN(_name, _reg) \
0274 AUD_GATE(tdm##_name##_sclk_post_en, _reg, 30, \
0275 aud_tdm##_name##_sclk_pre_en, CLK_SET_RATE_PARENT)
0276 #define AUD_TDM_SCLK(_name, _reg) \
0277 AUD_PHASE(tdm##_name##_sclk, _reg, 1, 29, \
0278 aud_tdm##_name##_sclk_post_en, \
0279 CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT)
0280 #define AUD_TDM_SCLK_WS(_name, _reg) \
0281 AUD_SCLK_WS(tdm##_name##_sclk, _reg, 1, 29, 28, \
0282 aud_tdm##_name##_sclk_post_en, \
0283 CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT)
0284
0285 #define AUD_TDM_LRLCK(_name, _reg) \
0286 AUD_MUX(tdm##_name##_lrclk, _reg, 0xf, 20, \
0287 CLK_MUX_ROUND_CLOSEST, tdm_lrclk_parent_data, 0)
0288
0289
0290 static const struct clk_parent_data mclk_pad_ctrl_parent_data[] = {
0291 { .name = "aud_mst_a_mclk", .index = -1, },
0292 { .name = "aud_mst_b_mclk", .index = -1, },
0293 { .name = "aud_mst_c_mclk", .index = -1, },
0294 { .name = "aud_mst_d_mclk", .index = -1, },
0295 { .name = "aud_mst_e_mclk", .index = -1, },
0296 { .name = "aud_mst_f_mclk", .index = -1, },
0297 };
0298
0299
0300 static const struct clk_parent_data sclk_pad_ctrl_parent_data[] = {
0301 { .name = "aud_mst_a_sclk", .index = -1, },
0302 { .name = "aud_mst_b_sclk", .index = -1, },
0303 { .name = "aud_mst_c_sclk", .index = -1, },
0304 { .name = "aud_mst_d_sclk", .index = -1, },
0305 { .name = "aud_mst_e_sclk", .index = -1, },
0306 { .name = "aud_mst_f_sclk", .index = -1, },
0307 };
0308
0309
0310 static const struct clk_parent_data lrclk_pad_ctrl_parent_data[] = {
0311 { .name = "aud_mst_a_lrclk", .index = -1, },
0312 { .name = "aud_mst_b_lrclk", .index = -1, },
0313 { .name = "aud_mst_c_lrclk", .index = -1, },
0314 { .name = "aud_mst_d_lrclk", .index = -1, },
0315 { .name = "aud_mst_e_lrclk", .index = -1, },
0316 { .name = "aud_mst_f_lrclk", .index = -1, },
0317 };
0318
0319 #define AUD_TDM_PAD_CTRL(_name, _reg, _shift, _parents) \
0320 AUD_MUX(_name, _reg, 0x7, _shift, 0, _parents, \
0321 CLK_SET_RATE_NO_REPARENT)
0322
0323
0324 static struct clk_regmap ddr_arb =
0325 AUD_PCLK_GATE(ddr_arb, AUDIO_CLK_GATE_EN, 0);
0326 static struct clk_regmap pdm =
0327 AUD_PCLK_GATE(pdm, AUDIO_CLK_GATE_EN, 1);
0328 static struct clk_regmap tdmin_a =
0329 AUD_PCLK_GATE(tdmin_a, AUDIO_CLK_GATE_EN, 2);
0330 static struct clk_regmap tdmin_b =
0331 AUD_PCLK_GATE(tdmin_b, AUDIO_CLK_GATE_EN, 3);
0332 static struct clk_regmap tdmin_c =
0333 AUD_PCLK_GATE(tdmin_c, AUDIO_CLK_GATE_EN, 4);
0334 static struct clk_regmap tdmin_lb =
0335 AUD_PCLK_GATE(tdmin_lb, AUDIO_CLK_GATE_EN, 5);
0336 static struct clk_regmap tdmout_a =
0337 AUD_PCLK_GATE(tdmout_a, AUDIO_CLK_GATE_EN, 6);
0338 static struct clk_regmap tdmout_b =
0339 AUD_PCLK_GATE(tdmout_b, AUDIO_CLK_GATE_EN, 7);
0340 static struct clk_regmap tdmout_c =
0341 AUD_PCLK_GATE(tdmout_c, AUDIO_CLK_GATE_EN, 8);
0342 static struct clk_regmap frddr_a =
0343 AUD_PCLK_GATE(frddr_a, AUDIO_CLK_GATE_EN, 9);
0344 static struct clk_regmap frddr_b =
0345 AUD_PCLK_GATE(frddr_b, AUDIO_CLK_GATE_EN, 10);
0346 static struct clk_regmap frddr_c =
0347 AUD_PCLK_GATE(frddr_c, AUDIO_CLK_GATE_EN, 11);
0348 static struct clk_regmap toddr_a =
0349 AUD_PCLK_GATE(toddr_a, AUDIO_CLK_GATE_EN, 12);
0350 static struct clk_regmap toddr_b =
0351 AUD_PCLK_GATE(toddr_b, AUDIO_CLK_GATE_EN, 13);
0352 static struct clk_regmap toddr_c =
0353 AUD_PCLK_GATE(toddr_c, AUDIO_CLK_GATE_EN, 14);
0354 static struct clk_regmap loopback =
0355 AUD_PCLK_GATE(loopback, AUDIO_CLK_GATE_EN, 15);
0356 static struct clk_regmap spdifin =
0357 AUD_PCLK_GATE(spdifin, AUDIO_CLK_GATE_EN, 16);
0358 static struct clk_regmap spdifout =
0359 AUD_PCLK_GATE(spdifout, AUDIO_CLK_GATE_EN, 17);
0360 static struct clk_regmap resample =
0361 AUD_PCLK_GATE(resample, AUDIO_CLK_GATE_EN, 18);
0362 static struct clk_regmap power_detect =
0363 AUD_PCLK_GATE(power_detect, AUDIO_CLK_GATE_EN, 19);
0364
0365 static struct clk_regmap spdifout_clk_sel =
0366 AUD_MST_MCLK_MUX(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL);
0367 static struct clk_regmap pdm_dclk_sel =
0368 AUD_MST_MCLK_MUX(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0);
0369 static struct clk_regmap spdifin_clk_sel =
0370 AUD_MST_SYS_MUX(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL);
0371 static struct clk_regmap pdm_sysclk_sel =
0372 AUD_MST_SYS_MUX(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1);
0373 static struct clk_regmap spdifout_b_clk_sel =
0374 AUD_MST_MCLK_MUX(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL);
0375
0376 static struct clk_regmap spdifout_clk_div =
0377 AUD_MST_MCLK_DIV(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL);
0378 static struct clk_regmap pdm_dclk_div =
0379 AUD_MST_MCLK_DIV(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0);
0380 static struct clk_regmap spdifin_clk_div =
0381 AUD_MST_SYS_DIV(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL);
0382 static struct clk_regmap pdm_sysclk_div =
0383 AUD_MST_SYS_DIV(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1);
0384 static struct clk_regmap spdifout_b_clk_div =
0385 AUD_MST_MCLK_DIV(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL);
0386
0387 static struct clk_regmap spdifout_clk =
0388 AUD_MST_MCLK_GATE(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL);
0389 static struct clk_regmap spdifin_clk =
0390 AUD_MST_MCLK_GATE(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL);
0391 static struct clk_regmap pdm_dclk =
0392 AUD_MST_MCLK_GATE(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0);
0393 static struct clk_regmap pdm_sysclk =
0394 AUD_MST_MCLK_GATE(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1);
0395 static struct clk_regmap spdifout_b_clk =
0396 AUD_MST_MCLK_GATE(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL);
0397
0398 static struct clk_regmap mst_a_sclk_pre_en =
0399 AUD_MST_SCLK_PRE_EN(a, AUDIO_MST_A_SCLK_CTRL0);
0400 static struct clk_regmap mst_b_sclk_pre_en =
0401 AUD_MST_SCLK_PRE_EN(b, AUDIO_MST_B_SCLK_CTRL0);
0402 static struct clk_regmap mst_c_sclk_pre_en =
0403 AUD_MST_SCLK_PRE_EN(c, AUDIO_MST_C_SCLK_CTRL0);
0404 static struct clk_regmap mst_d_sclk_pre_en =
0405 AUD_MST_SCLK_PRE_EN(d, AUDIO_MST_D_SCLK_CTRL0);
0406 static struct clk_regmap mst_e_sclk_pre_en =
0407 AUD_MST_SCLK_PRE_EN(e, AUDIO_MST_E_SCLK_CTRL0);
0408 static struct clk_regmap mst_f_sclk_pre_en =
0409 AUD_MST_SCLK_PRE_EN(f, AUDIO_MST_F_SCLK_CTRL0);
0410
0411 static struct clk_regmap mst_a_sclk_div =
0412 AUD_MST_SCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0);
0413 static struct clk_regmap mst_b_sclk_div =
0414 AUD_MST_SCLK_DIV(b, AUDIO_MST_B_SCLK_CTRL0);
0415 static struct clk_regmap mst_c_sclk_div =
0416 AUD_MST_SCLK_DIV(c, AUDIO_MST_C_SCLK_CTRL0);
0417 static struct clk_regmap mst_d_sclk_div =
0418 AUD_MST_SCLK_DIV(d, AUDIO_MST_D_SCLK_CTRL0);
0419 static struct clk_regmap mst_e_sclk_div =
0420 AUD_MST_SCLK_DIV(e, AUDIO_MST_E_SCLK_CTRL0);
0421 static struct clk_regmap mst_f_sclk_div =
0422 AUD_MST_SCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0);
0423
0424 static struct clk_regmap mst_a_sclk_post_en =
0425 AUD_MST_SCLK_POST_EN(a, AUDIO_MST_A_SCLK_CTRL0);
0426 static struct clk_regmap mst_b_sclk_post_en =
0427 AUD_MST_SCLK_POST_EN(b, AUDIO_MST_B_SCLK_CTRL0);
0428 static struct clk_regmap mst_c_sclk_post_en =
0429 AUD_MST_SCLK_POST_EN(c, AUDIO_MST_C_SCLK_CTRL0);
0430 static struct clk_regmap mst_d_sclk_post_en =
0431 AUD_MST_SCLK_POST_EN(d, AUDIO_MST_D_SCLK_CTRL0);
0432 static struct clk_regmap mst_e_sclk_post_en =
0433 AUD_MST_SCLK_POST_EN(e, AUDIO_MST_E_SCLK_CTRL0);
0434 static struct clk_regmap mst_f_sclk_post_en =
0435 AUD_MST_SCLK_POST_EN(f, AUDIO_MST_F_SCLK_CTRL0);
0436
0437 static struct clk_regmap mst_a_sclk =
0438 AUD_MST_SCLK(a, AUDIO_MST_A_SCLK_CTRL1);
0439 static struct clk_regmap mst_b_sclk =
0440 AUD_MST_SCLK(b, AUDIO_MST_B_SCLK_CTRL1);
0441 static struct clk_regmap mst_c_sclk =
0442 AUD_MST_SCLK(c, AUDIO_MST_C_SCLK_CTRL1);
0443 static struct clk_regmap mst_d_sclk =
0444 AUD_MST_SCLK(d, AUDIO_MST_D_SCLK_CTRL1);
0445 static struct clk_regmap mst_e_sclk =
0446 AUD_MST_SCLK(e, AUDIO_MST_E_SCLK_CTRL1);
0447 static struct clk_regmap mst_f_sclk =
0448 AUD_MST_SCLK(f, AUDIO_MST_F_SCLK_CTRL1);
0449
0450 static struct clk_regmap mst_a_lrclk_div =
0451 AUD_MST_LRCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0);
0452 static struct clk_regmap mst_b_lrclk_div =
0453 AUD_MST_LRCLK_DIV(b, AUDIO_MST_B_SCLK_CTRL0);
0454 static struct clk_regmap mst_c_lrclk_div =
0455 AUD_MST_LRCLK_DIV(c, AUDIO_MST_C_SCLK_CTRL0);
0456 static struct clk_regmap mst_d_lrclk_div =
0457 AUD_MST_LRCLK_DIV(d, AUDIO_MST_D_SCLK_CTRL0);
0458 static struct clk_regmap mst_e_lrclk_div =
0459 AUD_MST_LRCLK_DIV(e, AUDIO_MST_E_SCLK_CTRL0);
0460 static struct clk_regmap mst_f_lrclk_div =
0461 AUD_MST_LRCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0);
0462
0463 static struct clk_regmap mst_a_lrclk =
0464 AUD_MST_LRCLK(a, AUDIO_MST_A_SCLK_CTRL1);
0465 static struct clk_regmap mst_b_lrclk =
0466 AUD_MST_LRCLK(b, AUDIO_MST_B_SCLK_CTRL1);
0467 static struct clk_regmap mst_c_lrclk =
0468 AUD_MST_LRCLK(c, AUDIO_MST_C_SCLK_CTRL1);
0469 static struct clk_regmap mst_d_lrclk =
0470 AUD_MST_LRCLK(d, AUDIO_MST_D_SCLK_CTRL1);
0471 static struct clk_regmap mst_e_lrclk =
0472 AUD_MST_LRCLK(e, AUDIO_MST_E_SCLK_CTRL1);
0473 static struct clk_regmap mst_f_lrclk =
0474 AUD_MST_LRCLK(f, AUDIO_MST_F_SCLK_CTRL1);
0475
0476 static struct clk_regmap tdmin_a_sclk_sel =
0477 AUD_TDM_SCLK_MUX(in_a, AUDIO_CLK_TDMIN_A_CTRL);
0478 static struct clk_regmap tdmin_b_sclk_sel =
0479 AUD_TDM_SCLK_MUX(in_b, AUDIO_CLK_TDMIN_B_CTRL);
0480 static struct clk_regmap tdmin_c_sclk_sel =
0481 AUD_TDM_SCLK_MUX(in_c, AUDIO_CLK_TDMIN_C_CTRL);
0482 static struct clk_regmap tdmin_lb_sclk_sel =
0483 AUD_TDM_SCLK_MUX(in_lb, AUDIO_CLK_TDMIN_LB_CTRL);
0484 static struct clk_regmap tdmout_a_sclk_sel =
0485 AUD_TDM_SCLK_MUX(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
0486 static struct clk_regmap tdmout_b_sclk_sel =
0487 AUD_TDM_SCLK_MUX(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
0488 static struct clk_regmap tdmout_c_sclk_sel =
0489 AUD_TDM_SCLK_MUX(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
0490
0491 static struct clk_regmap tdmin_a_sclk_pre_en =
0492 AUD_TDM_SCLK_PRE_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL);
0493 static struct clk_regmap tdmin_b_sclk_pre_en =
0494 AUD_TDM_SCLK_PRE_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL);
0495 static struct clk_regmap tdmin_c_sclk_pre_en =
0496 AUD_TDM_SCLK_PRE_EN(in_c, AUDIO_CLK_TDMIN_C_CTRL);
0497 static struct clk_regmap tdmin_lb_sclk_pre_en =
0498 AUD_TDM_SCLK_PRE_EN(in_lb, AUDIO_CLK_TDMIN_LB_CTRL);
0499 static struct clk_regmap tdmout_a_sclk_pre_en =
0500 AUD_TDM_SCLK_PRE_EN(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
0501 static struct clk_regmap tdmout_b_sclk_pre_en =
0502 AUD_TDM_SCLK_PRE_EN(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
0503 static struct clk_regmap tdmout_c_sclk_pre_en =
0504 AUD_TDM_SCLK_PRE_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
0505
0506 static struct clk_regmap tdmin_a_sclk_post_en =
0507 AUD_TDM_SCLK_POST_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL);
0508 static struct clk_regmap tdmin_b_sclk_post_en =
0509 AUD_TDM_SCLK_POST_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL);
0510 static struct clk_regmap tdmin_c_sclk_post_en =
0511 AUD_TDM_SCLK_POST_EN(in_c, AUDIO_CLK_TDMIN_C_CTRL);
0512 static struct clk_regmap tdmin_lb_sclk_post_en =
0513 AUD_TDM_SCLK_POST_EN(in_lb, AUDIO_CLK_TDMIN_LB_CTRL);
0514 static struct clk_regmap tdmout_a_sclk_post_en =
0515 AUD_TDM_SCLK_POST_EN(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
0516 static struct clk_regmap tdmout_b_sclk_post_en =
0517 AUD_TDM_SCLK_POST_EN(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
0518 static struct clk_regmap tdmout_c_sclk_post_en =
0519 AUD_TDM_SCLK_POST_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
0520
0521 static struct clk_regmap tdmin_a_sclk =
0522 AUD_TDM_SCLK(in_a, AUDIO_CLK_TDMIN_A_CTRL);
0523 static struct clk_regmap tdmin_b_sclk =
0524 AUD_TDM_SCLK(in_b, AUDIO_CLK_TDMIN_B_CTRL);
0525 static struct clk_regmap tdmin_c_sclk =
0526 AUD_TDM_SCLK(in_c, AUDIO_CLK_TDMIN_C_CTRL);
0527 static struct clk_regmap tdmin_lb_sclk =
0528 AUD_TDM_SCLK(in_lb, AUDIO_CLK_TDMIN_LB_CTRL);
0529
0530 static struct clk_regmap tdmin_a_lrclk =
0531 AUD_TDM_LRLCK(in_a, AUDIO_CLK_TDMIN_A_CTRL);
0532 static struct clk_regmap tdmin_b_lrclk =
0533 AUD_TDM_LRLCK(in_b, AUDIO_CLK_TDMIN_B_CTRL);
0534 static struct clk_regmap tdmin_c_lrclk =
0535 AUD_TDM_LRLCK(in_c, AUDIO_CLK_TDMIN_C_CTRL);
0536 static struct clk_regmap tdmin_lb_lrclk =
0537 AUD_TDM_LRLCK(in_lb, AUDIO_CLK_TDMIN_LB_CTRL);
0538 static struct clk_regmap tdmout_a_lrclk =
0539 AUD_TDM_LRLCK(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
0540 static struct clk_regmap tdmout_b_lrclk =
0541 AUD_TDM_LRLCK(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
0542 static struct clk_regmap tdmout_c_lrclk =
0543 AUD_TDM_LRLCK(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
0544
0545
0546 static struct clk_regmap axg_tdmout_a_sclk =
0547 AUD_TDM_SCLK(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
0548 static struct clk_regmap axg_tdmout_b_sclk =
0549 AUD_TDM_SCLK(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
0550 static struct clk_regmap axg_tdmout_c_sclk =
0551 AUD_TDM_SCLK(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
0552
0553
0554 static struct clk_hw axg_aud_top = {
0555 .init = &(struct clk_init_data) {
0556
0557 .name = "aud_top",
0558 .ops = &(const struct clk_ops) {},
0559 .parent_data = &(const struct clk_parent_data) {
0560 .fw_name = "pclk",
0561 },
0562 .num_parents = 1,
0563 },
0564 };
0565
0566 static struct clk_regmap mst_a_mclk_sel =
0567 AUD_MST_MCLK_MUX(mst_a_mclk, AUDIO_MCLK_A_CTRL);
0568 static struct clk_regmap mst_b_mclk_sel =
0569 AUD_MST_MCLK_MUX(mst_b_mclk, AUDIO_MCLK_B_CTRL);
0570 static struct clk_regmap mst_c_mclk_sel =
0571 AUD_MST_MCLK_MUX(mst_c_mclk, AUDIO_MCLK_C_CTRL);
0572 static struct clk_regmap mst_d_mclk_sel =
0573 AUD_MST_MCLK_MUX(mst_d_mclk, AUDIO_MCLK_D_CTRL);
0574 static struct clk_regmap mst_e_mclk_sel =
0575 AUD_MST_MCLK_MUX(mst_e_mclk, AUDIO_MCLK_E_CTRL);
0576 static struct clk_regmap mst_f_mclk_sel =
0577 AUD_MST_MCLK_MUX(mst_f_mclk, AUDIO_MCLK_F_CTRL);
0578
0579 static struct clk_regmap mst_a_mclk_div =
0580 AUD_MST_MCLK_DIV(mst_a_mclk, AUDIO_MCLK_A_CTRL);
0581 static struct clk_regmap mst_b_mclk_div =
0582 AUD_MST_MCLK_DIV(mst_b_mclk, AUDIO_MCLK_B_CTRL);
0583 static struct clk_regmap mst_c_mclk_div =
0584 AUD_MST_MCLK_DIV(mst_c_mclk, AUDIO_MCLK_C_CTRL);
0585 static struct clk_regmap mst_d_mclk_div =
0586 AUD_MST_MCLK_DIV(mst_d_mclk, AUDIO_MCLK_D_CTRL);
0587 static struct clk_regmap mst_e_mclk_div =
0588 AUD_MST_MCLK_DIV(mst_e_mclk, AUDIO_MCLK_E_CTRL);
0589 static struct clk_regmap mst_f_mclk_div =
0590 AUD_MST_MCLK_DIV(mst_f_mclk, AUDIO_MCLK_F_CTRL);
0591
0592 static struct clk_regmap mst_a_mclk =
0593 AUD_MST_MCLK_GATE(mst_a_mclk, AUDIO_MCLK_A_CTRL);
0594 static struct clk_regmap mst_b_mclk =
0595 AUD_MST_MCLK_GATE(mst_b_mclk, AUDIO_MCLK_B_CTRL);
0596 static struct clk_regmap mst_c_mclk =
0597 AUD_MST_MCLK_GATE(mst_c_mclk, AUDIO_MCLK_C_CTRL);
0598 static struct clk_regmap mst_d_mclk =
0599 AUD_MST_MCLK_GATE(mst_d_mclk, AUDIO_MCLK_D_CTRL);
0600 static struct clk_regmap mst_e_mclk =
0601 AUD_MST_MCLK_GATE(mst_e_mclk, AUDIO_MCLK_E_CTRL);
0602 static struct clk_regmap mst_f_mclk =
0603 AUD_MST_MCLK_GATE(mst_f_mclk, AUDIO_MCLK_F_CTRL);
0604
0605
0606 static struct clk_regmap g12a_tdm_mclk_pad_0 = AUD_TDM_PAD_CTRL(
0607 mclk_pad_0, AUDIO_MST_PAD_CTRL0, 0, mclk_pad_ctrl_parent_data);
0608 static struct clk_regmap g12a_tdm_mclk_pad_1 = AUD_TDM_PAD_CTRL(
0609 mclk_pad_1, AUDIO_MST_PAD_CTRL0, 4, mclk_pad_ctrl_parent_data);
0610 static struct clk_regmap g12a_tdm_lrclk_pad_0 = AUD_TDM_PAD_CTRL(
0611 lrclk_pad_0, AUDIO_MST_PAD_CTRL1, 16, lrclk_pad_ctrl_parent_data);
0612 static struct clk_regmap g12a_tdm_lrclk_pad_1 = AUD_TDM_PAD_CTRL(
0613 lrclk_pad_1, AUDIO_MST_PAD_CTRL1, 20, lrclk_pad_ctrl_parent_data);
0614 static struct clk_regmap g12a_tdm_lrclk_pad_2 = AUD_TDM_PAD_CTRL(
0615 lrclk_pad_2, AUDIO_MST_PAD_CTRL1, 24, lrclk_pad_ctrl_parent_data);
0616 static struct clk_regmap g12a_tdm_sclk_pad_0 = AUD_TDM_PAD_CTRL(
0617 sclk_pad_0, AUDIO_MST_PAD_CTRL1, 0, sclk_pad_ctrl_parent_data);
0618 static struct clk_regmap g12a_tdm_sclk_pad_1 = AUD_TDM_PAD_CTRL(
0619 sclk_pad_1, AUDIO_MST_PAD_CTRL1, 4, sclk_pad_ctrl_parent_data);
0620 static struct clk_regmap g12a_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL(
0621 sclk_pad_2, AUDIO_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data);
0622
0623 static struct clk_regmap g12a_tdmout_a_sclk =
0624 AUD_TDM_SCLK_WS(out_a, AUDIO_CLK_TDMOUT_A_CTRL);
0625 static struct clk_regmap g12a_tdmout_b_sclk =
0626 AUD_TDM_SCLK_WS(out_b, AUDIO_CLK_TDMOUT_B_CTRL);
0627 static struct clk_regmap g12a_tdmout_c_sclk =
0628 AUD_TDM_SCLK_WS(out_c, AUDIO_CLK_TDMOUT_C_CTRL);
0629
0630 static struct clk_regmap toram =
0631 AUD_PCLK_GATE(toram, AUDIO_CLK_GATE_EN, 20);
0632 static struct clk_regmap spdifout_b =
0633 AUD_PCLK_GATE(spdifout_b, AUDIO_CLK_GATE_EN, 21);
0634 static struct clk_regmap eqdrc =
0635 AUD_PCLK_GATE(eqdrc, AUDIO_CLK_GATE_EN, 22);
0636
0637
0638 static struct clk_regmap sm1_clk81_en = {
0639 .data = &(struct clk_regmap_gate_data){
0640 .offset = AUDIO_CLK81_EN,
0641 .bit_idx = 31,
0642 },
0643 .hw.init = &(struct clk_init_data) {
0644 .name = "aud_clk81_en",
0645 .ops = &clk_regmap_gate_ops,
0646 .parent_data = &(const struct clk_parent_data) {
0647 .fw_name = "pclk",
0648 },
0649 .num_parents = 1,
0650 },
0651 };
0652
0653 static struct clk_regmap sm1_sysclk_a_div = {
0654 .data = &(struct clk_regmap_div_data){
0655 .offset = AUDIO_CLK81_CTRL,
0656 .shift = 0,
0657 .width = 8,
0658 },
0659 .hw.init = &(struct clk_init_data) {
0660 .name = "aud_sysclk_a_div",
0661 .ops = &clk_regmap_divider_ops,
0662 .parent_hws = (const struct clk_hw *[]) {
0663 &sm1_clk81_en.hw,
0664 },
0665 .num_parents = 1,
0666 .flags = CLK_SET_RATE_PARENT,
0667 },
0668 };
0669
0670 static struct clk_regmap sm1_sysclk_a_en = {
0671 .data = &(struct clk_regmap_gate_data){
0672 .offset = AUDIO_CLK81_CTRL,
0673 .bit_idx = 8,
0674 },
0675 .hw.init = &(struct clk_init_data) {
0676 .name = "aud_sysclk_a_en",
0677 .ops = &clk_regmap_gate_ops,
0678 .parent_hws = (const struct clk_hw *[]) {
0679 &sm1_sysclk_a_div.hw,
0680 },
0681 .num_parents = 1,
0682 .flags = CLK_SET_RATE_PARENT,
0683 },
0684 };
0685
0686 static struct clk_regmap sm1_sysclk_b_div = {
0687 .data = &(struct clk_regmap_div_data){
0688 .offset = AUDIO_CLK81_CTRL,
0689 .shift = 16,
0690 .width = 8,
0691 },
0692 .hw.init = &(struct clk_init_data) {
0693 .name = "aud_sysclk_b_div",
0694 .ops = &clk_regmap_divider_ops,
0695 .parent_hws = (const struct clk_hw *[]) {
0696 &sm1_clk81_en.hw,
0697 },
0698 .num_parents = 1,
0699 .flags = CLK_SET_RATE_PARENT,
0700 },
0701 };
0702
0703 static struct clk_regmap sm1_sysclk_b_en = {
0704 .data = &(struct clk_regmap_gate_data){
0705 .offset = AUDIO_CLK81_CTRL,
0706 .bit_idx = 24,
0707 },
0708 .hw.init = &(struct clk_init_data) {
0709 .name = "aud_sysclk_b_en",
0710 .ops = &clk_regmap_gate_ops,
0711 .parent_hws = (const struct clk_hw *[]) {
0712 &sm1_sysclk_b_div.hw,
0713 },
0714 .num_parents = 1,
0715 .flags = CLK_SET_RATE_PARENT,
0716 },
0717 };
0718
0719 static const struct clk_hw *sm1_aud_top_parents[] = {
0720 &sm1_sysclk_a_en.hw,
0721 &sm1_sysclk_b_en.hw,
0722 };
0723
0724 static struct clk_regmap sm1_aud_top = {
0725 .data = &(struct clk_regmap_mux_data){
0726 .offset = AUDIO_CLK81_CTRL,
0727 .mask = 0x1,
0728 .shift = 31,
0729 },
0730 .hw.init = &(struct clk_init_data){
0731 .name = "aud_top",
0732 .ops = &clk_regmap_mux_ops,
0733 .parent_hws = sm1_aud_top_parents,
0734 .num_parents = ARRAY_SIZE(sm1_aud_top_parents),
0735 .flags = CLK_SET_RATE_NO_REPARENT,
0736 },
0737 };
0738
0739 static struct clk_regmap resample_b =
0740 AUD_PCLK_GATE(resample_b, AUDIO_CLK_GATE_EN, 26);
0741 static struct clk_regmap tovad =
0742 AUD_PCLK_GATE(tovad, AUDIO_CLK_GATE_EN, 27);
0743 static struct clk_regmap locker =
0744 AUD_PCLK_GATE(locker, AUDIO_CLK_GATE_EN, 28);
0745 static struct clk_regmap spdifin_lb =
0746 AUD_PCLK_GATE(spdifin_lb, AUDIO_CLK_GATE_EN, 29);
0747 static struct clk_regmap frddr_d =
0748 AUD_PCLK_GATE(frddr_d, AUDIO_CLK_GATE_EN1, 0);
0749 static struct clk_regmap toddr_d =
0750 AUD_PCLK_GATE(toddr_d, AUDIO_CLK_GATE_EN1, 1);
0751 static struct clk_regmap loopback_b =
0752 AUD_PCLK_GATE(loopback_b, AUDIO_CLK_GATE_EN1, 2);
0753
0754 static struct clk_regmap sm1_mst_a_mclk_sel =
0755 AUD_MST_MCLK_MUX(mst_a_mclk, AUDIO_SM1_MCLK_A_CTRL);
0756 static struct clk_regmap sm1_mst_b_mclk_sel =
0757 AUD_MST_MCLK_MUX(mst_b_mclk, AUDIO_SM1_MCLK_B_CTRL);
0758 static struct clk_regmap sm1_mst_c_mclk_sel =
0759 AUD_MST_MCLK_MUX(mst_c_mclk, AUDIO_SM1_MCLK_C_CTRL);
0760 static struct clk_regmap sm1_mst_d_mclk_sel =
0761 AUD_MST_MCLK_MUX(mst_d_mclk, AUDIO_SM1_MCLK_D_CTRL);
0762 static struct clk_regmap sm1_mst_e_mclk_sel =
0763 AUD_MST_MCLK_MUX(mst_e_mclk, AUDIO_SM1_MCLK_E_CTRL);
0764 static struct clk_regmap sm1_mst_f_mclk_sel =
0765 AUD_MST_MCLK_MUX(mst_f_mclk, AUDIO_SM1_MCLK_F_CTRL);
0766
0767 static struct clk_regmap sm1_mst_a_mclk_div =
0768 AUD_MST_MCLK_DIV(mst_a_mclk, AUDIO_SM1_MCLK_A_CTRL);
0769 static struct clk_regmap sm1_mst_b_mclk_div =
0770 AUD_MST_MCLK_DIV(mst_b_mclk, AUDIO_SM1_MCLK_B_CTRL);
0771 static struct clk_regmap sm1_mst_c_mclk_div =
0772 AUD_MST_MCLK_DIV(mst_c_mclk, AUDIO_SM1_MCLK_C_CTRL);
0773 static struct clk_regmap sm1_mst_d_mclk_div =
0774 AUD_MST_MCLK_DIV(mst_d_mclk, AUDIO_SM1_MCLK_D_CTRL);
0775 static struct clk_regmap sm1_mst_e_mclk_div =
0776 AUD_MST_MCLK_DIV(mst_e_mclk, AUDIO_SM1_MCLK_E_CTRL);
0777 static struct clk_regmap sm1_mst_f_mclk_div =
0778 AUD_MST_MCLK_DIV(mst_f_mclk, AUDIO_SM1_MCLK_F_CTRL);
0779
0780 static struct clk_regmap sm1_mst_a_mclk =
0781 AUD_MST_MCLK_GATE(mst_a_mclk, AUDIO_SM1_MCLK_A_CTRL);
0782 static struct clk_regmap sm1_mst_b_mclk =
0783 AUD_MST_MCLK_GATE(mst_b_mclk, AUDIO_SM1_MCLK_B_CTRL);
0784 static struct clk_regmap sm1_mst_c_mclk =
0785 AUD_MST_MCLK_GATE(mst_c_mclk, AUDIO_SM1_MCLK_C_CTRL);
0786 static struct clk_regmap sm1_mst_d_mclk =
0787 AUD_MST_MCLK_GATE(mst_d_mclk, AUDIO_SM1_MCLK_D_CTRL);
0788 static struct clk_regmap sm1_mst_e_mclk =
0789 AUD_MST_MCLK_GATE(mst_e_mclk, AUDIO_SM1_MCLK_E_CTRL);
0790 static struct clk_regmap sm1_mst_f_mclk =
0791 AUD_MST_MCLK_GATE(mst_f_mclk, AUDIO_SM1_MCLK_F_CTRL);
0792
0793 static struct clk_regmap sm1_tdm_mclk_pad_0 = AUD_TDM_PAD_CTRL(
0794 tdm_mclk_pad_0, AUDIO_SM1_MST_PAD_CTRL0, 0, mclk_pad_ctrl_parent_data);
0795 static struct clk_regmap sm1_tdm_mclk_pad_1 = AUD_TDM_PAD_CTRL(
0796 tdm_mclk_pad_1, AUDIO_SM1_MST_PAD_CTRL0, 4, mclk_pad_ctrl_parent_data);
0797 static struct clk_regmap sm1_tdm_lrclk_pad_0 = AUD_TDM_PAD_CTRL(
0798 tdm_lrclk_pad_0, AUDIO_SM1_MST_PAD_CTRL1, 16, lrclk_pad_ctrl_parent_data);
0799 static struct clk_regmap sm1_tdm_lrclk_pad_1 = AUD_TDM_PAD_CTRL(
0800 tdm_lrclk_pad_1, AUDIO_SM1_MST_PAD_CTRL1, 20, lrclk_pad_ctrl_parent_data);
0801 static struct clk_regmap sm1_tdm_lrclk_pad_2 = AUD_TDM_PAD_CTRL(
0802 tdm_lrclk_pad_2, AUDIO_SM1_MST_PAD_CTRL1, 24, lrclk_pad_ctrl_parent_data);
0803 static struct clk_regmap sm1_tdm_sclk_pad_0 = AUD_TDM_PAD_CTRL(
0804 tdm_sclk_pad_0, AUDIO_SM1_MST_PAD_CTRL1, 0, sclk_pad_ctrl_parent_data);
0805 static struct clk_regmap sm1_tdm_sclk_pad_1 = AUD_TDM_PAD_CTRL(
0806 tdm_sclk_pad_1, AUDIO_SM1_MST_PAD_CTRL1, 4, sclk_pad_ctrl_parent_data);
0807 static struct clk_regmap sm1_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL(
0808 tdm_sclk_pad_2, AUDIO_SM1_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data);
0809
0810
0811
0812
0813
0814 static struct clk_hw_onecell_data axg_audio_hw_onecell_data = {
0815 .hws = {
0816 [AUD_CLKID_DDR_ARB] = &ddr_arb.hw,
0817 [AUD_CLKID_PDM] = &pdm.hw,
0818 [AUD_CLKID_TDMIN_A] = &tdmin_a.hw,
0819 [AUD_CLKID_TDMIN_B] = &tdmin_b.hw,
0820 [AUD_CLKID_TDMIN_C] = &tdmin_c.hw,
0821 [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw,
0822 [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw,
0823 [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw,
0824 [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw,
0825 [AUD_CLKID_FRDDR_A] = &frddr_a.hw,
0826 [AUD_CLKID_FRDDR_B] = &frddr_b.hw,
0827 [AUD_CLKID_FRDDR_C] = &frddr_c.hw,
0828 [AUD_CLKID_TODDR_A] = &toddr_a.hw,
0829 [AUD_CLKID_TODDR_B] = &toddr_b.hw,
0830 [AUD_CLKID_TODDR_C] = &toddr_c.hw,
0831 [AUD_CLKID_LOOPBACK] = &loopback.hw,
0832 [AUD_CLKID_SPDIFIN] = &spdifin.hw,
0833 [AUD_CLKID_SPDIFOUT] = &spdifout.hw,
0834 [AUD_CLKID_RESAMPLE] = &resample.hw,
0835 [AUD_CLKID_POWER_DETECT] = &power_detect.hw,
0836 [AUD_CLKID_MST_A_MCLK_SEL] = &mst_a_mclk_sel.hw,
0837 [AUD_CLKID_MST_B_MCLK_SEL] = &mst_b_mclk_sel.hw,
0838 [AUD_CLKID_MST_C_MCLK_SEL] = &mst_c_mclk_sel.hw,
0839 [AUD_CLKID_MST_D_MCLK_SEL] = &mst_d_mclk_sel.hw,
0840 [AUD_CLKID_MST_E_MCLK_SEL] = &mst_e_mclk_sel.hw,
0841 [AUD_CLKID_MST_F_MCLK_SEL] = &mst_f_mclk_sel.hw,
0842 [AUD_CLKID_MST_A_MCLK_DIV] = &mst_a_mclk_div.hw,
0843 [AUD_CLKID_MST_B_MCLK_DIV] = &mst_b_mclk_div.hw,
0844 [AUD_CLKID_MST_C_MCLK_DIV] = &mst_c_mclk_div.hw,
0845 [AUD_CLKID_MST_D_MCLK_DIV] = &mst_d_mclk_div.hw,
0846 [AUD_CLKID_MST_E_MCLK_DIV] = &mst_e_mclk_div.hw,
0847 [AUD_CLKID_MST_F_MCLK_DIV] = &mst_f_mclk_div.hw,
0848 [AUD_CLKID_MST_A_MCLK] = &mst_a_mclk.hw,
0849 [AUD_CLKID_MST_B_MCLK] = &mst_b_mclk.hw,
0850 [AUD_CLKID_MST_C_MCLK] = &mst_c_mclk.hw,
0851 [AUD_CLKID_MST_D_MCLK] = &mst_d_mclk.hw,
0852 [AUD_CLKID_MST_E_MCLK] = &mst_e_mclk.hw,
0853 [AUD_CLKID_MST_F_MCLK] = &mst_f_mclk.hw,
0854 [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw,
0855 [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw,
0856 [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw,
0857 [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw,
0858 [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw,
0859 [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw,
0860 [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw,
0861 [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw,
0862 [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw,
0863 [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw,
0864 [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw,
0865 [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw,
0866 [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw,
0867 [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw,
0868 [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw,
0869 [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw,
0870 [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw,
0871 [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw,
0872 [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw,
0873 [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw,
0874 [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw,
0875 [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw,
0876 [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw,
0877 [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw,
0878 [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw,
0879 [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw,
0880 [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw,
0881 [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw,
0882 [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw,
0883 [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw,
0884 [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw,
0885 [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw,
0886 [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw,
0887 [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw,
0888 [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw,
0889 [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw,
0890 [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw,
0891 [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw,
0892 [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw,
0893 [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw,
0894 [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw,
0895 [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw,
0896 [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw,
0897 [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw,
0898 [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw,
0899 [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw,
0900 [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw,
0901 [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw,
0902 [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw,
0903 [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw,
0904 [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw,
0905 [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw,
0906 [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw,
0907 [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw,
0908 [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw,
0909 [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw,
0910 [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw,
0911 [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw,
0912 [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw,
0913 [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw,
0914 [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw,
0915 [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw,
0916 [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw,
0917 [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw,
0918 [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw,
0919 [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw,
0920 [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw,
0921 [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw,
0922 [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw,
0923 [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw,
0924 [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw,
0925 [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw,
0926 [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw,
0927 [AUD_CLKID_TDMOUT_A_SCLK] = &axg_tdmout_a_sclk.hw,
0928 [AUD_CLKID_TDMOUT_B_SCLK] = &axg_tdmout_b_sclk.hw,
0929 [AUD_CLKID_TDMOUT_C_SCLK] = &axg_tdmout_c_sclk.hw,
0930 [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw,
0931 [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw,
0932 [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw,
0933 [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw,
0934 [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw,
0935 [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw,
0936 [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw,
0937 [AUD_CLKID_TOP] = &axg_aud_top,
0938 [NR_CLKS] = NULL,
0939 },
0940 .num = NR_CLKS,
0941 };
0942
0943
0944
0945
0946
0947 static struct clk_hw_onecell_data g12a_audio_hw_onecell_data = {
0948 .hws = {
0949 [AUD_CLKID_DDR_ARB] = &ddr_arb.hw,
0950 [AUD_CLKID_PDM] = &pdm.hw,
0951 [AUD_CLKID_TDMIN_A] = &tdmin_a.hw,
0952 [AUD_CLKID_TDMIN_B] = &tdmin_b.hw,
0953 [AUD_CLKID_TDMIN_C] = &tdmin_c.hw,
0954 [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw,
0955 [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw,
0956 [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw,
0957 [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw,
0958 [AUD_CLKID_FRDDR_A] = &frddr_a.hw,
0959 [AUD_CLKID_FRDDR_B] = &frddr_b.hw,
0960 [AUD_CLKID_FRDDR_C] = &frddr_c.hw,
0961 [AUD_CLKID_TODDR_A] = &toddr_a.hw,
0962 [AUD_CLKID_TODDR_B] = &toddr_b.hw,
0963 [AUD_CLKID_TODDR_C] = &toddr_c.hw,
0964 [AUD_CLKID_LOOPBACK] = &loopback.hw,
0965 [AUD_CLKID_SPDIFIN] = &spdifin.hw,
0966 [AUD_CLKID_SPDIFOUT] = &spdifout.hw,
0967 [AUD_CLKID_RESAMPLE] = &resample.hw,
0968 [AUD_CLKID_POWER_DETECT] = &power_detect.hw,
0969 [AUD_CLKID_SPDIFOUT_B] = &spdifout_b.hw,
0970 [AUD_CLKID_MST_A_MCLK_SEL] = &mst_a_mclk_sel.hw,
0971 [AUD_CLKID_MST_B_MCLK_SEL] = &mst_b_mclk_sel.hw,
0972 [AUD_CLKID_MST_C_MCLK_SEL] = &mst_c_mclk_sel.hw,
0973 [AUD_CLKID_MST_D_MCLK_SEL] = &mst_d_mclk_sel.hw,
0974 [AUD_CLKID_MST_E_MCLK_SEL] = &mst_e_mclk_sel.hw,
0975 [AUD_CLKID_MST_F_MCLK_SEL] = &mst_f_mclk_sel.hw,
0976 [AUD_CLKID_MST_A_MCLK_DIV] = &mst_a_mclk_div.hw,
0977 [AUD_CLKID_MST_B_MCLK_DIV] = &mst_b_mclk_div.hw,
0978 [AUD_CLKID_MST_C_MCLK_DIV] = &mst_c_mclk_div.hw,
0979 [AUD_CLKID_MST_D_MCLK_DIV] = &mst_d_mclk_div.hw,
0980 [AUD_CLKID_MST_E_MCLK_DIV] = &mst_e_mclk_div.hw,
0981 [AUD_CLKID_MST_F_MCLK_DIV] = &mst_f_mclk_div.hw,
0982 [AUD_CLKID_MST_A_MCLK] = &mst_a_mclk.hw,
0983 [AUD_CLKID_MST_B_MCLK] = &mst_b_mclk.hw,
0984 [AUD_CLKID_MST_C_MCLK] = &mst_c_mclk.hw,
0985 [AUD_CLKID_MST_D_MCLK] = &mst_d_mclk.hw,
0986 [AUD_CLKID_MST_E_MCLK] = &mst_e_mclk.hw,
0987 [AUD_CLKID_MST_F_MCLK] = &mst_f_mclk.hw,
0988 [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw,
0989 [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw,
0990 [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw,
0991 [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &spdifout_b_clk_sel.hw,
0992 [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &spdifout_b_clk_div.hw,
0993 [AUD_CLKID_SPDIFOUT_B_CLK] = &spdifout_b_clk.hw,
0994 [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw,
0995 [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw,
0996 [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw,
0997 [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw,
0998 [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw,
0999 [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw,
1000 [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw,
1001 [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw,
1002 [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw,
1003 [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw,
1004 [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw,
1005 [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw,
1006 [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw,
1007 [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw,
1008 [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw,
1009 [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw,
1010 [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw,
1011 [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw,
1012 [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw,
1013 [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw,
1014 [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw,
1015 [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw,
1016 [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw,
1017 [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw,
1018 [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw,
1019 [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw,
1020 [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw,
1021 [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw,
1022 [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw,
1023 [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw,
1024 [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw,
1025 [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw,
1026 [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw,
1027 [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw,
1028 [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw,
1029 [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw,
1030 [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw,
1031 [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw,
1032 [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw,
1033 [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw,
1034 [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw,
1035 [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw,
1036 [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw,
1037 [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw,
1038 [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw,
1039 [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw,
1040 [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw,
1041 [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw,
1042 [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw,
1043 [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw,
1044 [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw,
1045 [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw,
1046 [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw,
1047 [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw,
1048 [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw,
1049 [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw,
1050 [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw,
1051 [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw,
1052 [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw,
1053 [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw,
1054 [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw,
1055 [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw,
1056 [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw,
1057 [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw,
1058 [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw,
1059 [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw,
1060 [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw,
1061 [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw,
1062 [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw,
1063 [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw,
1064 [AUD_CLKID_TDMOUT_A_SCLK] = &g12a_tdmout_a_sclk.hw,
1065 [AUD_CLKID_TDMOUT_B_SCLK] = &g12a_tdmout_b_sclk.hw,
1066 [AUD_CLKID_TDMOUT_C_SCLK] = &g12a_tdmout_c_sclk.hw,
1067 [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw,
1068 [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw,
1069 [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw,
1070 [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw,
1071 [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw,
1072 [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw,
1073 [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw,
1074 [AUD_CLKID_TDM_MCLK_PAD0] = &g12a_tdm_mclk_pad_0.hw,
1075 [AUD_CLKID_TDM_MCLK_PAD1] = &g12a_tdm_mclk_pad_1.hw,
1076 [AUD_CLKID_TDM_LRCLK_PAD0] = &g12a_tdm_lrclk_pad_0.hw,
1077 [AUD_CLKID_TDM_LRCLK_PAD1] = &g12a_tdm_lrclk_pad_1.hw,
1078 [AUD_CLKID_TDM_LRCLK_PAD2] = &g12a_tdm_lrclk_pad_2.hw,
1079 [AUD_CLKID_TDM_SCLK_PAD0] = &g12a_tdm_sclk_pad_0.hw,
1080 [AUD_CLKID_TDM_SCLK_PAD1] = &g12a_tdm_sclk_pad_1.hw,
1081 [AUD_CLKID_TDM_SCLK_PAD2] = &g12a_tdm_sclk_pad_2.hw,
1082 [AUD_CLKID_TOP] = &axg_aud_top,
1083 [NR_CLKS] = NULL,
1084 },
1085 .num = NR_CLKS,
1086 };
1087
1088
1089
1090
1091
1092 static struct clk_hw_onecell_data sm1_audio_hw_onecell_data = {
1093 .hws = {
1094 [AUD_CLKID_DDR_ARB] = &ddr_arb.hw,
1095 [AUD_CLKID_PDM] = &pdm.hw,
1096 [AUD_CLKID_TDMIN_A] = &tdmin_a.hw,
1097 [AUD_CLKID_TDMIN_B] = &tdmin_b.hw,
1098 [AUD_CLKID_TDMIN_C] = &tdmin_c.hw,
1099 [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw,
1100 [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw,
1101 [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw,
1102 [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw,
1103 [AUD_CLKID_FRDDR_A] = &frddr_a.hw,
1104 [AUD_CLKID_FRDDR_B] = &frddr_b.hw,
1105 [AUD_CLKID_FRDDR_C] = &frddr_c.hw,
1106 [AUD_CLKID_TODDR_A] = &toddr_a.hw,
1107 [AUD_CLKID_TODDR_B] = &toddr_b.hw,
1108 [AUD_CLKID_TODDR_C] = &toddr_c.hw,
1109 [AUD_CLKID_LOOPBACK] = &loopback.hw,
1110 [AUD_CLKID_SPDIFIN] = &spdifin.hw,
1111 [AUD_CLKID_SPDIFOUT] = &spdifout.hw,
1112 [AUD_CLKID_RESAMPLE] = &resample.hw,
1113 [AUD_CLKID_SPDIFOUT_B] = &spdifout_b.hw,
1114 [AUD_CLKID_MST_A_MCLK_SEL] = &sm1_mst_a_mclk_sel.hw,
1115 [AUD_CLKID_MST_B_MCLK_SEL] = &sm1_mst_b_mclk_sel.hw,
1116 [AUD_CLKID_MST_C_MCLK_SEL] = &sm1_mst_c_mclk_sel.hw,
1117 [AUD_CLKID_MST_D_MCLK_SEL] = &sm1_mst_d_mclk_sel.hw,
1118 [AUD_CLKID_MST_E_MCLK_SEL] = &sm1_mst_e_mclk_sel.hw,
1119 [AUD_CLKID_MST_F_MCLK_SEL] = &sm1_mst_f_mclk_sel.hw,
1120 [AUD_CLKID_MST_A_MCLK_DIV] = &sm1_mst_a_mclk_div.hw,
1121 [AUD_CLKID_MST_B_MCLK_DIV] = &sm1_mst_b_mclk_div.hw,
1122 [AUD_CLKID_MST_C_MCLK_DIV] = &sm1_mst_c_mclk_div.hw,
1123 [AUD_CLKID_MST_D_MCLK_DIV] = &sm1_mst_d_mclk_div.hw,
1124 [AUD_CLKID_MST_E_MCLK_DIV] = &sm1_mst_e_mclk_div.hw,
1125 [AUD_CLKID_MST_F_MCLK_DIV] = &sm1_mst_f_mclk_div.hw,
1126 [AUD_CLKID_MST_A_MCLK] = &sm1_mst_a_mclk.hw,
1127 [AUD_CLKID_MST_B_MCLK] = &sm1_mst_b_mclk.hw,
1128 [AUD_CLKID_MST_C_MCLK] = &sm1_mst_c_mclk.hw,
1129 [AUD_CLKID_MST_D_MCLK] = &sm1_mst_d_mclk.hw,
1130 [AUD_CLKID_MST_E_MCLK] = &sm1_mst_e_mclk.hw,
1131 [AUD_CLKID_MST_F_MCLK] = &sm1_mst_f_mclk.hw,
1132 [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw,
1133 [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw,
1134 [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw,
1135 [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &spdifout_b_clk_sel.hw,
1136 [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &spdifout_b_clk_div.hw,
1137 [AUD_CLKID_SPDIFOUT_B_CLK] = &spdifout_b_clk.hw,
1138 [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw,
1139 [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw,
1140 [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw,
1141 [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw,
1142 [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw,
1143 [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw,
1144 [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw,
1145 [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw,
1146 [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw,
1147 [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw,
1148 [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw,
1149 [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw,
1150 [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw,
1151 [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw,
1152 [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw,
1153 [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw,
1154 [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw,
1155 [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw,
1156 [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw,
1157 [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw,
1158 [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw,
1159 [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw,
1160 [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw,
1161 [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw,
1162 [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw,
1163 [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw,
1164 [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw,
1165 [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw,
1166 [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw,
1167 [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw,
1168 [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw,
1169 [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw,
1170 [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw,
1171 [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw,
1172 [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw,
1173 [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw,
1174 [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw,
1175 [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw,
1176 [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw,
1177 [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw,
1178 [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw,
1179 [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw,
1180 [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw,
1181 [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw,
1182 [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw,
1183 [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw,
1184 [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw,
1185 [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw,
1186 [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw,
1187 [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw,
1188 [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw,
1189 [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw,
1190 [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw,
1191 [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw,
1192 [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw,
1193 [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw,
1194 [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw,
1195 [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw,
1196 [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw,
1197 [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw,
1198 [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw,
1199 [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw,
1200 [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw,
1201 [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw,
1202 [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw,
1203 [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw,
1204 [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw,
1205 [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw,
1206 [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw,
1207 [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw,
1208 [AUD_CLKID_TDMOUT_A_SCLK] = &g12a_tdmout_a_sclk.hw,
1209 [AUD_CLKID_TDMOUT_B_SCLK] = &g12a_tdmout_b_sclk.hw,
1210 [AUD_CLKID_TDMOUT_C_SCLK] = &g12a_tdmout_c_sclk.hw,
1211 [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw,
1212 [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw,
1213 [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw,
1214 [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw,
1215 [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw,
1216 [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw,
1217 [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw,
1218 [AUD_CLKID_TDM_MCLK_PAD0] = &sm1_tdm_mclk_pad_0.hw,
1219 [AUD_CLKID_TDM_MCLK_PAD1] = &sm1_tdm_mclk_pad_1.hw,
1220 [AUD_CLKID_TDM_LRCLK_PAD0] = &sm1_tdm_lrclk_pad_0.hw,
1221 [AUD_CLKID_TDM_LRCLK_PAD1] = &sm1_tdm_lrclk_pad_1.hw,
1222 [AUD_CLKID_TDM_LRCLK_PAD2] = &sm1_tdm_lrclk_pad_2.hw,
1223 [AUD_CLKID_TDM_SCLK_PAD0] = &sm1_tdm_sclk_pad_0.hw,
1224 [AUD_CLKID_TDM_SCLK_PAD1] = &sm1_tdm_sclk_pad_1.hw,
1225 [AUD_CLKID_TDM_SCLK_PAD2] = &sm1_tdm_sclk_pad_2.hw,
1226 [AUD_CLKID_TOP] = &sm1_aud_top.hw,
1227 [AUD_CLKID_TORAM] = &toram.hw,
1228 [AUD_CLKID_EQDRC] = &eqdrc.hw,
1229 [AUD_CLKID_RESAMPLE_B] = &resample_b.hw,
1230 [AUD_CLKID_TOVAD] = &tovad.hw,
1231 [AUD_CLKID_LOCKER] = &locker.hw,
1232 [AUD_CLKID_SPDIFIN_LB] = &spdifin_lb.hw,
1233 [AUD_CLKID_FRDDR_D] = &frddr_d.hw,
1234 [AUD_CLKID_TODDR_D] = &toddr_d.hw,
1235 [AUD_CLKID_LOOPBACK_B] = &loopback_b.hw,
1236 [AUD_CLKID_CLK81_EN] = &sm1_clk81_en.hw,
1237 [AUD_CLKID_SYSCLK_A_DIV] = &sm1_sysclk_a_div.hw,
1238 [AUD_CLKID_SYSCLK_A_EN] = &sm1_sysclk_a_en.hw,
1239 [AUD_CLKID_SYSCLK_B_DIV] = &sm1_sysclk_b_div.hw,
1240 [AUD_CLKID_SYSCLK_B_EN] = &sm1_sysclk_b_en.hw,
1241 [NR_CLKS] = NULL,
1242 },
1243 .num = NR_CLKS,
1244 };
1245
1246
1247
1248 static struct clk_regmap *const axg_clk_regmaps[] = {
1249 &ddr_arb,
1250 &pdm,
1251 &tdmin_a,
1252 &tdmin_b,
1253 &tdmin_c,
1254 &tdmin_lb,
1255 &tdmout_a,
1256 &tdmout_b,
1257 &tdmout_c,
1258 &frddr_a,
1259 &frddr_b,
1260 &frddr_c,
1261 &toddr_a,
1262 &toddr_b,
1263 &toddr_c,
1264 &loopback,
1265 &spdifin,
1266 &spdifout,
1267 &resample,
1268 &power_detect,
1269 &mst_a_mclk_sel,
1270 &mst_b_mclk_sel,
1271 &mst_c_mclk_sel,
1272 &mst_d_mclk_sel,
1273 &mst_e_mclk_sel,
1274 &mst_f_mclk_sel,
1275 &mst_a_mclk_div,
1276 &mst_b_mclk_div,
1277 &mst_c_mclk_div,
1278 &mst_d_mclk_div,
1279 &mst_e_mclk_div,
1280 &mst_f_mclk_div,
1281 &mst_a_mclk,
1282 &mst_b_mclk,
1283 &mst_c_mclk,
1284 &mst_d_mclk,
1285 &mst_e_mclk,
1286 &mst_f_mclk,
1287 &spdifout_clk_sel,
1288 &spdifout_clk_div,
1289 &spdifout_clk,
1290 &spdifin_clk_sel,
1291 &spdifin_clk_div,
1292 &spdifin_clk,
1293 &pdm_dclk_sel,
1294 &pdm_dclk_div,
1295 &pdm_dclk,
1296 &pdm_sysclk_sel,
1297 &pdm_sysclk_div,
1298 &pdm_sysclk,
1299 &mst_a_sclk_pre_en,
1300 &mst_b_sclk_pre_en,
1301 &mst_c_sclk_pre_en,
1302 &mst_d_sclk_pre_en,
1303 &mst_e_sclk_pre_en,
1304 &mst_f_sclk_pre_en,
1305 &mst_a_sclk_div,
1306 &mst_b_sclk_div,
1307 &mst_c_sclk_div,
1308 &mst_d_sclk_div,
1309 &mst_e_sclk_div,
1310 &mst_f_sclk_div,
1311 &mst_a_sclk_post_en,
1312 &mst_b_sclk_post_en,
1313 &mst_c_sclk_post_en,
1314 &mst_d_sclk_post_en,
1315 &mst_e_sclk_post_en,
1316 &mst_f_sclk_post_en,
1317 &mst_a_sclk,
1318 &mst_b_sclk,
1319 &mst_c_sclk,
1320 &mst_d_sclk,
1321 &mst_e_sclk,
1322 &mst_f_sclk,
1323 &mst_a_lrclk_div,
1324 &mst_b_lrclk_div,
1325 &mst_c_lrclk_div,
1326 &mst_d_lrclk_div,
1327 &mst_e_lrclk_div,
1328 &mst_f_lrclk_div,
1329 &mst_a_lrclk,
1330 &mst_b_lrclk,
1331 &mst_c_lrclk,
1332 &mst_d_lrclk,
1333 &mst_e_lrclk,
1334 &mst_f_lrclk,
1335 &tdmin_a_sclk_sel,
1336 &tdmin_b_sclk_sel,
1337 &tdmin_c_sclk_sel,
1338 &tdmin_lb_sclk_sel,
1339 &tdmout_a_sclk_sel,
1340 &tdmout_b_sclk_sel,
1341 &tdmout_c_sclk_sel,
1342 &tdmin_a_sclk_pre_en,
1343 &tdmin_b_sclk_pre_en,
1344 &tdmin_c_sclk_pre_en,
1345 &tdmin_lb_sclk_pre_en,
1346 &tdmout_a_sclk_pre_en,
1347 &tdmout_b_sclk_pre_en,
1348 &tdmout_c_sclk_pre_en,
1349 &tdmin_a_sclk_post_en,
1350 &tdmin_b_sclk_post_en,
1351 &tdmin_c_sclk_post_en,
1352 &tdmin_lb_sclk_post_en,
1353 &tdmout_a_sclk_post_en,
1354 &tdmout_b_sclk_post_en,
1355 &tdmout_c_sclk_post_en,
1356 &tdmin_a_sclk,
1357 &tdmin_b_sclk,
1358 &tdmin_c_sclk,
1359 &tdmin_lb_sclk,
1360 &axg_tdmout_a_sclk,
1361 &axg_tdmout_b_sclk,
1362 &axg_tdmout_c_sclk,
1363 &tdmin_a_lrclk,
1364 &tdmin_b_lrclk,
1365 &tdmin_c_lrclk,
1366 &tdmin_lb_lrclk,
1367 &tdmout_a_lrclk,
1368 &tdmout_b_lrclk,
1369 &tdmout_c_lrclk,
1370 };
1371
1372 static struct clk_regmap *const g12a_clk_regmaps[] = {
1373 &ddr_arb,
1374 &pdm,
1375 &tdmin_a,
1376 &tdmin_b,
1377 &tdmin_c,
1378 &tdmin_lb,
1379 &tdmout_a,
1380 &tdmout_b,
1381 &tdmout_c,
1382 &frddr_a,
1383 &frddr_b,
1384 &frddr_c,
1385 &toddr_a,
1386 &toddr_b,
1387 &toddr_c,
1388 &loopback,
1389 &spdifin,
1390 &spdifout,
1391 &resample,
1392 &power_detect,
1393 &spdifout_b,
1394 &mst_a_mclk_sel,
1395 &mst_b_mclk_sel,
1396 &mst_c_mclk_sel,
1397 &mst_d_mclk_sel,
1398 &mst_e_mclk_sel,
1399 &mst_f_mclk_sel,
1400 &mst_a_mclk_div,
1401 &mst_b_mclk_div,
1402 &mst_c_mclk_div,
1403 &mst_d_mclk_div,
1404 &mst_e_mclk_div,
1405 &mst_f_mclk_div,
1406 &mst_a_mclk,
1407 &mst_b_mclk,
1408 &mst_c_mclk,
1409 &mst_d_mclk,
1410 &mst_e_mclk,
1411 &mst_f_mclk,
1412 &spdifout_clk_sel,
1413 &spdifout_clk_div,
1414 &spdifout_clk,
1415 &spdifin_clk_sel,
1416 &spdifin_clk_div,
1417 &spdifin_clk,
1418 &pdm_dclk_sel,
1419 &pdm_dclk_div,
1420 &pdm_dclk,
1421 &pdm_sysclk_sel,
1422 &pdm_sysclk_div,
1423 &pdm_sysclk,
1424 &mst_a_sclk_pre_en,
1425 &mst_b_sclk_pre_en,
1426 &mst_c_sclk_pre_en,
1427 &mst_d_sclk_pre_en,
1428 &mst_e_sclk_pre_en,
1429 &mst_f_sclk_pre_en,
1430 &mst_a_sclk_div,
1431 &mst_b_sclk_div,
1432 &mst_c_sclk_div,
1433 &mst_d_sclk_div,
1434 &mst_e_sclk_div,
1435 &mst_f_sclk_div,
1436 &mst_a_sclk_post_en,
1437 &mst_b_sclk_post_en,
1438 &mst_c_sclk_post_en,
1439 &mst_d_sclk_post_en,
1440 &mst_e_sclk_post_en,
1441 &mst_f_sclk_post_en,
1442 &mst_a_sclk,
1443 &mst_b_sclk,
1444 &mst_c_sclk,
1445 &mst_d_sclk,
1446 &mst_e_sclk,
1447 &mst_f_sclk,
1448 &mst_a_lrclk_div,
1449 &mst_b_lrclk_div,
1450 &mst_c_lrclk_div,
1451 &mst_d_lrclk_div,
1452 &mst_e_lrclk_div,
1453 &mst_f_lrclk_div,
1454 &mst_a_lrclk,
1455 &mst_b_lrclk,
1456 &mst_c_lrclk,
1457 &mst_d_lrclk,
1458 &mst_e_lrclk,
1459 &mst_f_lrclk,
1460 &tdmin_a_sclk_sel,
1461 &tdmin_b_sclk_sel,
1462 &tdmin_c_sclk_sel,
1463 &tdmin_lb_sclk_sel,
1464 &tdmout_a_sclk_sel,
1465 &tdmout_b_sclk_sel,
1466 &tdmout_c_sclk_sel,
1467 &tdmin_a_sclk_pre_en,
1468 &tdmin_b_sclk_pre_en,
1469 &tdmin_c_sclk_pre_en,
1470 &tdmin_lb_sclk_pre_en,
1471 &tdmout_a_sclk_pre_en,
1472 &tdmout_b_sclk_pre_en,
1473 &tdmout_c_sclk_pre_en,
1474 &tdmin_a_sclk_post_en,
1475 &tdmin_b_sclk_post_en,
1476 &tdmin_c_sclk_post_en,
1477 &tdmin_lb_sclk_post_en,
1478 &tdmout_a_sclk_post_en,
1479 &tdmout_b_sclk_post_en,
1480 &tdmout_c_sclk_post_en,
1481 &tdmin_a_sclk,
1482 &tdmin_b_sclk,
1483 &tdmin_c_sclk,
1484 &tdmin_lb_sclk,
1485 &g12a_tdmout_a_sclk,
1486 &g12a_tdmout_b_sclk,
1487 &g12a_tdmout_c_sclk,
1488 &tdmin_a_lrclk,
1489 &tdmin_b_lrclk,
1490 &tdmin_c_lrclk,
1491 &tdmin_lb_lrclk,
1492 &tdmout_a_lrclk,
1493 &tdmout_b_lrclk,
1494 &tdmout_c_lrclk,
1495 &spdifout_b_clk_sel,
1496 &spdifout_b_clk_div,
1497 &spdifout_b_clk,
1498 &g12a_tdm_mclk_pad_0,
1499 &g12a_tdm_mclk_pad_1,
1500 &g12a_tdm_lrclk_pad_0,
1501 &g12a_tdm_lrclk_pad_1,
1502 &g12a_tdm_lrclk_pad_2,
1503 &g12a_tdm_sclk_pad_0,
1504 &g12a_tdm_sclk_pad_1,
1505 &g12a_tdm_sclk_pad_2,
1506 &toram,
1507 &eqdrc,
1508 };
1509
1510 static struct clk_regmap *const sm1_clk_regmaps[] = {
1511 &ddr_arb,
1512 &pdm,
1513 &tdmin_a,
1514 &tdmin_b,
1515 &tdmin_c,
1516 &tdmin_lb,
1517 &tdmout_a,
1518 &tdmout_b,
1519 &tdmout_c,
1520 &frddr_a,
1521 &frddr_b,
1522 &frddr_c,
1523 &toddr_a,
1524 &toddr_b,
1525 &toddr_c,
1526 &loopback,
1527 &spdifin,
1528 &spdifout,
1529 &resample,
1530 &spdifout_b,
1531 &sm1_mst_a_mclk_sel,
1532 &sm1_mst_b_mclk_sel,
1533 &sm1_mst_c_mclk_sel,
1534 &sm1_mst_d_mclk_sel,
1535 &sm1_mst_e_mclk_sel,
1536 &sm1_mst_f_mclk_sel,
1537 &sm1_mst_a_mclk_div,
1538 &sm1_mst_b_mclk_div,
1539 &sm1_mst_c_mclk_div,
1540 &sm1_mst_d_mclk_div,
1541 &sm1_mst_e_mclk_div,
1542 &sm1_mst_f_mclk_div,
1543 &sm1_mst_a_mclk,
1544 &sm1_mst_b_mclk,
1545 &sm1_mst_c_mclk,
1546 &sm1_mst_d_mclk,
1547 &sm1_mst_e_mclk,
1548 &sm1_mst_f_mclk,
1549 &spdifout_clk_sel,
1550 &spdifout_clk_div,
1551 &spdifout_clk,
1552 &spdifin_clk_sel,
1553 &spdifin_clk_div,
1554 &spdifin_clk,
1555 &pdm_dclk_sel,
1556 &pdm_dclk_div,
1557 &pdm_dclk,
1558 &pdm_sysclk_sel,
1559 &pdm_sysclk_div,
1560 &pdm_sysclk,
1561 &mst_a_sclk_pre_en,
1562 &mst_b_sclk_pre_en,
1563 &mst_c_sclk_pre_en,
1564 &mst_d_sclk_pre_en,
1565 &mst_e_sclk_pre_en,
1566 &mst_f_sclk_pre_en,
1567 &mst_a_sclk_div,
1568 &mst_b_sclk_div,
1569 &mst_c_sclk_div,
1570 &mst_d_sclk_div,
1571 &mst_e_sclk_div,
1572 &mst_f_sclk_div,
1573 &mst_a_sclk_post_en,
1574 &mst_b_sclk_post_en,
1575 &mst_c_sclk_post_en,
1576 &mst_d_sclk_post_en,
1577 &mst_e_sclk_post_en,
1578 &mst_f_sclk_post_en,
1579 &mst_a_sclk,
1580 &mst_b_sclk,
1581 &mst_c_sclk,
1582 &mst_d_sclk,
1583 &mst_e_sclk,
1584 &mst_f_sclk,
1585 &mst_a_lrclk_div,
1586 &mst_b_lrclk_div,
1587 &mst_c_lrclk_div,
1588 &mst_d_lrclk_div,
1589 &mst_e_lrclk_div,
1590 &mst_f_lrclk_div,
1591 &mst_a_lrclk,
1592 &mst_b_lrclk,
1593 &mst_c_lrclk,
1594 &mst_d_lrclk,
1595 &mst_e_lrclk,
1596 &mst_f_lrclk,
1597 &tdmin_a_sclk_sel,
1598 &tdmin_b_sclk_sel,
1599 &tdmin_c_sclk_sel,
1600 &tdmin_lb_sclk_sel,
1601 &tdmout_a_sclk_sel,
1602 &tdmout_b_sclk_sel,
1603 &tdmout_c_sclk_sel,
1604 &tdmin_a_sclk_pre_en,
1605 &tdmin_b_sclk_pre_en,
1606 &tdmin_c_sclk_pre_en,
1607 &tdmin_lb_sclk_pre_en,
1608 &tdmout_a_sclk_pre_en,
1609 &tdmout_b_sclk_pre_en,
1610 &tdmout_c_sclk_pre_en,
1611 &tdmin_a_sclk_post_en,
1612 &tdmin_b_sclk_post_en,
1613 &tdmin_c_sclk_post_en,
1614 &tdmin_lb_sclk_post_en,
1615 &tdmout_a_sclk_post_en,
1616 &tdmout_b_sclk_post_en,
1617 &tdmout_c_sclk_post_en,
1618 &tdmin_a_sclk,
1619 &tdmin_b_sclk,
1620 &tdmin_c_sclk,
1621 &tdmin_lb_sclk,
1622 &g12a_tdmout_a_sclk,
1623 &g12a_tdmout_b_sclk,
1624 &g12a_tdmout_c_sclk,
1625 &tdmin_a_lrclk,
1626 &tdmin_b_lrclk,
1627 &tdmin_c_lrclk,
1628 &tdmin_lb_lrclk,
1629 &tdmout_a_lrclk,
1630 &tdmout_b_lrclk,
1631 &tdmout_c_lrclk,
1632 &spdifout_b_clk_sel,
1633 &spdifout_b_clk_div,
1634 &spdifout_b_clk,
1635 &sm1_tdm_mclk_pad_0,
1636 &sm1_tdm_mclk_pad_1,
1637 &sm1_tdm_lrclk_pad_0,
1638 &sm1_tdm_lrclk_pad_1,
1639 &sm1_tdm_lrclk_pad_2,
1640 &sm1_tdm_sclk_pad_0,
1641 &sm1_tdm_sclk_pad_1,
1642 &sm1_tdm_sclk_pad_2,
1643 &sm1_aud_top,
1644 &toram,
1645 &eqdrc,
1646 &resample_b,
1647 &tovad,
1648 &locker,
1649 &spdifin_lb,
1650 &frddr_d,
1651 &toddr_d,
1652 &loopback_b,
1653 &sm1_clk81_en,
1654 &sm1_sysclk_a_div,
1655 &sm1_sysclk_a_en,
1656 &sm1_sysclk_b_div,
1657 &sm1_sysclk_b_en,
1658 };
1659
1660 struct axg_audio_reset_data {
1661 struct reset_controller_dev rstc;
1662 struct regmap *map;
1663 unsigned int offset;
1664 };
1665
1666 static void axg_audio_reset_reg_and_bit(struct axg_audio_reset_data *rst,
1667 unsigned long id,
1668 unsigned int *reg,
1669 unsigned int *bit)
1670 {
1671 unsigned int stride = regmap_get_reg_stride(rst->map);
1672
1673 *reg = (id / (stride * BITS_PER_BYTE)) * stride;
1674 *reg += rst->offset;
1675 *bit = id % (stride * BITS_PER_BYTE);
1676 }
1677
1678 static int axg_audio_reset_update(struct reset_controller_dev *rcdev,
1679 unsigned long id, bool assert)
1680 {
1681 struct axg_audio_reset_data *rst =
1682 container_of(rcdev, struct axg_audio_reset_data, rstc);
1683 unsigned int offset, bit;
1684
1685 axg_audio_reset_reg_and_bit(rst, id, &offset, &bit);
1686
1687 regmap_update_bits(rst->map, offset, BIT(bit),
1688 assert ? BIT(bit) : 0);
1689
1690 return 0;
1691 }
1692
1693 static int axg_audio_reset_status(struct reset_controller_dev *rcdev,
1694 unsigned long id)
1695 {
1696 struct axg_audio_reset_data *rst =
1697 container_of(rcdev, struct axg_audio_reset_data, rstc);
1698 unsigned int val, offset, bit;
1699
1700 axg_audio_reset_reg_and_bit(rst, id, &offset, &bit);
1701
1702 regmap_read(rst->map, offset, &val);
1703
1704 return !!(val & BIT(bit));
1705 }
1706
1707 static int axg_audio_reset_assert(struct reset_controller_dev *rcdev,
1708 unsigned long id)
1709 {
1710 return axg_audio_reset_update(rcdev, id, true);
1711 }
1712
1713 static int axg_audio_reset_deassert(struct reset_controller_dev *rcdev,
1714 unsigned long id)
1715 {
1716 return axg_audio_reset_update(rcdev, id, false);
1717 }
1718
1719 static int axg_audio_reset_toggle(struct reset_controller_dev *rcdev,
1720 unsigned long id)
1721 {
1722 int ret;
1723
1724 ret = axg_audio_reset_assert(rcdev, id);
1725 if (ret)
1726 return ret;
1727
1728 return axg_audio_reset_deassert(rcdev, id);
1729 }
1730
1731 static const struct reset_control_ops axg_audio_rstc_ops = {
1732 .assert = axg_audio_reset_assert,
1733 .deassert = axg_audio_reset_deassert,
1734 .reset = axg_audio_reset_toggle,
1735 .status = axg_audio_reset_status,
1736 };
1737
1738 static const struct regmap_config axg_audio_regmap_cfg = {
1739 .reg_bits = 32,
1740 .val_bits = 32,
1741 .reg_stride = 4,
1742 .max_register = AUDIO_CLK_SPDIFOUT_B_CTRL,
1743 };
1744
1745 struct audioclk_data {
1746 struct clk_regmap *const *regmap_clks;
1747 unsigned int regmap_clk_num;
1748 struct clk_hw_onecell_data *hw_onecell_data;
1749 unsigned int reset_offset;
1750 unsigned int reset_num;
1751 };
1752
1753 static int axg_audio_clkc_probe(struct platform_device *pdev)
1754 {
1755 struct device *dev = &pdev->dev;
1756 const struct audioclk_data *data;
1757 struct axg_audio_reset_data *rst;
1758 struct regmap *map;
1759 void __iomem *regs;
1760 struct clk_hw *hw;
1761 struct clk *clk;
1762 int ret, i;
1763
1764 data = of_device_get_match_data(dev);
1765 if (!data)
1766 return -EINVAL;
1767
1768 regs = devm_platform_ioremap_resource(pdev, 0);
1769 if (IS_ERR(regs))
1770 return PTR_ERR(regs);
1771
1772 map = devm_regmap_init_mmio(dev, regs, &axg_audio_regmap_cfg);
1773 if (IS_ERR(map)) {
1774 dev_err(dev, "failed to init regmap: %ld\n", PTR_ERR(map));
1775 return PTR_ERR(map);
1776 }
1777
1778
1779 clk = devm_clk_get_enabled(dev, "pclk");
1780 if (IS_ERR(clk))
1781 return PTR_ERR(clk);
1782
1783 ret = device_reset(dev);
1784 if (ret) {
1785 dev_err_probe(dev, ret, "failed to reset device\n");
1786 return ret;
1787 }
1788
1789
1790 for (i = 0; i < data->regmap_clk_num; i++)
1791 data->regmap_clks[i]->map = map;
1792
1793
1794 for (i = AUD_CLKID_DDR_ARB; i < data->hw_onecell_data->num; i++) {
1795 const char *name;
1796
1797 hw = data->hw_onecell_data->hws[i];
1798
1799 if (!hw)
1800 continue;
1801
1802 name = hw->init->name;
1803
1804 ret = devm_clk_hw_register(dev, hw);
1805 if (ret) {
1806 dev_err(dev, "failed to register clock %s\n", name);
1807 return ret;
1808 }
1809 }
1810
1811 ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
1812 data->hw_onecell_data);
1813 if (ret)
1814 return ret;
1815
1816
1817 if (!data->reset_num)
1818 return 0;
1819
1820 rst = devm_kzalloc(dev, sizeof(*rst), GFP_KERNEL);
1821 if (!rst)
1822 return -ENOMEM;
1823
1824 rst->map = map;
1825 rst->offset = data->reset_offset;
1826 rst->rstc.nr_resets = data->reset_num;
1827 rst->rstc.ops = &axg_audio_rstc_ops;
1828 rst->rstc.of_node = dev->of_node;
1829 rst->rstc.owner = THIS_MODULE;
1830
1831 return devm_reset_controller_register(dev, &rst->rstc);
1832 }
1833
1834 static const struct audioclk_data axg_audioclk_data = {
1835 .regmap_clks = axg_clk_regmaps,
1836 .regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps),
1837 .hw_onecell_data = &axg_audio_hw_onecell_data,
1838 };
1839
1840 static const struct audioclk_data g12a_audioclk_data = {
1841 .regmap_clks = g12a_clk_regmaps,
1842 .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
1843 .hw_onecell_data = &g12a_audio_hw_onecell_data,
1844 .reset_offset = AUDIO_SW_RESET,
1845 .reset_num = 26,
1846 };
1847
1848 static const struct audioclk_data sm1_audioclk_data = {
1849 .regmap_clks = sm1_clk_regmaps,
1850 .regmap_clk_num = ARRAY_SIZE(sm1_clk_regmaps),
1851 .hw_onecell_data = &sm1_audio_hw_onecell_data,
1852 .reset_offset = AUDIO_SM1_SW_RESET0,
1853 .reset_num = 39,
1854 };
1855
1856 static const struct of_device_id clkc_match_table[] = {
1857 {
1858 .compatible = "amlogic,axg-audio-clkc",
1859 .data = &axg_audioclk_data
1860 }, {
1861 .compatible = "amlogic,g12a-audio-clkc",
1862 .data = &g12a_audioclk_data
1863 }, {
1864 .compatible = "amlogic,sm1-audio-clkc",
1865 .data = &sm1_audioclk_data
1866 }, {}
1867 };
1868 MODULE_DEVICE_TABLE(of, clkc_match_table);
1869
1870 static struct platform_driver axg_audio_driver = {
1871 .probe = axg_audio_clkc_probe,
1872 .driver = {
1873 .name = "axg-audio-clkc",
1874 .of_match_table = clkc_match_table,
1875 },
1876 };
1877 module_platform_driver(axg_audio_driver);
1878
1879 MODULE_DESCRIPTION("Amlogic AXG/G12A/SM1 Audio Clock driver");
1880 MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
1881 MODULE_LICENSE("GPL v2");