1919
2020#include "stm32_sai.h"
2121
22+ static int stm32_sai_get_parent_clk (struct stm32_sai_data * sai );
23+
2224static const struct stm32_sai_conf stm32_sai_conf_f4 = {
2325 .version = STM_SAI_STM32F4 ,
2426 .fifo_size = 8 ,
2527 .has_spdif_pdm = false,
28+ .get_sai_ck_parent = stm32_sai_get_parent_clk ,
2629};
2730
2831/*
29- * Default settings for stm32 H7 socs and next .
32+ * Default settings for STM32H7x socs and STM32MP1x .
3033 * These default settings will be overridden if the soc provides
3134 * support of hardware configuration registers.
35+ * - STM32H7: rely on default settings
36+ * - STM32MP1: retrieve settings from registers
3237 */
3338static const struct stm32_sai_conf stm32_sai_conf_h7 = {
3439 .version = STM_SAI_STM32H7 ,
3540 .fifo_size = 8 ,
3641 .has_spdif_pdm = true,
42+ .get_sai_ck_parent = stm32_sai_get_parent_clk ,
43+ };
44+
45+ /*
46+ * STM32MP2x:
47+ * - do not use SAI parent clock source selection
48+ * - do not use DMA burst mode
49+ */
50+ static const struct stm32_sai_conf stm32_sai_conf_mp25 = {
51+ .no_dma_burst = true,
3752};
3853
3954static const struct of_device_id stm32_sai_ids [] = {
4055 { .compatible = "st,stm32f4-sai" , .data = (void * )& stm32_sai_conf_f4 },
4156 { .compatible = "st,stm32h7-sai" , .data = (void * )& stm32_sai_conf_h7 },
57+ { .compatible = "st,stm32mp25-sai" , .data = (void * )& stm32_sai_conf_mp25 },
4258 {}
4359};
4460
@@ -148,6 +164,29 @@ static int stm32_sai_set_sync(struct stm32_sai_data *sai_client,
148164 return ret ;
149165}
150166
167+ static int stm32_sai_get_parent_clk (struct stm32_sai_data * sai )
168+ {
169+ struct device * dev = & sai -> pdev -> dev ;
170+
171+ sai -> clk_x8k = devm_clk_get (dev , "x8k" );
172+ if (IS_ERR (sai -> clk_x8k )) {
173+ if (PTR_ERR (sai -> clk_x8k ) != - EPROBE_DEFER )
174+ dev_err (dev , "missing x8k parent clock: %ld\n" ,
175+ PTR_ERR (sai -> clk_x8k ));
176+ return PTR_ERR (sai -> clk_x8k );
177+ }
178+
179+ sai -> clk_x11k = devm_clk_get (dev , "x11k" );
180+ if (IS_ERR (sai -> clk_x11k )) {
181+ if (PTR_ERR (sai -> clk_x11k ) != - EPROBE_DEFER )
182+ dev_err (dev , "missing x11k parent clock: %ld\n" ,
183+ PTR_ERR (sai -> clk_x11k ));
184+ return PTR_ERR (sai -> clk_x11k );
185+ }
186+
187+ return 0 ;
188+ }
189+
151190static int stm32_sai_probe (struct platform_device * pdev )
152191{
153192 struct stm32_sai_data * sai ;
@@ -160,6 +199,8 @@ static int stm32_sai_probe(struct platform_device *pdev)
160199 if (!sai )
161200 return - ENOMEM ;
162201
202+ sai -> pdev = pdev ;
203+
163204 sai -> base = devm_platform_ioremap_resource (pdev , 0 );
164205 if (IS_ERR (sai -> base ))
165206 return PTR_ERR (sai -> base );
@@ -178,15 +219,11 @@ static int stm32_sai_probe(struct platform_device *pdev)
178219 "missing bus clock pclk\n" );
179220 }
180221
181- sai -> clk_x8k = devm_clk_get (& pdev -> dev , "x8k" );
182- if (IS_ERR (sai -> clk_x8k ))
183- return dev_err_probe (& pdev -> dev , PTR_ERR (sai -> clk_x8k ),
184- "missing x8k parent clock\n" );
185-
186- sai -> clk_x11k = devm_clk_get (& pdev -> dev , "x11k" );
187- if (IS_ERR (sai -> clk_x11k ))
188- return dev_err_probe (& pdev -> dev , PTR_ERR (sai -> clk_x11k ),
189- "missing x11k parent clock\n" );
222+ if (sai -> conf .get_sai_ck_parent ) {
223+ ret = sai -> conf .get_sai_ck_parent (sai );
224+ if (ret )
225+ return ret ;
226+ }
190227
191228 /* init irqs */
192229 sai -> irq = platform_get_irq (pdev , 0 );
@@ -227,7 +264,6 @@ static int stm32_sai_probe(struct platform_device *pdev)
227264 }
228265 clk_disable_unprepare (sai -> pclk );
229266
230- sai -> pdev = pdev ;
231267 sai -> set_sync = & stm32_sai_set_sync ;
232268 platform_set_drvdata (pdev , sai );
233269
0 commit comments