Skip to content

Commit

Permalink
ASoC: cs43130: handle errors in cs43130_probe() properly
Browse files Browse the repository at this point in the history
[ Upstream commit 2da441a ]

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.

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 <broonie@kernel.org>
Link: https://lore.kernel.org/r/20210503115736.2104747-58-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
gregkh committed Jun 3, 2021
1 parent e8e8f73 commit 48f71fa
Showing 1 changed file with 14 additions and 14 deletions.
28 changes: 14 additions & 14 deletions sound/soc/codecs/cs43130.c
Expand Up @@ -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},
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit 48f71fa

Please sign in to comment.