Lines Matching +full:add +full:- +full:fs

2  * siu_dai.c - ALSA SoC driver for Renesas SH7343, SH7722 SIU peripheral.
4 * Copyright (C) 2009-2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de>
96 .spdif = 0, /* impossible - turn off */
102 .spdif = 0, /* impossible - turn off */
111 u32 __iomem *base = info->reg; in siu_dai_start()
113 dev_dbg(port_info->pcm->card->dev, "%s\n", __func__); in siu_dai_start()
121 port_info->stfifo = 0; in siu_dai_start()
122 port_info->trdat = 0; in siu_dai_start()
127 /* portA=256fs, portB=256fs */ in siu_dai_start()
140 /* portA: 32 bit/fs, master; portB: 32 bit/fs, master */ in siu_dai_start()
147 siu_write32(base + SIU_SBDVCA, port_info->playback.volume); in siu_dai_start()
148 siu_write32(base + SIU_SBDVCB, port_info->capture.volume); in siu_dai_start()
154 u32 __iomem *base = info->reg; in siu_dai_stop()
163 struct siu_firmware *fw = &info->fw; in siu_dai_spbAselect()
164 u32 *ydef = fw->yram0; in siu_dai_spbAselect()
168 if (!info->port_id) in siu_dai_spbAselect()
173 ydef[0] = (fw->spbpar[idx].ab1a << 16) | in siu_dai_spbAselect()
174 (fw->spbpar[idx].ab0a << 8) | in siu_dai_spbAselect()
175 (fw->spbpar[idx].dir << 7) | 3; in siu_dai_spbAselect()
176 ydef[1] = fw->yram0[1]; /* 0x03000300 */ in siu_dai_spbAselect()
178 ydef[3] = fw->yram0[3]; /* 0 */ in siu_dai_spbAselect()
179 ydef[4] = fw->yram0[4]; /* 0 */ in siu_dai_spbAselect()
180 ydef[7] = fw->spbpar[idx].event; in siu_dai_spbAselect()
181 port_info->stfifo |= fw->spbpar[idx].stfifo; in siu_dai_spbAselect()
182 port_info->trdat |= fw->spbpar[idx].trdat; in siu_dai_spbAselect()
188 struct siu_firmware *fw = &info->fw; in siu_dai_spbBselect()
189 u32 *ydef = fw->yram0; in siu_dai_spbBselect()
193 if (!info->port_id) in siu_dai_spbBselect()
198 ydef[5] = (fw->spbpar[idx].ab1a << 16) | in siu_dai_spbBselect()
199 (fw->spbpar[idx].ab0a << 8) | 1; in siu_dai_spbBselect()
200 ydef[6] = fw->spbpar[idx].event; in siu_dai_spbBselect()
201 port_info->stfifo |= fw->spbpar[idx].stfifo; in siu_dai_spbBselect()
202 port_info->trdat |= fw->spbpar[idx].trdat; in siu_dai_spbBselect()
208 u32 __iomem *base = info->reg; in siu_dai_open()
214 switch (info->port_id) { in siu_dai_open()
233 * At the moment only fixed Left-upper, Left-lower, Right-upper, Right-lower
239 u32 __iomem *base = info->reg; in siu_dai_pcmdatapack()
244 switch (info->port_id) { in siu_dai_pcmdatapack()
259 u32 __iomem *base = info->reg; in siu_dai_spbstart()
260 struct siu_firmware *fw = &info->fw; in siu_dai_spbstart()
261 u32 *ydef = fw->yram0; in siu_dai_spbstart()
263 u32 __iomem *add; in siu_dai_spbstart() local
267 ptr = fw->pram0; in siu_dai_spbstart()
268 add = info->pram; in siu_dai_spbstart()
269 for (cnt = 0; cnt < PRAM0_SIZE; cnt++, add++, ptr++) in siu_dai_spbstart()
270 siu_write32(add, *ptr); in siu_dai_spbstart()
272 ptr = fw->pram1; in siu_dai_spbstart()
273 add = info->pram + (0x0100 / sizeof(u32)); in siu_dai_spbstart()
274 for (cnt = 0; cnt < PRAM1_SIZE; cnt++, add++, ptr++) in siu_dai_spbstart()
275 siu_write32(add, *ptr); in siu_dai_spbstart()
278 add = info->xram; in siu_dai_spbstart()
279 for (cnt = 0; cnt < XRAM0_SIZE + XRAM1_SIZE + XRAM2_SIZE; cnt++, add++) in siu_dai_spbstart()
280 siu_write32(add, 0); in siu_dai_spbstart()
283 add = info->yram; in siu_dai_spbstart()
284 for (cnt = 0; cnt < YRAM_DEF_SIZE; cnt++, add++) in siu_dai_spbstart()
285 siu_write32(add, ydef[cnt]); in siu_dai_spbstart()
288 add = info->yram + (0x0200 / sizeof(u32)); in siu_dai_spbstart()
289 for (cnt = 0; cnt < YRAM_FIR_SIZE; cnt++, add++) in siu_dai_spbstart()
290 siu_write32(add, fw->yram_fir_coeff[cnt]); in siu_dai_spbstart()
293 add = info->yram + (0x0600 / sizeof(u32)); in siu_dai_spbstart()
294 for (cnt = 0; cnt < YRAM_IIR_SIZE; cnt++, add++) in siu_dai_spbstart()
295 siu_write32(add, 0); in siu_dai_spbstart()
297 siu_write32(base + SIU_TRDAT, port_info->trdat); in siu_dai_spbstart()
298 port_info->trdat = 0x0; in siu_dai_spbstart()
307 while (--cnt && siu_read32(base + SIU_SBCTL) != 0x80000000) in siu_dai_spbstart()
311 return -EBUSY; in siu_dai_spbstart()
324 u32 __iomem *base = info->reg; in siu_dai_spbstop()
330 port_info->stfifo = 0; in siu_dai_spbstop()
356 dev_dbg(port_info->pcm->card->dev, "%s\n", __func__); in siu_dai_info_volume()
358 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in siu_dai_info_volume()
359 uinfo->count = 2; in siu_dai_info_volume()
360 uinfo->value.integer.min = 0; in siu_dai_info_volume()
361 uinfo->value.integer.max = SIU_MAX_VOLUME; in siu_dai_info_volume()
370 struct device *dev = port_info->pcm->card->dev; in siu_dai_get_volume()
375 switch (kctrl->private_value) { in siu_dai_get_volume()
378 vol = port_info->playback.volume; in siu_dai_get_volume()
379 ucontrol->value.integer.value[0] = vol & 0xffff; in siu_dai_get_volume()
380 ucontrol->value.integer.value[1] = vol >> 16 & 0xffff; in siu_dai_get_volume()
384 vol = port_info->capture.volume; in siu_dai_get_volume()
385 ucontrol->value.integer.value[0] = vol & 0xffff; in siu_dai_get_volume()
386 ucontrol->value.integer.value[1] = vol >> 16 & 0xffff; in siu_dai_get_volume()
390 __func__, kctrl->private_value); in siu_dai_get_volume()
391 return -EINVAL; in siu_dai_get_volume()
401 struct device *dev = port_info->pcm->card->dev; in siu_dai_put_volume()
403 u32 __iomem *base = info->reg; in siu_dai_put_volume()
409 if (ucontrol->value.integer.value[0] < 0 || in siu_dai_put_volume()
410 ucontrol->value.integer.value[0] > SIU_MAX_VOLUME || in siu_dai_put_volume()
411 ucontrol->value.integer.value[1] < 0 || in siu_dai_put_volume()
412 ucontrol->value.integer.value[1] > SIU_MAX_VOLUME) in siu_dai_put_volume()
413 return -EINVAL; in siu_dai_put_volume()
415 new_vol = ucontrol->value.integer.value[0] | in siu_dai_put_volume()
416 ucontrol->value.integer.value[1] << 16; in siu_dai_put_volume()
418 /* See comment above - DSP firmware implementation */ in siu_dai_put_volume()
419 switch (kctrl->private_value) { in siu_dai_put_volume()
422 cur_vol = port_info->playback.volume; in siu_dai_put_volume()
424 port_info->playback.volume = new_vol; in siu_dai_put_volume()
428 cur_vol = port_info->capture.volume; in siu_dai_put_volume()
430 port_info->capture.volume = new_vol; in siu_dai_put_volume()
434 __func__, kctrl->private_value); in siu_dai_put_volume()
435 return -EINVAL; in siu_dai_put_volume()
466 struct device *dev = card->dev; in siu_init_port()
472 return -ENOMEM; in siu_init_port()
476 (*port_info)->playback.volume = DFLT_VOLUME_LEVEL; in siu_init_port()
477 (*port_info)->capture.volume = DFLT_VOLUME_LEVEL; in siu_init_port()
480 * Add mixer support. The SPB is used to change the volume. Both in siu_init_port()
489 "failed to add playback controls %p port=%d err=%d\n", in siu_init_port()
496 "failed to add capture controls %p port=%d err=%d\n", in siu_init_port()
511 struct snd_pcm_runtime *rt = substream->runtime; in siu_dai_startup()
515 dev_dbg(substream->pcm->card->dev, "%s: port=%d@%p\n", __func__, in siu_dai_startup()
516 info->port_id, port_info); in siu_dai_startup()
535 dev_dbg(substream->pcm->card->dev, "%s: port=%d@%p\n", __func__, in siu_dai_shutdown()
536 info->port_id, port_info); in siu_dai_shutdown()
538 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in siu_dai_shutdown()
539 port_info->play_cap &= ~PLAYBACK_ENABLED; in siu_dai_shutdown()
541 port_info->play_cap &= ~CAPTURE_ENABLED; in siu_dai_shutdown()
544 if (!port_info->play_cap) { in siu_dai_shutdown()
546 BUG_ON(port_info->playback.rw_flg || port_info->capture.rw_flg); in siu_dai_shutdown()
557 struct snd_pcm_runtime *rt = substream->runtime; in siu_dai_prepare()
562 dev_dbg(substream->pcm->card->dev, in siu_dai_prepare()
564 __func__, info->port_id, port_info->play_cap, rt->channels); in siu_dai_prepare()
566 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in siu_dai_prepare()
568 siu_stream = &port_info->playback; in siu_dai_prepare()
571 siu_stream = &port_info->capture; in siu_dai_prepare()
575 if (!port_info->play_cap) { in siu_dai_prepare()
576 siu_stream->rw_flg = 0; /* stream-data transfer flag */ in siu_dai_prepare()
592 port_info->play_cap |= self; in siu_dai_prepare()
606 u32 __iomem *base = info->reg; in siu_dai_set_fmt()
609 dev_dbg(dai->dev, "%s: fmt 0x%x on port %d\n", in siu_dai_set_fmt()
610 __func__, fmt, info->port_id); in siu_dai_set_fmt()
612 if (info->port_id < 0) in siu_dai_set_fmt()
613 return -ENODEV; in siu_dai_set_fmt()
618 ifctl = siu_flags[info->port_id].playback.i2s | in siu_dai_set_fmt()
619 siu_flags[info->port_id].capture.i2s; in siu_dai_set_fmt()
622 ifctl = siu_flags[info->port_id].playback.pcm | in siu_dai_set_fmt()
623 siu_flags[info->port_id].capture.pcm; in siu_dai_set_fmt()
625 /* SPDIF disabled - see comment at the top */ in siu_dai_set_fmt()
627 return -EINVAL; in siu_dai_set_fmt()
630 ifctl |= ~(siu_flags[info->port_id].playback.mask | in siu_dai_set_fmt()
631 siu_flags[info->port_id].capture.mask) & in siu_dai_set_fmt()
646 return -EINVAL; in siu_dai_set_sysclk()
648 dev_dbg(dai->dev, "%s: using clock %d\n", __func__, clk_id); in siu_dai_set_sysclk()
668 return -EINVAL; in siu_dai_set_sysclk()
671 siu_clk = clk_get(dai->dev, siu_name); in siu_dai_set_sysclk()
673 dev_err(dai->dev, "%s: cannot get a SIU clock: %ld\n", __func__, in siu_dai_set_sysclk()
678 parent_clk = clk_get(dai->dev, parent_name); in siu_dai_set_sysclk()
681 dev_err(dai->dev, "cannot get a SIU clock parent: %d\n", ret); in siu_dai_set_sysclk()
687 dev_err(dai->dev, "cannot reparent the SIU clock: %d\n", ret); in siu_dai_set_sysclk()
693 dev_err(dai->dev, "cannot set SIU clock rate: %d\n", ret); in siu_dai_set_sysclk()
713 .name = "siu-i2s-dai",
738 return -ENOMEM; in siu_probe()
740 info->dev = &pdev->dev; in siu_probe()
742 ret = request_firmware(&fw_entry, "siu_spb.bin", &pdev->dev); in siu_probe()
747 * Loaded firmware is "const" - read only, but we have to modify it in in siu_probe()
750 memcpy(&info->fw, fw_entry->data, fw_entry->size); in siu_probe()
756 ret = -ENODEV; in siu_probe()
760 region = request_mem_region(res->start, resource_size(res), in siu_probe()
761 pdev->name); in siu_probe()
763 dev_err(&pdev->dev, "SIU region already claimed\n"); in siu_probe()
764 ret = -EBUSY; in siu_probe()
768 ret = -ENOMEM; in siu_probe()
769 info->pram = ioremap(res->start, PRAM_SIZE); in siu_probe()
770 if (!info->pram) in siu_probe()
772 info->xram = ioremap(res->start + XRAM_OFFSET, XRAM_SIZE); in siu_probe()
773 if (!info->xram) in siu_probe()
775 info->yram = ioremap(res->start + YRAM_OFFSET, YRAM_SIZE); in siu_probe()
776 if (!info->yram) in siu_probe()
778 info->reg = ioremap(res->start + REG_OFFSET, resource_size(res) - in siu_probe()
780 if (!info->reg) in siu_probe()
783 dev_set_drvdata(&pdev->dev, info); in siu_probe()
786 ret = snd_soc_register_dais(&pdev->dev, &siu_i2s_dai, 1); in siu_probe()
790 ret = snd_soc_register_platform(&pdev->dev, &siu_platform); in siu_probe()
794 pm_runtime_enable(&pdev->dev); in siu_probe()
799 snd_soc_unregister_dai(&pdev->dev); in siu_probe()
801 iounmap(info->reg); in siu_probe()
803 iounmap(info->yram); in siu_probe()
805 iounmap(info->xram); in siu_probe()
807 iounmap(info->pram); in siu_probe()
809 release_mem_region(res->start, resource_size(res)); in siu_probe()
820 struct siu_info *info = dev_get_drvdata(&pdev->dev); in siu_remove()
823 pm_runtime_disable(&pdev->dev); in siu_remove()
825 snd_soc_unregister_platform(&pdev->dev); in siu_remove()
826 snd_soc_unregister_dai(&pdev->dev); in siu_remove()
828 iounmap(info->reg); in siu_remove()
829 iounmap(info->yram); in siu_remove()
830 iounmap(info->xram); in siu_remove()
831 iounmap(info->pram); in siu_remove()
834 release_mem_region(res->start, resource_size(res)); in siu_remove()
843 .name = "siu-pcm-audio",