Lines Matching full:ssp
3 * pxa-ssp.c -- ALSA Soc Audio Layer
33 #include "pxa-ssp.h"
36 * SSP audio private data
39 struct ssp_device *ssp; member
53 static void dump_registers(struct ssp_device *ssp) in dump_registers() argument
55 dev_dbg(ssp->dev, "SSCR0 0x%08x SSCR1 0x%08x SSTO 0x%08x\n", in dump_registers()
56 pxa_ssp_read_reg(ssp, SSCR0), pxa_ssp_read_reg(ssp, SSCR1), in dump_registers()
57 pxa_ssp_read_reg(ssp, SSTO)); in dump_registers()
59 dev_dbg(ssp->dev, "SSPSP 0x%08x SSSR 0x%08x SSACD 0x%08x\n", in dump_registers()
60 pxa_ssp_read_reg(ssp, SSPSP), pxa_ssp_read_reg(ssp, SSSR), in dump_registers()
61 pxa_ssp_read_reg(ssp, SSACD)); in dump_registers()
64 static void pxa_ssp_enable(struct ssp_device *ssp) in pxa_ssp_enable() argument
68 sscr0 = __raw_readl(ssp->mmio_base + SSCR0) | SSCR0_SSE; in pxa_ssp_enable()
69 __raw_writel(sscr0, ssp->mmio_base + SSCR0); in pxa_ssp_enable()
72 static void pxa_ssp_disable(struct ssp_device *ssp) in pxa_ssp_disable() argument
76 sscr0 = __raw_readl(ssp->mmio_base + SSCR0) & ~SSCR0_SSE; in pxa_ssp_disable()
77 __raw_writel(sscr0, ssp->mmio_base + SSCR0); in pxa_ssp_disable()
80 static void pxa_ssp_set_dma_params(struct ssp_device *ssp, int width4, in pxa_ssp_set_dma_params() argument
86 dma->addr = ssp->phys_base + SSDR; in pxa_ssp_set_dma_params()
93 struct ssp_device *ssp = priv->ssp; in pxa_ssp_startup() local
98 clk_prepare_enable(ssp->clk); in pxa_ssp_startup()
99 pxa_ssp_disable(ssp); in pxa_ssp_startup()
120 struct ssp_device *ssp = priv->ssp; in pxa_ssp_shutdown() local
123 pxa_ssp_disable(ssp); in pxa_ssp_shutdown()
124 clk_disable_unprepare(ssp->clk); in pxa_ssp_shutdown()
139 struct ssp_device *ssp = priv->ssp; in pxa_ssp_suspend() local
142 clk_prepare_enable(ssp->clk); in pxa_ssp_suspend()
144 priv->cr0 = __raw_readl(ssp->mmio_base + SSCR0); in pxa_ssp_suspend()
145 priv->cr1 = __raw_readl(ssp->mmio_base + SSCR1); in pxa_ssp_suspend()
146 priv->to = __raw_readl(ssp->mmio_base + SSTO); in pxa_ssp_suspend()
147 priv->psp = __raw_readl(ssp->mmio_base + SSPSP); in pxa_ssp_suspend()
149 pxa_ssp_disable(ssp); in pxa_ssp_suspend()
150 clk_disable_unprepare(ssp->clk); in pxa_ssp_suspend()
157 struct ssp_device *ssp = priv->ssp; in pxa_ssp_resume() local
160 clk_prepare_enable(ssp->clk); in pxa_ssp_resume()
162 __raw_writel(sssr, ssp->mmio_base + SSSR); in pxa_ssp_resume()
163 __raw_writel(priv->cr0 & ~SSCR0_SSE, ssp->mmio_base + SSCR0); in pxa_ssp_resume()
164 __raw_writel(priv->cr1, ssp->mmio_base + SSCR1); in pxa_ssp_resume()
165 __raw_writel(priv->to, ssp->mmio_base + SSTO); in pxa_ssp_resume()
166 __raw_writel(priv->psp, ssp->mmio_base + SSPSP); in pxa_ssp_resume()
169 pxa_ssp_enable(ssp); in pxa_ssp_resume()
171 clk_disable_unprepare(ssp->clk); in pxa_ssp_resume()
182 * ssp_set_clkdiv - set SSP clock divider
185 static void pxa_ssp_set_scr(struct ssp_device *ssp, u32 div) in pxa_ssp_set_scr() argument
187 u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0); in pxa_ssp_set_scr()
189 if (ssp->type == PXA25x_SSP) { in pxa_ssp_set_scr()
196 pxa_ssp_write_reg(ssp, SSCR0, sscr0); in pxa_ssp_set_scr()
200 * Set the SSP ports SYSCLK.
206 struct ssp_device *ssp = priv->ssp; in pxa_ssp_set_dai_sysclk() local
208 u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & in pxa_ssp_set_dai_sysclk()
226 dev_dbg(ssp->dev, in pxa_ssp_set_dai_sysclk()
236 if (ssp->type == PXA25x_SSP) in pxa_ssp_set_dai_sysclk()
251 pxa_ssp_set_scr(ssp, 1); in pxa_ssp_set_dai_sysclk()
258 /* The SSP clock must be disabled when changing SSP clock mode in pxa_ssp_set_dai_sysclk()
260 if (ssp->type != PXA3xx_SSP) in pxa_ssp_set_dai_sysclk()
261 clk_disable_unprepare(ssp->clk); in pxa_ssp_set_dai_sysclk()
262 pxa_ssp_write_reg(ssp, SSCR0, sscr0); in pxa_ssp_set_dai_sysclk()
263 if (ssp->type != PXA3xx_SSP) in pxa_ssp_set_dai_sysclk()
264 clk_prepare_enable(ssp->clk); in pxa_ssp_set_dai_sysclk()
274 struct ssp_device *ssp = priv->ssp; in pxa_ssp_set_pll() local
275 u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70; in pxa_ssp_set_pll()
277 if (ssp->type == PXA3xx_SSP) in pxa_ssp_set_pll()
278 pxa_ssp_write_reg(ssp, SSACDD, 0); in pxa_ssp_set_pll()
306 if (ssp->type == PXA3xx_SSP) { in pxa_ssp_set_pll()
315 pxa_ssp_write_reg(ssp, SSACDD, val); in pxa_ssp_set_pll()
319 dev_dbg(ssp->dev, in pxa_ssp_set_pll()
328 pxa_ssp_write_reg(ssp, SSACD, ssacd); in pxa_ssp_set_pll()
340 struct ssp_device *ssp = priv->ssp; in pxa_ssp_set_dai_tdm_slot() local
343 sscr0 = pxa_ssp_read_reg(ssp, SSCR0); in pxa_ssp_set_dai_tdm_slot()
360 pxa_ssp_write_reg(ssp, SSTSA, tx_mask); in pxa_ssp_set_dai_tdm_slot()
361 pxa_ssp_write_reg(ssp, SSRSA, rx_mask); in pxa_ssp_set_dai_tdm_slot()
363 pxa_ssp_write_reg(ssp, SSCR0, sscr0); in pxa_ssp_set_dai_tdm_slot()
369 * Tristate the SSP DAI lines
375 struct ssp_device *ssp = priv->ssp; in pxa_ssp_set_dai_tristate() local
378 sscr1 = pxa_ssp_read_reg(ssp, SSCR1); in pxa_ssp_set_dai_tristate()
383 pxa_ssp_write_reg(ssp, SSCR1, sscr1); in pxa_ssp_set_dai_tristate()
429 * Set up the SSP DAI format.
430 * The SSP Port must be inactive before calling this function as the
435 struct ssp_device *ssp = priv->ssp; in pxa_ssp_configure_dai_fmt() local
443 sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & in pxa_ssp_configure_dai_fmt()
445 sscr1 = pxa_ssp_read_reg(ssp, SSCR1) & in pxa_ssp_configure_dai_fmt()
448 sspsp = pxa_ssp_read_reg(ssp, SSPSP) & in pxa_ssp_configure_dai_fmt()
501 pxa_ssp_write_reg(ssp, SSCR0, sscr0); in pxa_ssp_configure_dai_fmt()
502 pxa_ssp_write_reg(ssp, SSCR1, sscr1); in pxa_ssp_configure_dai_fmt()
503 pxa_ssp_write_reg(ssp, SSPSP, sspsp); in pxa_ssp_configure_dai_fmt()
508 scfr = pxa_ssp_read_reg(ssp, SSCR1) | SSCR1_SCFR; in pxa_ssp_configure_dai_fmt()
509 pxa_ssp_write_reg(ssp, SSCR1, scfr); in pxa_ssp_configure_dai_fmt()
511 while (pxa_ssp_read_reg(ssp, SSSR) & SSSR_BSY) in pxa_ssp_configure_dai_fmt()
516 dump_registers(ssp); in pxa_ssp_configure_dai_fmt()
546 * Set the SSP audio DMA parameters and sample size.
554 struct ssp_device *ssp = priv->ssp; in pxa_ssp_hw_params() local
558 int ttsa = pxa_ssp_read_reg(ssp, SSTSA) & 0xf; in pxa_ssp_hw_params()
570 pxa_ssp_set_dma_params(ssp, in pxa_ssp_hw_params()
575 if (pxa_ssp_read_reg(ssp, SSCR0) & SSCR0_SSE) in pxa_ssp_hw_params()
582 /* clear selected SSP bits */ in pxa_ssp_hw_params()
583 sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & ~(SSCR0_DSS | SSCR0_EDSS); in pxa_ssp_hw_params()
588 if (ssp->type == PXA3xx_SSP) in pxa_ssp_hw_params()
599 pxa_ssp_write_reg(ssp, SSCR0, sscr0); in pxa_ssp_hw_params()
632 ssacd = pxa_ssp_read_reg(ssp, SSACD); in pxa_ssp_hw_params()
636 pxa_ssp_write_reg(ssp, SSACD, ssacd); in pxa_ssp_hw_params()
644 pxa_ssp_set_scr(ssp, bclk / rate); in pxa_ssp_hw_params()
649 sspsp = pxa_ssp_read_reg(ssp, SSPSP); in pxa_ssp_hw_params()
656 * The SSP values used for that are all found out by in pxa_ssp_hw_params()
660 if (ssp->type != PXA3xx_SSP) in pxa_ssp_hw_params()
680 pxa_ssp_write_reg(ssp, SSPSP, sspsp); in pxa_ssp_hw_params()
690 dev_err(ssp->dev, "No TDM timeslot configured\n"); in pxa_ssp_hw_params()
694 dump_registers(ssp); in pxa_ssp_hw_params()
700 struct ssp_device *ssp, int value) in pxa_ssp_set_running_bit() argument
702 uint32_t sscr0 = pxa_ssp_read_reg(ssp, SSCR0); in pxa_ssp_set_running_bit()
703 uint32_t sscr1 = pxa_ssp_read_reg(ssp, SSCR1); in pxa_ssp_set_running_bit()
704 uint32_t sspsp = pxa_ssp_read_reg(ssp, SSPSP); in pxa_ssp_set_running_bit()
705 uint32_t sssr = pxa_ssp_read_reg(ssp, SSSR); in pxa_ssp_set_running_bit()
708 pxa_ssp_write_reg(ssp, SSCR0, sscr0 & ~SSCR0_SSE); in pxa_ssp_set_running_bit()
722 pxa_ssp_write_reg(ssp, SSCR1, sscr1); in pxa_ssp_set_running_bit()
725 pxa_ssp_write_reg(ssp, SSSR, sssr); in pxa_ssp_set_running_bit()
726 pxa_ssp_write_reg(ssp, SSPSP, sspsp); in pxa_ssp_set_running_bit()
727 pxa_ssp_write_reg(ssp, SSCR0, sscr0 | SSCR0_SSE); in pxa_ssp_set_running_bit()
736 struct ssp_device *ssp = priv->ssp; in pxa_ssp_trigger() local
741 pxa_ssp_enable(ssp); in pxa_ssp_trigger()
744 pxa_ssp_set_running_bit(substream, ssp, 1); in pxa_ssp_trigger()
745 val = pxa_ssp_read_reg(ssp, SSSR); in pxa_ssp_trigger()
746 pxa_ssp_write_reg(ssp, SSSR, val); in pxa_ssp_trigger()
749 pxa_ssp_set_running_bit(substream, ssp, 1); in pxa_ssp_trigger()
752 pxa_ssp_set_running_bit(substream, ssp, 0); in pxa_ssp_trigger()
755 pxa_ssp_disable(ssp); in pxa_ssp_trigger()
758 pxa_ssp_set_running_bit(substream, ssp, 0); in pxa_ssp_trigger()
765 dump_registers(ssp); in pxa_ssp_trigger()
790 priv->ssp = pxa_ssp_request_of(ssp_handle, "SoC audio"); in pxa_ssp_probe()
791 if (priv->ssp == NULL) { in pxa_ssp_probe()
805 priv->ssp = pxa_ssp_request(dai->id + 1, "SoC audio"); in pxa_ssp_probe()
806 if (priv->ssp == NULL) { in pxa_ssp_probe()
826 pxa_ssp_free(priv->ssp); in pxa_ssp_remove()
869 .name = "pxa-ssp",
886 { .compatible = "mrvl,pxa-ssp-dai" },
900 .name = "pxa-ssp-dai",
911 MODULE_DESCRIPTION("PXA SSP/PCM SoC Interface");
913 MODULE_ALIAS("platform:pxa-ssp-dai");