diff options
Diffstat (limited to 'drivers/net')
-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; |