ASoC: cs43130: handle errors in cs43130_probe() properly
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>
This commit is contained in:
parent
fdda0dd268
commit
2da441a649
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user