@@ -54,10 +54,12 @@ struct clk_imx8_acm_sel {
54
54
* struct imx8_acm_soc_data - soc specific data
55
55
* @sels: pointer to struct clk_imx8_acm_sel
56
56
* @num_sels: numbers of items
57
+ * @mclk_sels: pointer to imx8qm/qxp/dxl_mclk_sels
57
58
*/
58
59
struct imx8_acm_soc_data {
59
60
struct clk_imx8_acm_sel * sels ;
60
61
unsigned int num_sels ;
62
+ struct clk_parent_data * mclk_sels ;
61
63
};
62
64
63
65
/**
@@ -111,11 +113,14 @@ static const struct clk_parent_data imx8qm_mclk_out_sels[] = {
111
113
{ .fw_name = "sai6_rx_bclk" },
112
114
};
113
115
114
- static const struct clk_parent_data imx8qm_mclk_sels [] = {
116
+ #define ACM_AUD_CLK0_SEL_INDEX 2
117
+ #define ACM_AUD_CLK1_SEL_INDEX 3
118
+
119
+ static struct clk_parent_data imx8qm_mclk_sels [] = {
115
120
{ .fw_name = "aud_pll_div_clk0_lpcg_clk" },
116
121
{ .fw_name = "aud_pll_div_clk1_lpcg_clk" },
117
- { . fw_name = "acm_aud_clk0_sel" },
118
- { . fw_name = "acm_aud_clk1_sel" },
122
+ { }, /* clk_hw pointer of "acm_aud_clk0_sel" */
123
+ { }, /* clk_hw pointer of "acm_aud_clk1_sel" */
119
124
};
120
125
121
126
static const struct clk_parent_data imx8qm_asrc_mux_clk_sels [] = {
@@ -176,11 +181,11 @@ static const struct clk_parent_data imx8qxp_mclk_out_sels[] = {
176
181
{ .fw_name = "sai4_rx_bclk" },
177
182
};
178
183
179
- static const struct clk_parent_data imx8qxp_mclk_sels [] = {
184
+ static struct clk_parent_data imx8qxp_mclk_sels [] = {
180
185
{ .fw_name = "aud_pll_div_clk0_lpcg_clk" },
181
186
{ .fw_name = "aud_pll_div_clk1_lpcg_clk" },
182
- { . fw_name = "acm_aud_clk0_sel" },
183
- { . fw_name = "acm_aud_clk1_sel" },
187
+ { }, /* clk_hw pointer of "acm_aud_clk0_sel" */
188
+ { }, /* clk_hw pointer of "acm_aud_clk1_sel" */
184
189
};
185
190
186
191
static struct clk_imx8_acm_sel imx8qxp_sels [] = {
@@ -228,11 +233,11 @@ static const struct clk_parent_data imx8dxl_mclk_out_sels[] = {
228
233
{ .index = -1 },
229
234
};
230
235
231
- static const struct clk_parent_data imx8dxl_mclk_sels [] = {
236
+ static struct clk_parent_data imx8dxl_mclk_sels [] = {
232
237
{ .fw_name = "aud_pll_div_clk0_lpcg_clk" },
233
238
{ .fw_name = "aud_pll_div_clk1_lpcg_clk" },
234
- { . fw_name = "acm_aud_clk0_sel" },
235
- { . fw_name = "acm_aud_clk1_sel" },
239
+ { }, /* clk_hw pointer of "acm_aud_clk0_sel" */
240
+ { }, /* clk_hw pointer of "acm_aud_clk1_sel" */
236
241
};
237
242
238
243
static struct clk_imx8_acm_sel imx8dxl_sels [] = {
@@ -375,6 +380,18 @@ static int imx8_acm_clk_probe(struct platform_device *pdev)
375
380
imx_check_clk_hws (hws , IMX_ADMA_ACM_CLK_END );
376
381
goto err_clk_register ;
377
382
}
383
+
384
+ /*
385
+ * The IMX_ADMA_ACM_AUD_CLK0_SEL and IMX_ADMA_ACM_AUD_CLK1_SEL are
386
+ * registered first. After registration, update the clk_hw pointer
387
+ * to imx8qm/qxp/dxl_mclk_sels structures.
388
+ */
389
+ if (sels [i ].clkid == IMX_ADMA_ACM_AUD_CLK0_SEL )
390
+ priv -> soc_data -> mclk_sels [ACM_AUD_CLK0_SEL_INDEX ].hw =
391
+ hws [IMX_ADMA_ACM_AUD_CLK0_SEL ];
392
+ if (sels [i ].clkid == IMX_ADMA_ACM_AUD_CLK1_SEL )
393
+ priv -> soc_data -> mclk_sels [ACM_AUD_CLK1_SEL_INDEX ].hw =
394
+ hws [IMX_ADMA_ACM_AUD_CLK1_SEL ];
378
395
}
379
396
380
397
ret = devm_of_clk_add_hw_provider (dev , of_clk_hw_onecell_get , clk_hw_data );
@@ -406,16 +423,19 @@ static void imx8_acm_clk_remove(struct platform_device *pdev)
406
423
static const struct imx8_acm_soc_data imx8qm_acm_data = {
407
424
.sels = imx8qm_sels ,
408
425
.num_sels = ARRAY_SIZE (imx8qm_sels ),
426
+ .mclk_sels = imx8qm_mclk_sels ,
409
427
};
410
428
411
429
static const struct imx8_acm_soc_data imx8qxp_acm_data = {
412
430
.sels = imx8qxp_sels ,
413
431
.num_sels = ARRAY_SIZE (imx8qxp_sels ),
432
+ .mclk_sels = imx8qxp_mclk_sels ,
414
433
};
415
434
416
435
static const struct imx8_acm_soc_data imx8dxl_acm_data = {
417
436
.sels = imx8dxl_sels ,
418
437
.num_sels = ARRAY_SIZE (imx8dxl_sels ),
438
+ .mclk_sels = imx8dxl_mclk_sels ,
419
439
};
420
440
421
441
static const struct of_device_id imx8_acm_match [] = {
0 commit comments