ASoC: bolero: Synchronize bolero register macro function

Bolero_register_macro can be called simultaneously by different
macros as bootup resulting in inconsistent value of
num_macros_registered. This will result in one of macro going ahead and
registering bolero component and other macro failing to register which
will cause probe of other macro to fail. Protect function with mutex lock
so that macros access it sequentially.

Change-Id: Idd0110d8b0bcfdcbf9f03c293c4cdba82e0a8827
Signed-off-by: Vatsal Bucha <vbucha@codeaurora.org>
This commit is contained in:
Vatsal Bucha 2021-07-06 12:22:43 +05:30
parent e73ea1c01a
commit 1da5c56c8b
2 changed files with 9 additions and 2 deletions

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
*/
#include <linux/of_platform.h>
@ -702,6 +702,7 @@ int bolero_register_macro(struct device *dev, u16 macro_id,
priv->macro_params[macro_id].reg_wake_irq =
ops->reg_wake_irq;
}
mutex_lock(&priv->macro_lock);
priv->num_dais += ops->num_dais;
priv->num_macros_registered++;
priv->macros_supported[macro_id] = true;
@ -712,6 +713,7 @@ int bolero_register_macro(struct device *dev, u16 macro_id,
ret = bolero_copy_dais_from_macro(priv);
if (ret < 0) {
dev_err(dev, "%s: copy_dais failed\n", __func__);
mutex_unlock(&priv->macro_lock);
return ret;
}
if (priv->macros_supported[TX_MACRO] == false) {
@ -724,9 +726,11 @@ int bolero_register_macro(struct device *dev, u16 macro_id,
priv->bolero_dais, priv->num_dais);
if (ret < 0) {
dev_err(dev, "%s: register codec failed\n", __func__);
mutex_unlock(&priv->macro_lock);
return ret;
}
}
mutex_unlock(&priv->macro_lock);
return 0;
}
EXPORT_SYMBOL(bolero_register_macro);
@ -1395,6 +1399,7 @@ static int bolero_probe(struct platform_device *pdev)
priv->core_audio_vote_count = 0;
dev_set_drvdata(&pdev->dev, priv);
mutex_init(&priv->macro_lock);
mutex_init(&priv->io_lock);
mutex_init(&priv->clk_lock);
mutex_init(&priv->vote_lock);
@ -1435,6 +1440,7 @@ static int bolero_remove(struct platform_device *pdev)
return -EINVAL;
of_platform_depopulate(&pdev->dev);
mutex_destroy(&priv->macro_lock);
mutex_destroy(&priv->io_lock);
mutex_destroy(&priv->clk_lock);
mutex_destroy(&priv->vote_lock);

View File

@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
*/
#ifndef _BOLERO_INTERNAL_H
@ -28,6 +28,7 @@ struct bolero_priv {
struct device *dev;
struct snd_soc_component *component;
struct regmap *regmap;
struct mutex macro_lock;
struct mutex io_lock;
struct mutex clk_lock;
struct mutex vote_lock;