diff options
author | Fabio Estevam <fabio.estevam@freescale.com> | 2013-07-22 11:41:40 -0400 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2013-08-01 06:36:20 -0400 |
commit | aa10181bdac99a623517f0f2bfa14cd98c749246 (patch) | |
tree | 23868dc0c629a17f8685ccd40815ffb8f4413742 /drivers/net/can/flexcan.c | |
parent | 933e4af4c590c63509ffadeb77fcd1d329ac9155 (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/can/flexcan.c')
-rw-r--r-- | drivers/net/can/flexcan.c | 28 |
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; |