Lines Matching full:sai
3 * STM32 ALSA SoC Digital Audio Interface (SAI) driver.
40 { .compatible = "st,stm32f4-sai", .data = (void *)&stm32_sai_conf_f4 },
41 { .compatible = "st,stm32h7-sai", .data = (void *)&stm32_sai_conf_h7 },
47 struct stm32_sai_data *sai = dev_get_drvdata(dev); in stm32_sai_pclk_disable() local
49 clk_disable_unprepare(sai->pclk); in stm32_sai_pclk_disable()
56 struct stm32_sai_data *sai = dev_get_drvdata(dev); in stm32_sai_pclk_enable() local
59 ret = clk_prepare_enable(sai->pclk); in stm32_sai_pclk_enable()
61 dev_err(&sai->pdev->dev, "failed to enable clock: %d\n", ret); in stm32_sai_pclk_enable()
68 static int stm32_sai_sync_conf_client(struct stm32_sai_data *sai, int synci) in stm32_sai_sync_conf_client() argument
73 ret = stm32_sai_pclk_enable(&sai->pdev->dev); in stm32_sai_sync_conf_client()
77 writel_relaxed(FIELD_PREP(SAI_GCR_SYNCIN_MASK, (synci - 1)), sai->base); in stm32_sai_sync_conf_client()
79 stm32_sai_pclk_disable(&sai->pdev->dev); in stm32_sai_sync_conf_client()
84 static int stm32_sai_sync_conf_provider(struct stm32_sai_data *sai, int synco) in stm32_sai_sync_conf_provider() argument
90 ret = stm32_sai_pclk_enable(&sai->pdev->dev); in stm32_sai_sync_conf_provider()
94 dev_dbg(&sai->pdev->dev, "Set %pOFn%s as synchro provider\n", in stm32_sai_sync_conf_provider()
95 sai->pdev->dev.of_node, in stm32_sai_sync_conf_provider()
98 prev_synco = FIELD_GET(SAI_GCR_SYNCOUT_MASK, readl_relaxed(sai->base)); in stm32_sai_sync_conf_provider()
100 dev_err(&sai->pdev->dev, "%pOFn%s already set as sync provider\n", in stm32_sai_sync_conf_provider()
101 sai->pdev->dev.of_node, in stm32_sai_sync_conf_provider()
103 stm32_sai_pclk_disable(&sai->pdev->dev); in stm32_sai_sync_conf_provider()
107 writel_relaxed(FIELD_PREP(SAI_GCR_SYNCOUT_MASK, synco), sai->base); in stm32_sai_sync_conf_provider()
109 stm32_sai_pclk_disable(&sai->pdev->dev); in stm32_sai_sync_conf_provider()
132 "SAI sync provider data not found\n"); in stm32_sai_set_sync()
153 struct stm32_sai_data *sai; in stm32_sai_probe() local
159 sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL); in stm32_sai_probe()
160 if (!sai) in stm32_sai_probe()
163 sai->base = devm_platform_ioremap_resource(pdev, 0); in stm32_sai_probe()
164 if (IS_ERR(sai->base)) in stm32_sai_probe()
165 return PTR_ERR(sai->base); in stm32_sai_probe()
169 memcpy(&sai->conf, (const struct stm32_sai_conf *)of_id->data, in stm32_sai_probe()
174 if (!STM_SAI_IS_F4(sai)) { in stm32_sai_probe()
175 sai->pclk = devm_clk_get(&pdev->dev, "pclk"); in stm32_sai_probe()
176 if (IS_ERR(sai->pclk)) { in stm32_sai_probe()
177 if (PTR_ERR(sai->pclk) != -EPROBE_DEFER) in stm32_sai_probe()
179 PTR_ERR(sai->pclk)); in stm32_sai_probe()
180 return PTR_ERR(sai->pclk); in stm32_sai_probe()
184 sai->clk_x8k = devm_clk_get(&pdev->dev, "x8k"); in stm32_sai_probe()
185 if (IS_ERR(sai->clk_x8k)) { in stm32_sai_probe()
186 if (PTR_ERR(sai->clk_x8k) != -EPROBE_DEFER) in stm32_sai_probe()
188 PTR_ERR(sai->clk_x8k)); in stm32_sai_probe()
189 return PTR_ERR(sai->clk_x8k); in stm32_sai_probe()
192 sai->clk_x11k = devm_clk_get(&pdev->dev, "x11k"); in stm32_sai_probe()
193 if (IS_ERR(sai->clk_x11k)) { in stm32_sai_probe()
194 if (PTR_ERR(sai->clk_x11k) != -EPROBE_DEFER) in stm32_sai_probe()
196 PTR_ERR(sai->clk_x11k)); in stm32_sai_probe()
197 return PTR_ERR(sai->clk_x11k); in stm32_sai_probe()
201 sai->irq = platform_get_irq(pdev, 0); in stm32_sai_probe()
202 if (sai->irq < 0) in stm32_sai_probe()
203 return sai->irq; in stm32_sai_probe()
218 ret = clk_prepare_enable(sai->pclk); in stm32_sai_probe()
225 readl_relaxed(sai->base + STM_SAI_IDR)); in stm32_sai_probe()
227 val = readl_relaxed(sai->base + STM_SAI_HWCFGR); in stm32_sai_probe()
228 sai->conf.fifo_size = FIELD_GET(SAI_HWCFGR_FIFO_SIZE, val); in stm32_sai_probe()
229 sai->conf.has_spdif_pdm = !!FIELD_GET(SAI_HWCFGR_SPDIF_PDM, in stm32_sai_probe()
232 val = readl_relaxed(sai->base + STM_SAI_VERR); in stm32_sai_probe()
233 sai->conf.version = val; in stm32_sai_probe()
235 dev_dbg(&pdev->dev, "SAI version: %lu.%lu registered\n", in stm32_sai_probe()
239 clk_disable_unprepare(sai->pclk); in stm32_sai_probe()
241 sai->pdev = pdev; in stm32_sai_probe()
242 sai->set_sync = &stm32_sai_set_sync; in stm32_sai_probe()
243 platform_set_drvdata(pdev, sai); in stm32_sai_probe()
250 * When pins are shared by two sai sub instances, pins have to be defined
251 * in sai parent node. In this case, pins state is not managed by alsa fw.
256 struct stm32_sai_data *sai = dev_get_drvdata(dev); in stm32_sai_suspend() local
263 sai->gcr = readl_relaxed(sai->base); in stm32_sai_suspend()
271 struct stm32_sai_data *sai = dev_get_drvdata(dev); in stm32_sai_resume() local
278 writel_relaxed(sai->gcr, sai->base); in stm32_sai_resume()
293 .name = "st,stm32-sai",
302 MODULE_DESCRIPTION("STM32 Soc SAI Interface");
304 MODULE_ALIAS("platform:st,stm32-sai");