Commit b2997387 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Greg Kroah-Hartman

misc/st_kim: Free resources in the error path of probe()

Signed-off-by: default avatarMatthias Kaehlcke <matthias@kaehlcke.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2cf4e52e
...@@ -705,9 +705,9 @@ static const struct file_operations list_debugfs_fops = { ...@@ -705,9 +705,9 @@ static const struct file_operations list_debugfs_fops = {
static struct dentry *kim_debugfs_dir; static struct dentry *kim_debugfs_dir;
static int kim_probe(struct platform_device *pdev) static int kim_probe(struct platform_device *pdev)
{ {
long status;
struct kim_data_s *kim_gdata; struct kim_data_s *kim_gdata;
struct ti_st_plat_data *pdata = pdev->dev.platform_data; struct ti_st_plat_data *pdata = pdev->dev.platform_data;
int err;
if ((pdev->id != -1) && (pdev->id < MAX_ST_DEVICES)) { if ((pdev->id != -1) && (pdev->id < MAX_ST_DEVICES)) {
/* multiple devices could exist */ /* multiple devices could exist */
...@@ -724,10 +724,11 @@ static int kim_probe(struct platform_device *pdev) ...@@ -724,10 +724,11 @@ static int kim_probe(struct platform_device *pdev)
} }
dev_set_drvdata(&pdev->dev, kim_gdata); dev_set_drvdata(&pdev->dev, kim_gdata);
status = st_core_init(&kim_gdata->core_data); err = st_core_init(&kim_gdata->core_data);
if (status != 0) { if (err != 0) {
pr_err(" ST core init failed"); pr_err(" ST core init failed");
return -EIO; err = -EIO;
goto err_core_init;
} }
/* refer to itself */ /* refer to itself */
kim_gdata->core_data->kim_data = kim_gdata; kim_gdata->core_data->kim_data = kim_gdata;
...@@ -738,10 +739,10 @@ static int kim_probe(struct platform_device *pdev) ...@@ -738,10 +739,10 @@ static int kim_probe(struct platform_device *pdev)
init_completion(&kim_gdata->kim_rcvd); init_completion(&kim_gdata->kim_rcvd);
init_completion(&kim_gdata->ldisc_installed); init_completion(&kim_gdata->ldisc_installed);
status = sysfs_create_group(&pdev->dev.kobj, &uim_attr_grp); err = sysfs_create_group(&pdev->dev.kobj, &uim_attr_grp);
if (status) { if (err) {
pr_err("failed to create sysfs entries"); pr_err("failed to create sysfs entries");
return status; goto err_sysfs_group;
} }
/* copying platform data */ /* copying platform data */
...@@ -753,8 +754,8 @@ static int kim_probe(struct platform_device *pdev) ...@@ -753,8 +754,8 @@ static int kim_probe(struct platform_device *pdev)
kim_debugfs_dir = debugfs_create_dir("ti-st", NULL); kim_debugfs_dir = debugfs_create_dir("ti-st", NULL);
if (IS_ERR(kim_debugfs_dir)) { if (IS_ERR(kim_debugfs_dir)) {
pr_err(" debugfs entries creation failed "); pr_err(" debugfs entries creation failed ");
kim_debugfs_dir = NULL; err = -EIO;
return -EIO; goto err_debugfs_dir;
} }
debugfs_create_file("version", S_IRUGO, kim_debugfs_dir, debugfs_create_file("version", S_IRUGO, kim_debugfs_dir,
...@@ -763,6 +764,17 @@ static int kim_probe(struct platform_device *pdev) ...@@ -763,6 +764,17 @@ static int kim_probe(struct platform_device *pdev)
kim_gdata, &list_debugfs_fops); kim_gdata, &list_debugfs_fops);
pr_info(" debugfs entries created "); pr_info(" debugfs entries created ");
return 0; return 0;
err_debugfs_dir:
sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp);
err_sysfs_group:
st_core_exit(kim_gdata->core_data);
err_core_init:
kfree(kim_gdata);
return err;
} }
static int kim_remove(struct platform_device *pdev) static int kim_remove(struct platform_device *pdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment