]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00270697-2 net:fec: correct fec MDC clock source
authorFugang Duan <B38611@freescale.com>
Thu, 11 Jul 2013 11:07:50 +0000 (19:07 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:14:13 +0000 (14:14 +0200)
For imx6 serial silicon, fec MDC clock parent is ipg 66MHz.
The current clock file define the clock source is enet_pll8 50Mhz.
So, the MDC clock is more than 2.5Mhz after divider.

The phy Ar8031 work fine in current MDC clock, which shows the phy
have exceeding flexibility. Correct the parent clock source to make
MDC clock little than 2.5Mhz.

Signed-off-by: Fugang Duan <B38611@freescale.com>
drivers/net/fec.c

index 1b646ed9e5c5b586a3c2c942d00d302399d035d8..50fe80109bab70d4db81790d60682f6254a292af 100755 (executable)
@@ -196,6 +196,7 @@ struct fec_enet_private {
        struct net_device *netdev;
 
        struct clk *clk;
+       struct clk *mdc_clk;
 
        /* The saved address of a sent-in-place packet/buffer, for skfree(). */
        unsigned char *tx_bounce[TX_RING_SIZE];
@@ -1139,9 +1140,8 @@ static int fec_enet_mii_init(struct platform_device *pdev)
        /*
         * Set MII speed to 2.5 MHz (= clk_get_rate() / 2 * phy_speed)
         */
-       fep->phy_speed = DIV_ROUND_UP(clk_get_rate(fep->clk),
+       fep->phy_speed = DIV_ROUND_UP(clk_get_rate(fep->mdc_clk),
                                        (FEC_ENET_MII_CLK << 2)) << 1;
-
        /* set hold time to 2 internal clock cycle */
        if (cpu_is_mx6q() || cpu_is_mx6dl())
                fep->phy_speed |= FEC_ENET_HOLD_TIME;
@@ -1900,6 +1900,11 @@ fec_probe(struct platform_device *pdev)
                ret = PTR_ERR(fep->clk);
                goto failed_clk;
        }
+       fep->mdc_clk = clk_get(&pdev->dev, "fec_mdc_clk");
+       if (IS_ERR(fep->mdc_clk)) {
+               ret = PTR_ERR(fep->mdc_clk);
+               goto failed_clk;
+       }
        clk_enable(fep->clk);
 
        ret = fec_enet_init(ndev);
@@ -1943,6 +1948,7 @@ failed_mii_init:
 failed_init:
        clk_disable(fep->clk);
        clk_put(fep->clk);
+       clk_put(fep->mdc_clk);
 failed_clk:
        if (pdata->gpio_irq < 0)
                free_irq(irq, ndev);
@@ -1975,6 +1981,7 @@ fec_drv_remove(struct platform_device *pdev)
        fec_enet_mii_remove(fep);
        clk_disable(fep->clk);
        clk_put(fep->clk);
+       clk_put(fep->mdc_clk);
        iounmap((void __iomem *)ndev->base_addr);
        if (fep->ptimer_present)
                fec_ptp_cleanup(fep->ptp_priv);