hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/nvmem/core.c
....@@ -625,6 +625,8 @@
625625 return ERR_PTR(rval);
626626 }
627627
628
+ nvmem->id = rval;
629
+
628630 if (config->wp_gpio)
629631 nvmem->wp_gpio = config->wp_gpio;
630632 else
....@@ -640,7 +642,6 @@
640642 kref_init(&nvmem->refcnt);
641643 INIT_LIST_HEAD(&nvmem->cells);
642644
643
- nvmem->id = rval;
644645 nvmem->owner = config->owner;
645646 if (!nvmem->owner && config->dev->driver)
646647 nvmem->owner = config->dev->driver->owner;
....@@ -660,16 +661,22 @@
660661
661662 switch (config->id) {
662663 case NVMEM_DEVID_NONE:
663
- dev_set_name(&nvmem->dev, "%s", config->name);
664
+ rval = dev_set_name(&nvmem->dev, "%s", config->name);
664665 break;
665666 case NVMEM_DEVID_AUTO:
666
- dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
667
+ rval = dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
667668 break;
668669 default:
669
- dev_set_name(&nvmem->dev, "%s%d",
670
+ rval = dev_set_name(&nvmem->dev, "%s%d",
670671 config->name ? : "nvmem",
671672 config->name ? config->id : nvmem->id);
672673 break;
674
+ }
675
+
676
+ if (rval) {
677
+ ida_free(&nvmem_ida, nvmem->id);
678
+ kfree(nvmem);
679
+ return ERR_PTR(rval);
673680 }
674681
675682 nvmem->read_only = device_property_present(config->dev, "read-only") ||
....@@ -694,7 +701,7 @@
694701 if (config->cells) {
695702 rval = nvmem_add_cells(nvmem, config->cells, config->ncells);
696703 if (rval)
697
- goto err_teardown_compat;
704
+ goto err_remove_cells;
698705 }
699706
700707 rval = nvmem_add_cells_from_table(nvmem);
....@@ -711,7 +718,6 @@
711718
712719 err_remove_cells:
713720 nvmem_device_remove_all_cells(nvmem);
714
-err_teardown_compat:
715721 if (config->compat)
716722 nvmem_sysfs_remove_compat(nvmem, config);
717723 err_device_del: