36 #include <linux/device.h>
40 #include <linux/module.h>
42 #include <linux/slab.h>
51 #include <mach/hardware.h>
55 #define SSI_SACNT_DEFAULT (SSI_SACNT_AC97EN | SSI_SACNT_FV)
61 static int imx_ssi_set_dai_tdm_slot(
struct snd_soc_dai *cpu_dai,
64 struct imx_ssi *
ssi = snd_soc_dai_get_drvdata(cpu_dai);
87 static int imx_ssi_set_dai_fmt(
struct snd_soc_dai *cpu_dai,
unsigned int fmt)
89 struct imx_ssi *
ssi = snd_soc_dai_get_drvdata(cpu_dai);
164 static int imx_ssi_set_dai_sysclk(
struct snd_soc_dai *cpu_dai,
165 int clk_id,
unsigned int freq,
int dir)
167 struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
192 static int imx_ssi_set_dai_clkdiv(
struct snd_soc_dai *cpu_dai,
195 struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
239 struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
248 snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data);
261 struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
296 struct imx_ssi *ssi = snd_soc_dai_get_drvdata(dai);
297 unsigned int sier_bits, sier;
357 .startup = imx_ssi_startup,
358 .hw_params = imx_ssi_hw_params,
359 .set_fmt = imx_ssi_set_dai_fmt,
360 .set_clkdiv = imx_ssi_set_dai_clkdiv,
361 .set_sysclk = imx_ssi_set_dai_sysclk,
362 .set_tdm_slot = imx_ssi_set_dai_tdm_slot,
363 .trigger = imx_ssi_trigger,
366 static int imx_ssi_dai_probe(
struct snd_soc_dai *dai)
371 snd_soc_dai_set_drvdata(dai, ssi);
381 .probe = imx_ssi_dai_probe,
394 .ops = &imx_ssi_pcm_dai_ops,
398 .probe = imx_ssi_dai_probe,
401 .stream_name =
"AC97 Playback",
408 .stream_name =
"AC97 Capture",
414 .ops = &imx_ssi_pcm_dai_ops,
447 static struct imx_ssi *ac97_ssi;
449 static void imx_ssi_ac97_write(
struct snd_ac97 *ac97,
unsigned short reg,
452 struct imx_ssi *imx_ssi = ac97_ssi;
460 pr_debug(
"%s: 0x%02x 0x%04x\n", __func__, reg, val);
472 static unsigned short imx_ssi_ac97_read(
struct snd_ac97 *ac97,
475 struct imx_ssi *imx_ssi = ac97_ssi;
478 unsigned short val = -1;
481 lreg = (reg & 0x7f) << 12 ;
489 pr_debug(
"%s: 0x%02x 0x%04x\n", __func__, reg, val);
494 static void imx_ssi_ac97_reset(
struct snd_ac97 *ac97)
496 struct imx_ssi *imx_ssi = ac97_ssi;
502 static void imx_ssi_ac97_warm_reset(
struct snd_ac97 *ac97)
504 struct imx_ssi *imx_ssi = ac97_ssi;
511 .read = imx_ssi_ac97_read,
512 .write = imx_ssi_ac97_write,
513 .reset = imx_ssi_ac97_reset,
514 .warm_reset = imx_ssi_ac97_warm_reset
540 if (IS_ERR(ssi->
clk)) {
541 ret = PTR_ERR(ssi->
clk);
542 dev_err(&pdev->
dev,
"Cannot get the clock: %d\n",
546 clk_prepare_enable(ssi->
clk);
551 goto failed_get_resource;
558 goto failed_register;
563 dev_err(&pdev->
dev,
"AC'97 SSI already registered\n");
565 goto failed_register;
568 setup_channel_to_ac97(ssi);
589 platform_set_drvdata(pdev, ssi);
594 goto failed_register;
600 goto failed_pdev_fiq_alloc;
606 dev_err(&pdev->
dev,
"failed to add platform device\n");
607 goto failed_pdev_fiq_add;
613 goto failed_pdev_alloc;
619 dev_err(&pdev->
dev,
"failed to add platform device\n");
620 goto failed_pdev_add;
631 failed_pdev_fiq_alloc:
636 clk_disable_unprepare(ssi->
clk);
645 struct imx_ssi *ssi = platform_get_drvdata(pdev);
656 clk_disable_unprepare(ssi->
clk);
662 .probe = imx_ssi_probe,