kirkwood-i2s.c (088eef2219bd1e8cb82bfcb5b32c1c687aeea6d7) kirkwood-i2s.c (af64d7341ab51335eeb03453180cf200b120ec43)
1/*
2 * kirkwood-i2s.c
3 *
4 * (c) 2010 Arnaud Patard <apatard@mandriva.com>
5 * (c) 2010 Arnaud Patard <arnaud.patard@rtp-net.org>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the

--- 12 unchanged lines hidden (view full) ---

21#include <sound/pcm.h>
22#include <sound/pcm_params.h>
23#include <sound/soc.h>
24#include <linux/platform_data/asoc-kirkwood.h>
25#include "kirkwood.h"
26
27#define DRV_NAME "kirkwood-i2s"
28
1/*
2 * kirkwood-i2s.c
3 *
4 * (c) 2010 Arnaud Patard <apatard@mandriva.com>
5 * (c) 2010 Arnaud Patard <arnaud.patard@rtp-net.org>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the

--- 12 unchanged lines hidden (view full) ---

21#include <sound/pcm.h>
22#include <sound/pcm_params.h>
23#include <sound/soc.h>
24#include <linux/platform_data/asoc-kirkwood.h>
25#include "kirkwood.h"
26
27#define DRV_NAME "kirkwood-i2s"
28
29#define KIRKWOOD_I2S_RATES \
30 (SNDRV_PCM_RATE_44100 | \
31 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
32#define KIRKWOOD_I2S_FORMATS \
33 (SNDRV_PCM_FMTBIT_S16_LE | \
34 SNDRV_PCM_FMTBIT_S24_LE | \
35 SNDRV_PCM_FMTBIT_S32_LE)
36
37static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
38 unsigned int fmt)
39{

--- 60 unchanged lines hidden (view full) ---

100}
101
102static void kirkwood_set_rate(struct snd_soc_dai *dai,
103 struct kirkwood_dma_data *priv, unsigned long rate)
104{
105 uint32_t clks_ctrl;
106
107 if (rate == 44100 || rate == 48000 || rate == 96000) {
29#define KIRKWOOD_I2S_FORMATS \
30 (SNDRV_PCM_FMTBIT_S16_LE | \
31 SNDRV_PCM_FMTBIT_S24_LE | \
32 SNDRV_PCM_FMTBIT_S32_LE)
33
34static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
35 unsigned int fmt)
36{

--- 60 unchanged lines hidden (view full) ---

97}
98
99static void kirkwood_set_rate(struct snd_soc_dai *dai,
100 struct kirkwood_dma_data *priv, unsigned long rate)
101{
102 uint32_t clks_ctrl;
103
104 if (rate == 44100 || rate == 48000 || rate == 96000) {
108 /* use internal dco for supported rates */
105 /* use internal dco for the supported rates
106 * defined in kirkwood_i2s_dai */
109 dev_dbg(dai->dev, "%s: dco set rate = %lu\n",
110 __func__, rate);
111 kirkwood_set_dco(priv->io, rate);
112
113 clks_ctrl = KIRKWOOD_MCLK_SOURCE_DCO;
107 dev_dbg(dai->dev, "%s: dco set rate = %lu\n",
108 __func__, rate);
109 kirkwood_set_dco(priv->io, rate);
110
111 clks_ctrl = KIRKWOOD_MCLK_SOURCE_DCO;
114 } else if (!IS_ERR(priv->extclk)) {
115 /* use optional external clk for other rates */
112 } else {
113 /* use the external clock for the other rates
114 * defined in kirkwood_i2s_dai_extclk */
116 dev_dbg(dai->dev, "%s: extclk set rate = %lu -> %lu\n",
117 __func__, rate, 256 * rate);
118 clk_set_rate(priv->extclk, 256 * rate);
119
120 clks_ctrl = KIRKWOOD_MCLK_SOURCE_EXTCLK;
121 }
122 writel(clks_ctrl, priv->io + KIRKWOOD_CLOCKS_CTRL);
123}

