From: Marcus Cooper <codekip...@gmail.com> Tidy up of the code so that it passes checkpatch. Misplaced spaces, tabs etc have been removed and the column width restricted where possible to < 80 chars.
Signed-off-by: Marcus Cooper <codekip...@gmail.com> --- sound/soc/sunxi/spdif/sndspdif.c | 21 +- sound/soc/sunxi/spdif/sunxi_sndspdif.c | 78 +++--- sound/soc/sunxi/spdif/sunxi_spdif.c | 491 ++++++++++++++++++--------------- sound/soc/sunxi/spdif/sunxi_spdif.h | 146 +++++----- sound/soc/sunxi/spdif/sunxi_spdma.c | 113 ++++---- 5 files changed, 455 insertions(+), 394 deletions(-) diff --git a/sound/soc/sunxi/spdif/sndspdif.c b/sound/soc/sunxi/spdif/sndspdif.c index c41a06b..7bc5713 100644 --- a/sound/soc/sunxi/spdif/sndspdif.c +++ b/sound/soc/sunxi/spdif/sndspdif.c @@ -23,7 +23,7 @@ #include <plat/sys_config.h> #include <linux/io.h> -#define SNDSPDIF_RATES (SNDRV_PCM_RATE_8000_192000|SNDRV_PCM_RATE_KNOT) +#define SNDSPDIF_RATES (SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_KNOT) #define SNDSPDIF_FORMATS (SNDRV_PCM_FMTBIT_S16_LE) struct sndspdif_priv { @@ -58,18 +58,18 @@ static int sndspdif_hw_params(struct snd_pcm_substream *substream, } static int sndspdif_set_dai_sysclk(struct snd_soc_dai *codec_dai, - int clk_id, unsigned int freq, int dir) + int clk_id, unsigned int freq, int dir) { return 0; } -static int sndspdif_set_dai_clkdiv(struct snd_soc_dai *codec_dai, int div_id, int div) +static int sndspdif_set_dai_clkdiv(struct snd_soc_dai *codec_dai, int div_id, + int div) { return 0; } -static int sndspdif_set_dai_fmt(struct snd_soc_dai *codec_dai, - unsigned int fmt) +static int sndspdif_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { return 0; } @@ -103,8 +103,8 @@ static int sndspdif_soc_probe(struct snd_soc_codec *codec) struct sndspdif_priv *sndspdif; sndspdif = kzalloc(sizeof(struct sndspdif_priv), GFP_KERNEL); - if(sndspdif == NULL){ - printk("%s,%d\n",__func__,__LINE__); + if (sndspdif == NULL) { + printk("%s,%d\n", __func__, __LINE__); return -ENOMEM; } snd_soc_codec_set_drvdata(codec, sndspdif); @@ -123,13 +123,14 @@ static int sndspdif_soc_remove(struct snd_soc_codec *codec) } static struct snd_soc_codec_driver soc_codec_dev_sndspdif = { - .probe = sndspdif_soc_probe, - .remove = sndspdif_soc_remove, + .probe = sndspdif_soc_probe, + .remove = sndspdif_soc_remove, }; static int __devinit sndspdif_codec_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_sndspdif, &sndspdif_dai, 1); + return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_sndspdif, + &sndspdif_dai, 1); } static int __devexit sndspdif_codec_remove(struct platform_device *pdev) diff --git a/sound/soc/sunxi/spdif/sunxi_sndspdif.c b/sound/soc/sunxi/spdif/sunxi_sndspdif.c index c5a8509..7cea365 100644 --- a/sound/soc/sunxi/spdif/sunxi_sndspdif.c +++ b/sound/soc/sunxi/spdif/sunxi_sndspdif.c @@ -41,15 +41,17 @@ static struct snd_pcm_hw_constraint_list hw_constraints_rates = { static int sunxi_sndspdif_startup(struct snd_pcm_substream *substream) { int ret = 0; - #ifdef ENFORCE_RATES - struct snd_pcm_runtime *runtime = substream->runtime;; - #endif +#ifdef ENFORCE_RATES + struct snd_pcm_runtime *runtime = substream->runtime; +#endif if (!ret) { - #ifdef ENFORCE_RATES - ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates); +#ifdef ENFORCE_RATES + ret = snd_pcm_hw_constraint_list(runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, + &hw_constraints_rates); if (ret < 0) return ret; - #endif +#endif } return ret; } @@ -132,27 +134,29 @@ static __mclk_set_inf MCLK_INF[] = { {0xffffffff, 0, 0, 0}, }; -static s32 get_clock_divder(u32 sample_rate, u32 sample_width, u32 * mclk_div, u32* mpll, u32* bclk_div, u32* mult_fs) +static s32 get_clock_divder(u32 sample_rate, u32 sample_width, u32 *mclk_div, + u32 *mpll, u32 *bclk_div, u32 *mult_fs) { u32 i, j, ret = -EINVAL; - for(i=0; i< 100; i++) { - if((MCLK_INF[i].samp_rate == sample_rate) && - ((MCLK_INF[i].mult_fs == 256) || (MCLK_INF[i].mult_fs == 128))) { - for(j=0; j<ARRAY_SIZE(BCLK_INF); j++) { - if((BCLK_INF[j].bitpersamp == sample_width) && - (BCLK_INF[j].mult_fs == MCLK_INF[i].mult_fs)) { - *mclk_div = MCLK_INF[i].clk_div; - *mpll = MCLK_INF[i].mpll; - *bclk_div = BCLK_INF[j].clk_div; - *mult_fs = MCLK_INF[i].mult_fs; - ret = 0; - break; - } - } - } - else if(MCLK_INF[i].samp_rate == 0xffffffff) - break; + for (i = 0; i < 100; i++) { + if ((MCLK_INF[i].samp_rate == sample_rate) && + ((MCLK_INF[i].mult_fs == 256) || + (MCLK_INF[i].mult_fs == 128))) { + for (j = 0; j < ARRAY_SIZE(BCLK_INF); j++) { + if ((BCLK_INF[j].bitpersamp == sample_width) && + (BCLK_INF[j].mult_fs == + MCLK_INF[i].mult_fs)) { + *mclk_div = MCLK_INF[i].clk_div; + *mpll = MCLK_INF[i].mpll; + *bclk_div = BCLK_INF[j].clk_div; + *mult_fs = MCLK_INF[i].mult_fs; + ret = 0; + break; + } + } + } else if (MCLK_INF[i].samp_rate == 0xffffffff) + break; } return ret; @@ -166,7 +170,7 @@ static int sunxi_sndspdif_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *cpu_dai = rtd->cpu_dai; int ret = 0; unsigned long rate = params_rate(params); - u32 mclk_div=0, mpll=0, bclk_div=0, mult_fs=0; + u32 mclk_div = 0, mpll = 0, bclk_div = 0, mult_fs = 0; get_clock_divder(rate, 32, &mclk_div, &mpll, &bclk_div, &mult_fs); @@ -203,26 +207,26 @@ static int sunxi_sndspdif_hw_params(struct snd_pcm_substream *substream, } static struct snd_soc_ops sunxi_sndspdif_ops = { - .startup = sunxi_sndspdif_startup, - .shutdown = sunxi_sndspdif_shutdown, - .hw_params = sunxi_sndspdif_hw_params, + .startup = sunxi_sndspdif_startup, + .shutdown = sunxi_sndspdif_shutdown, + .hw_params = sunxi_sndspdif_hw_params, }; static struct snd_soc_dai_link sunxi_sndspdif_dai_link = { - .name = "SPDIF", - .stream_name = "SUNXI-SPDIF", - .cpu_dai_name = "sunxi-spdif.0", + .name = "SPDIF", + .stream_name = "SUNXI-SPDIF", + .cpu_dai_name = "sunxi-spdif.0", .codec_dai_name = "sndspdif", - .platform_name = "sunxi-spdif-pcm-audio.0", - .codec_name = "sunxi-spdif-codec.0", - .ops = &sunxi_sndspdif_ops, + .platform_name = "sunxi-spdif-pcm-audio.0", + .codec_name = "sunxi-spdif-codec.0", + .ops = &sunxi_sndspdif_ops, }; static struct snd_soc_card snd_soc_sunxi_sndspdif = { - .name = "sunxi-sndspdif", + .name = "sunxi-sndspdif", .owner = THIS_MODULE, - .dai_link = &sunxi_sndspdif_dai_link, - .num_links = 1, + .dai_link = &sunxi_sndspdif_dai_link, + .num_links = 1, }; static int __devinit sunxi_sndspdif_probe(struct platform_device *pdev) diff --git a/sound/soc/sunxi/spdif/sunxi_spdif.c b/sound/soc/sunxi/spdif/sunxi_spdif.c index 9cc6264..df53666 100644 --- a/sound/soc/sunxi/spdif/sunxi_spdif.c +++ b/sound/soc/sunxi/spdif/sunxi_spdif.c @@ -43,19 +43,19 @@ static struct sunxi_dma_params sunxi_spdif_stereo_out = { #if defined CONFIG_ARCH_SUN4I || defined CONFIG_ARCH_SUN5I .channel = DMACH_NSPDIF, #endif - .dma_addr = SUNXI_SPDIFBASE + SUNXI_SPDIF_TXFIFO, + .dma_addr = SUNXI_SPDIFBASE + SUNXI_SPDIF_TXFIFO, }; static struct sunxi_dma_params sunxi_spdif_stereo_in = { - .client.name = "SPDIF out", + .client.name = "SPDIF in", #if defined CONFIG_ARCH_SUN4I || defined CONFIG_ARCH_SUN5I .channel = DMACH_NSPDIF, #endif - .dma_addr = SUNXI_SPDIFBASE + SUNXI_SPDIF_RXFIFO, + .dma_addr = SUNXI_SPDIFBASE + SUNXI_SPDIF_RXFIFO, }; struct sunxi_spdif_info sunxi_spdif; -static u32 spdif_handle = 0; +static u32 spdif_handle; static struct clk *spdif_apbclk, *spdif_pll2clk, *spdif_pllx8, *spdif_moduleclk; void sunxi_snd_txctrl(struct snd_pcm_substream *substream, int on) @@ -174,14 +174,14 @@ static int sunxi_spdif_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) } static int sunxi_spdif_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct sunxi_dma_params *dma_data; /* play or record */ - if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) dma_data = &sunxi_spdif_stereo_out; else dma_data = &sunxi_spdif_stereo_in; @@ -192,55 +192,52 @@ static int sunxi_spdif_hw_params(struct snd_pcm_substream *substream, } static int sunxi_spdif_trigger(struct snd_pcm_substream *substream, - int cmd, struct snd_soc_dai *dai) + int cmd, struct snd_soc_dai *dai) { int ret = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct sunxi_dma_params *dma_data = - snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); + snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - sunxi_snd_rxctrl(1); - } else { - sunxi_snd_txctrl(substream, 1); - } - sunxi_dma_started(dma_data); - break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - sunxi_snd_rxctrl(0); - } else { - sunxi_snd_txctrl(substream, 0); - } - break; - default: - ret = -EINVAL; - break; + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) + sunxi_snd_rxctrl(1); + else + sunxi_snd_txctrl(substream, 1); + sunxi_dma_started(dma_data); + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) + sunxi_snd_rxctrl(0); + else + sunxi_snd_txctrl(substream, 0); + break; + default: + ret = -EINVAL; + break; } - return ret; + return ret; } /* freq: 1: 22.5792MHz 0: 24.576MHz */ static int sunxi_spdif_set_sysclk(struct snd_soc_dai *cpu_dai, int clk_id, - unsigned int freq, int dir) + unsigned int freq, int dir) { - if (!freq) { + if (!freq) clk_set_rate(spdif_pll2clk, 24576000); - } else { + else clk_set_rate(spdif_pll2clk, 22579200); - } - return 0; } -static int sunxi_spdif_set_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, int div) +static int sunxi_spdif_set_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, + int div) { u32 reg_val = 0; @@ -250,150 +247,200 @@ static int sunxi_spdif_set_clkdiv(struct snd_soc_dai *cpu_dai, int div_id, int d reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); reg_val &= ~(SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xf)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - - switch(div_id) { - case SUNXI_DIV_MCLK: - { - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCFG); - reg_val &= ~SUNXI_SPDIF_TXCFG_TXRATIO(0x1F); - reg_val |= SUNXI_SPDIF_TXCFG_TXRATIO(div-1); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCFG); - - if(clk_get_rate(spdif_pll2clk) == 24576000) - { - switch(div) - { - /* 24KHZ */ - case 8: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x6)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x9)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - /* 32KHZ */ - case 6: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x3)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xC)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - /* 48KHZ */ - case 4: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x2)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xD)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - /* 96KHZ */ - case 2: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0xA)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x5)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - /* 192KHZ */ - case 1: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0xE)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x1)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - default: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(1)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - } - } else { /* 22.5792MHz */ - switch(div) - { - /* 22.05khz */ - case 8: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x4)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xb)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - /* 44.1KHZ */ - case 4: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x0)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xF)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - /* 88.2khz */ - case 2: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x8)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x7)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - /* 176.4KHZ */ - case 1: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0xC)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x3)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - - default: - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(1)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); - - reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0)); - writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); - break; - } + writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); + + switch (div_id) { + case SUNXI_DIV_MCLK: { + reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCFG); + reg_val &= ~SUNXI_SPDIF_TXCFG_TXRATIO(0x1F); + reg_val |= SUNXI_SPDIF_TXCFG_TXRATIO(div-1); + writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_TXCFG); + + if (clk_get_rate(spdif_pll2clk) == 24576000) { + switch (div) { + /* 24KHZ */ + case 8: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x6)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x9)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + /* 32KHZ */ + case 6: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x3)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xC)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + /* 48KHZ */ + case 4: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x2)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xD)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + /* 96KHZ */ + case 2: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0xA)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x5)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + /* 192KHZ */ + case 1: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0xE)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x1)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + default: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(1)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + } + } else { + /* 22.5792MHz */ + switch (div) { + /* 22.05KHZ */ + case 8: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x4)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xb)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + /* 44.1KHZ */ + case 4: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x0)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0xF)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + /* 88.2KHZ */ + case 2: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0x8)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x7)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + /* 176.4KHZ */ + case 1: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(0xC)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= + (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0x3)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; + + default: + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + reg_val |= (SUNXI_SPDIF_TXCHSTA0_SAMFREQ(1)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA0); + + reg_val = readl(sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + reg_val |= (SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(0)); + writel(reg_val, sunxi_spdif.regs + + SUNXI_SPDIF_TXCHSTA1); + break; } } - break; - case SUNXI_DIV_BCLK: - break; + } + break; + case SUNXI_DIV_BCLK: + break; - default: - return -EINVAL; + default: + return -EINVAL; } return 0; @@ -403,6 +450,7 @@ static int sunxi_spdif_dai_probe(struct snd_soc_dai *dai) { return 0; } + static int sunxi_spdif_dai_remove(struct snd_soc_dai *dai) { return 0; @@ -412,7 +460,7 @@ static void spdifregsave(void) { regsave[0] = readl(sunxi_spdif.regs + SUNXI_SPDIF_CTL); regsave[1] = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCFG); - regsave[2] = readl(sunxi_spdif.regs + SUNXI_SPDIF_FCTL) | (0x3<<16); + regsave[2] = readl(sunxi_spdif.regs + SUNXI_SPDIF_FCTL) | (0x3 << 16); regsave[3] = readl(sunxi_spdif.regs + SUNXI_SPDIF_INT); regsave[4] = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA0); regsave[5] = readl(sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); @@ -428,7 +476,7 @@ static void spdifregrestore(void) writel(regsave[5], sunxi_spdif.regs + SUNXI_SPDIF_TXCHSTA1); } -//#ifdef CONFIG_PM +#if 1 /* def CONFIG_PM */ static int sunxi_spdif_suspend(struct snd_soc_dai *cpu_dai) { u32 reg_val; @@ -445,8 +493,10 @@ static int sunxi_spdif_suspend(struct snd_soc_dai *cpu_dai) clk_disable(spdif_apbclk); - printk("[SPDIF]SPECIAL CLK 0x01c20068 = %#x, line= %d\n", *(volatile int*)0xF1C20068, __LINE__); - printk("[SPDIF]SPECIAL CLK 0x01c200C0 = %#x, line= %d\n", *(volatile int*)0xF1C200C0, __LINE__); + printk("[SPDIF]SPECIAL CLK 0x01c20068 = %#x, line= %d\n", + *(volatile int *)0xF1C20068, __LINE__); + printk("[SPDIF]SPECIAL CLK 0x01c200C0 = %#x, line= %d\n", + *(volatile int *)0xF1C200C0, __LINE__); return 0; } @@ -468,38 +518,44 @@ static int sunxi_spdif_resume(struct snd_soc_dai *cpu_dai) reg_val |= SUNXI_SPDIF_CTL_GEN; writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_CTL); - //printk("[SPDIF]PLL2 0x01c20008 = %#x\n", *(volatile int*)0xF1C20008); - printk("[SPDIF]SPECIAL CLK 0x01c20068 = %#x, line= %d\n", *(volatile int*)0xF1C20068, __LINE__); - printk("[SPDIF]SPECIAL CLK 0x01c200C0 = %#x, line = %d\n", *(volatile int*)0xF1C200C0, __LINE__); + /*printk("[SPDIF]PLL2 0x01c20008 = %#x\n",*(volatile int*)0xF1C20008);*/ + printk("[SPDIF]SPECIAL CLK 0x01c20068 = %#x, line= %d\n", + *(volatile int *)0xF1C20068, __LINE__); + printk("[SPDIF]SPECIAL CLK 0x01c200C0 = %#x, line = %d\n", + *(volatile int *)0xF1C200C0, __LINE__); return 0; } +#endif #define SUNXI_SPDIF_RATES (SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_KNOT) static struct snd_soc_dai_ops sunxi_spdif_dai_ops = { - .trigger = sunxi_spdif_trigger, - .hw_params = sunxi_spdif_hw_params, - .set_fmt = sunxi_spdif_set_fmt, - .set_clkdiv = sunxi_spdif_set_clkdiv, - .set_sysclk = sunxi_spdif_set_sysclk, + .trigger = sunxi_spdif_trigger, + .hw_params = sunxi_spdif_hw_params, + .set_fmt = sunxi_spdif_set_fmt, + .set_clkdiv = sunxi_spdif_set_clkdiv, + .set_sysclk = sunxi_spdif_set_sysclk, }; + static struct snd_soc_dai_driver sunxi_spdif_dai = { - .probe = sunxi_spdif_dai_probe, - .suspend = sunxi_spdif_suspend, - .resume = sunxi_spdif_resume, - .remove = sunxi_spdif_dai_remove, - .playback = { - .channels_min = 1, - .channels_max = 2, - .rates = SUNXI_SPDIF_RATES, - .formats = SNDRV_PCM_FMTBIT_S16_LE,}, + .probe = sunxi_spdif_dai_probe, + .suspend = sunxi_spdif_suspend, + .resume = sunxi_spdif_resume, + .remove = sunxi_spdif_dai_remove, + .playback = { + .channels_min = 1, + .channels_max = 2, + .rates = SUNXI_SPDIF_RATES, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, .capture = { - .channels_min = 1, - .channels_max = 2, - .rates = SUNXI_SPDIF_RATES, - .formats = SNDRV_PCM_FMTBIT_S16_LE,}, - .symmetric_rates = 1, - .ops = &sunxi_spdif_dai_ops, + .channels_min = 1, + .channels_max = 2, + .rates = SUNXI_SPDIF_RATES, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .symmetric_rates = 1, + .ops = &sunxi_spdif_dai_ops, }; static int __devinit sunxi_spdif_dev_probe(struct platform_device *pdev) @@ -508,13 +564,12 @@ static int __devinit sunxi_spdif_dev_probe(struct platform_device *pdev) int ret = 0; sunxi_spdif.regs = ioremap(SUNXI_SPDIFBASE, 0x100); - if(sunxi_spdif.regs == NULL) + if (sunxi_spdif.regs == NULL) return -ENXIO; spdif_apbclk = clk_get(NULL, "apb_spdif"); - if(-1 == clk_enable(spdif_apbclk)){ + if (-1 == clk_enable(spdif_apbclk)) printk("spdif_apbclk failed! line = %d\n", __LINE__); - } spdif_pllx8 = clk_get(NULL, "audio_pllx8"); @@ -522,17 +577,17 @@ static int __devinit sunxi_spdif_dev_probe(struct platform_device *pdev) spdif_moduleclk = clk_get(NULL, "spdif"); - if(clk_set_parent(spdif_moduleclk, spdif_pll2clk)){ - printk("try to set parent of spdif_moduleclk to spdif_pll2ck failed! line = %d\n",__LINE__); - } + if (clk_set_parent(spdif_moduleclk, spdif_pll2clk)) + printk("try to set parent of spdif_moduleclk to "\ + "spdif_pll2ck failed! line = %d\n", __LINE__); - if(clk_set_rate(spdif_moduleclk, 24576000/8)){ - printk("set spdif_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__); - } + if (clk_set_rate(spdif_moduleclk, 24576000/8)) + printk("set spdif_moduleclk clock freq to 24576000 "\ + "failed! line = %d\n", __LINE__); - if(-1 == clk_enable(spdif_moduleclk)){ - printk("open spdif_moduleclk failed! line = %d\n", __LINE__); - } + if (-1 == clk_enable(spdif_moduleclk)) + printk("open spdif_moduleclk failed! line = %d\n", + __LINE__); /* Global enbale */ reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_CTL); diff --git a/sound/soc/sunxi/spdif/sunxi_spdif.h b/sound/soc/sunxi/spdif/sunxi_spdif.h index b4157f6..e1d1dd4 100644 --- a/sound/soc/sunxi/spdif/sunxi_spdif.h +++ b/sound/soc/sunxi/spdif/sunxi_spdif.h @@ -20,109 +20,109 @@ #define SUNXI_SPDIFBASE 0x01C21000 #define SUNXI_SPDIF_CTL (0x00) - #define SUNXI_SPDIF_CTL_MCLKDIV(v) ((v)<<4) //v even - #define SUNXI_SPDIF_CTL_MCLKOUTEN (1<<2) - #define SUNXI_SPDIF_CTL_GEN (1<<1) - #define SUNXI_SPDIF_CTL_RESET (1<<0) + #define SUNXI_SPDIF_CTL_MCLKDIV(v) ((v) << 4) /* v even */ + #define SUNXI_SPDIF_CTL_MCLKOUTEN (1 << 2) + #define SUNXI_SPDIF_CTL_GEN (1 << 1) + #define SUNXI_SPDIF_CTL_RESET (1 << 0) #define SUNXI_SPDIF_TXCFG (0x04) - #define SUNXI_SPDIF_TXCFG_SINGLEMOD (1<<31) - #define SUNXI_SPDIF_TXCFG_ASS (1<<17) - #define SUNXI_SPDIF_TXCFG_NONAUDIO (1<<16) - #define SUNXI_SPDIF_TXCFG_TXRATIO(v) ((v)<<4) - #define SUNXI_SPDIF_TXCFG_FMTRVD (3<<2) - #define SUNXI_SPDIF_TXCFG_FMT16BIT (0<<2) - #define SUNXI_SPDIF_TXCFG_FMT20BIT (1<<2) - #define SUNXI_SPDIF_TXCFG_FMT24BIT (2<<2) - #define SUNXI_SPDIF_TXCFG_CHSTMODE (1<<1) - #define SUNXI_SPDIF_TXCFG_TXEN (1<<0) + #define SUNXI_SPDIF_TXCFG_SINGLEMOD (1 << 31) + #define SUNXI_SPDIF_TXCFG_ASS (1 << 17) + #define SUNXI_SPDIF_TXCFG_NONAUDIO (1 << 16) + #define SUNXI_SPDIF_TXCFG_TXRATIO(v) ((v) << 4) + #define SUNXI_SPDIF_TXCFG_FMTRVD (3 << 2) + #define SUNXI_SPDIF_TXCFG_FMT16BIT (0 << 2) + #define SUNXI_SPDIF_TXCFG_FMT20BIT (1 << 2) + #define SUNXI_SPDIF_TXCFG_FMT24BIT (2 << 2) + #define SUNXI_SPDIF_TXCFG_CHSTMODE (1 << 1) + #define SUNXI_SPDIF_TXCFG_TXEN (1 << 0) #define SUNXI_SPDIF_RXCFG (0x08) - #define SUNXI_SPDIF_RXCFG_LOCKFLAG (1<<4) - #define SUNXI_SPDIF_RXCFG_CHSTSRC (1<<3) - #define SUNXI_SPDIF_RXCFG_CHSTCP (1<<1) - #define SUNXI_SPDIF_RXCFG_RXEN (1<<0) + #define SUNXI_SPDIF_RXCFG_LOCKFLAG (1 << 4) + #define SUNXI_SPDIF_RXCFG_CHSTSRC (1 << 3) + #define SUNXI_SPDIF_RXCFG_CHSTCP (1 << 1) + #define SUNXI_SPDIF_RXCFG_RXEN (1 << 0) #define SUNXI_SPDIF_TXFIFO (0x0C) #define SUNXI_SPDIF_RXFIFO (0x10) #define SUNXI_SPDIF_FCTL (0x14) - #define SUNXI_SPDIF_FCTL_FIFOSRC (1<<31) - #define SUNXI_SPDIF_FCTL_FTX (1<<17) - #define SUNXI_SPDIF_FCTL_FRX (1<<16) - #define SUNXI_SPDIF_FCTL_TXTL(v) ((v)<<8) - #define SUNXI_SPDIF_FCTL_RXTL(v) (((v))<<3) - #define SUNXI_SPDIF_FCTL_TXIM(v) ((v)<<2) - #define SUNXI_SPDIF_FCTL_RXOM(v) ((v)<<0) + #define SUNXI_SPDIF_FCTL_FIFOSRC (1 << 31) + #define SUNXI_SPDIF_FCTL_FTX (1 << 17) + #define SUNXI_SPDIF_FCTL_FRX (1 << 16) + #define SUNXI_SPDIF_FCTL_TXTL(v) ((v) << 8) + #define SUNXI_SPDIF_FCTL_RXTL(v) ((v) << 3) + #define SUNXI_SPDIF_FCTL_TXIM(v) ((v) << 2) + #define SUNXI_SPDIF_FCTL_RXOM(v) ((v) << 0) #define SUNXI_SPDIF_FSTA (0x18) - #define SUNXI_SPDIF_FSTA_TXE (1<<14) + #define SUNXI_SPDIF_FSTA_TXE (1 << 14) #define SUNXI_SPDIF_FSTA_TXECNTSHT (8) - #define SUNXI_SPDIF_FSTA_RXA (1<<6) + #define SUNXI_SPDIF_FSTA_RXA (1 << 6) #define SUNXI_SPDIF_FSTA_RXACNTSHT (0) #define SUNXI_SPDIF_INT (0x1C) - #define SUNXI_SPDIF_INT_RXLOCKEN (1<<18) - #define SUNXI_SPDIF_INT_RXUNLOCKEN (1<<17) - #define SUNXI_SPDIF_INT_RXPARERREN (1<<16) - #define SUNXI_SPDIF_INT_TXDRQEN (1<<7) - #define SUNXI_SPDIF_INT_TXUIEN (1<<6) - #define SUNXI_SPDIF_INT_TXOIEN (1<<5) - #define SUNXI_SPDIF_INT_TXEIEN (1<<4) - #define SUNXI_SPDIF_INT_RXDRQEN (1<<2) - #define SUNXI_SPDIF_INT_RXOIEN (1<<1) - #define SUNXI_SPDIF_INT_RXAIEN (1<<0) + #define SUNXI_SPDIF_INT_RXLOCKEN (1 << 18) + #define SUNXI_SPDIF_INT_RXUNLOCKEN (1 << 17) + #define SUNXI_SPDIF_INT_RXPARERREN (1 << 16) + #define SUNXI_SPDIF_INT_TXDRQEN (1 << 7) + #define SUNXI_SPDIF_INT_TXUIEN (1 << 6) + #define SUNXI_SPDIF_INT_TXOIEN (1 << 5) + #define SUNXI_SPDIF_INT_TXEIEN (1 << 4) + #define SUNXI_SPDIF_INT_RXDRQEN (1 << 2) + #define SUNXI_SPDIF_INT_RXOIEN (1 << 1) + #define SUNXI_SPDIF_INT_RXAIEN (1 << 0) #define SUNXI_SPDIF_ISTA (0x20) - #define SUNXI_SPDIF_ISTA_RXLOCKSTA (1<<18) - #define SUNXI_SPDIF_ISTA_RXUNLOCKSTA (1<<17) - #define SUNXI_SPDIF_ISTA_RXPARERRSTA (1<<16) - #define SUNXI_SPDIF_ISTA_TXUSTA (1<<6) - #define SUNXI_SPDIF_ISTA_TXOSTA (1<<5) - #define SUNXI_SPDIF_ISTA_TXESTA (1<<4) - #define SUNXI_SPDIF_ISTA_RXOSTA (1<<1) - #define SUNXI_SPDIF_ISTA_RXASTA (1<<0) + #define SUNXI_SPDIF_ISTA_RXLOCKSTA (1 << 18) + #define SUNXI_SPDIF_ISTA_RXUNLOCKSTA (1 << 17) + #define SUNXI_SPDIF_ISTA_RXPARERRSTA (1 << 16) + #define SUNXI_SPDIF_ISTA_TXUSTA (1 << 6) + #define SUNXI_SPDIF_ISTA_TXOSTA (1 << 5) + #define SUNXI_SPDIF_ISTA_TXESTA (1 << 4) + #define SUNXI_SPDIF_ISTA_RXOSTA (1 << 1) + #define SUNXI_SPDIF_ISTA_RXASTA (1 << 0) #define SUNXI_SPDIF_TXCNT (0x24) #define SUNXI_SPDIF_RXCNT (0x28) #define SUNXI_SPDIF_TXCHSTA0 (0x2C) - #define SUNXI_SPDIF_TXCHSTA0_CLK(v) ((v)<<28) - #define SUNXI_SPDIF_TXCHSTA0_SAMFREQ(v) ((v)<<24) - #define SUNXI_SPDIF_TXCHSTA0_CHNUM(v) ((v)<<20) - #define SUNXI_SPDIF_TXCHSTA0_SRCNUM(v) ((v)<<16) - #define SUNXI_SPDIF_TXCHSTA0_CATACOD(v) ((v)<<8) - #define SUNXI_SPDIF_TXCHSTA0_MODE(v) ((v)<<6) - #define SUNXI_SPDIF_TXCHSTA0_EMPHASIS(v) ((v)<<3) - #define SUNXI_SPDIF_TXCHSTA0_CP (1<<2) - #define SUNXI_SPDIF_TXCHSTA0_AUDIO (1<<1) - #define SUNXI_SPDIF_TXCHSTA0_PRO (1<<0) + #define SUNXI_SPDIF_TXCHSTA0_CLK(v) ((v) << 28) + #define SUNXI_SPDIF_TXCHSTA0_SAMFREQ(v) ((v) << 24) + #define SUNXI_SPDIF_TXCHSTA0_CHNUM(v) ((v) << 20) + #define SUNXI_SPDIF_TXCHSTA0_SRCNUM(v) ((v) << 16) + #define SUNXI_SPDIF_TXCHSTA0_CATACOD(v) ((v) << 8) + #define SUNXI_SPDIF_TXCHSTA0_MODE(v) ((v) << 6) + #define SUNXI_SPDIF_TXCHSTA0_EMPHASIS(v) ((v) << 3) + #define SUNXI_SPDIF_TXCHSTA0_CP (1 << 2) + #define SUNXI_SPDIF_TXCHSTA0_AUDIO (1 << 1) + #define SUNXI_SPDIF_TXCHSTA0_PRO (1 << 0) #define SUNXI_SPDIF_TXCHSTA1 (0x30) - #define SUNXI_SPDIF_TXCHSTA1_CGMSA(v) ((v)<<8) - #define SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(v) ((v)<<4) - #define SUNXI_SPDIF_TXCHSTA1_SAMWORDLEN(v) ((v)<<1) - #define SUNXI_SPDIF_TXCHSTA1_MAXWORDLEN (1<<0) + #define SUNXI_SPDIF_TXCHSTA1_CGMSA(v) ((v) << 8) + #define SUNXI_SPDIF_TXCHSTA1_ORISAMFREQ(v) ((v) << 4) + #define SUNXI_SPDIF_TXCHSTA1_SAMWORDLEN(v) ((v) << 1) + #define SUNXI_SPDIF_TXCHSTA1_MAXWORDLEN (1 << 0) #define SUNXI_SPDIF_RXCHSTA0 (0x34) - #define SUNXI_SPDIF_RXCHSTA0_CLK(v) ((v)<<28) - #define SUNXI_SPDIF_RXCHSTA0_SAMFREQ(v) ((v)<<24) - #define SUNXI_SPDIF_RXCHSTA0_CHNUM(v) ((v)<<20) - #define SUNXI_SPDIF_RXCHSTA0_SRCNUM(v) ((v)<<16) - #define SUNXI_SPDIF_RXCHSTA0_CATACOD(v) ((v)<<8) - #define SUNXI_SPDIF_RXCHSTA0_MODE(v) ((v)<<6) - #define SUNXI_SPDIF_RXCHSTA0_EMPHASIS(v) ((v)<<3) - #define SUNXI_SPDIF_RXCHSTA0_CP (1<<2) - #define SUNXI_SPDIF_RXCHSTA0_AUDIO (1<<1) - #define SUNXI_SPDIF_RXCHSTA0_PRO (1<<0) + #define SUNXI_SPDIF_RXCHSTA0_CLK(v) ((v) << 28) + #define SUNXI_SPDIF_RXCHSTA0_SAMFREQ(v) ((v) << 24) + #define SUNXI_SPDIF_RXCHSTA0_CHNUM(v) ((v) << 20) + #define SUNXI_SPDIF_RXCHSTA0_SRCNUM(v) ((v) << 16) + #define SUNXI_SPDIF_RXCHSTA0_CATACOD(v) ((v) << 8) + #define SUNXI_SPDIF_RXCHSTA0_MODE(v) ((v) << 6) + #define SUNXI_SPDIF_RXCHSTA0_EMPHASIS(v) ((v) << 3) + #define SUNXI_SPDIF_RXCHSTA0_CP (1 << 2) + #define SUNXI_SPDIF_RXCHSTA0_AUDIO (1 << 1) + #define SUNXI_SPDIF_RXCHSTA0_PRO (1 << 0) #define SUNXI_SPDIF_RXCHSTA1 (0x38) - #define SUNXI_SPDIF_RXCHSTA1_CGMSA(v) ((v)<<8) - #define SUNXI_SPDIF_RXCHSTA1_ORISAMFREQ(v) ((v)<<4) - #define SUNXI_SPDIF_RXCHSTA1_SAMWORDLEN(v) ((v)<<1) - #define SUNXI_SPDIF_RXCHSTA1_MAXWORDLEN (1<<0) + #define SUNXI_SPDIF_RXCHSTA1_CGMSA(v) ((v) << 8) + #define SUNXI_SPDIF_RXCHSTA1_ORISAMFREQ(v) ((v) << 4) + #define SUNXI_SPDIF_RXCHSTA1_SAMWORDLEN(v) ((v) << 1) + #define SUNXI_SPDIF_RXCHSTA1_MAXWORDLEN (1 << 0) /* Clock dividers */ #define SUNXI_DIV_MCLK 0 diff --git a/sound/soc/sunxi/spdif/sunxi_spdma.c b/sound/soc/sunxi/spdif/sunxi_spdma.c index 7a37174..5db8f62 100644 --- a/sound/soc/sunxi/spdif/sunxi_spdma.c +++ b/sound/soc/sunxi/spdif/sunxi_spdma.c @@ -33,15 +33,19 @@ #include "sunxi_spdif.h" -static volatile unsigned int dmasrc = 0; -static volatile unsigned int dmadst = 0; +static volatile unsigned int dmasrc; +static volatile unsigned int dmadst; static const struct snd_pcm_hardware sunxi_pcm_hardware = { - .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME, + .info = SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_PAUSE | + SNDRV_PCM_INFO_RESUME, .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_KNOT, + .rates = SNDRV_PCM_RATE_8000_192000 | + SNDRV_PCM_RATE_KNOT, .rate_min = 8000, .rate_max = 192000, .channels_min = 1, @@ -75,21 +79,19 @@ static void sunxi_pcm_enqueue(struct snd_pcm_substream *substream) unsigned long len = prtd->dma_period; - limit = prtd->dma_limit; - while(prtd->dma_loaded < limit){ - if((pos + len) > prtd->dma_end){ - len = prtd->dma_end - pos; - } + limit = prtd->dma_limit; + while (prtd->dma_loaded < limit) { + if ((pos + len) > prtd->dma_end) + len = prtd->dma_end - pos; ret = sunxi_dma_enqueue(prtd->params, pos, len, 0); if (ret == 0) { prtd->dma_loaded++; pos += prtd->dma_period; - if(pos >= prtd->dma_end) + if (pos >= prtd->dma_end) pos = prtd->dma_start; - } else { + } else break; - } } prtd->dma_pos = pos; } @@ -100,9 +102,8 @@ static void sunxi_audio_buffdone(struct sunxi_dma_params *dma, void *dev_id) struct snd_pcm_substream *substream = dev_id; prtd = substream->runtime->private_data; - if (substream) { - snd_pcm_period_elapsed(substream); - } + if (substream) + snd_pcm_period_elapsed(substream); spin_lock(&prtd->lock); { @@ -119,8 +120,8 @@ static int sunxi_pcm_hw_params(struct snd_pcm_substream *substream, struct sunxi_runtime_data *prtd = runtime->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data; unsigned long totbytes = params_buffer_bytes(params); - struct sunxi_dma_params *dma = - snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); + struct sunxi_dma_params *dma = snd_soc_dai_get_dma_data(rtd->cpu_dai, + substream); int ret = 0; if (!dma) return 0; @@ -128,13 +129,12 @@ static int sunxi_pcm_hw_params(struct snd_pcm_substream *substream, if (prtd->params == NULL) { prtd->params = dma; ret = sunxi_dma_request(prtd->params, 0); - if (ret < 0) { - return ret; - } + if (ret < 0) + return ret; } if (sunxi_dma_set_callback(prtd->params, sunxi_audio_buffdone, - substream) != 0) { + substream) != 0) { sunxi_dma_release(prtd->params); prtd->params = NULL; return -EINVAL; @@ -181,18 +181,18 @@ static int sunxi_pcm_prepare(struct snd_pcm_substream *substream) if (!prtd->params) return 0; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK){ + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { #if defined CONFIG_ARCH_SUN4I || defined CONFIG_ARCH_SUN5I struct dma_hw_conf spdif_dma_conf; - spdif_dma_conf.drqsrc_type = DRQ_TYPE_SDRAM; - spdif_dma_conf.drqdst_type = DRQ_TYPE_SPDIF; - spdif_dma_conf.xfer_type = DMAXFER_D_BHALF_S_BHALF; - spdif_dma_conf.address_type = DMAADDRT_D_FIX_S_INC; - spdif_dma_conf.dir = SW_DMA_WDEV; - spdif_dma_conf.reload = 0; - spdif_dma_conf.hf_irq = SW_DMA_IRQ_FULL; - spdif_dma_conf.from = prtd->dma_start; - spdif_dma_conf.to = prtd->params->dma_addr; + spdif_dma_conf.drqsrc_type = DRQ_TYPE_SDRAM; + spdif_dma_conf.drqdst_type = DRQ_TYPE_SPDIF; + spdif_dma_conf.xfer_type = DMAXFER_D_BHALF_S_BHALF; + spdif_dma_conf.address_type = DMAADDRT_D_FIX_S_INC; + spdif_dma_conf.dir = SW_DMA_WDEV; + spdif_dma_conf.reload = 0; + spdif_dma_conf.hf_irq = SW_DMA_IRQ_FULL; + spdif_dma_conf.from = prtd->dma_start; + spdif_dma_conf.to = prtd->params->dma_addr; #else dma_config_t spdif_dma_conf; memset(&spdif_dma_conf, 0, sizeof(spdif_dma_conf)); @@ -205,21 +205,22 @@ static int sunxi_pcm_prepare(struct snd_pcm_substream *substream) spdif_dma_conf.bconti_mode = false; spdif_dma_conf.irq_spt = CHAN_IRQ_FD; spdif_dma_conf.src_drq_type = N_SRC_SDRAM; - spdif_dma_conf.dst_drq_type = N_DST_SPDIF_TX;//DRQDST_SPDIFTX; + spdif_dma_conf.dst_drq_type = N_DST_SPDIF_TX; #endif ret = sunxi_dma_config(prtd->params, &spdif_dma_conf, 0); } else { #if defined CONFIG_ARCH_SUN4I || defined CONFIG_ARCH_SUN5I struct dma_hw_conf spdif_dma_conf; - spdif_dma_conf.drqsrc_type = DRQ_TYPE_SDRAM; - spdif_dma_conf.drqdst_type = DRQ_TYPE_SPDIF; - spdif_dma_conf.xfer_type = DMAXFER_D_BWORD_S_BWORD; - spdif_dma_conf.address_type = DMAADDRT_D_INC_S_FIX; - spdif_dma_conf.dir = SW_DMA_RDEV; - spdif_dma_conf.reload = 1; - spdif_dma_conf.hf_irq = SW_DMA_IRQ_FULL|SW_DMA_IRQ_HALF; - spdif_dma_conf.from = prtd->params->dma_addr; - spdif_dma_conf.to = prtd->dma_start; + spdif_dma_conf.drqsrc_type = DRQ_TYPE_SDRAM; + spdif_dma_conf.drqdst_type = DRQ_TYPE_SPDIF; + spdif_dma_conf.xfer_type = DMAXFER_D_BWORD_S_BWORD; + spdif_dma_conf.address_type = DMAADDRT_D_INC_S_FIX; + spdif_dma_conf.dir = SW_DMA_RDEV; + spdif_dma_conf.reload = 1; + spdif_dma_conf.hf_irq = SW_DMA_IRQ_FULL | + SW_DMA_IRQ_HALF; + spdif_dma_conf.from = prtd->params->dma_addr; + spdif_dma_conf.to = prtd->dma_start; ret = sunxi_dma_config(prtd->params, &spdif_dma_conf, 0); #else return -EINVAL; @@ -273,18 +274,18 @@ static snd_pcm_uframes_t sunxi_pcm_pointer(struct snd_pcm_substream *substream) spin_lock(&prtd->lock); sunxi_dma_getcurposition(prtd->params, - (dma_addr_t*)&dmasrc, (dma_addr_t*)&dmadst); + (dma_addr_t *)&dmasrc, (dma_addr_t *)&dmadst); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE){ + if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) res = dmadst - prtd->dma_start; - } else { - offset = bytes_to_frames(runtime, dmasrc + prtd->dma_period - runtime->dma_addr); - } + else + offset = bytes_to_frames(runtime, dmasrc + + prtd->dma_period - runtime->dma_addr); spin_unlock(&prtd->lock); - if(offset >= runtime->buffer_size) + if (offset >= runtime->buffer_size) offset = 0; - return offset; + return offset; } static int sunxi_pcm_open(struct snd_pcm_substream *substream) @@ -320,9 +321,9 @@ static int sunxi_pcm_mmap(struct snd_pcm_substream *substream, struct snd_pcm_runtime *runtime = substream->runtime; return dma_mmap_writecombine(substream->pcm->card->dev, vma, - runtime->dma_area, - runtime->dma_addr, - runtime->dma_bytes); + runtime->dma_area, + runtime->dma_addr, + runtime->dma_bytes); } static struct snd_pcm_ops sunxi_pcm_ops = { @@ -347,7 +348,7 @@ static int sunxi_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) buf->dev.dev = pcm->card->dev; buf->private_data = NULL; buf->area = dma_alloc_writecombine(pcm->card->dev, size, - &buf->addr, GFP_KERNEL); + &buf->addr, GFP_KERNEL); if (!buf->area) return -ENOMEM; buf->bytes = size; @@ -370,7 +371,7 @@ static void sunxi_pcm_free_dma_buffers(struct snd_pcm *pcm) continue; dma_free_writecombine(pcm->card->dev, buf->bytes, - buf->area, buf->addr); + buf->area, buf->addr); buf->area = NULL; } } @@ -406,7 +407,7 @@ static int sunxi_pcm_new(struct snd_soc_pcm_runtime *rtd) } static struct snd_soc_platform_driver sunxi_soc_platform = { - .ops = &sunxi_pcm_ops, + .ops = &sunxi_pcm_ops, .pcm_new = sunxi_pcm_new, .pcm_free = sunxi_pcm_free_dma_buffers, }; -- 1.9.1 -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.