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 --- |