mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-02 18:33:55 +08:00
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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAABAgAGBQJQ/zvKAAoJEAi3KVZQDZAebCIIAKCaI3zYiHku7Q52Auzog0oU 7Gk6/TpZtolZURusjSVo8ZPWoZhJc9SoFAVkVJPcB9j1xTl3K7iNVOj4DVvi66o2 R8dw85nTKryBc6kapiJEpQhJof9dQKzmNSL36TNLaHjPef/hz3gVn/QqOxmyuBro ZZI0aUm+idgaDFkQCuevcfuStQGaKdOsIr23QEbicTj0rbgy0OIKrQ2KxFGKnr0Z YYYjUr9M5wk1mSOsssEcE/a97eejHS201JhYvCfxSpWCjbwiaErg0fzns7wZ2hhV BKGAEs+M67gcaHR/Pi2fy3LNLtwIcVNNgFYF3aCiBEFQ+hqtar6O9zqSmlBk1bI= =xOtK -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
f6be19c8bc
@ -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>;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
DRIVER_NAME " cd", host);
|
||||
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);
|
||||
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);
|
||||
mmc_remove_host(mmc);
|
||||
del_timer_sync(&host->timer);
|
||||
mvsd_power_down(host);
|
||||
|
||||
if (!IS_ERR(host->clk))
|
||||
clk_disable_unprepare(host->clk);
|
||||
mmc_free_host(mmc);
|
||||
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user