.status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll4",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = (const struct clk_parent_data[]){
+                       { .fw_name = "pxo", .name = "pxo_board" },
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
        { P_PLL4, 2 }
 };
 
-static const char * const lcc_pxo_pll4[] = {
-       "pxo",
-       "pll4_vote",
+static const struct clk_parent_data lcc_pxo_pll4[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "pll4_vote", .name = "pll4_vote" },
 };
 
 static struct freq_tbl clk_tbl_aif_osr_492[] = {
                .enable_mask = BIT(9),                          \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_osr_src",             \
-                       .parent_names = lcc_pxo_pll4,           \
-                       .num_parents = 2,                       \
+                       .parent_data = lcc_pxo_pll4,            \
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4), \
                        .ops = &clk_rcg_ops,                    \
                        .flags = CLK_SET_RATE_GATE,             \
                },                                              \
        },                                                      \
 };                                                             \
-                                                               \
-static const char * const lcc_##prefix##_parents[] = {         \
-       #prefix "_osr_src",                                     \
-};                                                             \
 
 #define CLK_AIF_OSR_CLK(prefix, _ns, hr, en_bit)               \
 static struct clk_branch prefix##_osr_clk = {                  \
                .enable_mask = BIT(en_bit),                     \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_osr_clk",             \
-                       .parent_names = lcc_##prefix##_parents, \
+                       .parent_hws = (const struct clk_hw*[]){ \
+                               &prefix##_osr_src.clkr.hw,      \
+                       },                                      \
                        .num_parents = 1,                       \
                        .ops = &clk_branch_ops,                 \
                        .flags = CLK_SET_RATE_PARENT,           \
        .clkr = {                                               \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_div_clk",             \
-                       .parent_names = lcc_##prefix##_parents, \
+                       .parent_hws = (const struct clk_hw*[]){ \
+                               &prefix##_osr_src.clkr.hw,      \
+                       },                                      \
                        .num_parents = 1,                       \
                        .ops = &clk_regmap_div_ops,             \
                },                                              \
                .enable_mask = BIT(en_bit),                     \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_bit_div_clk",         \
-                       .parent_names = (const char *[]){       \
-                               #prefix "_div_clk"              \
-                       },                                      \
+                       .parent_hws = (const struct clk_hw*[]){ \
+                               &prefix##_div_clk.clkr.hw,      \
+                       },                                      \
                        .num_parents = 1,                       \
                        .ops = &clk_branch_ops,                 \
                        .flags = CLK_SET_RATE_PARENT,           \
        .clkr = {                                               \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_bit_clk",             \
-                       .parent_names = (const char *[]){       \
-                               #prefix "_bit_div_clk",         \
-                               #prefix "_codec_clk",           \
+                       .parent_data = (const struct clk_parent_data[]){ \
+                               { .hw = &prefix##_bit_div_clk.clkr.hw, }, \
+                               { .fw_name = #prefix "_codec_clk", \
+                                 .name = #prefix "_codec_clk", }, \
                        },                                      \
                        .num_parents = 2,                       \
                        .ops = &clk_regmap_mux_closest_ops,     \
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_clk_out",
-                       .parent_names = (const char *[]){ "pcm_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcm_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_clk",
-                       .parent_names = (const char *[]){
-                               "pcm_clk_out",
-                               "pcm_codec_clk",
+                       .parent_data = (const struct clk_parent_data[]){
+                               { .hw = &pcm_clk_out.clkr.hw },
+                               { .fw_name = "pcm_codec_clk", .name = "pcm_codec_clk" },
                        },
                        .num_parents = 2,
                        .ops = &clk_regmap_mux_closest_ops,
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "slimbus_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        },
 };
 
-static const char * const lcc_slimbus_parents[] = {
-       "slimbus_src",
-};
-
 static struct clk_branch audio_slimbus_clk = {
        .halt_reg = 0xd4,
        .halt_bit = 0,
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "audio_slimbus_clk",
-                       .parent_names = lcc_slimbus_parents,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &slimbus_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
                        .name = "sps_slimbus_clk",
-                       .parent_names = lcc_slimbus_parents,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &slimbus_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,