mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 02:44:41 +01:00
Add a function cs_amp_devm_get_vendor_specific_variant_id() to return a vendor-specific hardware identifier string (if there is one) and use it to fetch an identifier from Dell SSIDExV2 UEFI variable content. Dell use the same PCI SSID on multiple products that might have different audio hardware and thus need different firmware for the amplifier DSP. The SSIDExV2 string contains additional system identifiers, and the second field is a 2-character audio hardware identifier. There are older Dell models with Cirrus Logic amplifiers that have the SSIDExV2 UEFI variable but do not have the 2-character audio ID in the second field. The SSIDExV2 is ignored if the second field is not 2 characters. Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Link: https://patch.msgid.link/20260121132243.1256019-2-rf@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
93 lines
2.8 KiB
C
93 lines
2.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2024 Cirrus Logic, Inc. and
|
|
* Cirrus Logic International Semiconductor Ltd.
|
|
*/
|
|
|
|
#ifndef CS_AMP_LIB_H
|
|
#define CS_AMP_LIB_H
|
|
|
|
#include <linux/efi.h>
|
|
#include <linux/types.h>
|
|
|
|
struct cs_dsp;
|
|
|
|
struct cirrus_amp_cal_data {
|
|
u32 calTarget[2];
|
|
u32 calTime[2];
|
|
s8 calAmbient;
|
|
u8 calStatus;
|
|
u16 calR;
|
|
} __packed;
|
|
|
|
struct cirrus_amp_efi_data {
|
|
u32 size;
|
|
u32 count;
|
|
struct cirrus_amp_cal_data data[] __counted_by(count);
|
|
} __packed;
|
|
|
|
/**
|
|
* struct cirrus_amp_cal_controls - definition of firmware calibration controls
|
|
* @alg_id: ID of algorithm containing the controls.
|
|
* @mem_region: DSP memory region containing the controls.
|
|
* @ambient: Name of control for calAmbient value.
|
|
* @calr: Name of control for calR value.
|
|
* @status: Name of control for calStatus value.
|
|
* @checksum: Name of control for checksum value.
|
|
*/
|
|
struct cirrus_amp_cal_controls {
|
|
unsigned int alg_id;
|
|
int mem_region;
|
|
const char *ambient;
|
|
const char *calr;
|
|
const char *status;
|
|
const char *checksum;
|
|
};
|
|
|
|
int cs_amp_write_cal_coeffs(struct cs_dsp *dsp,
|
|
const struct cirrus_amp_cal_controls *controls,
|
|
const struct cirrus_amp_cal_data *data);
|
|
int cs_amp_read_cal_coeffs(struct cs_dsp *dsp,
|
|
const struct cirrus_amp_cal_controls *controls,
|
|
struct cirrus_amp_cal_data *data);
|
|
int cs_amp_write_ambient_temp(struct cs_dsp *dsp,
|
|
const struct cirrus_amp_cal_controls *controls,
|
|
u32 temp);
|
|
int cs_amp_get_efi_calibration_data(struct device *dev, u64 target_uid, int amp_index,
|
|
struct cirrus_amp_cal_data *out_data);
|
|
int cs_amp_set_efi_calibration_data(struct device *dev, int amp_index, int num_amps,
|
|
const struct cirrus_amp_cal_data *in_data);
|
|
int cs_amp_get_vendor_spkid(struct device *dev);
|
|
const char *cs_amp_devm_get_vendor_specific_variant_id(struct device *dev,
|
|
int ssid_vendor,
|
|
int ssid_device);
|
|
struct dentry *cs_amp_create_debugfs(struct device *dev);
|
|
|
|
static inline u64 cs_amp_cal_target_u64(const struct cirrus_amp_cal_data *data)
|
|
{
|
|
return ((u64)data->calTarget[1] << 32) | data->calTarget[0];
|
|
}
|
|
|
|
struct cs_amp_test_hooks {
|
|
efi_status_t (*get_efi_variable)(efi_char16_t *name,
|
|
efi_guid_t *guid,
|
|
u32 *returned_attr,
|
|
unsigned long *size,
|
|
void *buf);
|
|
efi_status_t (*set_efi_variable)(efi_char16_t *name,
|
|
efi_guid_t *guid,
|
|
u32 attr,
|
|
unsigned long size,
|
|
void *buf);
|
|
|
|
int (*write_cal_coeff)(struct cs_dsp *dsp,
|
|
const struct cirrus_amp_cal_controls *controls,
|
|
const char *ctl_name, u32 val);
|
|
|
|
int (*read_cal_coeff)(struct cs_dsp *dsp,
|
|
const struct cirrus_amp_cal_controls *controls,
|
|
const char *ctl_name, u32 *val);
|
|
};
|
|
extern const struct cs_amp_test_hooks * const cs_amp_test_hooks;
|
|
|
|
#endif /* CS_AMP_LIB_H */
|