Merge tag 'asoc-v5.3' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-2.6-microblaze.git] / sound / hda / hdac_device.c
index 6907dbe..b26cc93 100644 (file)
@@ -90,7 +90,7 @@ int snd_hdac_device_init(struct hdac_device *codec, struct hdac_bus *bus,
 
        fg = codec->afg ? codec->afg : codec->mfg;
 
-       err = snd_hdac_refresh_widgets(codec, false);
+       err = snd_hdac_refresh_widgets(codec);
        if (err < 0)
                goto error;
 
@@ -395,32 +395,35 @@ static void setup_fg_nodes(struct hdac_device *codec)
 /**
  * snd_hdac_refresh_widgets - Reset the widget start/end nodes
  * @codec: the codec object
- * @sysfs: re-initialize sysfs tree, too
  */
-int snd_hdac_refresh_widgets(struct hdac_device *codec, bool sysfs)
+int snd_hdac_refresh_widgets(struct hdac_device *codec)
 {
        hda_nid_t start_nid;
-       int nums, err;
+       int nums, err = 0;
 
+       /*
+        * Serialize against multiple threads trying to update the sysfs
+        * widgets array.
+        */
+       mutex_lock(&codec->widget_lock);
        nums = snd_hdac_get_sub_nodes(codec, codec->afg, &start_nid);
        if (!start_nid || nums <= 0 || nums >= 0xff) {
                dev_err(&codec->dev, "cannot read sub nodes for FG 0x%02x\n",
                        codec->afg);
-               return -EINVAL;
+               err = -EINVAL;
+               goto unlock;
        }
 
-       if (sysfs) {
-               mutex_lock(&codec->widget_lock);
-               err = hda_widget_sysfs_reinit(codec, start_nid, nums);
-               mutex_unlock(&codec->widget_lock);
-               if (err < 0)
-                       return err;
-       }
+       err = hda_widget_sysfs_reinit(codec, start_nid, nums);
+       if (err < 0)
+               goto unlock;
 
        codec->num_nodes = nums;
        codec->start_nid = start_nid;
        codec->end_nid = start_nid + nums;
-       return 0;
+unlock:
+       mutex_unlock(&codec->widget_lock);
+       return err;
 }
 EXPORT_SYMBOL_GPL(snd_hdac_refresh_widgets);