Commit f6be19c8 authored by Olof Johansson's avatar Olof Johansson
Browse files

Merge tag 'mvebu_fixes_for_v3.8-rc5' of git://git.infradead.org/users/jcooper/linux into fixes

From Jason Cooper:

mvebu fixes for v3.8-rc5
 - fix memory leak in mvebu/clk-cpu.c
 - use devm_ to correct/simplify error paths in mvsdio
 - add missing #interrupt-cells property in kirkwood

* tag 'mvebu_fixes_for_v3.8-rc5' of git://git.infradead.org/users/jcooper/linux:
  ARM: kirkwood: fix missing #interrupt-cells property
  mmc: mvsdio: use devm_ API to simplify/correct error paths.
  clk: mvebu/clk-cpu.c: fix memory leakage
parents 51edce0c 09d75bc7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
			reg = <0x10100 0x40>;
			ngpios = <32>;
			interrupt-controller;
			#interrupt-cells = <2>;
			interrupts = <35>, <36>, <37>, <38>;
		};

@@ -46,6 +47,7 @@
			reg = <0x10140 0x40>;
			ngpios = <18>;
			interrupt-controller;
			#interrupt-cells = <2>;
			interrupts = <39>, <40>, <41>;
		};

+6 −3
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ void __init of_cpu_clk_setup(struct device_node *node)

	clks = kzalloc(ncpus * sizeof(*clks), GFP_KERNEL);
	if (WARN_ON(!clks))
		return;
		goto clks_out;

	for_each_node_by_type(dn, "cpu") {
		struct clk_init_data init;
@@ -134,11 +134,11 @@ void __init of_cpu_clk_setup(struct device_node *node)
		int cpu, err;

		if (WARN_ON(!clk_name))
			return;
			goto bail_out;

		err = of_property_read_u32(dn, "reg", &cpu);
		if (WARN_ON(err))
			return;
			goto bail_out;

		sprintf(clk_name, "cpu%d", cpu);
		parent_clk = of_clk_get(node, 0);
@@ -167,6 +167,9 @@ void __init of_cpu_clk_setup(struct device_node *node)
	return;
bail_out:
	kfree(clks);
	while(ncpus--)
		kfree(cpuclk[ncpus].clk_name);
clks_out:
	kfree(cpuclk);
}

