mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 04:56:13 +02:00
ASoC: microchip: some cleanups for AT91 sound drivers
Merge series from Claudiu Beznea <claudiu.beznea@microchip.com>: This series does some cleanups for Microchip AT91 sound drivers. Along with it I took the chance and updated MAINTAINERS file.
This commit is contained in:
commit
faabfd5cfa
|
|
@ -13618,9 +13618,13 @@ F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
|
|||
F: drivers/spi/spi-at91-usart.c
|
||||
|
||||
MICROCHIP AUDIO ASOC DRIVERS
|
||||
M: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
|
||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/sound/atmel*
|
||||
F: Documentation/devicetree/bindings/sound/axentia,tse850-pcm5142.txt
|
||||
F: Documentation/devicetree/bindings/sound/microchip,sama7g5-*
|
||||
F: Documentation/devicetree/bindings/sound/mikroe,mikroe-proto.txt
|
||||
F: sound/soc/atmel
|
||||
|
||||
MICROCHIP CSI2DC DRIVER
|
||||
|
|
@ -13793,9 +13797,10 @@ S: Supported
|
|||
F: drivers/spi/spi-atmel.*
|
||||
|
||||
MICROCHIP SSC DRIVER
|
||||
M: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
|
||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/misc/atmel-ssc.txt
|
||||
F: drivers/misc/atmel-ssc.c
|
||||
F: include/linux/atmel-ssc.h
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <dt-bindings/sound/microchip,pdmc.h>
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
|
|
@ -49,8 +50,6 @@
|
|||
#define MCHP_PDMC_MR_OSR256 (3 << 16)
|
||||
|
||||
#define MCHP_PDMC_MR_SINCORDER_MASK GENMASK(23, 20)
|
||||
#define MCHP_PDMC_MR_SINCORDER(order) (((order) << 20) & \
|
||||
MCHP_PDMC_MR_SINCORDER_MASK)
|
||||
|
||||
#define MCHP_PDMC_MR_SINC_OSR_MASK GENMASK(27, 24)
|
||||
#define MCHP_PDMC_MR_SINC_OSR_DIS (0 << 24)
|
||||
|
|
@ -62,8 +61,6 @@
|
|||
#define MCHP_PDMC_MR_SINC_OSR_256 (6 << 24)
|
||||
|
||||
#define MCHP_PDMC_MR_CHUNK_MASK GENMASK(31, 28)
|
||||
#define MCHP_PDMC_MR_CHUNK(chunk) (((chunk) << 28) & \
|
||||
MCHP_PDMC_MR_CHUNK_MASK)
|
||||
|
||||
/*
|
||||
* ---- Configuration Register (Read/Write) ----
|
||||
|
|
@ -617,10 +614,10 @@ static int mchp_pdmc_hw_params(struct snd_pcm_substream *substream,
|
|||
|
||||
mr_val |= mchp_pdmc_mr_set_osr(dd->audio_filter_en, osr);
|
||||
|
||||
mr_val |= MCHP_PDMC_MR_SINCORDER(dd->sinc_order);
|
||||
mr_val |= FIELD_PREP(MCHP_PDMC_MR_SINCORDER_MASK, dd->sinc_order);
|
||||
|
||||
dd->addr.maxburst = mchp_pdmc_period_to_maxburst(snd_pcm_lib_period_bytes(substream));
|
||||
mr_val |= MCHP_PDMC_MR_CHUNK(dd->addr.maxburst);
|
||||
mr_val |= FIELD_PREP(MCHP_PDMC_MR_CHUNK_MASK, dd->addr.maxburst);
|
||||
dev_dbg(comp->dev, "maxburst set to %d\n", dd->addr.maxburst);
|
||||
|
||||
snd_soc_component_update_bits(comp, MCHP_PDMC_MR,
|
||||
|
|
@ -762,12 +759,10 @@ static int mchp_pdmc_pcm_new(struct snd_soc_pcm_runtime *rtd,
|
|||
int ret;
|
||||
|
||||
ret = mchp_pdmc_add_chmap_ctls(rtd->pcm, dd);
|
||||
if (ret < 0) {
|
||||
if (ret < 0)
|
||||
dev_err(dd->dev, "failed to add channel map controls: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct snd_soc_dai_driver mchp_pdmc_dai = {
|
||||
|
|
@ -788,7 +783,7 @@ static struct snd_soc_dai_driver mchp_pdmc_dai = {
|
|||
/* PDMC interrupt handler */
|
||||
static irqreturn_t mchp_pdmc_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct mchp_pdmc *dd = (struct mchp_pdmc *)dev_id;
|
||||
struct mchp_pdmc *dd = dev_id;
|
||||
u32 isr, msr, pending;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
|
|
@ -1082,7 +1077,7 @@ static int mchp_pdmc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
ret = devm_request_irq(dev, irq, mchp_pdmc_interrupt, 0,
|
||||
dev_name(&pdev->dev), (void *)dd);
|
||||
dev_name(&pdev->dev), dd);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n",
|
||||
irq, ret);
|
||||
|
|
|
|||
|
|
@ -72,11 +72,9 @@
|
|||
|
||||
/* Valid Bits per Sample */
|
||||
#define SPDIFTX_MR_VBPS_MASK GENMASK(13, 8)
|
||||
#define SPDIFTX_MR_VBPS(bps) FIELD_PREP(SPDIFTX_MR_VBPS_MASK, bps)
|
||||
|
||||
/* Chunk Size */
|
||||
#define SPDIFTX_MR_CHUNK_MASK GENMASK(19, 16)
|
||||
#define SPDIFTX_MR_CHUNK(size) FIELD_PREP(SPDIFTX_MR_CHUNK_MASK, size)
|
||||
|
||||
/* Validity Bits for Channels 1 and 2 */
|
||||
#define SPDIFTX_MR_VALID1 BIT(24)
|
||||
|
|
@ -89,7 +87,6 @@
|
|||
|
||||
/* Bytes per Sample */
|
||||
#define SPDIFTX_MR_BPS_MASK GENMASK(29, 28)
|
||||
#define SPDIFTX_MR_BPS(bytes) FIELD_PREP(SPDIFTX_MR_BPS_MASK, (bytes - 1))
|
||||
|
||||
/*
|
||||
* ---- Interrupt Enable/Disable/Mask/Status Register (Write/Read-only) ----
|
||||
|
|
@ -309,15 +306,10 @@ static int mchp_spdiftx_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
{
|
||||
struct mchp_spdiftx_dev *dev = snd_soc_dai_get_drvdata(dai);
|
||||
struct mchp_spdiftx_mixer_control *ctrl = &dev->control;
|
||||
u32 mr;
|
||||
int running;
|
||||
int ret;
|
||||
|
||||
/* do not start/stop while channel status or user data is updated */
|
||||
spin_lock(&ctrl->lock);
|
||||
regmap_read(dev->regmap, SPDIFTX_MR, &mr);
|
||||
running = !!(mr & SPDIFTX_MR_TXEN_ENABLE);
|
||||
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
|
|
@ -326,10 +318,8 @@ static int mchp_spdiftx_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
dev->suspend_irq = 0;
|
||||
fallthrough;
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
if (!running) {
|
||||
mr &= ~SPDIFTX_MR_TXEN_MASK;
|
||||
mr |= SPDIFTX_MR_TXEN_ENABLE;
|
||||
}
|
||||
ret = regmap_update_bits(dev->regmap, SPDIFTX_MR, SPDIFTX_MR_TXEN_MASK,
|
||||
SPDIFTX_MR_TXEN_ENABLE);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
regmap_read(dev->regmap, SPDIFTX_IMR, &dev->suspend_irq);
|
||||
|
|
@ -339,20 +329,15 @@ static int mchp_spdiftx_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
SPDIFTX_IR_TXUDR | SPDIFTX_IR_TXOVR);
|
||||
fallthrough;
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
if (running) {
|
||||
mr &= ~SPDIFTX_MR_TXEN_MASK;
|
||||
mr |= SPDIFTX_MR_TXEN_DISABLE;
|
||||
}
|
||||
ret = regmap_update_bits(dev->regmap, SPDIFTX_MR, SPDIFTX_MR_TXEN_MASK,
|
||||
SPDIFTX_MR_TXEN_DISABLE);
|
||||
break;
|
||||
default:
|
||||
spin_unlock(&ctrl->lock);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
ret = regmap_write(dev->regmap, SPDIFTX_MR, mr);
|
||||
spin_unlock(&ctrl->lock);
|
||||
if (ret)
|
||||
dev_err(dev->dev, "unable to disable TX: %d\n", ret);
|
||||
dev_err(dev->dev, "unable to start/stop TX: %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -402,47 +387,47 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream,
|
|||
params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
mr |= SPDIFTX_MR_CHUNK(dev->playback.maxburst);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_CHUNK_MASK, dev->playback.maxburst);
|
||||
|
||||
switch (params_format(params)) {
|
||||
case SNDRV_PCM_FORMAT_S8:
|
||||
mr |= SPDIFTX_MR_VBPS(8);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 8);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S16_BE:
|
||||
mr |= SPDIFTX_MR_ENDIAN_BIG;
|
||||
fallthrough;
|
||||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
mr |= SPDIFTX_MR_VBPS(16);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 16);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S18_3BE:
|
||||
mr |= SPDIFTX_MR_ENDIAN_BIG;
|
||||
fallthrough;
|
||||
case SNDRV_PCM_FORMAT_S18_3LE:
|
||||
mr |= SPDIFTX_MR_VBPS(18);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 18);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S20_3BE:
|
||||
mr |= SPDIFTX_MR_ENDIAN_BIG;
|
||||
fallthrough;
|
||||
case SNDRV_PCM_FORMAT_S20_3LE:
|
||||
mr |= SPDIFTX_MR_VBPS(20);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 20);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S24_3BE:
|
||||
mr |= SPDIFTX_MR_ENDIAN_BIG;
|
||||
fallthrough;
|
||||
case SNDRV_PCM_FORMAT_S24_3LE:
|
||||
mr |= SPDIFTX_MR_VBPS(24);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 24);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S24_BE:
|
||||
mr |= SPDIFTX_MR_ENDIAN_BIG;
|
||||
fallthrough;
|
||||
case SNDRV_PCM_FORMAT_S24_LE:
|
||||
mr |= SPDIFTX_MR_VBPS(24);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 24);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S32_BE:
|
||||
mr |= SPDIFTX_MR_ENDIAN_BIG;
|
||||
fallthrough;
|
||||
case SNDRV_PCM_FORMAT_S32_LE:
|
||||
mr |= SPDIFTX_MR_VBPS(32);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 32);
|
||||
break;
|
||||
default:
|
||||
dev_err(dev->dev, "unsupported PCM format: %d\n",
|
||||
|
|
@ -450,7 +435,7 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
mr |= SPDIFTX_MR_BPS(bps);
|
||||
mr |= FIELD_PREP(SPDIFTX_MR_BPS_MASK, bps - 1);
|
||||
|
||||
switch (params_rate(params)) {
|
||||
case 22050:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user