Commit b89b889a authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge branch 'topic/hda-refresh-cleanup' into for-next



Merge a cleanup for HD-audio widget refresh code

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parents d4bd3053 774a075a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ void snd_hdac_device_unregister(struct hdac_device *codec);
int snd_hdac_device_set_chip_name(struct hdac_device *codec, const char *name);
int snd_hdac_codec_modalias(struct hdac_device *hdac, char *buf, size_t size);

int snd_hdac_refresh_widgets(struct hdac_device *codec, bool sysfs);
int snd_hdac_refresh_widgets(struct hdac_device *codec);

unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid,
			       unsigned int verb, unsigned int parm);
+16 −13
Original line number Diff line number Diff line
@@ -89,7 +89,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;

@@ -394,32 +394,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;
	}
		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);

+1 −1
Original line number Diff line number Diff line
@@ -428,7 +428,7 @@ int hda_widget_sysfs_reinit(struct hdac_device *codec,
	int i;

	if (!codec->widgets)
		return hda_widget_sysfs_init(codec);
		return 0;

	tree = kmemdup(codec->widgets, sizeof(*tree), GFP_KERNEL);
	if (!tree)
+1 −1
Original line number Diff line number Diff line
@@ -1016,7 +1016,7 @@ int snd_hda_codec_update_widgets(struct hda_codec *codec)
	hda_nid_t fg;
	int err;

	err = snd_hdac_refresh_widgets(&codec->core, true);
	err = snd_hdac_refresh_widgets(&codec->core);
	if (err < 0)
		return err;

+1 −1
Original line number Diff line number Diff line
@@ -2043,7 +2043,7 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
			"Failed in parse and map nid with err: %d\n", ret);
		return ret;
	}
	snd_hdac_refresh_widgets(hdev, true);
	snd_hdac_refresh_widgets(hdev);

	/* ASoC specific initialization */
	ret = devm_snd_soc_register_component(&hdev->dev, &hdmi_hda_codec,
Loading