diff options
author | Leilk Liu <leilk.liu@mediatek.com> | 2015-11-25 04:50:38 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-11-25 06:55:00 -0500 |
commit | e38da37fa8f410e61f2a6c03b3d14fec11b00259 (patch) | |
tree | 2cc8ce8d31e15fc6810573b3997a56836bc5ce8e /drivers/spi/spi-mt65xx.c | |
parent | 4d920471d718618dab2c1dc867b1438c84b8d8ff (diff) |
spi: mediatek: revise mtk_spi_probe() failure flow
mtk_spi_probe() calls pm_runtime_enable(), after
pm_runtime_enable() is called, it should call
pm_runtime_disable() in the failure flow.
Signed-off-by: Leilk Liu <leilk.liu@mediatek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-mt65xx.c')
-rw-r--r-- | drivers/spi/spi-mt65xx.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c index 6c1a96eb49ee..00a36dacfe2f 100644 --- a/drivers/spi/spi-mt65xx.c +++ b/drivers/spi/spi-mt65xx.c | |||
@@ -607,7 +607,8 @@ static int mtk_spi_probe(struct platform_device *pdev) | |||
607 | ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk); | 607 | ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk); |
608 | if (ret < 0) { | 608 | if (ret < 0) { |
609 | dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret); | 609 | dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret); |
610 | goto err_disable_clk; | 610 | clk_disable_unprepare(mdata->spi_clk); |
611 | goto err_put_master; | ||
611 | } | 612 | } |
612 | 613 | ||
613 | clk_disable_unprepare(mdata->spi_clk); | 614 | clk_disable_unprepare(mdata->spi_clk); |
@@ -617,7 +618,7 @@ static int mtk_spi_probe(struct platform_device *pdev) | |||
617 | ret = devm_spi_register_master(&pdev->dev, master); | 618 | ret = devm_spi_register_master(&pdev->dev, master); |
618 | if (ret) { | 619 | if (ret) { |
619 | dev_err(&pdev->dev, "failed to register master (%d)\n", ret); | 620 | dev_err(&pdev->dev, "failed to register master (%d)\n", ret); |
620 | goto err_put_master; | 621 | goto err_disable_runtime_pm; |
621 | } | 622 | } |
622 | 623 | ||
623 | if (mdata->dev_comp->need_pad_sel) { | 624 | if (mdata->dev_comp->need_pad_sel) { |
@@ -626,14 +627,14 @@ static int mtk_spi_probe(struct platform_device *pdev) | |||
626 | "pad_num does not match num_chipselect(%d != %d)\n", | 627 | "pad_num does not match num_chipselect(%d != %d)\n", |
627 | mdata->pad_num, master->num_chipselect); | 628 | mdata->pad_num, master->num_chipselect); |
628 | ret = -EINVAL; | 629 | ret = -EINVAL; |
629 | goto err_put_master; | 630 | goto err_disable_runtime_pm; |
630 | } | 631 | } |
631 | 632 | ||
632 | if (!master->cs_gpios && master->num_chipselect > 1) { | 633 | if (!master->cs_gpios && master->num_chipselect > 1) { |
633 | dev_err(&pdev->dev, | 634 | dev_err(&pdev->dev, |
634 | "cs_gpios not specified and num_chipselect > 1\n"); | 635 | "cs_gpios not specified and num_chipselect > 1\n"); |
635 | ret = -EINVAL; | 636 | ret = -EINVAL; |
636 | goto err_put_master; | 637 | goto err_disable_runtime_pm; |
637 | } | 638 | } |
638 | 639 | ||
639 | if (master->cs_gpios) { | 640 | if (master->cs_gpios) { |
@@ -644,7 +645,7 @@ static int mtk_spi_probe(struct platform_device *pdev) | |||
644 | if (ret) { | 645 | if (ret) { |
645 | dev_err(&pdev->dev, | 646 | dev_err(&pdev->dev, |
646 | "can't get CS GPIO %i\n", i); | 647 | "can't get CS GPIO %i\n", i); |
647 | goto err_put_master; | 648 | goto err_disable_runtime_pm; |
648 | } | 649 | } |
649 | } | 650 | } |
650 | } | 651 | } |
@@ -652,8 +653,8 @@ static int mtk_spi_probe(struct platform_device *pdev) | |||
652 | 653 | ||
653 | return 0; | 654 | return 0; |
654 | 655 | ||
655 | err_disable_clk: | 656 | err_disable_runtime_pm: |
656 | clk_disable_unprepare(mdata->spi_clk); | 657 | pm_runtime_disable(&pdev->dev); |
657 | err_put_master: | 658 | err_put_master: |
658 | spi_master_put(master); | 659 | spi_master_put(master); |
659 | 660 | ||