aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorFabio Estevam <fabio.estevam@freescale.com>2013-07-22 11:41:40 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2013-08-01 06:36:20 -0400
commitaa10181bdac99a623517f0f2bfa14cd98c749246 (patch)
tree23868dc0c629a17f8685ccd40815ffb8f4413742 /drivers/net
parent933e4af4c590c63509ffadeb77fcd1d329ac9155 (diff)
can: flexcan: Check the return value from clk_prepare_enable()
clk_prepare_enable() may fail, so let's check its return value and propagate it in the case of error. Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/can/flexcan.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index 9ca27e23b0b7..c48174ed49cc 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -850,12 +850,17 @@ static int flexcan_open(struct net_device *dev)
850 struct flexcan_priv *priv = netdev_priv(dev); 850 struct flexcan_priv *priv = netdev_priv(dev);
851 int err; 851 int err;
852 852
853 clk_prepare_enable(priv->clk_ipg); 853 err = clk_prepare_enable(priv->clk_ipg);
854 clk_prepare_enable(priv->clk_per); 854 if (err)
855 return err;
856
857 err = clk_prepare_enable(priv->clk_per);
858 if (err)
859 goto out_disable_ipg;
855 860
856 err = open_candev(dev); 861 err = open_candev(dev);
857 if (err) 862 if (err)
858 goto out; 863 goto out_disable_per;
859 864
860 err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev); 865 err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
861 if (err) 866 if (err)
@@ -875,8 +880,9 @@ static int flexcan_open(struct net_device *dev)
875 880
876 out_close: 881 out_close:
877 close_candev(dev); 882 close_candev(dev);
878 out: 883 out_disable_per:
879 clk_disable_unprepare(priv->clk_per); 884 clk_disable_unprepare(priv->clk_per);
885 out_disable_ipg:
880 clk_disable_unprepare(priv->clk_ipg); 886 clk_disable_unprepare(priv->clk_ipg);
881 887
882 return err; 888 return err;
@@ -933,8 +939,13 @@ static int register_flexcandev(struct net_device *dev)
933 struct flexcan_regs __iomem *regs = priv->base; 939 struct flexcan_regs __iomem *regs = priv->base;
934 u32 reg, err; 940 u32 reg, err;
935 941
936 clk_prepare_enable(priv->clk_ipg); 942 err = clk_prepare_enable(priv->clk_ipg);
937 clk_prepare_enable(priv->clk_per); 943 if (err)
944 return err;
945
946 err = clk_prepare_enable(priv->clk_per);
947 if (err)
948 goto out_disable_ipg;
938 949
939 /* select "bus clock", chip must be disabled */ 950 /* select "bus clock", chip must be disabled */
940 flexcan_chip_disable(priv); 951 flexcan_chip_disable(priv);
@@ -959,15 +970,16 @@ static int register_flexcandev(struct net_device *dev)
959 if (!(reg & FLEXCAN_MCR_FEN)) { 970 if (!(reg & FLEXCAN_MCR_FEN)) {
960 netdev_err(dev, "Could not enable RX FIFO, unsupported core\n"); 971 netdev_err(dev, "Could not enable RX FIFO, unsupported core\n");
961 err = -ENODEV; 972 err = -ENODEV;
962 goto out; 973 goto out_disable_per;
963 } 974 }
964 975
965 err = register_candev(dev); 976 err = register_candev(dev);
966 977
967 out: 978 out_disable_per:
968 /* disable core and turn off clocks */ 979 /* disable core and turn off clocks */
969 flexcan_chip_disable(priv); 980 flexcan_chip_disable(priv);
970 clk_disable_unprepare(priv->clk_per); 981 clk_disable_unprepare(priv->clk_per);
982 out_disable_ipg:
971 clk_disable_unprepare(priv->clk_ipg); 983 clk_disable_unprepare(priv->clk_ipg);
972 984
973 return err; 985 return err;