ASoC: ux500: Deassert the MSP reset during probe

The devicetree has described each MSP reset line since the PRCC reset
controller was added, but the driver never acquires or deasserts it. The
block can consequently remain inaccessible when firmware has left it in
reset.

Acquire the reset exclusively and keep it deasserted for the lifetime of
the bound device.

Fixes: 95f0404832 ("ARM: dts: ux500: Add reset lines to IP blocks")
Assisted-by: LLM
Signed-off-by: Linus Walleij <linusw@kernel.org>
Link: https://patch.msgid.link/20260902-ux500-msp-fixes-v2-5-4b60b002d55a@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Linus Walleij 2026-09-02 09:55:55 +02:00 committed by Mark Brown
parent 9ccbacf5a0
commit 66ec63e7a9
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -14,6 +14,7 @@
#include <linux/clk.h>
#include <linux/of.h>
#include <linux/regulator/consumer.h>
#include <linux/reset.h>
#include <linux/mfd/db8500-prcmu.h>
#include <sound/soc.h>
@ -686,6 +687,7 @@ static const struct snd_soc_component_driver ux500_msp_component = {
static int ux500_msp_drv_probe(struct platform_device *pdev)
{
struct ux500_msp_i2s_drvdata *drvdata;
struct reset_control *reset;
int ret = 0;
drvdata = devm_kzalloc(&pdev->dev,
@ -733,6 +735,11 @@ static int ux500_msp_drv_probe(struct platform_device *pdev)
return -EINVAL;
}
reset = devm_reset_control_get_exclusive_deasserted(&pdev->dev, NULL);
if (IS_ERR(reset))
return dev_err_probe(&pdev->dev, PTR_ERR(reset),
"Failed to deassert MSP reset\n");
ret = ux500_msp_i2s_init_msp(pdev, &drvdata->msp);
if (ret) {
dev_err(&pdev->dev,