Commit f6be19c8 authored by Olof Johansson's avatar Olof Johansson

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
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
reg = <0x10100 0x40>; reg = <0x10100 0x40>;
ngpios = <32>; ngpios = <32>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>;
interrupts = <35>, <36>, <37>, <38>; interrupts = <35>, <36>, <37>, <38>;
}; };
...@@ -46,6 +47,7 @@ ...@@ -46,6 +47,7 @@
reg = <0x10140 0x40>; reg = <0x10140 0x40>;
ngpios = <18>; ngpios = <18>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>;
interrupts = <39>, <40>, <41>; interrupts = <39>, <40>, <41>;
}; };
......
...@@ -124,7 +124,7 @@ void __init of_cpu_clk_setup(struct device_node *node) ...@@ -124,7 +124,7 @@ void __init of_cpu_clk_setup(struct device_node *node)
clks = kzalloc(ncpus * sizeof(*clks), GFP_KERNEL); clks = kzalloc(ncpus * sizeof(*clks), GFP_KERNEL);
if (WARN_ON(!clks)) if (WARN_ON(!clks))
return; goto clks_out;
for_each_node_by_type(dn, "cpu") { for_each_node_by_type(dn, "cpu") {
struct clk_init_data init; struct clk_init_data init;
...@@ -134,11 +134,11 @@ void __init of_cpu_clk_setup(struct device_node *node) ...@@ -134,11 +134,11 @@ void __init of_cpu_clk_setup(struct device_node *node)
int cpu, err; int cpu, err;
if (WARN_ON(!clk_name)) if (WARN_ON(!clk_name))
return; goto bail_out;
err = of_property_read_u32(dn, "reg", &cpu); err = of_property_read_u32(dn, "reg", &cpu);
if (WARN_ON(err)) if (WARN_ON(err))
return; goto bail_out;
sprintf(clk_name, "cpu%d", cpu); sprintf(clk_name, "cpu%d", cpu);
parent_clk = of_clk_get(node, 0); parent_clk = of_clk_get(node, 0);
...@@ -167,6 +167,9 @@ void __init of_cpu_clk_setup(struct device_node *node) ...@@ -167,6 +167,9 @@ void __init of_cpu_clk_setup(struct device_node *node)
return; return;
bail_out: bail_out:
kfree(clks); kfree(clks);
while(ncpus--)
kfree(cpuclk[ncpus].clk_name);
clks_out:
kfree(cpuclk); kfree(cpuclk);
} }
......
...@@ -50,8 +50,6 @@ struct mvsd_host { ...@@ -50,8 +50,6 @@ struct mvsd_host {
struct timer_list timer; struct timer_list timer;
struct mmc_host *mmc; struct mmc_host *mmc;
struct device *dev; struct device *dev;
struct resource *res;
int irq;
struct clk *clk; struct clk *clk;
int gpio_card_detect; int gpio_card_detect;
int gpio_write_protect; int gpio_write_protect;
...@@ -718,10 +716,6 @@ static int __init mvsd_probe(struct platform_device *pdev) ...@@ -718,10 +716,6 @@ static int __init mvsd_probe(struct platform_device *pdev)
if (!r || irq < 0 || !mvsd_data) if (!r || irq < 0 || !mvsd_data)
return -ENXIO; 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); mmc = mmc_alloc_host(sizeof(struct mvsd_host), &pdev->dev);
if (!mmc) { if (!mmc) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -731,8 +725,8 @@ static int __init mvsd_probe(struct platform_device *pdev) ...@@ -731,8 +725,8 @@ static int __init mvsd_probe(struct platform_device *pdev)
host = mmc_priv(mmc); host = mmc_priv(mmc);
host->mmc = mmc; host->mmc = mmc;
host->dev = &pdev->dev; host->dev = &pdev->dev;
host->res = r;
host->base_clock = mvsd_data->clock / 2; host->base_clock = mvsd_data->clock / 2;
host->clk = ERR_PTR(-EINVAL);
mmc->ops = &mvsd_ops; mmc->ops = &mvsd_ops;
...@@ -752,7 +746,7 @@ static int __init mvsd_probe(struct platform_device *pdev) ...@@ -752,7 +746,7 @@ static int __init mvsd_probe(struct platform_device *pdev)
spin_lock_init(&host->lock); spin_lock_init(&host->lock);
host->base = ioremap(r->start, SZ_4K); host->base = devm_request_and_ioremap(&pdev->dev, r);
if (!host->base) { if (!host->base) {
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
...@@ -765,44 +759,45 @@ static int __init mvsd_probe(struct platform_device *pdev) ...@@ -765,44 +759,45 @@ static int __init mvsd_probe(struct platform_device *pdev)
mvsd_power_down(host); 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) { if (ret) {
pr_err("%s: cannot assign irq %d\n", DRIVER_NAME, irq); pr_err("%s: cannot assign irq %d\n", DRIVER_NAME, irq);
goto out; goto out;
} else }
host->irq = irq;
/* Not all platforms can gate the clock, so it is not /* Not all platforms can gate the clock, so it is not
an error if the clock does not exists. */ an error if the clock does not exists. */
host->clk = clk_get(&pdev->dev, NULL); host->clk = devm_clk_get(&pdev->dev, NULL);
if (!IS_ERR(host->clk)) { if (!IS_ERR(host->clk))
clk_prepare_enable(host->clk); clk_prepare_enable(host->clk);
}
if (mvsd_data->gpio_card_detect) { if (mvsd_data->gpio_card_detect) {
ret = gpio_request(mvsd_data->gpio_card_detect, ret = devm_gpio_request_one(&pdev->dev,
DRIVER_NAME " cd"); mvsd_data->gpio_card_detect,
GPIOF_IN, DRIVER_NAME " cd");
if (ret == 0) { if (ret == 0) {
gpio_direction_input(mvsd_data->gpio_card_detect);
irq = gpio_to_irq(mvsd_data->gpio_card_detect); irq = gpio_to_irq(mvsd_data->gpio_card_detect);
ret = request_irq(irq, mvsd_card_detect_irq, ret = devm_request_irq(&pdev->dev, irq,
IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING, mvsd_card_detect_irq,
DRIVER_NAME " cd", host); IRQ_TYPE_EDGE_RISING |
IRQ_TYPE_EDGE_FALLING,
DRIVER_NAME " cd", host);
if (ret == 0) if (ret == 0)
host->gpio_card_detect = host->gpio_card_detect =
mvsd_data->gpio_card_detect; mvsd_data->gpio_card_detect;
else else
gpio_free(mvsd_data->gpio_card_detect); devm_gpio_free(&pdev->dev,
mvsd_data->gpio_card_detect);
} }
} }
if (!host->gpio_card_detect) if (!host->gpio_card_detect)
mmc->caps |= MMC_CAP_NEEDS_POLL; mmc->caps |= MMC_CAP_NEEDS_POLL;
if (mvsd_data->gpio_write_protect) { if (mvsd_data->gpio_write_protect) {
ret = gpio_request(mvsd_data->gpio_write_protect, ret = devm_gpio_request_one(&pdev->dev,
DRIVER_NAME " wp"); mvsd_data->gpio_write_protect,
GPIOF_IN, DRIVER_NAME " wp");
if (ret == 0) { if (ret == 0) {
gpio_direction_input(mvsd_data->gpio_write_protect);
host->gpio_write_protect = host->gpio_write_protect =
mvsd_data->gpio_write_protect; mvsd_data->gpio_write_protect;
} }
...@@ -824,26 +819,11 @@ static int __init mvsd_probe(struct platform_device *pdev) ...@@ -824,26 +819,11 @@ static int __init mvsd_probe(struct platform_device *pdev)
return 0; return 0;
out: out:
if (host) { if (mmc) {
if (host->irq) if (!IS_ERR(host->clk))
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)) {
clk_disable_unprepare(host->clk); clk_disable_unprepare(host->clk);
clk_put(host->clk);
}
mmc_free_host(mmc); mmc_free_host(mmc);
}
return ret; return ret;
} }
...@@ -852,28 +832,16 @@ static int __exit mvsd_remove(struct platform_device *pdev) ...@@ -852,28 +832,16 @@ static int __exit mvsd_remove(struct platform_device *pdev)
{ {
struct mmc_host *mmc = platform_get_drvdata(pdev); struct mmc_host *mmc = platform_get_drvdata(pdev);
if (mmc) { struct mvsd_host *host = mmc_priv(mmc);
struct mvsd_host *host = mmc_priv(mmc);
if (host->gpio_card_detect) { mmc_remove_host(mmc);
free_irq(gpio_to_irq(host->gpio_card_detect), host); del_timer_sync(&host->timer);
gpio_free(host->gpio_card_detect); mvsd_power_down(host);
}
mmc_remove_host(mmc); if (!IS_ERR(host->clk))
free_irq(host->irq, host); clk_disable_unprepare(host->clk);
if (host->gpio_write_protect) mmc_free_host(mmc);
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)) {
clk_disable_unprepare(host->clk);
clk_put(host->clk);
}
mmc_free_host(mmc);
}
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
return 0; return 0;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment