Commit cb5faba9 authored by Viresh Kumar's avatar Viresh Kumar Committed by Samuel Ortiz
Browse files

mfd: stmpe: Use devm_*() routines



This patch frees stmpe driver from tension of freeing resources.
devm_* derivatives of multiple routines are used while allocating resources,
which would be freed automatically by kernel.

Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Acked-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 0c418844
Loading
Loading
Loading
Loading
+21 −39
Original line number Diff line number Diff line
@@ -1052,17 +1052,17 @@ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
	int ret;

	if (!pdata) {
		if (np) {
			pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
		if (!np)
			return -EINVAL;

		pdata = devm_kzalloc(ci->dev, sizeof(*pdata), GFP_KERNEL);
		if (!pdata)
			return -ENOMEM;

		stmpe_of_probe(pdata, np);
		} else
			return -EINVAL;
	}

	stmpe = kzalloc(sizeof(struct stmpe), GFP_KERNEL);
	stmpe = devm_kzalloc(ci->dev, sizeof(struct stmpe), GFP_KERNEL);
	if (!stmpe)
		return -ENOMEM;

@@ -1084,11 +1084,12 @@ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
		ci->init(stmpe);

	if (pdata->irq_over_gpio) {
		ret = gpio_request_one(pdata->irq_gpio, GPIOF_DIR_IN, "stmpe");
		ret = devm_gpio_request_one(ci->dev, pdata->irq_gpio,
				GPIOF_DIR_IN, "stmpe");
		if (ret) {
			dev_err(stmpe->dev, "failed to request IRQ GPIO: %d\n",
					ret);
			goto out_free;
			return ret;
		}

		stmpe->irq = gpio_to_irq(pdata->irq_gpio);
@@ -1105,48 +1106,37 @@ int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
			dev_err(stmpe->dev,
				"%s does not support no-irq mode!\n",
				stmpe->variant->name);
			ret = -ENODEV;
			goto free_gpio;
			return -ENODEV;
		}
		stmpe->variant = stmpe_noirq_variant_info[stmpe->partnum];
	}

	ret = stmpe_chip_init(stmpe);
	if (ret)
		goto free_gpio;
		return ret;

	if (stmpe->irq >= 0) {
		ret = stmpe_irq_init(stmpe, np);
		if (ret)
			goto free_gpio;
			return ret;

		ret = request_threaded_irq(stmpe->irq, NULL, stmpe_irq,
				pdata->irq_trigger | IRQF_ONESHOT,
		ret = devm_request_threaded_irq(ci->dev, stmpe->irq, NULL,
				stmpe_irq, pdata->irq_trigger | IRQF_ONESHOT,
				"stmpe", stmpe);
		if (ret) {
			dev_err(stmpe->dev, "failed to request IRQ: %d\n",
					ret);
			goto free_gpio;
			return ret;
		}
	}

	ret = stmpe_devices_init(stmpe);
	if (ret) {
		dev_err(stmpe->dev, "failed to add children\n");
		goto out_removedevs;
	}

	if (!ret)
		return 0;

out_removedevs:
	dev_err(stmpe->dev, "failed to add children\n");
	mfd_remove_devices(stmpe->dev);
	if (stmpe->irq >= 0)
		free_irq(stmpe->irq, stmpe);
free_gpio:
	if (pdata->irq_over_gpio)
		gpio_free(pdata->irq_gpio);
out_free:
	kfree(stmpe);

	return ret;
}

@@ -1154,14 +1144,6 @@ int stmpe_remove(struct stmpe *stmpe)
{
	mfd_remove_devices(stmpe->dev);

	if (stmpe->irq >= 0)
		free_irq(stmpe->irq, stmpe);

	if (stmpe->pdata->irq_over_gpio)
		gpio_free(stmpe->pdata->irq_gpio);

	kfree(stmpe);

	return 0;
}