Lines Matching full:sai
2 * STM32 ALSA SoC Digital Audio Interface (SAI) driver.
42 { .compatible = "st,stm32f4-sai", .data = (void *)&stm32_sai_conf_f4 },
43 { .compatible = "st,stm32h7-sai", .data = (void *)&stm32_sai_conf_h7 },
47 static int stm32_sai_sync_conf_client(struct stm32_sai_data *sai, int synci) in stm32_sai_sync_conf_client() argument
52 ret = clk_prepare_enable(sai->pclk); in stm32_sai_sync_conf_client()
54 dev_err(&sai->pdev->dev, "failed to enable clock: %d\n", ret); in stm32_sai_sync_conf_client()
58 writel_relaxed(FIELD_PREP(SAI_GCR_SYNCIN_MASK, (synci - 1)), sai->base); in stm32_sai_sync_conf_client()
60 clk_disable_unprepare(sai->pclk); in stm32_sai_sync_conf_client()
65 static int stm32_sai_sync_conf_provider(struct stm32_sai_data *sai, int synco) in stm32_sai_sync_conf_provider() argument
71 ret = clk_prepare_enable(sai->pclk); in stm32_sai_sync_conf_provider()
73 dev_err(&sai->pdev->dev, "failed to enable clock: %d\n", ret); in stm32_sai_sync_conf_provider()
77 dev_dbg(&sai->pdev->dev, "Set %s%s as synchro provider\n", in stm32_sai_sync_conf_provider()
78 sai->pdev->dev.of_node->name, in stm32_sai_sync_conf_provider()
81 prev_synco = FIELD_GET(SAI_GCR_SYNCOUT_MASK, readl_relaxed(sai->base)); in stm32_sai_sync_conf_provider()
83 dev_err(&sai->pdev->dev, "%s%s already set as sync provider\n", in stm32_sai_sync_conf_provider()
84 sai->pdev->dev.of_node->name, in stm32_sai_sync_conf_provider()
86 clk_disable_unprepare(sai->pclk); in stm32_sai_sync_conf_provider()
90 writel_relaxed(FIELD_PREP(SAI_GCR_SYNCOUT_MASK, synco), sai->base); in stm32_sai_sync_conf_provider()
92 clk_disable_unprepare(sai->pclk); in stm32_sai_sync_conf_provider()
114 "SAI sync provider data not found\n"); in stm32_sai_set_sync()
134 struct stm32_sai_data *sai; in stm32_sai_probe() local
139 sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL); in stm32_sai_probe()
140 if (!sai) in stm32_sai_probe()
144 sai->base = devm_ioremap_resource(&pdev->dev, res); in stm32_sai_probe()
145 if (IS_ERR(sai->base)) in stm32_sai_probe()
146 return PTR_ERR(sai->base); in stm32_sai_probe()
150 sai->conf = (struct stm32_sai_conf *)of_id->data; in stm32_sai_probe()
154 if (!STM_SAI_IS_F4(sai)) { in stm32_sai_probe()
155 sai->pclk = devm_clk_get(&pdev->dev, "pclk"); in stm32_sai_probe()
156 if (IS_ERR(sai->pclk)) { in stm32_sai_probe()
158 return PTR_ERR(sai->pclk); in stm32_sai_probe()
162 sai->clk_x8k = devm_clk_get(&pdev->dev, "x8k"); in stm32_sai_probe()
163 if (IS_ERR(sai->clk_x8k)) { in stm32_sai_probe()
165 return PTR_ERR(sai->clk_x8k); in stm32_sai_probe()
168 sai->clk_x11k = devm_clk_get(&pdev->dev, "x11k"); in stm32_sai_probe()
169 if (IS_ERR(sai->clk_x11k)) { in stm32_sai_probe()
171 return PTR_ERR(sai->clk_x11k); in stm32_sai_probe()
175 sai->irq = platform_get_irq(pdev, 0); in stm32_sai_probe()
176 if (sai->irq < 0) { in stm32_sai_probe()
178 return sai->irq; in stm32_sai_probe()
189 sai->pdev = pdev; in stm32_sai_probe()
190 sai->set_sync = &stm32_sai_set_sync; in stm32_sai_probe()
191 platform_set_drvdata(pdev, sai); in stm32_sai_probe()
200 .name = "st,stm32-sai",
208 MODULE_DESCRIPTION("STM32 Soc SAI Interface");
210 MODULE_ALIAS("platform:st,stm32-sai");