mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
ASoC: mediatek: use reserved memory or enable buffer pre-allocation
In commit32c9c06adb
("ASoC: mediatek: disable buffer pre-allocation") buffer pre-allocation was disabled to accommodate newer platforms that have a limited reserved memory region for the audio frontend. Turns out disabling pre-allocation across the board impacts platforms that don't have this reserved memory region. Buffer allocation failures have been observed on MT8173 and MT8183 based Chromebooks under low memory conditions, which results in no audio playback for the user. Since some MediaTek platforms already have dedicated reserved memory pools for the audio frontend, the plan is to enable this for all of them. This requires device tree changes. As a fallback, reinstate the original policy of pre-allocating audio buffers at probe time of the reserved memory pool cannot be found or used. This patch covers the MT8173, MT8183, MT8186 and MT8192 platforms for now, the reason being that existing MediaTek platform drivers that supported reserved memory were all platforms that mainly supported ChromeOS, and is also the set of devices that I can verify. Fixes:32c9c06adb
("ASoC: mediatek: disable buffer pre-allocation") Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Chen-Yu Tsai <wenst@chromium.org> Link: https://patch.msgid.link/20250612074901.4023253-7-wenst@chromium.org Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
cd12d3a5ed
commit
ec4a10ca4a
|
@ -120,7 +120,9 @@ int mtk_afe_pcm_new(struct snd_soc_component *component,
|
|||
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
|
||||
|
||||
size = afe->mtk_afe_hardware->buffer_bytes_max;
|
||||
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, afe->dev, 0, size);
|
||||
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, afe->dev,
|
||||
afe->preallocate_buffers ? size : 0,
|
||||
size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -117,6 +117,7 @@ struct mtk_base_afe {
|
|||
struct mtk_base_afe_irq *irqs;
|
||||
int irqs_size;
|
||||
int memif_32bit_supported;
|
||||
bool preallocate_buffers;
|
||||
|
||||
struct list_head sub_dais;
|
||||
struct snd_soc_dai_driver *dai_drivers;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <sound/soc.h>
|
||||
|
@ -1070,6 +1071,12 @@ static int mt8173_afe_pcm_dev_probe(struct platform_device *pdev)
|
|||
|
||||
afe->dev = &pdev->dev;
|
||||
|
||||
ret = of_reserved_mem_device_init(&pdev->dev);
|
||||
if (ret) {
|
||||
dev_info(&pdev->dev, "no reserved memory found, pre-allocating buffers instead\n");
|
||||
afe->preallocate_buffers = true;
|
||||
}
|
||||
|
||||
irq_id = platform_get_irq(pdev, 0);
|
||||
if (irq_id <= 0)
|
||||
return irq_id < 0 ? irq_id : -ENXIO;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
|
@ -777,6 +778,12 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|||
afe->dev = &pdev->dev;
|
||||
dev = afe->dev;
|
||||
|
||||
ret = of_reserved_mem_device_init(dev);
|
||||
if (ret) {
|
||||
dev_info(dev, "no reserved memory found, pre-allocating buffers instead\n");
|
||||
afe->preallocate_buffers = true;
|
||||
}
|
||||
|
||||
/* initial audio related clock */
|
||||
ret = mt8183_init_clock(afe);
|
||||
if (ret) {
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/reset.h>
|
||||
#include <sound/soc.h>
|
||||
|
@ -2835,6 +2836,12 @@ static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev)
|
|||
afe_priv = afe->platform_priv;
|
||||
afe->dev = &pdev->dev;
|
||||
|
||||
ret = of_reserved_mem_device_init(dev);
|
||||
if (ret) {
|
||||
dev_info(dev, "no reserved memory found, pre-allocating buffers instead\n");
|
||||
afe->preallocate_buffers = true;
|
||||
}
|
||||
|
||||
afe->base_addr = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(afe->base_addr))
|
||||
return PTR_ERR(afe->base_addr);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/reset.h>
|
||||
#include <sound/soc.h>
|
||||
|
@ -2179,6 +2180,12 @@ static int mt8192_afe_pcm_dev_probe(struct platform_device *pdev)
|
|||
|
||||
afe->dev = dev;
|
||||
|
||||
ret = of_reserved_mem_device_init(dev);
|
||||
if (ret) {
|
||||
dev_info(dev, "no reserved memory found, pre-allocating buffers instead\n");
|
||||
afe->preallocate_buffers = true;
|
||||
}
|
||||
|
||||
/* init audio related clock */
|
||||
ret = mt8192_init_clock(afe);
|
||||
if (ret) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user