Lines Matching refs:ssp

3  * pxa-ssp.c  --  ALSA Soc Audio Layer
33 #include "pxa-ssp.h"
39 struct ssp_device *ssp;
53 static void dump_registers(struct ssp_device *ssp)
55 dev_dbg(ssp->dev, "SSCR0 0x%08x SSCR1 0x%08x SSTO 0x%08x\n",
56 pxa_ssp_read_reg(ssp, SSCR0), pxa_ssp_read_reg(ssp, SSCR1),
57 pxa_ssp_read_reg(ssp, SSTO));
59 dev_dbg(ssp->dev, "SSPSP 0x%08x SSSR 0x%08x SSACD 0x%08x\n",
60 pxa_ssp_read_reg(ssp, SSPSP), pxa_ssp_read_reg(ssp, SSSR),
61 pxa_ssp_read_reg(ssp, SSACD));
64 static void pxa_ssp_enable(struct ssp_device *ssp)
68 sscr0 = __raw_readl(ssp->mmio_base + SSCR0) | SSCR0_SSE;
69 __raw_writel(sscr0, ssp->mmio_base + SSCR0);
72 static void pxa_ssp_disable(struct ssp_device *ssp)
76 sscr0 = __raw_readl(ssp->mmio_base + SSCR0) & ~SSCR0_SSE;
77 __raw_writel(sscr0, ssp->mmio_base + SSCR0);
80 static void pxa_ssp_set_dma_params(struct ssp_device *ssp, int width4,
86 dma->addr = ssp->phys_base + SSDR;
93 struct ssp_device *ssp = priv->ssp;
98 clk_prepare_enable(ssp->clk);
99 pxa_ssp_disable(ssp);
120 struct ssp_device *ssp = priv->ssp;
123 pxa_ssp_disable(ssp);
124 clk_disable_unprepare(ssp->clk);
139 struct ssp_device *ssp = priv->ssp;
142 clk_prepare_enable(ssp->clk);
144 priv->cr0 = __raw_readl(ssp->mmio_base + SSCR0);
145 priv->cr1 = __raw_readl(ssp->mmio_base + SSCR1);
146 priv->to = __raw_readl(ssp->mmio_base + SSTO);
147 priv->psp = __raw_readl(ssp->mmio_base + SSPSP);
149 pxa_ssp_disable(ssp);
150 clk_disable_unprepare(ssp->clk);
157 struct ssp_device *ssp = priv->ssp;
160 clk_prepare_enable(ssp->clk);
162 __raw_writel(sssr, ssp->mmio_base + SSSR);
163 __raw_writel(priv->cr0 & ~SSCR0_SSE, ssp->mmio_base + SSCR0);
164 __raw_writel(priv->cr1, ssp->mmio_base + SSCR1);
165 __raw_writel(priv->to, ssp->mmio_base + SSTO);
166 __raw_writel(priv->psp, ssp->mmio_base + SSPSP);
169 pxa_ssp_enable(ssp);
171 clk_disable_unprepare(ssp->clk);
185 static void pxa_ssp_set_scr(struct ssp_device *ssp, u32 div)
187 u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
189 if (ssp->type == PXA25x_SSP) {
196 pxa_ssp_write_reg(ssp, SSCR0, sscr0);
206 struct ssp_device *ssp = priv->ssp;
208 u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0) &
226 dev_dbg(ssp->dev,
236 if (ssp->type == PXA25x_SSP)
251 pxa_ssp_set_scr(ssp, 1);
260 if (ssp->type != PXA3xx_SSP)
261 clk_disable_unprepare(ssp->clk);
262 pxa_ssp_write_reg(ssp, SSCR0, sscr0);
263 if (ssp->type != PXA3xx_SSP)
264 clk_prepare_enable(ssp->clk);
274 struct ssp_device *ssp = priv->ssp;
275 u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70;
277 if (ssp->type == PXA3xx_SSP)
278 pxa_ssp_write_reg(ssp, SSACDD, 0);
306 if (ssp->type == PXA3xx_SSP) {
315 pxa_ssp_write_reg(ssp, SSACDD, val);
319 dev_dbg(ssp->dev,
328 pxa_ssp_write_reg(ssp, SSACD, ssacd);
340 struct ssp_device *ssp = priv->ssp;
343 sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
360 pxa_ssp_write_reg(ssp, SSTSA, tx_mask);
361 pxa_ssp_write_reg(ssp, SSRSA, rx_mask);
363 pxa_ssp_write_reg(ssp, SSCR0, sscr0);
375 struct ssp_device *ssp = priv->ssp;
378 sscr1 = pxa_ssp_read_reg(ssp, SSCR1);
383 pxa_ssp_write_reg(ssp, SSCR1, sscr1);
435 struct ssp_device *ssp = priv->ssp;
443 sscr0 = pxa_ssp_read_reg(ssp, SSCR0) &
445 sscr1 = pxa_ssp_read_reg(ssp, SSCR1) &
448 sspsp = pxa_ssp_read_reg(ssp, SSPSP) &
501 pxa_ssp_write_reg(ssp, SSCR0, sscr0);
502 pxa_ssp_write_reg(ssp, SSCR1, sscr1);
503 pxa_ssp_write_reg(ssp, SSPSP, sspsp);
508 scfr = pxa_ssp_read_reg(ssp, SSCR1) | SSCR1_SCFR;
509 pxa_ssp_write_reg(ssp, SSCR1, scfr);
511 while (pxa_ssp_read_reg(ssp, SSSR) & SSSR_BSY)
516 dump_registers(ssp);
554 struct ssp_device *ssp = priv->ssp;
558 int ttsa = pxa_ssp_read_reg(ssp, SSTSA) & 0xf;
570 pxa_ssp_set_dma_params(ssp,
575 if (pxa_ssp_read_reg(ssp, SSCR0) & SSCR0_SSE)
583 sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & ~(SSCR0_DSS | SSCR0_EDSS);
588 if (ssp->type == PXA3xx_SSP)
599 pxa_ssp_write_reg(ssp, SSCR0, sscr0);
632 ssacd = pxa_ssp_read_reg(ssp, SSACD);
636 pxa_ssp_write_reg(ssp, SSACD, ssacd);
644 pxa_ssp_set_scr(ssp, bclk / rate);
649 sspsp = pxa_ssp_read_reg(ssp, SSPSP);
660 if (ssp->type != PXA3xx_SSP)
680 pxa_ssp_write_reg(ssp, SSPSP, sspsp);
690 dev_err(ssp->dev, "No TDM timeslot configured\n");
694 dump_registers(ssp);
700 struct ssp_device *ssp, int value)
702 uint32_t sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
703 uint32_t sscr1 = pxa_ssp_read_reg(ssp, SSCR1);
704 uint32_t sspsp = pxa_ssp_read_reg(ssp, SSPSP);
705 uint32_t sssr = pxa_ssp_read_reg(ssp, SSSR);
708 pxa_ssp_write_reg(ssp, SSCR0, sscr0 & ~SSCR0_SSE);
722 pxa_ssp_write_reg(ssp, SSCR1, sscr1);
725 pxa_ssp_write_reg(ssp, SSSR, sssr);
726 pxa_ssp_write_reg(ssp, SSPSP, sspsp);
727 pxa_ssp_write_reg(ssp, SSCR0, sscr0 | SSCR0_SSE);
736 struct ssp_device *ssp = priv->ssp;
741 pxa_ssp_enable(ssp);
744 pxa_ssp_set_running_bit(substream, ssp, 1);
745 val = pxa_ssp_read_reg(ssp, SSSR);
746 pxa_ssp_write_reg(ssp, SSSR, val);
749 pxa_ssp_set_running_bit(substream, ssp, 1);
752 pxa_ssp_set_running_bit(substream, ssp, 0);
755 pxa_ssp_disable(ssp);
758 pxa_ssp_set_running_bit(substream, ssp, 0);
765 dump_registers(ssp);
790 priv->ssp = pxa_ssp_request_of(ssp_handle, "SoC audio");
791 if (priv->ssp == NULL) {
805 priv->ssp = pxa_ssp_request(dai->id + 1, "SoC audio");
806 if (priv->ssp == NULL) {
826 pxa_ssp_free(priv->ssp);
869 .name = "pxa-ssp",
886 { .compatible = "mrvl,pxa-ssp-dai" },
900 .name = "pxa-ssp-dai",
913 MODULE_ALIAS("platform:pxa-ssp-dai");