]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: sun4i-codec: Add DMA Max Burst field
authorMesih Kilinc <mesihkilinc@gmail.com>
Sat, 23 Nov 2024 12:38:58 +0000 (13:38 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 2 Dec 2024 13:26:59 +0000 (13:26 +0000)
Allwinner suniv F1C100s has similar DMA engine to sun4i but it has
smaller max burst size compared to sun4i. Add a quirk field to
differantitate between them.

Signed-off-by: Mesih Kilinc <mesihkilinc@gmail.com>
[ csokas.bence: Rebased on current master ]
Signed-off-by: Csókás Bence <csokas.bence@prolan.hu>
Link: https://patch.msgid.link/20241123123900.2656837-2-csokas.bence@prolan.hu
Link: https://github.com/mricon/b4/issues/50
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sunxi/sun4i-codec.c

index 933a0913237c8e3a621e717774f9d91740edee67..275f77f60830f0e6b863c5ec78e50612ef45ec19 100644 (file)
 
 /* TODO H3 DAP (Digital Audio Processing) bits */
 
+#define SUN4I_DMA_MAX_BURST                    (8)
+
 struct sun4i_codec {
        struct device   *dev;
        struct regmap   *regmap;
@@ -1761,6 +1763,7 @@ struct sun4i_codec_quirks {
        unsigned int reg_adc_rxdata;    /* RX FIFO offset for DMA config */
        bool has_reset;
        bool playback_only;
+       u32 dma_max_burst;
 };
 
 static const struct sun4i_codec_quirks sun4i_codec_quirks = {
@@ -1771,6 +1774,7 @@ static const struct sun4i_codec_quirks sun4i_codec_quirks = {
        .reg_dac_fifoc  = REG_FIELD(SUN4I_CODEC_DAC_FIFOC, 0, 31),
        .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
        .reg_adc_rxdata = SUN4I_CODEC_ADC_RXDATA,
+       .dma_max_burst  = SUN4I_DMA_MAX_BURST,
 };
 
 static const struct sun4i_codec_quirks sun6i_a31_codec_quirks = {
@@ -1782,6 +1786,7 @@ static const struct sun4i_codec_quirks sun6i_a31_codec_quirks = {
        .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
        .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA,
        .has_reset      = true,
+       .dma_max_burst  = SUN4I_DMA_MAX_BURST,
 };
 
 static const struct sun4i_codec_quirks sun7i_codec_quirks = {
@@ -1792,6 +1797,7 @@ static const struct sun4i_codec_quirks sun7i_codec_quirks = {
        .reg_dac_fifoc  = REG_FIELD(SUN4I_CODEC_DAC_FIFOC, 0, 31),
        .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
        .reg_adc_rxdata = SUN4I_CODEC_ADC_RXDATA,
+       .dma_max_burst  = SUN4I_DMA_MAX_BURST,
 };
 
 static const struct sun4i_codec_quirks sun8i_a23_codec_quirks = {
@@ -1803,6 +1809,7 @@ static const struct sun4i_codec_quirks sun8i_a23_codec_quirks = {
        .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
        .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA,
        .has_reset      = true,
+       .dma_max_burst  = SUN4I_DMA_MAX_BURST,
 };
 
 static const struct sun4i_codec_quirks sun8i_h3_codec_quirks = {
@@ -1819,6 +1826,7 @@ static const struct sun4i_codec_quirks sun8i_h3_codec_quirks = {
        .reg_dac_txdata = SUN8I_H3_CODEC_DAC_TXDATA,
        .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA,
        .has_reset      = true,
+       .dma_max_burst  = SUN4I_DMA_MAX_BURST,
 };
 
 static const struct sun4i_codec_quirks sun8i_v3s_codec_quirks = {
@@ -1834,6 +1842,7 @@ static const struct sun4i_codec_quirks sun8i_v3s_codec_quirks = {
        .reg_dac_txdata = SUN8I_H3_CODEC_DAC_TXDATA,
        .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA,
        .has_reset      = true,
+       .dma_max_burst  = SUN4I_DMA_MAX_BURST,
 };
 
 static const struct sun4i_codec_quirks sun50i_h616_codec_quirks = {
@@ -1843,6 +1852,7 @@ static const struct sun4i_codec_quirks sun50i_h616_codec_quirks = {
        .reg_dac_fifoc  = REG_FIELD(SUN50I_H616_CODEC_DAC_FIFOC, 0, 31),
        .reg_dac_txdata = SUN8I_H3_CODEC_DAC_TXDATA,
        .has_reset      = true,
+       .dma_max_burst  = SUN4I_DMA_MAX_BURST,
 };
 
 static const struct of_device_id sun4i_codec_of_match[] = {
@@ -1979,14 +1989,14 @@ static int sun4i_codec_probe(struct platform_device *pdev)
 
        /* DMA configuration for TX FIFO */
        scodec->playback_dma_data.addr = res->start + quirks->reg_dac_txdata;
-       scodec->playback_dma_data.maxburst = 8;
+       scodec->playback_dma_data.maxburst = quirks->dma_max_burst;
        scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
 
        if (!quirks->playback_only) {
                /* DMA configuration for RX FIFO */
                scodec->capture_dma_data.addr = res->start +
                                                quirks->reg_adc_rxdata;
-               scodec->capture_dma_data.maxburst = 8;
+               scodec->capture_dma_data.maxburst = quirks->dma_max_burst;
                scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
        }