From 68f16142665df26da8f8762481c279d4d701758b Mon Sep 17 00:00:00 2001 From: Joakim Zhang Date: Wed, 1 Jul 2020 21:41:06 +0800 Subject: [PATCH] MLK-24363-1 mxc: emvsim: add error check when enable clk Add error check when enable clk and register misc device at the end of probe stage. This patch just improve and clean up the code, no function change. Fixes: commit d49442014935 ("MLK-23793-2 mxc: emvsim: add runtime pm support") Reviewed-by: Fugang Duan Signed-off-by: Joakim Zhang --- drivers/mxc/sim/imx_emvsim.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/drivers/mxc/sim/imx_emvsim.c b/drivers/mxc/sim/imx_emvsim.c index 5bdb30efc8b4..3d040bead74e 100644 --- a/drivers/mxc/sim/imx_emvsim.c +++ b/drivers/mxc/sim/imx_emvsim.c @@ -1479,7 +1479,6 @@ copy_data: static int emvsim_open(struct inode *inode, struct file *file) { - int err; int errval = SIM_OK; struct emvsim_t *emvsim = dev_get_drvdata(emvsim_dev.parent); @@ -1492,9 +1491,9 @@ static int emvsim_open(struct inode *inode, struct file *file) } emvsim->open_cnt = 1; - err = pm_runtime_get_sync(emvsim_dev.parent); - if (err < 0) - return err; + errval = pm_runtime_get_sync(emvsim_dev.parent); + if (errval < 0) + return errval; init_completion(&emvsim->xfer_done); errval = emvsim_reset_module(emvsim); @@ -1646,18 +1645,23 @@ static int emvsim_probe(struct platform_device *pdev) pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); - ret = misc_register(&emvsim_dev); - emvsim->open_cnt = 1; - clk_prepare_enable(emvsim->ipg); - clk_prepare_enable(emvsim->clk); - + ret = clk_prepare_enable(emvsim->ipg); + if (ret) + return ret; + ret = clk_prepare_enable(emvsim->clk); + if (ret) { + clk_disable_unprepare(emvsim->ipg); + return ret; + } /* Let pm_runtime_put() disable the clocks. * If CONFIG_PM is not enabled, the clocks will stay powered. */ pm_runtime_put(&pdev->dev); emvsim->open_cnt = 0; + ret = misc_register(&emvsim_dev); + dev_info(&pdev->dev, "emvsim register %s\n", ret ? "fail" : "success"); return ret; @@ -1712,11 +1716,18 @@ static int __maybe_unused emvsim_resume(struct device *dev) static int __maybe_unused emvsim_runtime_resume(struct device *dev) { + int err; struct emvsim_t *emvsim = dev_get_drvdata(dev); if (emvsim->open_cnt) { - clk_prepare_enable(emvsim->ipg); - clk_prepare_enable(emvsim->clk); + err = clk_prepare_enable(emvsim->ipg); + if (err) + return err; + err = clk_prepare_enable(emvsim->clk); + if (err) { + clk_disable_unprepare(emvsim->ipg); + return err; + } } return 0;