-/**
- ******************************************************************************
- * @file sf_spdif_pcm.c
- * @author StarFive Technology
- * @version V1.0
- * @date 05/27/2021
- * @brief
- ******************************************************************************
- * @copy
- *
- * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
- * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
- * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
- * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
- * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
- *
- * <h2><center>© COPYRIGHT 20120 Shanghai StarFive Technology Co., Ltd. </center></h2>
- */
+// SPDX-License-Identifier: GPL-2.0
+/*
+ ******************************************************************************
+ * @file sf_spdif_pcm.c
+ * @author StarFive Technology
+ * @version V1.0
+ * @date 05/27/2021
+ * @brief
+ ******************************************************************************
+ * @copy
+ *
+ * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * <h2><center>© COPYRIGHT 20120 Shanghai StarFive Technology Co., Ltd. </center></h2>
+ */
#include <linux/io.h>
#include <linux/rcupdate.h>
#define PERIOD_BYTES_MIN 4096
#define PERIODS_MIN 2
-static unsigned int sf_spdif_pcm_tx(struct sf_spdif_dev *dev,
- struct snd_pcm_runtime *runtime, unsigned int tx_ptr,
- bool *period_elapsed, snd_pcm_format_t format)
-{
+static unsigned int sf_spdif_pcm_tx(struct sf_spdif_dev *dev,
+ struct snd_pcm_runtime *runtime, unsigned int tx_ptr,
+ bool *period_elapsed, snd_pcm_format_t format)
+{
u32 data[2];
- unsigned int period_pos = tx_ptr % runtime->period_size;
- int i;
+ unsigned int period_pos = tx_ptr % runtime->period_size;
+ int i;
/* two- channel and signal-channel mode */
if (dev->channels) {
const u32 (*p32)[2] = (void *)runtime->dma_area;
for (i = 0; i < dev->fifo_th; i++) {
- if (SNDRV_PCM_FORMAT_S16_LE == format) {
+ if (format == SNDRV_PCM_FORMAT_S16_LE) {
data[0] = p16[tx_ptr][0];
data[0] = data[0]<<8;
data[0] &= 0x00ffff00;
data[1] = p16[tx_ptr][1];
data[1] = data[1]<<8;
data[1] &= 0x00ffff00;
- } else if (SNDRV_PCM_FORMAT_S24_LE == format) {
+ } else if (format == SNDRV_PCM_FORMAT_S24_LE) {
data[0] = p32[tx_ptr][0];
data[0] &= 0x00ffffff;
data[1] = p32[tx_ptr][1];
data[1] &= 0x00ffffff;
- } else if (SNDRV_PCM_FORMAT_S32_LE == format) {
+ } else if (format == SNDRV_PCM_FORMAT_S32_LE) {
data[0] = p32[tx_ptr][0];
data[0] = data[0]>>8;
data[1] = p32[tx_ptr][1];
iowrite32(data[0], dev->spdif_base + SPDIF_FIFO_ADDR);
iowrite32(data[1], dev->spdif_base + SPDIF_FIFO_ADDR);
period_pos++;
- if (++tx_ptr >= runtime->buffer_size) {
+ if (++tx_ptr >= runtime->buffer_size)
tx_ptr = 0;
- }
}
} else {
const u16 (*p16) = (void *)runtime->dma_area;
const u32 (*p32) = (void *)runtime->dma_area;
for (i = 0; i < dev->fifo_th; i++) {
- if (SNDRV_PCM_FORMAT_S16_LE == format) {
+ if (format == SNDRV_PCM_FORMAT_S16_LE) {
data[0] = p16[tx_ptr];
data[0] = data[0]<<8;
data[0] &= 0x00ffff00;
- } else if (SNDRV_PCM_FORMAT_S24_LE == format) {
+ } else if (format == SNDRV_PCM_FORMAT_S24_LE) {
data[0] = p32[tx_ptr];
data[0] &= 0x00ffffff;
- } else if (SNDRV_PCM_FORMAT_S32_LE == format) {
+ } else if (format == SNDRV_PCM_FORMAT_S32_LE) {
data[0] = p32[tx_ptr];
data[0] = data[0]>>8;
}
iowrite32(data[0], dev->spdif_base + SPDIF_FIFO_ADDR);
period_pos++;
- if (++tx_ptr >= runtime->buffer_size) {
+ if (++tx_ptr >= runtime->buffer_size)
tx_ptr = 0;
- }
}
}
- *period_elapsed = period_pos >= runtime->period_size;
- return tx_ptr;
+ *period_elapsed = period_pos >= runtime->period_size;
+ return tx_ptr;
}
-static unsigned int sf_spdif_pcm_rx(struct sf_spdif_dev *dev,
- struct snd_pcm_runtime *runtime, unsigned int rx_ptr,
- bool *period_elapsed, snd_pcm_format_t format)
-{
- u16 (*p16)[2] = (void *)runtime->dma_area;
- u32 (*p32)[2] = (void *)runtime->dma_area;
+static unsigned int sf_spdif_pcm_rx(struct sf_spdif_dev *dev,
+ struct snd_pcm_runtime *runtime, unsigned int rx_ptr,
+ bool *period_elapsed, snd_pcm_format_t format)
+{
+ u16 (*p16)[2] = (void *)runtime->dma_area;
+ u32 (*p32)[2] = (void *)runtime->dma_area;
u32 data[2];
- unsigned int period_pos = rx_ptr % runtime->period_size;
- int i;
+ unsigned int period_pos = rx_ptr % runtime->period_size;
+ int i;
- for (i = 0; i < dev->fifo_th; i++) {
+ for (i = 0; i < dev->fifo_th; i++) {
data[0] = ioread32(dev->spdif_base + SPDIF_FIFO_ADDR);
data[1] = ioread32(dev->spdif_base + SPDIF_FIFO_ADDR);
- if (SNDRV_PCM_FORMAT_S16_LE == format) {
+ if (format == SNDRV_PCM_FORMAT_S16_LE) {
p16[rx_ptr][0] = data[0]>>8;
p16[rx_ptr][1] = data[1]>>8;
- } else if (SNDRV_PCM_FORMAT_S24_LE == format) {
+ } else if (format == SNDRV_PCM_FORMAT_S24_LE) {
p32[rx_ptr][0] = data[0];
p32[rx_ptr][1] = data[1];
- } else if (SNDRV_PCM_FORMAT_S32_LE == format) {
+ } else if (format == SNDRV_PCM_FORMAT_S32_LE) {
p32[rx_ptr][0] = data[0]<<8;
p32[rx_ptr][1] = data[1]<<8;
- }
-
- period_pos++;
- if (++rx_ptr >= runtime->buffer_size)
- rx_ptr = 0;
- }
-
- *period_elapsed = period_pos >= runtime->period_size;
- return rx_ptr;
+ }
+
+ period_pos++;
+ if (++rx_ptr >= runtime->buffer_size)
+ rx_ptr = 0;
+ }
+
+ *period_elapsed = period_pos >= runtime->period_size;
+ return rx_ptr;
}
static const struct snd_pcm_hardware sf_pcm_hardware = {
struct sf_spdif_dev *dev = runtime->private_data;
snd_pcm_uframes_t pos;
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
pos = READ_ONCE(dev->tx_ptr);
- }
- else {
+ else
pos = READ_ONCE(dev->rx_ptr);
- }
return pos < runtime->buffer_size ? pos : 0;
}
return 0;
}
-
+
static const struct snd_soc_component_driver sf_pcm_component = {
.open = sf_pcm_open,
.close = sf_pcm_close,