diff options
Diffstat (limited to 'drivers/mtd/mtdcore.c')
| -rw-r--r-- | drivers/mtd/mtdcore.c | 40 | 
1 files changed, 22 insertions, 18 deletions
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 0feacb9fbdac..60670b2f70b9 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -63,7 +63,6 @@ static SIMPLE_DEV_PM_OPS(mtd_cls_pm_ops, mtd_cls_suspend, mtd_cls_resume);  static struct class mtd_class = {  	.name = "mtd", -	.owner = THIS_MODULE,  	.pm = MTD_CLS_PM_OPS,  }; @@ -519,7 +518,7 @@ static int mtd_nvmem_add(struct mtd_info *mtd)  	struct device_node *node = mtd_get_of_node(mtd);  	struct nvmem_config config = {}; -	config.id = -1; +	config.id = NVMEM_DEVID_NONE;  	config.dev = &mtd->dev;  	config.name = dev_name(&mtd->dev);  	config.owner = THIS_MODULE; @@ -536,12 +535,11 @@ static int mtd_nvmem_add(struct mtd_info *mtd)  	mtd->nvmem = nvmem_register(&config);  	if (IS_ERR(mtd->nvmem)) {  		/* Just ignore if there is no NVMEM support in the kernel */ -		if (PTR_ERR(mtd->nvmem) == -EOPNOTSUPP) { +		if (PTR_ERR(mtd->nvmem) == -EOPNOTSUPP)  			mtd->nvmem = NULL; -		} else { -			dev_err(&mtd->dev, "Failed to register NVMEM device\n"); -			return PTR_ERR(mtd->nvmem); -		} +		else +			return dev_err_probe(&mtd->dev, PTR_ERR(mtd->nvmem), +					     "Failed to register NVMEM device\n");  	}  	return 0; @@ -739,7 +737,7 @@ int add_mtd_device(struct mtd_info *mtd)  	mutex_unlock(&mtd_table_mutex); -	if (of_find_property(mtd_get_of_node(mtd), "linux,rootfs", NULL)) { +	if (of_property_read_bool(mtd_get_of_node(mtd), "linux,rootfs")) {  		if (IS_BUILTIN(CONFIG_MTD)) {  			pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name);  			ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); @@ -888,8 +886,8 @@ static struct nvmem_device *mtd_otp_nvmem_register(struct mtd_info *mtd,  	/* OTP nvmem will be registered on the physical device */  	config.dev = mtd->dev.parent; -	config.name = kasprintf(GFP_KERNEL, "%s-%s", dev_name(&mtd->dev), compatible); -	config.id = NVMEM_DEVID_NONE; +	config.name = compatible; +	config.id = NVMEM_DEVID_AUTO;  	config.owner = THIS_MODULE;  	config.type = NVMEM_TYPE_OTP;  	config.root_only = true; @@ -905,7 +903,6 @@ static struct nvmem_device *mtd_otp_nvmem_register(struct mtd_info *mtd,  		nvmem = NULL;  	of_node_put(np); -	kfree(config.name);  	return nvmem;  } @@ -940,6 +937,7 @@ static int mtd_nvmem_fact_otp_reg_read(void *priv, unsigned int offset,  static int mtd_otp_nvmem_add(struct mtd_info *mtd)  { +	struct device *dev = mtd->dev.parent;  	struct nvmem_device *nvmem;  	ssize_t size;  	int err; @@ -953,8 +951,8 @@ static int mtd_otp_nvmem_add(struct mtd_info *mtd)  			nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size,  						       mtd_nvmem_user_otp_reg_read);  			if (IS_ERR(nvmem)) { -				dev_err(&mtd->dev, "Failed to register OTP NVMEM device\n"); -				return PTR_ERR(nvmem); +				err = PTR_ERR(nvmem); +				goto err;  			}  			mtd->otp_user_nvmem = nvmem;  		} @@ -971,7 +969,6 @@ static int mtd_otp_nvmem_add(struct mtd_info *mtd)  			nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size,  						       mtd_nvmem_fact_otp_reg_read);  			if (IS_ERR(nvmem)) { -				dev_err(&mtd->dev, "Failed to register OTP NVMEM device\n");  				err = PTR_ERR(nvmem);  				goto err;  			} @@ -983,7 +980,7 @@ static int mtd_otp_nvmem_add(struct mtd_info *mtd)  err:  	nvmem_unregister(mtd->otp_user_nvmem); -	return err; +	return dev_err_probe(dev, err, "Failed to register OTP NVMEM device\n");  }  /** @@ -1023,10 +1020,14 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,  	mtd_set_dev_defaults(mtd); +	ret = mtd_otp_nvmem_add(mtd); +	if (ret) +		goto out; +  	if (IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) {  		ret = add_mtd_device(mtd);  		if (ret) -			return ret; +			goto out;  	}  	/* Prefer parsed partitions over driver-provided fallback */ @@ -1061,9 +1062,12 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,  		register_reboot_notifier(&mtd->reboot_notifier);  	} -	ret = mtd_otp_nvmem_add(mtd); -  out: +	if (ret) { +		nvmem_unregister(mtd->otp_user_nvmem); +		nvmem_unregister(mtd->otp_factory_nvmem); +	} +  	if (ret && device_is_registered(&mtd->dev))  		del_mtd_device(mtd);  |