u32 reg_esr;
        u32 reg_ctrl_default;
 
-       struct clk *clk;
+       struct clk *clk_ipg;
+       struct clk *clk_per;
        struct flexcan_platform_data *pdata;
        const struct flexcan_devtype_data *devtype_data;
 };
        struct flexcan_priv *priv = netdev_priv(dev);
        int err;
 
-       clk_prepare_enable(priv->clk);
+       clk_prepare_enable(priv->clk_ipg);
+       clk_prepare_enable(priv->clk_per);
 
        err = open_candev(dev);
        if (err)
  out_close:
        close_candev(dev);
  out:
-       clk_disable_unprepare(priv->clk);
+       clk_disable_unprepare(priv->clk_per);
+       clk_disable_unprepare(priv->clk_ipg);
 
        return err;
 }
        flexcan_chip_stop(dev);
 
        free_irq(dev->irq, dev);
-       clk_disable_unprepare(priv->clk);
+       clk_disable_unprepare(priv->clk_per);
+       clk_disable_unprepare(priv->clk_ipg);
 
        close_candev(dev);
 
        struct flexcan_regs __iomem *regs = priv->base;
        u32 reg, err;
 
-       clk_prepare_enable(priv->clk);
+       clk_prepare_enable(priv->clk_ipg);
+       clk_prepare_enable(priv->clk_per);
 
        /* select "bus clock", chip must be disabled */
        flexcan_chip_disable(priv);
  out:
        /* disable core and turn off clocks */
        flexcan_chip_disable(priv);
-       clk_disable_unprepare(priv->clk);
+       clk_disable_unprepare(priv->clk_per);
+       clk_disable_unprepare(priv->clk_ipg);
 
        return err;
 }
        struct net_device *dev;
        struct flexcan_priv *priv;
        struct resource *mem;
-       struct clk *clk = NULL;
+       struct clk *clk_ipg = NULL, *clk_per = NULL;
        struct pinctrl *pinctrl;
        void __iomem *base;
        resource_size_t mem_size;
                                                "clock-frequency", &clock_freq);
 
        if (!clock_freq) {
-               clk = clk_get(&pdev->dev, NULL);
-               if (IS_ERR(clk)) {
-                       dev_err(&pdev->dev, "no clock defined\n");
-                       err = PTR_ERR(clk);
+               clk_ipg = devm_clk_get(&pdev->dev, "ipg");
+               if (IS_ERR(clk_ipg)) {
+                       dev_err(&pdev->dev, "no ipg clock defined\n");
+                       err = PTR_ERR(clk_ipg);
+                       goto failed_clock;
+               }
+               clock_freq = clk_get_rate(clk_ipg);
+
+               clk_per = devm_clk_get(&pdev->dev, "per");
+               if (IS_ERR(clk_per)) {
+                       dev_err(&pdev->dev, "no per clock defined\n");
+                       err = PTR_ERR(clk_per);
                        goto failed_clock;
                }
-               clock_freq = clk_get_rate(clk);
        }
 
        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
                CAN_CTRLMODE_BERR_REPORTING;
        priv->base = base;
        priv->dev = dev;
-       priv->clk = clk;
+       priv->clk_ipg = clk_ipg;
+       priv->clk_per = clk_per;
        priv->pdata = pdev->dev.platform_data;
        priv->devtype_data = devtype_data;
 
  failed_map:
        release_mem_region(mem->start, mem_size);
  failed_get:
-       if (clk)
-               clk_put(clk);
  failed_clock:
        return err;
 }
        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        release_mem_region(mem->start, resource_size(mem));
 
-       if (priv->clk)
-               clk_put(priv->clk);
-
        free_candev(dev);
 
        return 0;