On Mon, May 24, 2021 at 10:45:49AM -0400, Sasha Levin wrote: > From: Greg Kroah-Hartman > > [ Upstream commit 2da441a6491d93eff8ffff523837fd621dc80389 ] > > cs43130_probe() does not do any valid error checking of things it > initializes, OR what it does, it does not unwind properly if there are > errors. I don't have this commit and can't see any sign of it having been submitted upstream. Where is it being backported from? The last commit I can see in -next to this driver is d2912cb15bdda8ba4a5dd73396ad62641af2f520 (treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500) from 2019. > > Fix this up by moving the sysfs files to an attribute group so the > driver core will correctly add/remove them all at once and handle errors > with them, and correctly check for creating a new workqueue and > unwinding if that fails. > > Cc: Mark Brown > Link: https://lore.kernel.org/r/20210503115736.2104747-58-gregkh@linuxfoundation.org > Signed-off-by: Greg Kroah-Hartman > Signed-off-by: Sasha Levin > --- > sound/soc/codecs/cs43130.c | 28 ++++++++++++++-------------- > 1 file changed, 14 insertions(+), 14 deletions(-) > > diff --git a/sound/soc/codecs/cs43130.c b/sound/soc/codecs/cs43130.c > index c2b6f0ae6d57..80cd3ea0c157 100644 > --- a/sound/soc/codecs/cs43130.c > +++ b/sound/soc/codecs/cs43130.c > @@ -1735,6 +1735,14 @@ static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL); > static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL); > static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL); > > +static struct attribute *hpload_attrs[] = { > + &dev_attr_hpload_dc_l.attr, > + &dev_attr_hpload_dc_r.attr, > + &dev_attr_hpload_ac_l.attr, > + &dev_attr_hpload_ac_r.attr, > +}; > +ATTRIBUTE_GROUPS(hpload); > + > static struct reg_sequence hp_en_cal_seq[] = { > {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL}, > {CS43130_HP_MEAS_LOAD_1, 0}, > @@ -2302,23 +2310,15 @@ static int cs43130_probe(struct snd_soc_component *component) > > cs43130->hpload_done = false; > if (cs43130->dc_meas) { > - ret = device_create_file(component->dev, &dev_attr_hpload_dc_l); > - if (ret < 0) > - return ret; > - > - ret = device_create_file(component->dev, &dev_attr_hpload_dc_r); > - if (ret < 0) > - return ret; > - > - ret = device_create_file(component->dev, &dev_attr_hpload_ac_l); > - if (ret < 0) > - return ret; > - > - ret = device_create_file(component->dev, &dev_attr_hpload_ac_r); > - if (ret < 0) > + ret = sysfs_create_groups(&component->dev->kobj, hpload_groups); > + if (ret) > return ret; > > cs43130->wq = create_singlethread_workqueue("cs43130_hp"); > + if (!cs43130->wq) { > + sysfs_remove_groups(&component->dev->kobj, hpload_groups); > + return -ENOMEM; > + } > INIT_WORK(&cs43130->work, cs43130_imp_meas); > } > > -- > 2.30.2 >