--- 269 unchanged lines hidden (view full) ---

393 value = readl(priv->io + KIRKWOOD_RECCTL);
394 value &= ~(KIRKWOOD_RECCTL_I2S_EN | KIRKWOOD_RECCTL_SPDIF_EN);
395 writel(value, priv->io + KIRKWOOD_RECCTL);
396
397 return 0;
398
399}
400
115 dev_dbg(dai->dev, "%s: extclk set rate = %lu -> %lu\n",
116 __func__, rate, 256 * rate);
117 clk_set_rate(priv->extclk, 256 * rate);
118
119 clks_ctrl = KIRKWOOD_MCLK_SOURCE_EXTCLK;
120 }
121 writel(clks_ctrl, priv->io + KIRKWOOD_CLOCKS_CTRL);
122}

--- 269 unchanged lines hidden (view full) ---

392 value = readl(priv->io + KIRKWOOD_RECCTL);
393 value &= ~(KIRKWOOD_RECCTL_I2S_EN | KIRKWOOD_RECCTL_SPDIF_EN);
394 writel(value, priv->io + KIRKWOOD_RECCTL);
395
396 return 0;
397
398}
399
401static int kirkwood_i2s_remove(struct snd_soc_dai *dai)
402{
403 return 0;
404}
405
406static const struct snd_soc_dai_ops kirkwood_i2s_dai_ops = {
407 .startup = kirkwood_i2s_startup,
408 .trigger = kirkwood_i2s_trigger,
409 .hw_params = kirkwood_i2s_hw_params,
410 .set_fmt = kirkwood_i2s_set_fmt,
411};
412
413
414static struct snd_soc_dai_driver kirkwood_i2s_dai = {
415 .probe = kirkwood_i2s_probe,
400static const struct snd_soc_dai_ops kirkwood_i2s_dai_ops = {
401 .startup = kirkwood_i2s_startup,
402 .trigger = kirkwood_i2s_trigger,
403 .hw_params = kirkwood_i2s_hw_params,
404 .set_fmt = kirkwood_i2s_set_fmt,
405};
406
407
408static struct snd_soc_dai_driver kirkwood_i2s_dai = {
409 .probe = kirkwood_i2s_probe,
416 .remove = kirkwood_i2s_remove,
417 .playback = {
418 .channels_min = 1,
419 .channels_max = 2,
410 .playback = {
411 .channels_min = 1,
412 .channels_max = 2,
420 .rates = KIRKWOOD_I2S_RATES,
413 .rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
414 SNDRV_PCM_RATE_96000,
421 .formats = KIRKWOOD_I2S_FORMATS,
422 },
423 .capture = {
424 .channels_min = 1,
425 .channels_max = 2,
415 .formats = KIRKWOOD_I2S_FORMATS,
416 },
417 .capture = {
418 .channels_min = 1,
419 .channels_max = 2,
426 .rates = KIRKWOOD_I2S_RATES,
420 .rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
421 SNDRV_PCM_RATE_96000,
427 .formats = KIRKWOOD_I2S_FORMATS,
428 },
429 .ops = &kirkwood_i2s_dai_ops,
430};
431
432static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk = {
433 .probe = kirkwood_i2s_probe,
422 .formats = KIRKWOOD_I2S_FORMATS,
423 },
424 .ops = &kirkwood_i2s_dai_ops,
425};
426
427static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk = {
428 .probe = kirkwood_i2s_probe,
434 .remove = kirkwood_i2s_remove,
435 .playback = {
436 .channels_min = 1,
437 .channels_max = 2,
438 .rates = SNDRV_PCM_RATE_8000_192000 |
439 SNDRV_PCM_RATE_CONTINUOUS |
440 SNDRV_PCM_RATE_KNOT,
441 .formats = KIRKWOOD_I2S_FORMATS,
442 },

--- 50 unchanged lines hidden (view full) ---

493 dev_err(&pdev->dev, "no clock\n");
494 return PTR_ERR(priv->clk);
495 }
496
497 err = clk_prepare_enable(priv->clk);
498 if (err < 0)
499 return err;
500
429 .playback = {
430 .channels_min = 1,
431 .channels_max = 2,
432 .rates = SNDRV_PCM_RATE_8000_192000 |
433 SNDRV_PCM_RATE_CONTINUOUS |
434 SNDRV_PCM_RATE_KNOT,
435 .formats = KIRKWOOD_I2S_FORMATS,
436 },

--- 50 unchanged lines hidden (view full) ---

487 dev_err(&pdev->dev, "no clock\n");
488 return PTR_ERR(priv->clk);
489 }
490
491 err = clk_prepare_enable(priv->clk);
492 if (err < 0)
493 return err;
494
501 priv->extclk = clk_get(&pdev->dev, "extclk");
495 priv->extclk = devm_clk_get(&pdev->dev, "extclk");
502 if (!IS_ERR(priv->extclk)) {
503 if (priv->extclk == priv->clk) {
496 if (!IS_ERR(priv->extclk)) {
497 if (priv->extclk == priv->clk) {
504 clk_put(priv->extclk);
498 devm_clk_put(&pdev->dev, priv->extclk);
505 priv->extclk = ERR_PTR(-EINVAL);
506 } else {
507 dev_info(&pdev->dev, "found external clock\n");
508 clk_prepare_enable(priv->extclk);
509 soc_dai = &kirkwood_i2s_dai_extclk;
510 }
511 }
512

--- 11 unchanged lines hidden (view full) ---

524 }
525
526 err = snd_soc_register_component(&pdev->dev, &kirkwood_i2s_component,
527 soc_dai, 1);
528 if (!err)
529 return 0;
530 dev_err(&pdev->dev, "snd_soc_register_component failed\n");
531
499 priv->extclk = ERR_PTR(-EINVAL);
500 } else {
501 dev_info(&pdev->dev, "found external clock\n");
502 clk_prepare_enable(priv->extclk);
503 soc_dai = &kirkwood_i2s_dai_extclk;
504 }
505 }
506

