mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 15:39:42 -04:00
ALSA: hda/tas2781: Fix device-0 reset issue and handle -EXDEV in block data processing
Fix reset for device-0: In older projects (e.g., Merino), the hardware reset pin for the first SPI device (device-0) is ineffective, causing initialization failures. Added a software reset sequence for device-0 to ensure proper initialization. Handle -EXDEV correctly: When processing block data, if the data does not belong to the current SPI device, the driver returned -EXDEV. This error code is now ignored to allow the driver to continue iterating through the block data and correctly calculate the total block size. Signed-off-by: Baojun Xu <baojun.xu@ti.com> Link: https://patch.msgid.link/20260609105253.19510-1-baojun.xu@ti.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -190,15 +190,15 @@ static void tas2781_spi_reset(struct tasdevice_priv *tas_dev)
|
||||
gpiod_set_value_cansleep(tas_dev->reset, 0);
|
||||
fsleep(800);
|
||||
gpiod_set_value_cansleep(tas_dev->reset, 1);
|
||||
} else {
|
||||
ret = tasdevice_dev_write(tas_dev, tas_dev->index,
|
||||
TASDEVICE_REG_SWRESET, TASDEVICE_REG_SWRESET_RESET);
|
||||
if (ret < 0) {
|
||||
dev_err(tas_dev->dev, "dev sw-reset fail, %d\n", ret);
|
||||
return;
|
||||
}
|
||||
fsleep(1000);
|
||||
}
|
||||
|
||||
ret = tasdevice_dev_write(tas_dev, tas_dev->index,
|
||||
TASDEVICE_REG_SWRESET, TASDEVICE_REG_SWRESET_RESET);
|
||||
if (ret < 0) {
|
||||
dev_err(tas_dev->dev, "dev sw-reset fail, %d\n", ret);
|
||||
return;
|
||||
}
|
||||
fsleep(1000);
|
||||
}
|
||||
|
||||
static int tascodec_spi_init(struct tasdevice_priv *tas_priv,
|
||||
|
||||
@@ -921,7 +921,8 @@ static int tasdevice_process_block(void *context, unsigned char *data,
|
||||
data[subblk_offset + 1],
|
||||
data[subblk_offset + 2]),
|
||||
data[subblk_offset + 3]);
|
||||
if (rc < 0) {
|
||||
if (rc < 0 &&
|
||||
!(tas_priv->isspi && rc == -EXDEV)) {
|
||||
is_err = true;
|
||||
dev_err(tas_priv->dev,
|
||||
"process_block: single write error\n");
|
||||
@@ -953,7 +954,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
|
||||
data[subblk_offset + 1],
|
||||
data[subblk_offset + 2]),
|
||||
&(data[subblk_offset + 4]), len);
|
||||
if (rc < 0) {
|
||||
if (rc < 0 && !(tas_priv->isspi && rc == -EXDEV)) {
|
||||
is_err = true;
|
||||
dev_err(tas_priv->dev,
|
||||
"%s: bulk_write error = %d\n",
|
||||
@@ -991,7 +992,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
|
||||
data[subblk_offset + 4]),
|
||||
data[subblk_offset + 1],
|
||||
data[subblk_offset + 5]);
|
||||
if (rc < 0) {
|
||||
if (rc < 0 && !(tas_priv->isspi && rc == -EXDEV)) {
|
||||
is_err = true;
|
||||
dev_err(tas_priv->dev,
|
||||
"%s: update_bits error = %d\n",
|
||||
|
||||
Reference in New Issue
Block a user