mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
ASoC: Merge up fixes
There is some overlap with the cs4271 driver.
This commit is contained in:
commit
47d98d432f
|
|
@ -105,10 +105,10 @@ In this example the SSID is 10280c63.
|
|||
|
||||
The format of the firmware file names is:
|
||||
|
||||
SoundWire (except CS35L56 Rev B0):
|
||||
SoundWire:
|
||||
cs35lxx-b0-dsp1-misc-SSID[-spkidX]-l?u?
|
||||
|
||||
SoundWire CS35L56 Rev B0:
|
||||
SoundWire CS35L56 Rev B0 firmware released before kernel version 6.16:
|
||||
cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN
|
||||
|
||||
Non-SoundWire (HDA and I2S):
|
||||
|
|
@ -127,9 +127,8 @@ Where:
|
|||
* spkidX is an optional part, used for laptops that have firmware
|
||||
configurations for different makes and models of internal speakers.
|
||||
|
||||
The CS35L56 Rev B0 continues to use the old filename scheme because a
|
||||
large number of firmware files have already been published with these
|
||||
names.
|
||||
Early firmware for CS35L56 Rev B0 used the ALSA prefix (ampN) as the
|
||||
filename qualifier. Support for the l?u? qualifier was added in kernel 6.16.
|
||||
|
||||
Sound Open Firmware and ALSA topology files
|
||||
-------------------------------------------
|
||||
|
|
|
|||
|
|
@ -603,6 +603,7 @@ static int cs4271_component_probe(struct snd_soc_component *component)
|
|||
CS4271_MODE2_PDN | CS4271_MODE2_CPEN);
|
||||
if (ret < 0)
|
||||
goto err_disable_clk;
|
||||
|
||||
ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2,
|
||||
CS4271_MODE2_PDN, 0);
|
||||
if (ret < 0)
|
||||
|
|
|
|||
|
|
@ -2124,11 +2124,50 @@ static int da7213_probe(struct snd_soc_component *component)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int da7213_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct da7213_priv *da7213 = dev_get_drvdata(dev);
|
||||
|
||||
regcache_cache_only(da7213->regmap, true);
|
||||
regcache_mark_dirty(da7213->regmap);
|
||||
regulator_bulk_disable(DA7213_NUM_SUPPLIES, da7213->supplies);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int da7213_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct da7213_priv *da7213 = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = regulator_bulk_enable(DA7213_NUM_SUPPLIES, da7213->supplies);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
regcache_cache_only(da7213->regmap, false);
|
||||
return regcache_sync(da7213->regmap);
|
||||
}
|
||||
|
||||
static int da7213_suspend(struct snd_soc_component *component)
|
||||
{
|
||||
struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
return da7213_runtime_suspend(da7213->dev);
|
||||
}
|
||||
|
||||
static int da7213_resume(struct snd_soc_component *component)
|
||||
{
|
||||
struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
return da7213_runtime_resume(da7213->dev);
|
||||
}
|
||||
|
||||
static const struct snd_soc_component_driver soc_component_dev_da7213 = {
|
||||
.probe = da7213_probe,
|
||||
.set_bias_level = da7213_set_bias_level,
|
||||
.controls = da7213_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(da7213_snd_controls),
|
||||
.suspend = da7213_suspend,
|
||||
.resume = da7213_resume,
|
||||
.dapm_widgets = da7213_dapm_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(da7213_dapm_widgets),
|
||||
.dapm_routes = da7213_audio_map,
|
||||
|
|
@ -2175,6 +2214,8 @@ static int da7213_i2c_probe(struct i2c_client *i2c)
|
|||
if (!da7213->fin_min_rate)
|
||||
return -EINVAL;
|
||||
|
||||
da7213->dev = &i2c->dev;
|
||||
|
||||
i2c_set_clientdata(i2c, da7213);
|
||||
|
||||
/* Get required supplies */
|
||||
|
|
@ -2224,31 +2265,9 @@ static void da7213_i2c_remove(struct i2c_client *i2c)
|
|||
pm_runtime_disable(&i2c->dev);
|
||||
}
|
||||
|
||||
static int da7213_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct da7213_priv *da7213 = dev_get_drvdata(dev);
|
||||
|
||||
regcache_cache_only(da7213->regmap, true);
|
||||
regcache_mark_dirty(da7213->regmap);
|
||||
regulator_bulk_disable(DA7213_NUM_SUPPLIES, da7213->supplies);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int da7213_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct da7213_priv *da7213 = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = regulator_bulk_enable(DA7213_NUM_SUPPLIES, da7213->supplies);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
regcache_cache_only(da7213->regmap, false);
|
||||
return regcache_sync(da7213->regmap);
|
||||
}
|
||||
|
||||
static DEFINE_RUNTIME_DEV_PM_OPS(da7213_pm, da7213_runtime_suspend,
|
||||
da7213_runtime_resume, NULL);
|
||||
static const struct dev_pm_ops da7213_pm = {
|
||||
RUNTIME_PM_OPS(da7213_runtime_suspend, da7213_runtime_resume, NULL)
|
||||
};
|
||||
|
||||
static const struct i2c_device_id da7213_i2c_id[] = {
|
||||
{ "da7213" },
|
||||
|
|
|
|||
|
|
@ -595,6 +595,7 @@ enum da7213_supplies {
|
|||
/* Codec private data */
|
||||
struct da7213_priv {
|
||||
struct regmap *regmap;
|
||||
struct device *dev;
|
||||
struct mutex ctrl_lock;
|
||||
struct regulator_bulk_data supplies[DA7213_NUM_SUPPLIES];
|
||||
struct clk *mclk;
|
||||
|
|
|
|||
|
|
@ -761,10 +761,17 @@ static void tas2783_fw_ready(const struct firmware *fmw, void *context)
|
|||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&tas_dev->pde_lock);
|
||||
img_sz = fmw->size;
|
||||
buf = fmw->data;
|
||||
offset += FW_DL_OFFSET;
|
||||
if (offset >= (img_sz - FW_FL_HDR)) {
|
||||
dev_err(tas_dev->dev,
|
||||
"firmware is too small");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&tas_dev->pde_lock);
|
||||
while (offset < (img_sz - FW_FL_HDR)) {
|
||||
memset(&hdr, 0, sizeof(hdr));
|
||||
offset += read_header(&buf[offset], &hdr);
|
||||
|
|
@ -775,6 +782,14 @@ static void tas2783_fw_ready(const struct firmware *fmw, void *context)
|
|||
/* size also includes the header */
|
||||
file_blk_size = hdr.length - FW_FL_HDR;
|
||||
|
||||
/* make sure that enough data is there */
|
||||
if (offset + file_blk_size > img_sz) {
|
||||
ret = -EINVAL;
|
||||
dev_err(tas_dev->dev,
|
||||
"corrupt firmware file");
|
||||
break;
|
||||
}
|
||||
|
||||
switch (hdr.file_id) {
|
||||
case 0:
|
||||
ret = sdw_nwrite_no_pm(tas_dev->sdw_peripheral,
|
||||
|
|
@ -807,7 +822,8 @@ static void tas2783_fw_ready(const struct firmware *fmw, void *context)
|
|||
break;
|
||||
}
|
||||
mutex_unlock(&tas_dev->pde_lock);
|
||||
tas2783_update_calibdata(tas_dev);
|
||||
if (!ret)
|
||||
tas2783_update_calibdata(tas_dev);
|
||||
|
||||
out:
|
||||
if (!ret)
|
||||
|
|
|
|||
|
|
@ -1335,7 +1335,7 @@ static int is_sdca_endpoint_present(struct device *dev,
|
|||
struct sdw_slave *slave;
|
||||
struct device *sdw_dev;
|
||||
const char *sdw_codec_name;
|
||||
int i;
|
||||
int ret, i;
|
||||
|
||||
dlc = kzalloc(sizeof(*dlc), GFP_KERNEL);
|
||||
if (!dlc)
|
||||
|
|
@ -1365,13 +1365,16 @@ static int is_sdca_endpoint_present(struct device *dev,
|
|||
}
|
||||
|
||||
slave = dev_to_sdw_dev(sdw_dev);
|
||||
if (!slave)
|
||||
return -EINVAL;
|
||||
if (!slave) {
|
||||
ret = -EINVAL;
|
||||
goto put_device;
|
||||
}
|
||||
|
||||
/* Make sure BIOS provides SDCA properties */
|
||||
if (!slave->sdca_data.interface_revision) {
|
||||
dev_warn(&slave->dev, "SDCA properties not found in the BIOS\n");
|
||||
return 1;
|
||||
ret = 1;
|
||||
goto put_device;
|
||||
}
|
||||
|
||||
for (i = 0; i < slave->sdca_data.num_functions; i++) {
|
||||
|
|
@ -1380,7 +1383,8 @@ static int is_sdca_endpoint_present(struct device *dev,
|
|||
if (dai_type == dai_info->dai_type) {
|
||||
dev_dbg(&slave->dev, "DAI type %d sdca function %s found\n",
|
||||
dai_type, slave->sdca_data.function[i].name);
|
||||
return 1;
|
||||
ret = 1;
|
||||
goto put_device;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1388,7 +1392,11 @@ static int is_sdca_endpoint_present(struct device *dev,
|
|||
"SDCA device function for DAI type %d not supported, skip endpoint\n",
|
||||
dai_info->dai_type);
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
|
||||
put_device:
|
||||
put_device(sdw_dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user