Commit faabfd5c authored by Mark Brown's avatar Mark Brown

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.
parents 0fde3187 15dbfc04
...@@ -13618,9 +13618,13 @@ F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml ...@@ -13618,9 +13618,13 @@ F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
F: drivers/spi/spi-at91-usart.c F: drivers/spi/spi-at91-usart.c
MICROCHIP AUDIO ASOC DRIVERS 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) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Supported 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 F: sound/soc/atmel
MICROCHIP CSI2DC DRIVER MICROCHIP CSI2DC DRIVER
...@@ -13793,9 +13797,10 @@ S: Supported ...@@ -13793,9 +13797,10 @@ S: Supported
F: drivers/spi/spi-atmel.* F: drivers/spi/spi-atmel.*
MICROCHIP SSC DRIVER 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) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Supported S: Supported
F: Documentation/devicetree/bindings/misc/atmel-ssc.txt
F: drivers/misc/atmel-ssc.c F: drivers/misc/atmel-ssc.c
F: include/linux/atmel-ssc.h F: include/linux/atmel-ssc.h
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <dt-bindings/sound/microchip,pdmc.h> #include <dt-bindings/sound/microchip,pdmc.h>
#include <linux/bitfield.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -49,8 +50,6 @@ ...@@ -49,8 +50,6 @@
#define MCHP_PDMC_MR_OSR256 (3 << 16) #define MCHP_PDMC_MR_OSR256 (3 << 16)
#define MCHP_PDMC_MR_SINCORDER_MASK GENMASK(23, 20) #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_MASK GENMASK(27, 24)
#define MCHP_PDMC_MR_SINC_OSR_DIS (0 << 24) #define MCHP_PDMC_MR_SINC_OSR_DIS (0 << 24)
...@@ -62,8 +61,6 @@ ...@@ -62,8 +61,6 @@
#define MCHP_PDMC_MR_SINC_OSR_256 (6 << 24) #define MCHP_PDMC_MR_SINC_OSR_256 (6 << 24)
#define MCHP_PDMC_MR_CHUNK_MASK GENMASK(31, 28) #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) ---- * ---- Configuration Register (Read/Write) ----
...@@ -617,10 +614,10 @@ static int mchp_pdmc_hw_params(struct snd_pcm_substream *substream, ...@@ -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_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)); 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); dev_dbg(comp->dev, "maxburst set to %d\n", dd->addr.maxburst);
snd_soc_component_update_bits(comp, MCHP_PDMC_MR, 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, ...@@ -762,12 +759,10 @@ static int mchp_pdmc_pcm_new(struct snd_soc_pcm_runtime *rtd,
int ret; int ret;
ret = mchp_pdmc_add_chmap_ctls(rtd->pcm, dd); 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); 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 = { static struct snd_soc_dai_driver mchp_pdmc_dai = {
...@@ -788,7 +783,7 @@ 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 */ /* PDMC interrupt handler */
static irqreturn_t mchp_pdmc_interrupt(int irq, void *dev_id) 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; u32 isr, msr, pending;
irqreturn_t ret = IRQ_NONE; irqreturn_t ret = IRQ_NONE;
...@@ -1082,7 +1077,7 @@ static int mchp_pdmc_probe(struct platform_device *pdev) ...@@ -1082,7 +1077,7 @@ static int mchp_pdmc_probe(struct platform_device *pdev)
} }
ret = devm_request_irq(dev, irq, mchp_pdmc_interrupt, 0, ret = devm_request_irq(dev, irq, mchp_pdmc_interrupt, 0,
dev_name(&pdev->dev), (void *)dd); dev_name(&pdev->dev), dd);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n", dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n",
irq, ret); irq, ret);
......
...@@ -72,11 +72,9 @@ ...@@ -72,11 +72,9 @@
/* Valid Bits per Sample */ /* Valid Bits per Sample */
#define SPDIFTX_MR_VBPS_MASK GENMASK(13, 8) #define SPDIFTX_MR_VBPS_MASK GENMASK(13, 8)
#define SPDIFTX_MR_VBPS(bps) FIELD_PREP(SPDIFTX_MR_VBPS_MASK, bps)
/* Chunk Size */ /* Chunk Size */
#define SPDIFTX_MR_CHUNK_MASK GENMASK(19, 16) #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 */ /* Validity Bits for Channels 1 and 2 */
#define SPDIFTX_MR_VALID1 BIT(24) #define SPDIFTX_MR_VALID1 BIT(24)
...@@ -89,7 +87,6 @@ ...@@ -89,7 +87,6 @@
/* Bytes per Sample */ /* Bytes per Sample */
#define SPDIFTX_MR_BPS_MASK GENMASK(29, 28) #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) ---- * ---- 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, ...@@ -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_dev *dev = snd_soc_dai_get_drvdata(dai);
struct mchp_spdiftx_mixer_control *ctrl = &dev->control; struct mchp_spdiftx_mixer_control *ctrl = &dev->control;
u32 mr;
int running;
int ret; int ret;
/* do not start/stop while channel status or user data is updated */ /* do not start/stop while channel status or user data is updated */
spin_lock(&ctrl->lock); spin_lock(&ctrl->lock);
regmap_read(dev->regmap, SPDIFTX_MR, &mr);
running = !!(mr & SPDIFTX_MR_TXEN_ENABLE);
switch (cmd) { switch (cmd) {
case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_START:
...@@ -326,10 +318,8 @@ static int mchp_spdiftx_trigger(struct snd_pcm_substream *substream, int cmd, ...@@ -326,10 +318,8 @@ static int mchp_spdiftx_trigger(struct snd_pcm_substream *substream, int cmd,
dev->suspend_irq = 0; dev->suspend_irq = 0;
fallthrough; fallthrough;
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
if (!running) { ret = regmap_update_bits(dev->regmap, SPDIFTX_MR, SPDIFTX_MR_TXEN_MASK,
mr &= ~SPDIFTX_MR_TXEN_MASK; SPDIFTX_MR_TXEN_ENABLE);
mr |= SPDIFTX_MR_TXEN_ENABLE;
}
break; break;
case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_SUSPEND:
regmap_read(dev->regmap, SPDIFTX_IMR, &dev->suspend_irq); 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, ...@@ -339,20 +329,15 @@ static int mchp_spdiftx_trigger(struct snd_pcm_substream *substream, int cmd,
SPDIFTX_IR_TXUDR | SPDIFTX_IR_TXOVR); SPDIFTX_IR_TXUDR | SPDIFTX_IR_TXOVR);
fallthrough; fallthrough;
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
if (running) { ret = regmap_update_bits(dev->regmap, SPDIFTX_MR, SPDIFTX_MR_TXEN_MASK,
mr &= ~SPDIFTX_MR_TXEN_MASK; SPDIFTX_MR_TXEN_DISABLE);
mr |= SPDIFTX_MR_TXEN_DISABLE;
}
break; break;
default: default:
spin_unlock(&ctrl->lock); ret = -EINVAL;
return -EINVAL;
} }
ret = regmap_write(dev->regmap, SPDIFTX_MR, mr);
spin_unlock(&ctrl->lock); spin_unlock(&ctrl->lock);
if (ret) 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; return ret;
} }
...@@ -402,47 +387,47 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream, ...@@ -402,47 +387,47 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream,
params_channels(params)); params_channels(params));
return -EINVAL; return -EINVAL;
} }
mr |= SPDIFTX_MR_CHUNK(dev->playback.maxburst); mr |= FIELD_PREP(SPDIFTX_MR_CHUNK_MASK, dev->playback.maxburst);
switch (params_format(params)) { switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S8: case SNDRV_PCM_FORMAT_S8:
mr |= SPDIFTX_MR_VBPS(8); mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 8);
break; break;
case SNDRV_PCM_FORMAT_S16_BE: case SNDRV_PCM_FORMAT_S16_BE:
mr |= SPDIFTX_MR_ENDIAN_BIG; mr |= SPDIFTX_MR_ENDIAN_BIG;
fallthrough; fallthrough;
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
mr |= SPDIFTX_MR_VBPS(16); mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 16);
break; break;
case SNDRV_PCM_FORMAT_S18_3BE: case SNDRV_PCM_FORMAT_S18_3BE:
mr |= SPDIFTX_MR_ENDIAN_BIG; mr |= SPDIFTX_MR_ENDIAN_BIG;
fallthrough; fallthrough;
case SNDRV_PCM_FORMAT_S18_3LE: case SNDRV_PCM_FORMAT_S18_3LE:
mr |= SPDIFTX_MR_VBPS(18); mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 18);
break; break;
case SNDRV_PCM_FORMAT_S20_3BE: case SNDRV_PCM_FORMAT_S20_3BE:
mr |= SPDIFTX_MR_ENDIAN_BIG; mr |= SPDIFTX_MR_ENDIAN_BIG;
fallthrough; fallthrough;
case SNDRV_PCM_FORMAT_S20_3LE: case SNDRV_PCM_FORMAT_S20_3LE:
mr |= SPDIFTX_MR_VBPS(20); mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 20);
break; break;
case SNDRV_PCM_FORMAT_S24_3BE: case SNDRV_PCM_FORMAT_S24_3BE:
mr |= SPDIFTX_MR_ENDIAN_BIG; mr |= SPDIFTX_MR_ENDIAN_BIG;
fallthrough; fallthrough;
case SNDRV_PCM_FORMAT_S24_3LE: case SNDRV_PCM_FORMAT_S24_3LE:
mr |= SPDIFTX_MR_VBPS(24); mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 24);
break; break;
case SNDRV_PCM_FORMAT_S24_BE: case SNDRV_PCM_FORMAT_S24_BE:
mr |= SPDIFTX_MR_ENDIAN_BIG; mr |= SPDIFTX_MR_ENDIAN_BIG;
fallthrough; fallthrough;
case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_LE:
mr |= SPDIFTX_MR_VBPS(24); mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 24);
break; break;
case SNDRV_PCM_FORMAT_S32_BE: case SNDRV_PCM_FORMAT_S32_BE:
mr |= SPDIFTX_MR_ENDIAN_BIG; mr |= SPDIFTX_MR_ENDIAN_BIG;
fallthrough; fallthrough;
case SNDRV_PCM_FORMAT_S32_LE: case SNDRV_PCM_FORMAT_S32_LE:
mr |= SPDIFTX_MR_VBPS(32); mr |= FIELD_PREP(SPDIFTX_MR_VBPS_MASK, 32);
break; break;
default: default:
dev_err(dev->dev, "unsupported PCM format: %d\n", dev_err(dev->dev, "unsupported PCM format: %d\n",
...@@ -450,7 +435,7 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream, ...@@ -450,7 +435,7 @@ static int mchp_spdiftx_hw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
} }
mr |= SPDIFTX_MR_BPS(bps); mr |= FIELD_PREP(SPDIFTX_MR_BPS_MASK, bps - 1);
switch (params_rate(params)) { switch (params_rate(params)) {
case 22050: case 22050:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment