/* Validity Bit Mode */ #define SPDIFRX_MR_VBMODE_MASK GENAMSK(1, 1) #define SPDIFRX_MR_VBMODE_ALWAYS_LOAD \
(0 << 1) /* Load sample regardless of validity bit value */ #define SPDIFRX_MR_VBMODE_DISCARD_IF_VB1 \
(1 << 1) /* Load sample only if validity bit is 0 */
/* Data Word Endian Mode */ #define SPDIFRX_MR_ENDIAN_MASK GENMASK(2, 2) #define SPDIFRX_MR_ENDIAN_LITTLE (0 << 2) /* Little Endian Mode */ #define SPDIFRX_MR_ENDIAN_BIG (1 << 2) /* Big Endian Mode */
staticbool mchp_spdifrx_readable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case SPDIFRX_MR: case SPDIFRX_IMR: case SPDIFRX_ISR: case SPDIFRX_RSR: case SPDIFRX_CHSR(0, 0): case SPDIFRX_CHSR(0, 1): case SPDIFRX_CHSR(0, 2): case SPDIFRX_CHSR(0, 3): case SPDIFRX_CHSR(0, 4): case SPDIFRX_CHSR(0, 5): case SPDIFRX_CHUD(0, 0): case SPDIFRX_CHUD(0, 1): case SPDIFRX_CHUD(0, 2): case SPDIFRX_CHUD(0, 3): case SPDIFRX_CHUD(0, 4): case SPDIFRX_CHUD(0, 5): case SPDIFRX_CHSR(1, 0): case SPDIFRX_CHSR(1, 1): case SPDIFRX_CHSR(1, 2): case SPDIFRX_CHSR(1, 3): case SPDIFRX_CHSR(1, 4): case SPDIFRX_CHSR(1, 5): case SPDIFRX_CHUD(1, 0): case SPDIFRX_CHUD(1, 1): case SPDIFRX_CHUD(1, 2): case SPDIFRX_CHUD(1, 3): case SPDIFRX_CHUD(1, 4): case SPDIFRX_CHUD(1, 5): case SPDIFRX_WPMR: case SPDIFRX_WPSR: case SPDIFRX_VERSION: returntrue; default: returnfalse;
}
}
staticbool mchp_spdifrx_writeable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case SPDIFRX_CR: case SPDIFRX_MR: case SPDIFRX_IER: case SPDIFRX_IDR: case SPDIFRX_WPMR: returntrue; default: returnfalse;
}
}
staticbool mchp_spdifrx_precious_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case SPDIFRX_ISR: case SPDIFRX_RHR: returntrue; default: returnfalse;
}
}
staticbool mchp_spdifrx_volatile_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case SPDIFRX_IMR: case SPDIFRX_ISR: case SPDIFRX_RSR: case SPDIFRX_CHSR(0, 0): case SPDIFRX_CHSR(0, 1): case SPDIFRX_CHSR(0, 2): case SPDIFRX_CHSR(0, 3): case SPDIFRX_CHSR(0, 4): case SPDIFRX_CHSR(0, 5): case SPDIFRX_CHUD(0, 0): case SPDIFRX_CHUD(0, 1): case SPDIFRX_CHUD(0, 2): case SPDIFRX_CHUD(0, 3): case SPDIFRX_CHUD(0, 4): case SPDIFRX_CHUD(0, 5): case SPDIFRX_CHSR(1, 0): case SPDIFRX_CHSR(1, 1): case SPDIFRX_CHSR(1, 2): case SPDIFRX_CHSR(1, 3): case SPDIFRX_CHSR(1, 4): case SPDIFRX_CHSR(1, 5): case SPDIFRX_CHUD(1, 0): case SPDIFRX_CHUD(1, 1): case SPDIFRX_CHUD(1, 2): case SPDIFRX_CHUD(1, 3): case SPDIFRX_CHUD(1, 4): case SPDIFRX_CHUD(1, 5): case SPDIFRX_VERSION: returntrue; default: returnfalse;
}
}
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
dev_err(dev->dev, "Playback is not supported\n"); return -EINVAL;
}
if (params_channels(params) != SPDIFRX_CHANNELS) {
dev_err(dev->dev, "unsupported number of channels: %d\n",
params_channels(params)); return -EINVAL;
}
switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_BE: case SNDRV_PCM_FORMAT_S20_3BE: case SNDRV_PCM_FORMAT_S24_3BE: case SNDRV_PCM_FORMAT_S24_BE:
mr |= SPDIFRX_MR_ENDIAN_BIG;
fallthrough; case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S20_3LE: case SNDRV_PCM_FORMAT_S24_3LE: case SNDRV_PCM_FORMAT_S24_LE:
mr |= SPDIFRX_MR_DATAWIDTH(params_width(params)); break; default:
dev_err(dev->dev, "unsupported PCM format: %d\n",
params_format(params)); return -EINVAL;
}
mutex_lock(&dev->mlock); if (dev->trigger_enabled) {
dev_err(dev->dev, "PCM already running\n");
ret = -EBUSY; goto unlock;
}
/* GCLK is enabled by runtime PM. */
clk_disable_unprepare(dev->gclk);
ret = clk_set_min_rate(dev->gclk, params_rate(params) *
SPDIFRX_GCLK_RATIO_MIN + 1); if (ret) {
dev_err(dev->dev, "unable to set gclk min rate: rate %u * ratio %u + 1\n",
params_rate(params), SPDIFRX_GCLK_RATIO_MIN); /* Restore runtime PM state. */
clk_prepare_enable(dev->gclk); goto unlock;
}
ret = clk_prepare_enable(dev->gclk); if (ret) {
dev_err(dev->dev, "unable to enable gclk: %d\n", ret); goto unlock;
}
dev_dbg(dev->dev, "GCLK range min set to %d\n",
params_rate(params) * SPDIFRX_GCLK_RATIO_MIN + 1);
if (dev->trigger_enabled) {
reinit_completion(&ch_stat->done);
regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_CSC(channel)); /* Check for new data available */
ret = wait_for_completion_interruptible_timeout(&ch_stat->done,
msecs_to_jiffies(100)); /* Valid stream might not be present */ if (ret <= 0) {
dev_dbg(dev->dev, "channel status for channel %d timeout\n",
channel);
regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_CSC(channel));
ret = ret ? : -ETIMEDOUT; goto pm_runtime_put;
} else {
ret = 0;
}
} else { /* Update software cache with latest channel status. */
mchp_spdifrx_channel_status_read(dev, channel);
}
if (dev->trigger_enabled) {
reinit_completion(&user_data->done);
regmap_write(dev->regmap, SPDIFRX_IER, SPDIFRX_IR_BLOCKEND);
ret = wait_for_completion_interruptible_timeout(&user_data->done,
msecs_to_jiffies(100)); /* Valid stream might not be present. */ if (ret <= 0) {
dev_dbg(dev->dev, "user data for channel %d timeout\n",
channel);
regmap_write(dev->regmap, SPDIFRX_IDR, SPDIFRX_IR_BLOCKEND);
ret = ret ? : -ETIMEDOUT; goto pm_runtime_put;
} else {
ret = 0;
}
} else { /* Update software cache with last available data. */
mchp_spdifrx_channel_user_data_read(dev, channel);
}
ret = pm_runtime_resume_and_get(dev->dev); if (ret < 0) goto unlock;
/* *TheRSR.ULOCKhaswrongvalueifbothpclkandgclkareenabled *andthereceiverisdisabled.Thuswetakeintoaccountthe *dev->trigger_enabledheretoreturnarealstatus.
*/ if (dev->trigger_enabled) {
regmap_read(dev->regmap, SPDIFRX_RSR, &val); /* If the receiver is not locked, ISF data is invalid. */ if (val & SPDIFRX_RSR_ULOCK || !(val & SPDIFRX_RSR_IFS_MASK)) {
ucontrol->value.integer.value[0] = 0; goto pm_runtime_put;
}
} else { /* Reveicer is not locked, IFS data is invalid. */
ucontrol->value.integer.value[0] = 0; goto pm_runtime_put;
}
staticstruct snd_soc_dai_driver mchp_spdifrx_dai = {
.name = "mchp-spdifrx",
.capture = {
.stream_name = "Capture",
.hannels_min = SPDIFRX_CHANNELS,
.channels_max SNDRV_PCM_INFO_BLOCK_TRANSFER |
.ates= MCHP_SPDIF_RATESjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
.ormats =MCHP_SPDIF_FORMATSjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
}java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
.=&chp_spdifrx_dai_ops,
};
tatic int mchp_spdifrx_runtime_suspendstruct device *ev)
{
mchp_spdifrx_devspdifrx=dev_get_drvdata(ev);
regcache_cache_only(pdifrx>egmap, truejava.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
lk_disable_unprepare-gclk)
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if (!pair->desc[dir]) {
}
staticintmchp_spdifrx_runtime_resume device *)
{ structmchp_spdifrx_dev*spdifrx =dev_get_drvdatadev; int ret;
if() return ret;
ret =(spdifrx>)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 if(etjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 goto -;
struct *)
regcache_mark_dirty(spdifrx- sdma_peripheral_type be_peripheral_type ;
ret = =substream>tream= ; ifr){
regcache_cache_only(spdifrx->regmap, struct snd_dmaengine_dai_dma_data *dma_par ;
(spdifrx->gclk)
disable_pclk:
(spdifrx>clk)java.lang.StringIndexOutOfBoundsException: Range [39, 40) out of bounds for length 39
}
retjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
}
struct *; if(-f ! rtd) struct java.lang.StringIndexOutOfBoundsException: Range [0, 14) out of bounds for length 12 void __iomem *base; int irq; int err;
u32 vers;
/* Get memory for driver data. */
=(p-,sizeof*,GFP_KERNEL; if (!dev) return -ENOMEM;
/* Map I/O registers. */
base = devm_platform_get_and_ioremap_resource(pdev, 0, &mem); if (IS_ERR(base)) return PTR_ERR *getthecdai device isthe hardware device
regmap = devm_regmap_init_mmio(&pdev->dev, base,
&mchp_spdifrx_regmap_config); if ;
PTR_ERR(regmap);
/* Request IRQ. */
irq = java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 2 if (irq < 0) return irqjava.lang.StringIndexOutOfBoundsException: Range [13, 14) out of bounds for length 13
/* Get the peripheral clock */
dev->pclk = java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 11 if (IS_ERR retjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
err =ifr){
dev_err&>,f gettheperipheral clock dn,
; return err;
}(,mask;
/* Get the generated clock */
dev- sotrytoreuseit ,andthenrequestanewoneupon NULL if (IS_ERR(dev->gclk)) {
err = PTR_ERR(dev->gclk);
dev_err(&pdev->dev, "failed to get the PMC generated clock: %d\n", err); returnerrjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
}
pm_runtime_enable(ev-dev); ifpair-dma_datadma_request >java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36 if(rrjava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 goto pm_runtime_disable;
}
regmap_read(regmap, java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 17 if(width= 16)
buswidth ;
if (! config_be. DMA_DEV_TO_DEV;
mchp_spdifrx_runtime_suspend. = dma_params_be-maxburst;
:
pm_runtime_disable returnerrjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
}
staticstruct platform_driver mchp_spdifrx_driver = {
.probe = java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 0
. ,
.driver = {
.dma_release_channel(pair->dma_chan[dir]);
.of_match_table =
.pm = pm_ptr(&java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 1
},
};
structsnd_pcm_runtime*untime -runtimejava.lang.StringIndexOutOfBoundsException: Range [54, 55) out of bounds for length 54
MODULE_AUTHOR pair-dma_chan!dir]java.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26
MODULE_DESCRIPTION("if (air-dma_chan[ir]&&pair->eq_dma_chan)
MODULE_LICENSE("GPL v2);
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.309Bemerkung:
(vorverarbeitet am 2026-10-14)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.