.status_bit = 17,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0",
-               .parent_names = (const char *[]){ "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "xo", .name = "xo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
        .enable_mask = BIT(0),
        .hw.init = &(struct clk_init_data){
                .name = "gpll0_vote",
-               .parent_names = (const char *[]){ "gpll0" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_pll_vote_ops,
        },
        .status_bit = 17,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll4",
-               .parent_names = (const char *[]){ "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "xo", .name = "xo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
        .enable_mask = BIT(4),
        .hw.init = &(struct clk_init_data){
                .name = "gpll4_vote",
-               .parent_names = (const char *[]){ "gpll4" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll4.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_pll_vote_ops,
        },
        { P_GPLL0, 1 }
 };
 
-static const char * const gcc_xo_gpll0[] = {
-       "xo",
-       "gpll0_vote",
+static const struct clk_parent_data gcc_xo_gpll0[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
 };
 
 static const struct parent_map gcc_xo_gpll0_gpll4_map[] = {
        { P_GPLL4, 5 }
 };
 
-static const char * const gcc_xo_gpll0_gpll4[] = {
-       "xo",
-       "gpll0_vote",
-       "gpll4_vote",
+static const struct clk_parent_data gcc_xo_gpll0_gpll4[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &gpll4_vote.hw },
 };
 
 static struct clk_rcg2 config_noc_clk_src = {
        .parent_map = gcc_xo_gpll0_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "config_noc_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .parent_map = gcc_xo_gpll0_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "periph_noc_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .parent_map = gcc_xo_gpll0_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "system_noc_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .status_bit = 17,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll1",
-               .parent_names = (const char *[]){ "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "xo", .name = "xo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
        .enable_mask = BIT(1),
        .hw.init = &(struct clk_init_data){
                .name = "gpll1_vote",
-               .parent_names = (const char *[]){ "gpll1" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll1.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_pll_vote_ops,
        },
        .freq_tbl = ftbl_gcc_usb30_master_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_master_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart1_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart3_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart4_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart5_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart6_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup1_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup1_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup2_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup2_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup3_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup3_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup4_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup4_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup5_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup5_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup6_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup6_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart1_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart3_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart4_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart5_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_blsp1_2_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart6_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_ce1_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ce1_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_ce2_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ce2_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_gp_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp1_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_gp_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp2_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_gp_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp3_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_pdm2_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pdm2_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 
 static struct clk_init_data sdcc1_apps_clk_src_init = {
        .name = "sdcc1_apps_clk_src",
-       .parent_names = gcc_xo_gpll0,
+       .parent_data = gcc_xo_gpll0,
        .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
        .ops = &clk_rcg2_floor_ops,
 };
        .freq_tbl = ftbl_gcc_sdcc1_4_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
        .freq_tbl = ftbl_gcc_sdcc1_4_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc3_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
        .freq_tbl = ftbl_gcc_sdcc1_4_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc4_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
        .freq_tbl = ftbl_gcc_tsif_ref_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "tsif_ref_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_usb30_mock_utmi_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_mock_utmi_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_usb_hs_system_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_hs_system_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_usb_hsic_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_hsic_clk_src",
-               .parent_names = (const char *[]){
-                       "xo",
-                       "gpll1_vote",
+               .parent_data = (const struct clk_parent_data[]){
+                       { .fw_name = "xo", .name = "xo_board" },
+                       { .hw = &gpll1_vote.hw },
                },
                .num_parents = 2,
                .ops = &clk_rcg2_ops,
        .freq_tbl = ftbl_gcc_usb_hsic_io_cal_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_hsic_io_cal_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .freq_tbl = ftbl_gcc_usb_hsic_system_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_hsic_system_clk_src",
-               .parent_names = gcc_xo_gpll0,
+               .parent_data = gcc_xo_gpll0,
                .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
        .enable_mask = BIT(26),
        .hw.init = &(struct clk_init_data){
                .name = "mmss_gpll0_vote",
-               .parent_names = (const char *[]){
-                       "gpll0_vote",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0_vote.hw,
                },
                .num_parents = 1,
                .ops = &clk_branch_simple_ops,
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_bam_dma_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(17),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup1_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup1_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup1_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup1_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup1_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup1_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup2_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup2_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup2_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup2_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup3_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup3_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup3_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup3_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup4_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup4_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup4_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup4_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup5_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup5_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup5_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup5_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup6_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup6_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup6_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup6_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart1_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_uart1_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart1_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart2_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_uart2_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart3_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_uart3_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart3_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart4_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_uart4_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart4_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart5_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_uart5_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart5_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart6_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_uart6_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart6_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(15),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup1_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup1_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup1_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup1_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup1_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup1_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup2_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup2_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup2_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup2_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup2_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup2_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup3_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup3_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup3_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup3_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup3_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup3_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup4_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup4_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup4_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup4_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup4_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup4_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup5_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup5_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup5_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup5_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup5_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup5_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup6_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup6_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup6_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup6_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup6_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup6_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart1_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_uart1_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart1_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart2_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_uart2_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart3_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_uart3_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart3_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart4_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_uart4_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart4_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart5_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_uart5_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart5_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart6_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_uart6_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart6_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_boot_rom_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "config_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &config_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(3),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ce1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "config_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &config_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ce1_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(5),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ce1_clk",
-                       .parent_names = (const char *[]){
-                               "ce1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ce1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ce2_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "config_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &config_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ce2_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ce2_clk",
-                       .parent_names = (const char *[]){
-                               "ce2_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ce2_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp1_clk",
-                       .parent_names = (const char *[]){
-                               "gp1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp2_clk",
-                       .parent_names = (const char *[]){
-                               "gp2_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp2_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp3_clk",
-                       .parent_names = (const char *[]){
-                               "gp3_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp3_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_lpass_q6_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mmss_noc_cfg_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "config_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &config_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ocmem_noc_cfg_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "config_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &config_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mss_cfg_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "config_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &config_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mss_q6_bimc_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm2_clk",
-                       .parent_names = (const char *[]){
-                               "pdm2_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pdm2_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm_xo4_clk",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo", .name = "xo_board",
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
                .enable_mask = BIT(13),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_prng_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_apps_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc1_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc1_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_cdccal_ff_clk",
-                       .parent_names = (const char *[]){
-                               "xo"
+                       .parent_data = (const struct clk_parent_data[]){
+                               { .fw_name = "xo", .name = "xo_board" }
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_cdccal_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "sleep_clk_src"
+                       .parent_data = (const struct clk_parent_data[]){
+                               { .fw_name = "sleep_clk", .name = "sleep_clk_src" }
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc2_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc2_apps_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc2_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc3_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc3_apps_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc3_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc3_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc4_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc4_apps_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc4_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc4_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sys_noc_usb3_axi_clk",
-                       .parent_names = (const char *[]){
-                               "usb30_master_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb30_master_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_tsif_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_tsif_ref_clk",
-                       .parent_names = (const char *[]){
-                               "tsif_ref_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tsif_ref_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb2a_phy_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "sleep_clk_src",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk", .name = "sleep_clk_src",
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb2b_phy_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "sleep_clk_src",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk", .name = "sleep_clk_src",
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb30_master_clk",
-                       .parent_names = (const char *[]){
-                               "usb30_master_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb30_master_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb30_mock_utmi_clk",
-                       .parent_names = (const char *[]){
-                               "usb30_mock_utmi_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb30_mock_utmi_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb30_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "sleep_clk_src",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk", .name = "sleep_clk_src",
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_system_clk",
-                       .parent_names = (const char *[]){
-                               "usb_hs_system_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hs_system_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hsic_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &periph_noc_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hsic_clk",
-                       .parent_names = (const char *[]){
-                               "usb_hsic_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hsic_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hsic_io_cal_clk",
-                       .parent_names = (const char *[]){
-                               "usb_hsic_io_cal_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hsic_io_cal_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hsic_io_cal_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "sleep_clk_src",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk", .name = "sleep_clk_src",
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hsic_system_clk",
-                       .parent_names = (const char *[]){
-                               "usb_hsic_system_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hsic_system_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
 
 static void msm8974_pro_clock_override(void)
 {
-       sdcc1_apps_clk_src_init.parent_names = gcc_xo_gpll0_gpll4;
+       sdcc1_apps_clk_src_init.parent_data = gcc_xo_gpll0_gpll4;
        sdcc1_apps_clk_src_init.num_parents = 3;
        sdcc1_apps_clk_src.freq_tbl = ftbl_gcc_sdcc1_apps_clk_pro;
        sdcc1_apps_clk_src.parent_map = gcc_xo_gpll0_gpll4_map;