+30 −62
Original line number Diff line number Diff line
@@ -50,8 +50,6 @@ struct mvsd_host {
	struct timer_list timer;
	struct mmc_host *mmc;
	struct device *dev;
	struct resource *res;
	int irq;
	struct clk *clk;
	int gpio_card_detect;
	int gpio_write_protect;
@@ -718,10 +716,6 @@ static int __init mvsd_probe(struct platform_device *pdev)
	if (!r || irq < 0 || !mvsd_data)
		return -ENXIO;

	r = request_mem_region(r->start, SZ_1K, DRIVER_NAME);
	if (!r)
		return -EBUSY;

	mmc = mmc_alloc_host(sizeof(struct mvsd_host), &pdev->dev);
	if (!mmc) {
		ret = -ENOMEM;
@@ -731,8 +725,8 @@ static int __init mvsd_probe(struct platform_device *pdev)
	host = mmc_priv(mmc);
	host->mmc = mmc;
	host->dev = &pdev->dev;
	host->res = r;
	host->base_clock = mvsd_data->clock / 2;
	host->clk = ERR_PTR(-EINVAL);

	mmc->ops = &mvsd_ops;

@@ -752,7 +746,7 @@ static int __init mvsd_probe(struct platform_device *pdev)

	spin_lock_init(&host->lock);

	host->base = ioremap(r->start, SZ_4K);
	host->base = devm_request_and_ioremap(&pdev->dev, r);
	if (!host->base) {
		ret = -ENOMEM;
		goto out;
@@ -765,44 +759,45 @@ static int __init mvsd_probe(struct platform_device *pdev)

	mvsd_power_down(host);

	ret = request_irq(irq, mvsd_irq, 0, DRIVER_NAME, host);
	ret = devm_request_irq(&pdev->dev, irq, mvsd_irq, 0, DRIVER_NAME, host);
	if (ret) {
		pr_err("%s: cannot assign irq %d\n", DRIVER_NAME, irq);
		goto out;
	} else
		host->irq = irq;
	}

	/* Not all platforms can gate the clock, so it is not
	   an error if the clock does not exists. */
	host->clk = clk_get(&pdev->dev, NULL);
	if (!IS_ERR(host->clk)) {
	host->clk = devm_clk_get(&pdev->dev, NULL);
	if (!IS_ERR(host->clk))
		clk_prepare_enable(host->clk);
	}

	if (mvsd_data->gpio_card_detect) {
		ret = gpio_request(mvsd_data->gpio_card_detect,
				   DRIVER_NAME " cd");
		ret = devm_gpio_request_one(&pdev->dev,
					    mvsd_data->gpio_card_detect,
					    GPIOF_IN, DRIVER_NAME " cd");
		if (ret == 0) {
			gpio_direction_input(mvsd_data->gpio_card_detect);
			irq = gpio_to_irq(mvsd_data->gpio_card_detect);
			ret = request_irq(irq, mvsd_card_detect_irq,
					  IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING,
			ret = devm_request_irq(&pdev->dev, irq,
					       mvsd_card_detect_irq,
					       IRQ_TYPE_EDGE_RISING |
					       IRQ_TYPE_EDGE_FALLING,
					       DRIVER_NAME " cd", host);
			if (ret == 0)
				host->gpio_card_detect =
					mvsd_data->gpio_card_detect;
			else
				gpio_free(mvsd_data->gpio_card_detect);
				devm_gpio_free(&pdev->dev,
					       mvsd_data->gpio_card_detect);
		}
	}
	if (!host->gpio_card_detect)
		mmc->caps |= MMC_CAP_NEEDS_POLL;

	if (mvsd_data->gpio_write_protect) {
		ret = gpio_request(mvsd_data->gpio_write_protect,
				   DRIVER_NAME " wp");
		ret = devm_gpio_request_one(&pdev->dev,
					    mvsd_data->gpio_write_protect,
					    GPIOF_IN, DRIVER_NAME " wp");
		if (ret == 0) {
			gpio_direction_input(mvsd_data->gpio_write_protect);
			host->gpio_write_protect =
				mvsd_data->gpio_write_protect;
		}
@@ -824,26 +819,11 @@ static int __init mvsd_probe(struct platform_device *pdev)
	return 0;

out:
	if (host) {
		if (host->irq)
			free_irq(host->irq, host);
		if (host->gpio_card_detect) {
			free_irq(gpio_to_irq(host->gpio_card_detect), host);
			gpio_free(host->gpio_card_detect);
		}
		if (host->gpio_write_protect)
			gpio_free(host->gpio_write_protect);
		if (host->base)
			iounmap(host->base);
	}
	if (r)
		release_resource(r);
	if (mmc)
		if (!IS_ERR_OR_NULL(host->clk)) {
	if (mmc) {
		if (!IS_ERR(host->clk))
			clk_disable_unprepare(host->clk);
			clk_put(host->clk);
		}
		mmc_free_host(mmc);
	}

	return ret;
}
@@ -852,28 +832,16 @@ static int __exit mvsd_remove(struct platform_device *pdev)
{
	struct mmc_host *mmc = platform_get_drvdata(pdev);

	if (mmc) {
	struct mvsd_host *host = mmc_priv(mmc);

		if (host->gpio_card_detect) {
			free_irq(gpio_to_irq(host->gpio_card_detect), host);
			gpio_free(host->gpio_card_detect);
		}
	mmc_remove_host(mmc);
		free_irq(host->irq, host);
		if (host->gpio_write_protect)
			gpio_free(host->gpio_write_protect);
	del_timer_sync(&host->timer);
	mvsd_power_down(host);
		iounmap(host->base);
		release_resource(host->res);

		if (!IS_ERR(host->clk)) {
	if (!IS_ERR(host->clk))
		clk_disable_unprepare(host->clk);
			clk_put(host->clk);
		}
	mmc_free_host(mmc);
	}

	platform_set_drvdata(pdev, NULL);
	return 0;
}