--- 11 unchanged lines hidden (view full) ---

518 }
519
520 err = snd_soc_register_component(&pdev->dev, &kirkwood_i2s_component,
521 soc_dai, 1);
522 if (!err)
523 return 0;
524 dev_err(&pdev->dev, "snd_soc_register_component failed\n");
525
532 if (!IS_ERR(priv->extclk)) {
526 if (!IS_ERR(priv->extclk))
533 clk_disable_unprepare(priv->extclk);
527 clk_disable_unprepare(priv->extclk);
534 clk_put(priv->extclk);
535 }
536 clk_disable_unprepare(priv->clk);
537
538 return err;
539}
540
541static int kirkwood_i2s_dev_remove(struct platform_device *pdev)
542{
543 struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev);
544
545 snd_soc_unregister_component(&pdev->dev);
546
528 clk_disable_unprepare(priv->clk);
529
530 return err;
531}
532
533static int kirkwood_i2s_dev_remove(struct platform_device *pdev)
534{
535 struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev);
536
537 snd_soc_unregister_component(&pdev->dev);
538
547 if (!IS_ERR(priv->extclk)) {
539 if (!IS_ERR(priv->extclk))
548 clk_disable_unprepare(priv->extclk);
540 clk_disable_unprepare(priv->extclk);
549 clk_put(priv->extclk);
550 }
551 clk_disable_unprepare(priv->clk);
552
553 return 0;
554}
555
556static struct platform_driver kirkwood_i2s_driver = {
557 .probe = kirkwood_i2s_dev_probe,
558 .remove = kirkwood_i2s_dev_remove,

--- 13 unchanged lines hidden ---
541 clk_disable_unprepare(priv->clk);
542
543 return 0;
544}
545
546static struct platform_driver kirkwood_i2s_driver = {
547 .probe = kirkwood_i2s_dev_probe,
548 .remove = kirkwood_i2s_dev_remove,

--- 13 unchanged lines hidden ---