1 // SPDX-License-Identifier: GPL-2.0
3 * SPDIF driver for the StarFive JH7110 SoC
5 * Copyright (C) 2022 StarFive Technology Co., Ltd.
8 #include <linux/init.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/platform_device.h>
12 #include <linux/slab.h>
14 #include <linux/clk.h>
15 #include <linux/regmap.h>
16 #include <linux/reset.h>
18 #include <sound/core.h>
19 #include <sound/pcm.h>
20 #include <sound/pcm_params.h>
21 #include <sound/soc.h>
22 #include <sound/initval.h>
23 #include <sound/dmaengine_pcm.h>
24 #include <linux/pm_runtime.h>
25 #include "starfive_spdif.h"
27 static irqreturn_t spdif_irq_handler(int irq, void *dev_id)
29 struct sf_spdif_dev *dev = dev_id;
30 bool irq_valid = false;
34 regmap_read(dev->regmap, SPDIF_INT_REG, &intr);
35 regmap_read(dev->regmap, SPDIF_STAT_REG, &stat);
36 regmap_update_bits(dev->regmap, SPDIF_CTRL,
37 SPDIF_MASK_ENABLE, 0);
38 regmap_update_bits(dev->regmap, SPDIF_INT_REG,
39 SPDIF_INT_REG_BIT, 0);
41 if ((stat & SPDIF_EMPTY_FLAG) || (stat & SPDIF_AEMPTY_FLAG)) {
42 sf_spdif_pcm_push_tx(dev);
46 if ((stat & SPDIF_FULL_FLAG) || (stat & SPDIF_AFULL_FLAG)) {
47 sf_spdif_pcm_pop_rx(dev);
51 if (stat & SPDIF_PARITY_FLAG)
54 if (stat & SPDIF_UNDERR_FLAG)
57 if (stat & SPDIF_OVRERR_FLAG)
60 if (stat & SPDIF_SYNCERR_FLAG)
63 if (stat & SPDIF_LOCK_FLAG)
66 if (stat & SPDIF_BEGIN_FLAG)
69 if (stat & SPDIF_RIGHT_LEFT)
72 regmap_update_bits(dev->regmap, SPDIF_CTRL,
73 SPDIF_MASK_ENABLE, SPDIF_MASK_ENABLE);
81 static int sf_spdif_trigger(struct snd_pcm_substream *substream, int cmd,
82 struct snd_soc_dai *dai)
84 struct sf_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
87 tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
90 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
91 SPDIF_TR_MODE, SPDIF_TR_MODE);
93 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
94 SPDIF_MASK_FIFO, SPDIF_EMPTY_MASK | SPDIF_AEMPTY_MASK);
97 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
100 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
101 SPDIF_MASK_FIFO, SPDIF_FULL_MASK | SPDIF_AFULL_MASK);
105 case SNDRV_PCM_TRIGGER_START:
106 case SNDRV_PCM_TRIGGER_RESUME:
107 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
108 /* clock recovery form the SPDIF data stream 0:clk_enable */
109 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
110 SPDIF_CLK_ENABLE, 0);
112 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
113 SPDIF_ENABLE, SPDIF_ENABLE);
115 case SNDRV_PCM_TRIGGER_STOP:
116 case SNDRV_PCM_TRIGGER_SUSPEND:
117 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
118 /* clock recovery form the SPDIF data stream 1:power save mode */
119 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
120 SPDIF_CLK_ENABLE, SPDIF_CLK_ENABLE);
122 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
126 dev_err(dai->dev, "%s L.%d cmd:%d\n", __func__, __LINE__, cmd);
133 static int sf_spdif_hw_params(struct snd_pcm_substream *substream,
134 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
136 struct sf_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
137 unsigned int channels;
140 unsigned int tsamplerate;
142 unsigned int audio_root;
145 channels = params_channels(params);
146 rate = params_rate(params);
147 format = params_format(params);
151 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
152 SPDIF_CHANNEL_MODE, SPDIF_CHANNEL_MODE);
153 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
154 SPDIF_DUPLICATE, SPDIF_DUPLICATE);
155 spdif->channels = false;
158 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
159 SPDIF_CHANNEL_MODE, 0);
160 spdif->channels = true;
163 dev_err(dai->dev, "invalid channels number\n");
168 case SNDRV_PCM_FORMAT_S16_LE:
169 case SNDRV_PCM_FORMAT_S24_LE:
170 case SNDRV_PCM_FORMAT_S24_3LE:
171 case SNDRV_PCM_FORMAT_S32_LE:
174 dev_err(dai->dev, "invalid format\n");
182 audio_root = 148500000;
183 /* 11025 * 512 = 5644800 */
184 /* But now pll2 is 1188m and mclk should be 5711539 closely. */
190 audio_root = 148500000;
194 dev_err(dai->dev, "channel:%d sample rate:%d\n", channels, rate);
198 /* use mclk_inner clock from 1188m PLL2 will be better about 11k and 22k*/
199 if ((rate == 11025) || (rate == 22050)) {
200 ret = clk_set_parent(spdif->mclk, spdif->mclk_inner);
203 "failed to set parent to mclk_inner ret=%d\n", ret);
207 ret = clk_set_rate(spdif->audio_root, audio_root);
209 dev_err(dai->dev, "failed to set audio_root rate :%d\n", ret);
212 dev_dbg(dai->dev, "audio_root get rate:%ld\n",
213 clk_get_rate(spdif->audio_root));
215 ret = clk_set_rate(spdif->mclk_inner, mclk);
217 dev_err(dai->dev, "failed to set mclk_inner rate :%d\n", ret);
221 mclk = clk_get_rate(spdif->mclk_inner);
222 dev_dbg(dai->dev, "mclk_inner get rate:%d\n", mclk);
224 ret = clk_set_parent(spdif->mclk, spdif->mclk_ext);
227 "failed to set parent to mclk_ext ret=%d\n", ret);
231 mclk = clk_get_rate(spdif->mclk_ext);
232 dev_dbg(dai->dev, "mclk_ext get rate:%d\n", mclk);
235 /* (FCLK)4096000/128=32000 */
236 tsamplerate = (mclk / 128 + rate / 2) / rate - 1;
240 /* transmission sample rate */
241 regmap_update_bits(spdif->regmap, SPDIF_CTRL, 0xFF, tsamplerate);
249 static int sf_spdif_clks_get(struct platform_device *pdev,
250 struct sf_spdif_dev *spdif)
252 static struct clk_bulk_data clks[] = {
253 { .id = "spdif-apb" }, /* clock-names in dts file */
254 { .id = "spdif-core" },
256 { .id = "mclk_inner"},
260 int ret = devm_clk_bulk_get(&pdev->dev, ARRAY_SIZE(clks), clks);
262 spdif->spdif_apb = clks[0].clk;
263 spdif->spdif_core = clks[1].clk;
264 spdif->audio_root = clks[2].clk;
265 spdif->mclk_inner = clks[3].clk;
266 spdif->mclk_ext = clks[4].clk;
267 spdif->mclk = clks[5].clk;
272 static int sf_spdif_resets_get(struct platform_device *pdev,
273 struct sf_spdif_dev *spdif)
275 struct reset_control_bulk_data resets[] = {
278 int ret = devm_reset_control_bulk_get_exclusive(&pdev->dev, ARRAY_SIZE(resets), resets);
283 spdif->rst_apb = resets[0].rstc;
288 static int starfive_spdif_crg_enable(struct sf_spdif_dev *spdif, bool enable)
292 dev_dbg(spdif->dev, "starfive_spdif clk&rst %sable.\n", enable ? "en":"dis");
294 ret = clk_prepare_enable(spdif->spdif_apb);
296 dev_err(spdif->dev, "failed to prepare enable spdif_apb\n");
300 ret = clk_prepare_enable(spdif->spdif_core);
302 dev_err(spdif->dev, "failed to prepare enable spdif_core\n");
303 goto failed_core_clk;
306 ret = reset_control_deassert(spdif->rst_apb);
308 dev_err(spdif->dev, "failed to deassert apb\n");
312 clk_disable_unprepare(spdif->spdif_core);
313 clk_disable_unprepare(spdif->spdif_apb);
319 clk_disable_unprepare(spdif->spdif_core);
321 clk_disable_unprepare(spdif->spdif_apb);
326 static int sf_spdif_clk_init(struct platform_device *pdev,
327 struct sf_spdif_dev *spdif)
331 ret = starfive_spdif_crg_enable(spdif, true);
335 ret = clk_set_rate(spdif->audio_root, 204800000);
337 dev_err(&pdev->dev, "failed to set rate for spdif audroot ret=%d\n", ret);
338 goto disable_core_clk;
341 ret = clk_set_rate(spdif->mclk_inner, 8192000);
343 dev_err(&pdev->dev, "failed to set rate for spdif mclk_inner ret=%d\n", ret);
344 goto disable_core_clk;
347 dev_dbg(&pdev->dev, "spdif->spdif_apb = %lu\n", clk_get_rate(spdif->spdif_apb));
348 dev_dbg(&pdev->dev, "spdif->spdif_core = %lu\n", clk_get_rate(spdif->spdif_core));
350 ret = clk_set_parent(spdif->mclk, spdif->mclk_ext);
352 dev_err(&pdev->dev, "failed to set parent for mclk to mclk_ext ret=%d\n", ret);
353 goto disable_core_clk;
359 clk_disable_unprepare(spdif->spdif_core);
360 clk_disable_unprepare(spdif->spdif_apb);
365 static int sf_spdif_dai_probe(struct snd_soc_dai *dai)
367 struct sf_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
369 pm_runtime_get_sync(spdif->dev);
372 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
373 SPDIF_ENABLE | SPDIF_SFR_ENABLE | SPDIF_FIFO_ENABLE, 0);
376 regmap_update_bits(spdif->regmap, SPDIF_INT_REG,
377 SPDIF_INT_REG_BIT, 0);
379 /* power save mode */
380 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
381 SPDIF_CLK_ENABLE, SPDIF_CLK_ENABLE);
383 /* power save mode */
384 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
385 SPDIF_CLK_ENABLE, SPDIF_CLK_ENABLE);
387 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
388 SPDIF_PARITCHECK|SPDIF_VALIDITYCHECK|SPDIF_DUPLICATE,
389 SPDIF_PARITCHECK|SPDIF_VALIDITYCHECK|SPDIF_DUPLICATE);
391 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
392 SPDIF_SETPREAMBB, SPDIF_SETPREAMBB);
394 regmap_update_bits(spdif->regmap, SPDIF_INT_REG,
395 BIT8TO20MASK<<SPDIF_PREAMBLEDEL, 0x3<<SPDIF_PREAMBLEDEL);
397 regmap_update_bits(spdif->regmap, SPDIF_FIFO_CTRL,
398 ALLBITMASK, 0x20|(0x20<<SPDIF_AFULL_THRESHOLD));
400 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
401 SPDIF_PARITYGEN, SPDIF_PARITYGEN);
403 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
404 SPDIF_MASK_ENABLE, SPDIF_MASK_ENABLE);
406 /* APB access to FIFO enable, disable if use DMA/FIFO */
407 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
408 SPDIF_USE_FIFO_IF, 0);
411 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
412 SPDIF_CHANNEL_MODE, 0);
414 pm_runtime_put_sync(spdif->dev);
418 static const struct snd_soc_dai_ops sf_spdif_dai_ops = {
419 .trigger = sf_spdif_trigger,
420 .hw_params = sf_spdif_hw_params,
423 #ifdef CONFIG_PM_SLEEP
424 static int spdif_system_suspend(struct device *dev)
426 struct sf_spdif_dev *spdif = dev_get_drvdata(dev);
428 /* save the register value */
429 regmap_read(spdif->regmap, SPDIF_CTRL, &spdif->reg_spdif_ctrl);
430 regmap_read(spdif->regmap, SPDIF_INT_REG, &spdif->reg_spdif_int);
431 regmap_read(spdif->regmap, SPDIF_FIFO_CTRL, &spdif->reg_spdif_fifo_ctrl);
433 return pm_runtime_force_suspend(dev);
436 static int spdif_system_resume(struct device *dev)
438 struct sf_spdif_dev *spdif = dev_get_drvdata(dev);
441 ret = pm_runtime_force_resume(dev);
445 /* restore the register value */
446 regmap_update_bits(spdif->regmap, SPDIF_CTRL,
447 ALLBITMASK, spdif->reg_spdif_ctrl);
448 regmap_update_bits(spdif->regmap, SPDIF_INT_REG,
449 ALLBITMASK, spdif->reg_spdif_int);
450 regmap_update_bits(spdif->regmap, SPDIF_FIFO_CTRL,
451 ALLBITMASK, spdif->reg_spdif_fifo_ctrl);
458 static int spdif_runtime_suspend(struct device *dev)
460 struct sf_spdif_dev *spdif = dev_get_drvdata(dev);
462 return starfive_spdif_crg_enable(spdif, false);
465 static int spdif_runtime_resume(struct device *dev)
467 struct sf_spdif_dev *spdif = dev_get_drvdata(dev);
469 return starfive_spdif_crg_enable(spdif, true);
473 static const struct dev_pm_ops spdif_pm_ops = {
474 SET_RUNTIME_PM_OPS(spdif_runtime_suspend, spdif_runtime_resume, NULL)
475 SET_SYSTEM_SLEEP_PM_OPS(spdif_system_suspend, spdif_system_resume)
478 #define SF_PCM_RATE_44100_192000 (SNDRV_PCM_RATE_44100 | \
479 SNDRV_PCM_RATE_48000 | \
480 SNDRV_PCM_RATE_96000 | \
481 SNDRV_PCM_RATE_192000)
483 #define SF_PCM_RATE_8000_22050 (SNDRV_PCM_RATE_8000 | \
484 SNDRV_PCM_RATE_11025 | \
485 SNDRV_PCM_RATE_16000 | \
486 SNDRV_PCM_RATE_22050)
488 static struct snd_soc_dai_driver sf_spdif_dai = {
491 .probe = sf_spdif_dai_probe,
493 .stream_name = "Playback",
496 .rates = SF_PCM_RATE_8000_22050,
497 .formats = SNDRV_PCM_FMTBIT_S16_LE |
498 SNDRV_PCM_FMTBIT_S24_LE |
499 SNDRV_PCM_FMTBIT_S24_3LE |
500 SNDRV_PCM_FMTBIT_S32_LE,
502 .ops = &sf_spdif_dai_ops,
506 static const struct snd_soc_component_driver sf_spdif_component = {
507 .name = "starfive-spdif",
510 static const struct regmap_config sf_spdif_regmap_config = {
514 .max_register = 0x200,
517 static int sf_spdif_probe(struct platform_device *pdev)
519 struct sf_spdif_dev *spdif;
520 struct resource *res;
525 spdif = devm_kzalloc(&pdev->dev, sizeof(*spdif), GFP_KERNEL);
529 platform_set_drvdata(pdev, spdif);
531 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
532 base = devm_ioremap_resource(&pdev->dev, res);
534 return PTR_ERR(base);
536 spdif->spdif_base = base;
537 spdif->regmap = devm_regmap_init_mmio(&pdev->dev, spdif->spdif_base,
538 &sf_spdif_regmap_config);
539 if (IS_ERR(spdif->regmap))
540 return PTR_ERR(spdif->regmap);
542 spdif->dev = &pdev->dev;
544 ret = sf_spdif_clks_get(pdev, spdif);
546 dev_err(&pdev->dev, "failed to get audio clock\n");
550 ret = sf_spdif_resets_get(pdev, spdif);
552 dev_err(&pdev->dev, "failed to get audio reset controls\n");
556 ret = sf_spdif_clk_init(pdev, spdif);
558 dev_err(&pdev->dev, "failed to enable audio clock\n");
564 irq = platform_get_irq(pdev, 0);
566 ret = devm_request_irq(&pdev->dev, irq, spdif_irq_handler, 0,
569 dev_err(&pdev->dev, "failed to request irq\n");
574 ret = devm_snd_soc_register_component(&pdev->dev, &sf_spdif_component,
577 goto err_clk_disable;
580 ret = sf_spdif_pcm_register(pdev);
581 spdif->use_pio = true;
583 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL,
585 spdif->use_pio = false;
589 goto err_clk_disable;
591 starfive_spdif_crg_enable(spdif, false);
592 pm_runtime_enable(&pdev->dev);
593 dev_info(&pdev->dev, "spdif register done.\n");
601 static const struct of_device_id sf_spdif_of_match[] = {
602 { .compatible = "starfive,jh7110-spdif", },
605 MODULE_DEVICE_TABLE(of, sf_spdif_of_match);
607 static struct platform_driver sf_spdif_driver = {
609 .name = "starfive-spdif",
610 .of_match_table = sf_spdif_of_match,
613 .probe = sf_spdif_probe,
615 module_platform_driver(sf_spdif_driver);
617 MODULE_AUTHOR("curry.zhang <curry.zhang@starfive.com>");
618 MODULE_AUTHOR("Xingyu Wu <xingyu.wu@starfivetech.com>");
619 MODULE_DESCRIPTION("starfive SPDIF driver");
620 MODULE_LICENSE("GPL v2");