aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
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;