mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
ASoC: Intel: avs: Code cleanups and separation
Merge series from Cezary Rojewski <cezary.rojewski@intel.com>: Set of patches that brings no new functionality but makes it easier to maintain and read the avs-driver code. There is one 'fix' among them - the third patch, described below. First, debug-related code - mainly the data-probing feature - is mixed with non-debug PCM code. Separate it into debug.h and update the pcm.c file. Next, as the probing-board is not tied to any topology file, it shall not using struct avs_soc_component descriptor but the basic struct snd_soc_component one. While on the first sight this is just bump in LOCs, runtime is simplified as no topology checks and related code will be engaged. With probing-board addressed and debug code relocated: - address the component-teardown issues when the componet->name points to a string which is shared by multiple components and/or machine boards. devm_kstrdup() makes this go away. - streamline the naming scheme for the functions engaged in the components registration. This is purely a readability improvement.
This commit is contained in:
commit
9963b1fde2
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
#include "path.h"
|
||||
#include "registers.h"
|
||||
|
|
|
|||
|
|
@ -348,91 +348,18 @@ struct avs_soc_component {
|
|||
|
||||
extern const struct snd_soc_dai_ops avs_dai_fe_ops;
|
||||
|
||||
int avs_soc_component_register(struct device *dev, const char *name,
|
||||
struct snd_soc_component_driver *drv,
|
||||
struct snd_soc_dai_driver *cpu_dais, int num_cpu_dais);
|
||||
int avs_dmic_platform_register(struct avs_dev *adev, const char *name);
|
||||
int avs_i2s_platform_register(struct avs_dev *adev, const char *name, unsigned long port_mask,
|
||||
unsigned long *tdms);
|
||||
int avs_hda_platform_register(struct avs_dev *adev, const char *name);
|
||||
int avs_register_dmic_component(struct avs_dev *adev, const char *name);
|
||||
int avs_register_i2s_component(struct avs_dev *adev, const char *name, unsigned long port_mask,
|
||||
unsigned long *tdms);
|
||||
int avs_register_hda_component(struct avs_dev *adev, const char *name);
|
||||
int avs_register_component(struct device *dev, const char *name,
|
||||
struct snd_soc_component_driver *drv,
|
||||
struct snd_soc_dai_driver *cpu_dais, int num_cpu_dais);
|
||||
|
||||
int avs_register_all_boards(struct avs_dev *adev);
|
||||
void avs_unregister_all_boards(struct avs_dev *adev);
|
||||
|
||||
/* Firmware tracing helpers */
|
||||
|
||||
#define avs_log_buffer_size(adev) \
|
||||
((adev)->fw_cfg.trace_log_bytes / (adev)->hw_cfg.dsp_cores)
|
||||
|
||||
#define avs_log_buffer_addr(adev, core) \
|
||||
({ \
|
||||
s32 __offset = avs_dsp_op(adev, log_buffer_offset, core); \
|
||||
(__offset < 0) ? NULL : \
|
||||
(avs_sram_addr(adev, AVS_DEBUG_WINDOW) + __offset); \
|
||||
})
|
||||
|
||||
static inline int avs_log_buffer_status_locked(struct avs_dev *adev, union avs_notify_msg *msg)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&adev->trace_lock, flags);
|
||||
ret = avs_dsp_op(adev, log_buffer_status, msg);
|
||||
spin_unlock_irqrestore(&adev->trace_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct avs_apl_log_buffer_layout {
|
||||
u32 read_ptr;
|
||||
u32 write_ptr;
|
||||
u8 buffer[];
|
||||
} __packed;
|
||||
static_assert(sizeof(struct avs_apl_log_buffer_layout) == 8);
|
||||
|
||||
#define avs_apl_log_payload_size(adev) \
|
||||
(avs_log_buffer_size(adev) - sizeof(struct avs_apl_log_buffer_layout))
|
||||
|
||||
#define avs_apl_log_payload_addr(addr) \
|
||||
(addr + sizeof(struct avs_apl_log_buffer_layout))
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
#define AVS_SET_ENABLE_LOGS_OP(name) \
|
||||
.enable_logs = avs_##name##_enable_logs
|
||||
|
||||
bool avs_logging_fw(struct avs_dev *adev);
|
||||
void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len);
|
||||
void avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src, unsigned int len);
|
||||
|
||||
int avs_probe_platform_register(struct avs_dev *adev, const char *name);
|
||||
|
||||
void avs_debugfs_init(struct avs_dev *adev);
|
||||
void avs_debugfs_exit(struct avs_dev *adev);
|
||||
#else
|
||||
#define AVS_SET_ENABLE_LOGS_OP(name)
|
||||
|
||||
static inline bool avs_logging_fw(struct avs_dev *adev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src, unsigned int len)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int avs_probe_platform_register(struct avs_dev *adev, const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void avs_debugfs_init(struct avs_dev *adev) { }
|
||||
static inline void avs_debugfs_exit(struct avs_dev *adev) { }
|
||||
#endif
|
||||
int avs_parse_sched_cfg(struct avs_dev *adev, const char *buf, size_t len);
|
||||
|
||||
/* Filesystems integration */
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@
|
|||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-component.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "pcm.h"
|
||||
#include "utils.h"
|
||||
|
||||
static char *i2s_test;
|
||||
|
|
@ -409,7 +411,7 @@ static int __maybe_unused avs_register_probe_board(struct avs_dev *adev)
|
|||
struct snd_soc_acpi_mach mach = {{0}};
|
||||
int ret;
|
||||
|
||||
ret = avs_probe_platform_register(adev, "probe-platform");
|
||||
ret = avs_register_probe_component(adev, "probe-platform");
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
@ -454,7 +456,7 @@ static int avs_register_dmic_board(struct avs_dev *adev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = avs_dmic_platform_register(adev, "dmic-platform");
|
||||
ret = avs_register_dmic_component(adev, "dmic-platform");
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
@ -515,7 +517,7 @@ static int avs_register_i2s_board(struct avs_dev *adev, struct snd_soc_acpi_mach
|
|||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = avs_i2s_platform_register(adev, name, mach->mach_params.i2s_link_mask, pdata->tdms);
|
||||
ret = avs_register_i2s_component(adev, name, mach->mach_params.i2s_link_mask, pdata->tdms);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
@ -654,7 +656,7 @@ static int avs_register_hda_board(struct avs_dev *adev, struct hda_codec *codec)
|
|||
pdata->obsolete_card_names = obsolete_card_names;
|
||||
pdata->codec = codec;
|
||||
|
||||
ret = avs_hda_platform_register(adev, pname);
|
||||
ret = avs_register_hda_component(adev, pname);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
#include "registers.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include "../../codecs/hda.h"
|
||||
#include "avs.h"
|
||||
#include "cldma.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
#include "pcm.h"
|
||||
|
||||
|
|
|
|||
91
sound/soc/intel/avs/debug.h
Normal file
91
sound/soc/intel/avs/debug.h
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright(c) 2024-2025 Intel Corporation
|
||||
*
|
||||
* Authors: Cezary Rojewski <cezary.rojewski@intel.com>
|
||||
* Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_SOC_INTEL_AVS_DEBUG_H
|
||||
#define __SOUND_SOC_INTEL_AVS_DEBUG_H
|
||||
|
||||
#include "messages.h"
|
||||
#include "registers.h"
|
||||
|
||||
struct avs_dev;
|
||||
|
||||
#define avs_log_buffer_size(adev) \
|
||||
((adev)->fw_cfg.trace_log_bytes / (adev)->hw_cfg.dsp_cores)
|
||||
|
||||
#define avs_log_buffer_addr(adev, core) \
|
||||
({ \
|
||||
s32 __offset = avs_dsp_op(adev, log_buffer_offset, core); \
|
||||
(__offset < 0) ? NULL : \
|
||||
(avs_sram_addr(adev, AVS_DEBUG_WINDOW) + __offset); \
|
||||
})
|
||||
|
||||
static inline int avs_log_buffer_status_locked(struct avs_dev *adev, union avs_notify_msg *msg)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&adev->trace_lock, flags);
|
||||
ret = avs_dsp_op(adev, log_buffer_status, msg);
|
||||
spin_unlock_irqrestore(&adev->trace_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct avs_apl_log_buffer_layout {
|
||||
u32 read_ptr;
|
||||
u32 write_ptr;
|
||||
u8 buffer[];
|
||||
} __packed;
|
||||
static_assert(sizeof(struct avs_apl_log_buffer_layout) == 8);
|
||||
|
||||
#define avs_apl_log_payload_size(adev) \
|
||||
(avs_log_buffer_size(adev) - sizeof(struct avs_apl_log_buffer_layout))
|
||||
|
||||
#define avs_apl_log_payload_addr(addr) \
|
||||
(addr + sizeof(struct avs_apl_log_buffer_layout))
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
int avs_register_probe_component(struct avs_dev *adev, const char *name);
|
||||
|
||||
#define AVS_SET_ENABLE_LOGS_OP(name) \
|
||||
.enable_logs = avs_##name##_enable_logs
|
||||
|
||||
bool avs_logging_fw(struct avs_dev *adev);
|
||||
void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len);
|
||||
void avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src, unsigned int len);
|
||||
|
||||
void avs_debugfs_init(struct avs_dev *adev);
|
||||
void avs_debugfs_exit(struct avs_dev *adev);
|
||||
|
||||
#else
|
||||
static inline int avs_register_probe_component(struct avs_dev *adev, const char *name)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
#define AVS_SET_ENABLE_LOGS_OP(name)
|
||||
|
||||
static inline bool avs_logging_fw(struct avs_dev *adev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void avs_dump_fw_log(struct avs_dev *adev, const void __iomem *src, unsigned int len)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void avs_dump_fw_log_wakeup(struct avs_dev *adev, const void __iomem *src,
|
||||
unsigned int len)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void avs_debugfs_init(struct avs_dev *adev) { }
|
||||
static inline void avs_debugfs_exit(struct avs_dev *adev) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/string_helpers.h>
|
||||
#include <sound/soc.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
|
||||
static unsigned int __kfifo_fromio(struct kfifo *fifo, const void __iomem *src, unsigned int len)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <sound/hdaudio.h>
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
|
||||
#define ICL_VS_LTRP_GB_ICCMAX 95
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
#include "registers.h"
|
||||
#include "trace.h"
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "registers.h"
|
||||
|
||||
int avs_lnl_core_stall(struct avs_dev *adev, u32 core_mask, bool stall)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "registers.h"
|
||||
#include "trace.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -1379,9 +1379,9 @@ static struct snd_soc_component_driver avs_component_driver = {
|
|||
.topology_name_prefix = "intel/avs",
|
||||
};
|
||||
|
||||
int avs_soc_component_register(struct device *dev, const char *name,
|
||||
struct snd_soc_component_driver *drv,
|
||||
struct snd_soc_dai_driver *cpu_dais, int num_cpu_dais)
|
||||
int avs_register_component(struct device *dev, const char *name,
|
||||
struct snd_soc_component_driver *drv,
|
||||
struct snd_soc_dai_driver *cpu_dais, int num_cpu_dais)
|
||||
{
|
||||
struct avs_soc_component *acomp;
|
||||
int ret;
|
||||
|
|
@ -1390,16 +1390,18 @@ int avs_soc_component_register(struct device *dev, const char *name,
|
|||
if (!acomp)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_component_initialize(&acomp->base, drv, dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
acomp->base.name = devm_kstrdup(dev, name, GFP_KERNEL);
|
||||
if (!acomp->base.name)
|
||||
return -ENOMEM;
|
||||
|
||||
/* force name change after ASoC is done with its init */
|
||||
acomp->base.name = name;
|
||||
INIT_LIST_HEAD(&acomp->node);
|
||||
|
||||
drv->use_dai_pcm_id = !obsolete_card_names;
|
||||
|
||||
ret = snd_soc_component_initialize(&acomp->base, drv, dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return snd_soc_add_component(&acomp->base, cpu_dais, num_cpu_dais);
|
||||
}
|
||||
|
||||
|
|
@ -1426,7 +1428,7 @@ static struct snd_soc_dai_driver dmic_cpu_dais[] = {
|
|||
},
|
||||
};
|
||||
|
||||
int avs_dmic_platform_register(struct avs_dev *adev, const char *name)
|
||||
int avs_register_dmic_component(struct avs_dev *adev, const char *name)
|
||||
{
|
||||
const struct snd_soc_dai_ops *ops;
|
||||
|
||||
|
|
@ -1437,8 +1439,8 @@ int avs_dmic_platform_register(struct avs_dev *adev, const char *name)
|
|||
|
||||
dmic_cpu_dais[0].ops = ops;
|
||||
dmic_cpu_dais[1].ops = ops;
|
||||
return avs_soc_component_register(adev->dev, name, &avs_component_driver, dmic_cpu_dais,
|
||||
ARRAY_SIZE(dmic_cpu_dais));
|
||||
return avs_register_component(adev->dev, name, &avs_component_driver, dmic_cpu_dais,
|
||||
ARRAY_SIZE(dmic_cpu_dais));
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_driver i2s_dai_template = {
|
||||
|
|
@ -1470,8 +1472,8 @@ static const struct snd_soc_dai_driver i2s_dai_template = {
|
|||
},
|
||||
};
|
||||
|
||||
int avs_i2s_platform_register(struct avs_dev *adev, const char *name, unsigned long port_mask,
|
||||
unsigned long *tdms)
|
||||
int avs_register_i2s_component(struct avs_dev *adev, const char *name, unsigned long port_mask,
|
||||
unsigned long *tdms)
|
||||
{
|
||||
struct snd_soc_dai_driver *cpus, *dai;
|
||||
const struct snd_soc_dai_ops *ops;
|
||||
|
|
@ -1537,7 +1539,7 @@ int avs_i2s_platform_register(struct avs_dev *adev, const char *name, unsigned l
|
|||
}
|
||||
|
||||
plat_register:
|
||||
return avs_soc_component_register(adev->dev, name, &avs_component_driver, cpus, cpu_count);
|
||||
return avs_register_component(adev->dev, name, &avs_component_driver, cpus, cpu_count);
|
||||
}
|
||||
|
||||
/* HD-Audio CPU DAI template */
|
||||
|
|
@ -1762,8 +1764,7 @@ static struct snd_soc_component_driver avs_hda_component_driver = {
|
|||
.topology_name_prefix = "intel/avs",
|
||||
};
|
||||
|
||||
int avs_hda_platform_register(struct avs_dev *adev, const char *name)
|
||||
int avs_register_hda_component(struct avs_dev *adev, const char *name)
|
||||
{
|
||||
return avs_soc_component_register(adev->dev, name,
|
||||
&avs_hda_component_driver, NULL, 0);
|
||||
return avs_register_component(adev->dev, name, &avs_hda_component_driver, NULL, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <sound/hdaudio.h>
|
||||
#include <sound/soc.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
|
||||
static int avs_dsp_init_probe(struct avs_dev *adev, union avs_connector_node_id node_id,
|
||||
|
|
@ -284,14 +285,28 @@ static struct snd_soc_dai_driver probe_cpu_dais[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_component_driver avs_probe_component_driver = {
|
||||
static const struct snd_soc_component_driver avs_probe_component_driver = {
|
||||
.name = "avs-probe-compr",
|
||||
.compress_ops = &avs_probe_compress_ops,
|
||||
.module_get_upon_open = 1, /* increment refcount when a stream is opened */
|
||||
};
|
||||
|
||||
int avs_probe_platform_register(struct avs_dev *adev, const char *name)
|
||||
int avs_register_probe_component(struct avs_dev *adev, const char *name)
|
||||
{
|
||||
return avs_soc_component_register(adev->dev, name, &avs_probe_component_driver,
|
||||
probe_cpu_dais, ARRAY_SIZE(probe_cpu_dais));
|
||||
struct snd_soc_component *component;
|
||||
int ret;
|
||||
|
||||
component = devm_kzalloc(adev->dev, sizeof(*component), GFP_KERNEL);
|
||||
if (!component)
|
||||
return -ENOMEM;
|
||||
|
||||
component->name = devm_kstrdup(adev->dev, name, GFP_KERNEL);
|
||||
if (!component->name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snd_soc_component_initialize(component, &avs_probe_component_driver, adev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return snd_soc_add_component(component, probe_cpu_dais, ARRAY_SIZE(probe_cpu_dais));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "registers.h"
|
||||
#include "trace.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <sound/hdaudio_ext.h>
|
||||
#include "avs.h"
|
||||
#include "cldma.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
#include "registers.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <linux/pci.h>
|
||||
#include "avs.h"
|
||||
#include "debug.h"
|
||||
#include "messages.h"
|
||||
|
||||
#define CPUID_TSC_LEAF 0x15
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user