| From 463c3476e925751693342b29f37df3c5b209e132 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 8 May 2024 11:03:47 +0100 |
| Subject: ALSA: hda: hda_component: Initialize shared data during bind callback |
| |
| From: Richard Fitzgerald <rf@opensource.cirrus.com> |
| |
| [ Upstream commit ec6f32bc924d1c00cbcd5672510758f7088f2513 ] |
| |
| Move the initialization of the shared struct hda_component array into |
| hda_component_manager_bind(). |
| |
| The purpose of the manager bind() callback is to allow it to perform |
| initialization before binding in the component drivers. This is the |
| correct place to initialize the shared data. |
| |
| The original implementation initialized the shared data in |
| hda_component_manager_init(). This is only done once during probe() |
| of the manager driver. So if the component binding was unbound and |
| then rebound, the shared data would not be re-initialized. |
| |
| Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> |
| Fixes: fd895a74dc1d ("ALSA: hda: realtek: Move hda_component implementation to module") |
| Link: https://lore.kernel.org/r/20240508100347.47283-1-rf@opensource.cirrus.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/pci/hda/hda_component.c | 16 +++++++++++++++- |
| sound/pci/hda/hda_component.h | 7 ++----- |
| sound/pci/hda/patch_realtek.c | 2 +- |
| 3 files changed, 18 insertions(+), 7 deletions(-) |
| |
| diff --git a/sound/pci/hda/hda_component.c b/sound/pci/hda/hda_component.c |
| index cd299d7d84baf..d02589014a3fa 100644 |
| --- a/sound/pci/hda/hda_component.c |
| +++ b/sound/pci/hda/hda_component.c |
| @@ -123,6 +123,21 @@ static int hda_comp_match_dev_name(struct device *dev, void *data) |
| return !strcmp(d + n, tmp); |
| } |
| |
| +int hda_component_manager_bind(struct hda_codec *cdc, |
| + struct hda_component *comps, int count) |
| +{ |
| + int i; |
| + |
| + /* Init shared data */ |
| + for (i = 0; i < count; ++i) { |
| + memset(&comps[i], 0, sizeof(comps[i])); |
| + comps[i].codec = cdc; |
| + } |
| + |
| + return component_bind_all(hda_codec_dev(cdc), comps); |
| +} |
| +EXPORT_SYMBOL_NS_GPL(hda_component_manager_bind, SND_HDA_SCODEC_COMPONENT); |
| + |
| int hda_component_manager_init(struct hda_codec *cdc, |
| struct hda_component *comps, int count, |
| const char *bus, const char *hid, |
| @@ -143,7 +158,6 @@ int hda_component_manager_init(struct hda_codec *cdc, |
| sm->hid = hid; |
| sm->match_str = match_str; |
| sm->index = i; |
| - comps[i].codec = cdc; |
| component_match_add(dev, &match, hda_comp_match_dev_name, sm); |
| } |
| |
| diff --git a/sound/pci/hda/hda_component.h b/sound/pci/hda/hda_component.h |
| index c80a66691b5d8..c70b3de68ab20 100644 |
| --- a/sound/pci/hda/hda_component.h |
| +++ b/sound/pci/hda/hda_component.h |
| @@ -75,11 +75,8 @@ int hda_component_manager_init(struct hda_codec *cdc, |
| void hda_component_manager_free(struct hda_codec *cdc, |
| const struct component_master_ops *ops); |
| |
| -static inline int hda_component_manager_bind(struct hda_codec *cdc, |
| - struct hda_component *comps) |
| -{ |
| - return component_bind_all(hda_codec_dev(cdc), comps); |
| -} |
| +int hda_component_manager_bind(struct hda_codec *cdc, |
| + struct hda_component *comps, int count); |
| |
| static inline void hda_component_manager_unbind(struct hda_codec *cdc, |
| struct hda_component *comps) |
| diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
| index 3b8b4ab488a61..08598a4f1fa3f 100644 |
| --- a/sound/pci/hda/patch_realtek.c |
| +++ b/sound/pci/hda/patch_realtek.c |
| @@ -6793,7 +6793,7 @@ static int comp_bind(struct device *dev) |
| struct alc_spec *spec = cdc->spec; |
| int ret; |
| |
| - ret = hda_component_manager_bind(cdc, spec->comps); |
| + ret = hda_component_manager_bind(cdc, spec->comps, ARRAY_SIZE(spec->comps)); |
| if (ret) |
| return ret; |
| |
| -- |
| 2.43.0 |
| |