From 1da5c56c8bedc7a7a68ce36bb2a6588e70df1b17 Mon Sep 17 00:00:00 2001 From: Vatsal Bucha Date: Tue, 6 Jul 2021 12:22:43 +0530 Subject: [PATCH] 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 --- asoc/codecs/bolero/bolero-cdc.c | 8 +++++++- asoc/codecs/bolero/internal.h | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index df5360a4d28d..47fb838af176 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -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 @@ -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); diff --git a/asoc/codecs/bolero/internal.h b/asoc/codecs/bolero/internal.h index 69e7dd458e2f..bd25ec2b6f4c 100644 --- a/asoc/codecs/bolero/internal.h +++ b/asoc/codecs/bolero/internal.h @@ -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;