Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d9d4b14 authored by Ricardo Ribalda Delgado's avatar Ricardo Ribalda Delgado Committed by Greg Kroah-Hartman
Browse files

base/platform: Remove code duplication



Failure path of platform_device_add was almost the same as
platform_device_del. Refactor same code in a function.

Acked-by: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b6d2233f
Loading
Loading
Loading
Loading
+25 −35
Original line number Diff line number Diff line
@@ -298,6 +298,25 @@ int platform_device_add_data(struct platform_device *pdev, const void *data,
}
EXPORT_SYMBOL_GPL(platform_device_add_data);

static void platform_device_cleanout(struct platform_device *pdev, int n_res)
{
	int i;

	if (pdev->id_auto) {
		ida_simple_remove(&platform_devid_ida, pdev->id);
		pdev->id = PLATFORM_DEVID_AUTO;
	}

	for (i = 0; i < n_res; i++) {
		struct resource *r = &pdev->resource[i];
		unsigned long type = resource_type(r);

		if ((type == IORESOURCE_MEM || type == IORESOURCE_IO) &&
				r->parent)
			release_resource(r);
	}
}

/**
 * platform_device_add - add a platform device to device hierarchy
 * @pdev: platform device we're adding
@@ -371,23 +390,8 @@ int platform_device_add(struct platform_device *pdev)
		 dev_name(&pdev->dev), dev_name(pdev->dev.parent));

	ret = device_add(&pdev->dev);
	if (ret == 0)
		return ret;

	/* Failure path */
	if (pdev->id_auto) {
		ida_simple_remove(&platform_devid_ida, pdev->id);
		pdev->id = PLATFORM_DEVID_AUTO;
	}

	while (--i >= 0) {
		struct resource *r = &pdev->resource[i];
		unsigned long type = resource_type(r);

		if ((type == IORESOURCE_MEM || type == IORESOURCE_IO) &&
				r->parent)
			release_resource(r);
	}
	if (ret)
		platform_device_cleanout(pdev, i);

	return ret;
}
@@ -403,25 +407,11 @@ EXPORT_SYMBOL_GPL(platform_device_add);
 */
void platform_device_del(struct platform_device *pdev)
{
	int i;
	if (!pdev)
		return;

	if (pdev) {
	device_del(&pdev->dev);

		if (pdev->id_auto) {
			ida_simple_remove(&platform_devid_ida, pdev->id);
			pdev->id = PLATFORM_DEVID_AUTO;
		}

		for (i = 0; i < pdev->num_resources; i++) {
			struct resource *r = &pdev->resource[i];
			unsigned long type = resource_type(r);

			if ((type == IORESOURCE_MEM || type == IORESOURCE_IO) &&
					r->parent)
				release_resource(r);
		}
	}
	platform_device_cleanout(pdev, pdev->num_resources);
}
EXPORT_SYMBOL_GPL(platform_device_del);