ethernet: add rmii clkin support and support rmii data package without header
authorwdc <wdc@rock-chips.com>
Sat, 12 Oct 2013 12:52:56 +0000 (20:52 +0800)
committerwdc <wdc@rock-chips.com>
Sat, 12 Oct 2013 12:56:13 +0000 (20:56 +0800)
arch/arm/mach-rk30/board-rk30-sdk-vmac.c
arch/arm/mach-rk30/board-rk31-sdk-vmac.c
arch/arm/mach-rk3188/board-rk3188-ac.c
arch/arm/plat-rk/include/plat/board.h
drivers/net/rk29_vmac.c

index 0a43c75aca87073f2e87f99461f1e388b2e44b96..76837f701c3d4fc0ff479bec6be32274b48be4a8 100755 (executable)
@@ -1,3 +1,4 @@
+static rmii_extclk_sel = 0;
 static int rk30_vmac_register_set(void)
 {
        //config rk30 vmac as rmii
@@ -83,10 +84,19 @@ static int rk29_vmac_speed_switch(int speed)
        }
 }
 
+static int rk30_rmii_extclk_sel(void)
+{
+#ifdef RMII_EXT_CLK
+    rmii_extclk_sel = 1; //0:select internal divider clock, 1:select external input clock
+#endif 
+    return rmii_extclk_sel; 
+}
+
 struct rk29_vmac_platform_data board_vmac_data = {
        .vmac_register_set = rk30_vmac_register_set,
        .rmii_io_init = rk30_rmii_io_init,
        .rmii_io_deinit = rk30_rmii_io_deinit,
        .rmii_power_control = rk30_rmii_power_control,
        .rmii_speed_switch = rk29_vmac_speed_switch,
+   .rmii_extclk_sel = rk30_rmii_extclk_sel,
 };
index 56901da8876e9efac730d90ed0b691e720b2c419..35b9b79210b7ebc226cdfdadb1e0d80e75cc8087 100644 (file)
@@ -1,25 +1,31 @@
-//$_FOR_ROCKCHIP_RBOX_$
-
+static rmii_extclk_sel = 0;
 static int rk30_vmac_register_set(void)
 {
     //config rk30 vmac as rmii
     writel_relaxed(0x3 << 16 | 0x2, RK30_GRF_BASE + GRF_SOC_CON1);
     int val = readl_relaxed(RK30_GRF_BASE + GRF_IO_CON3);
     writel_relaxed(val | 0xf << 16 | 0xf, RK30_GRF_BASE + GRF_IO_CON3);
+    val = readl(RK30_GRF_BASE + GRF_SOC_CON2);
+    writel(0x1 << 6 | 0x1 << 22 | val, RK30_GRF_BASE + GRF_SOC_CON2);
+
     return 0;
 }
 
 static int rk30_rmii_io_init(void)
 {
     int err;
-    printk("enter %s ",__func__);
+    printk("enter %s \n",__func__);
 
     iomux_set(RMII_TXEN);
     iomux_set(RMII_TXD1);
     iomux_set(RMII_TXD0);
     iomux_set(RMII_RXD0);
     iomux_set(RMII_RXD1);
-    iomux_set(RMII_CLKOUT);
+#ifdef RMII_EXT_CLK
+    iomux_set(RMII_CLKIN);
+#else
+    iomux_set(RMII_CLKOUT);  
+#endif
     iomux_set(RMII_RXERR);
     iomux_set(RMII_CRS);
     iomux_set(RMII_MD);
@@ -44,7 +50,7 @@ static int rk30_rmii_io_init(void)
 static int rk30_rmii_io_deinit(void)
 {
     //phy power down
-    printk("enter %s ",__func__);
+    printk("enter %s \n",__func__);
 
     if(INVALID_GPIO != PHY_PWR_EN_GPIO)
     {
@@ -58,7 +64,7 @@ static int rk30_rmii_io_deinit(void)
 
 static int rk30_rmii_power_control(int enable)
 {
-    printk("enter %s ,enable = %d ",__func__,enable);
+    printk("enter %s ,enable = %d \n",__func__,enable);
 
     if (enable){
            iomux_set(RMII_TXEN);
@@ -66,7 +72,11 @@ static int rk30_rmii_power_control(int enable)
            iomux_set(RMII_TXD0);
            iomux_set(RMII_RXD0);
            iomux_set(RMII_RXD1);
+#ifdef RMII_EXT_CLK
+            iomux_set(RMII_CLKIN);
+#else
            iomux_set(RMII_CLKOUT);
+#endif 
            iomux_set(RMII_RXERR);
            iomux_set(RMII_CRS);
            iomux_set(RMII_MD);
@@ -100,10 +110,19 @@ static int rk29_vmac_speed_switch(int speed)
     }
 }
 
+static int rk30_rmii_extclk_sel(void)
+{
+#ifdef RMII_EXT_CLK
+    rmii_extclk_sel = 1; //0:select internal divider clock, 1:select external input clock
+#endif 
+    return rmii_extclk_sel; 
+}
+
 struct rk29_vmac_platform_data board_vmac_data = {
        .vmac_register_set = rk30_vmac_register_set,
        .rmii_io_init = rk30_rmii_io_init,
        .rmii_io_deinit = rk30_rmii_io_deinit,
        .rmii_power_control = rk30_rmii_power_control,
        .rmii_speed_switch = rk29_vmac_speed_switch,
+    .rmii_extclk_sel = rk30_rmii_extclk_sel,
 };
index 6805fbe04f0220b80d099fac2e3c98834a1c362a..f718a942ff558987e29f2c4f0eeb4cdb9e537d48 100755 (executable)
@@ -1115,6 +1115,7 @@ struct platform_device pwm_regulator_device[1] = {
 #define PHY_PWR_EN_GPIO  INVALID_GPIO
 #define PHY_PWR_EN_IOMUX GPIO3_D2 
 #define PHY_PWR_EN_VALUE GPIO_HIGH
+#define RMII_EXT_CLK
 #include "../mach-rk30/board-rk31-sdk-vmac.c"
 #endif
 
index 89fc19aa1733a19f15c11013f8078649e86c6491..b149bcdc6c41eeaa2b67e4046d31a9cea6c6fb48 100755 (executable)
@@ -274,6 +274,7 @@ struct rk29_vmac_platform_data {
        int (*rmii_io_deinit)(void);
        int (*rmii_power_control)(int enable);
         int(*rmii_speed_switch)(int speed);
+        int(*rmii_extclk_sel)(void);
 };
 /* adc battery */
 #define LCDC_ON 0x0001
index d32da064eaad113f4fe13a7d5709caa2397a64fb..d5c24dcfec1e03b1b611080ab5d86d919b7aafa6 100755 (executable)
@@ -1037,6 +1037,8 @@ int vmac_open(struct net_device *dev)
        struct clk *mac_parent = NULL;\r
        struct clk *arm_clk = NULL;\r
        struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data;\r
+       unsigned char current_mac[6];\r
+       int ret = 0;\r
 \r
        printk("enter func %s...\n", __func__);\r
 \r
@@ -1048,7 +1050,7 @@ int vmac_open(struct net_device *dev)
        ap->shutdown = 0;\r
                \r
        //set rmii ref clock 50MHz\r
-       mac_clk = clk_get(NULL, "mac_ref_div");\r
+       mac_clk = clk_get(NULL, "mac_ref");\r
        if (IS_ERR(mac_clk))\r
                mac_clk = NULL;\r
        arm_clk = clk_get(NULL, "arm_pll");\r
@@ -1061,7 +1063,17 @@ int vmac_open(struct net_device *dev)
        }\r
        if (arm_clk && mac_parent && (arm_clk == mac_parent))\r
                wake_lock(&idlelock);\r
-       \r
+\r
+        if(pdata && pdata->rmii_extclk_sel && pdata->rmii_extclk_sel())\r
+        {\r
+            struct clk * mac_clkin = NULL;\r
+            mac_clkin = clk_get(NULL, "rmii_clkin");\r
+            if (IS_ERR(mac_clkin)) {\r
+                pr_err("mac_clkin get fail\n");\r
+            }\r
+            clk_set_parent(mac_clk, mac_clkin); \r
+        }\r
+        \r
        clk_set_rate(mac_clk, 50000000);\r
        clk_enable(mac_clk);\r
        clk_enable(clk_get(NULL,"mii_rx"));\r
@@ -1070,16 +1082,70 @@ int vmac_open(struct net_device *dev)
        clk_enable(clk_get(NULL,"mac_ref"));\r
 \r
        //phy power on\r
-       if (pdata && pdata->rmii_power_control) {\r
-        pdata->rmii_power_control(0);\r
-        msleep(100);\r
+       if (pdata && pdata->rmii_power_control)\r
                pdata->rmii_power_control(1);\r
-    }\r
 \r
        msleep(1000);\r
 \r
        vmac_hw_init(dev);\r
 \r
+//$_rbox_$_modify_$_chenxiao\r
+       if (is_valid_ether_addr(dev->dev_addr)){\r
+               strlcpy(current_mac,dev->dev_addr,6);\r
+       }\r
+\r
+#ifdef CONFIG_ETH_MAC_FROM_EEPROM\r
+       ret = eeprom_read_data(0,dev->dev_addr,6);\r
+       if (ret != 6){\r
+               printk("read mac from Eeprom fail.\n");\r
+       }else {\r
+               if (is_valid_ether_addr(dev->dev_addr)){\r
+                       printk("eth_mac_from_eeprom***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
+                                               dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
+                                               dev->dev_addr[4],dev->dev_addr[5] );\r
+               }\r
+       }\r
+#endif\r
+\r
+#ifdef CONFIG_ETH_MAC_FROM_IDB\r
+       err = eth_mac_idb(dev->dev_addr);\r
+       if (err) {\r
+               printk("read mac from IDB fail.\n");\r
+       } else {\r
+               if (is_valid_ether_addr(dev->dev_addr)) {\r
+                       printk("eth_mac_from_idb***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
+                                               dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
+                                               dev->dev_addr[4],dev->dev_addr[5] );\r
+               }\r
+       }\r
+#endif\r
+\r
+#ifdef CONFIG_ETH_MAC_FROM_WIFI_MAC\r
+       err = eth_mac_wifi(dev->dev_addr);\r
+       if (err) {\r
+               printk("read mac from Wifi  fail.\n");\r
+       } else {\r
+               if (is_valid_ether_addr(dev->dev_addr)) {\r
+                       printk("eth_mac_from_wifi_mac***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
+                                               dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
+                                               dev->dev_addr[4],dev->dev_addr[5] );\r
+               }\r
+       }\r
+#endif\r
+\r
+#ifdef CONFIG_ETH_MAC_FROM_SECURE_CHIP\r
+\r
+#endif\r
+         \r
+\r
+       if (!is_valid_ether_addr(dev->dev_addr)) {\r
+               strlcpy(dev->dev_addr,current_mac,6);\r
+               printk("eth_mac_from_RANDOM***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
+                                               dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
+                                               dev->dev_addr[4],dev->dev_addr[5] );\r
+       }\r
+//add end      \r
+\r
        /* mac address changed? */\r
        write_mac_reg(dev, dev->dev_addr);\r
 \r
@@ -1552,56 +1618,8 @@ static int __devinit vmac_probe(struct platform_device *pdev)
        /* mac address intialize, set vmac_open  */\r
        read_mac_reg(dev, dev->dev_addr);\r
 \r
-       if (!is_valid_ether_addr(dev->dev_addr)) {\r
-       //add by cx@rock-chips.com\r
-       \r
-       #ifdef CONFIG_ETH_MAC_FROM_EEPROM\r
-               ret = eeprom_read_data(0,dev->dev_addr,6);\r
-               if (ret != 6){\r
-                       printk("read mac from Eeprom fail.\n");\r
-               }else {\r
-                       if (is_valid_ether_addr(dev->dev_addr)){\r
-                               printk("eth_mac_from_eeprom***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
-                                                       dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
-                                                       dev->dev_addr[4],dev->dev_addr[5] );\r
-                       }\r
-               }\r
-       #endif\r
-       \r
-       #ifdef CONFIG_ETH_MAC_FROM_IDB\r
-               err = eth_mac_idb(dev->dev_addr);\r
-               if (err) {\r
-                       printk("read mac from IDB fail.\n");\r
-               } else {\r
-                       if (is_valid_ether_addr(dev->dev_addr)) {\r
-                               printk("eth_mac_from_idb***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
-                                                       dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
-                                                       dev->dev_addr[4],dev->dev_addr[5] );\r
-                       }\r
-               }\r
-       #endif\r
-       \r
-       /*#ifdef CONFIG_ETH_MAC_FROM_WIFI_MAC\r
-               err = eth_mac_wifi(dev->dev_addr);\r
-               if (err) {\r
-                       printk("read mac from Wifi  fail.\n");\r
-               } else {\r
-                       if (is_valid_ether_addr(dev->dev_addr)) {\r
-                               printk("eth_mac_from_wifi_mac***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
-                                                       dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
-                                                       dev->dev_addr[4],dev->dev_addr[5] );\r
-                       }\r
-               }\r
-       #endif*/\r
-       \r
-       #ifdef CONFIG_ETH_MAC_FROM_RANDOM\r
-           random_ether_addr(dev->dev_addr);\r
-        printk("random_ether_addr***********:%X:%X:%X:%X:%X:%X\n",dev->dev_addr[0],\r
-                                 dev->dev_addr[1],dev->dev_addr[2],dev->dev_addr[3],\r
-                                 dev->dev_addr[4],dev->dev_addr[5] );  \r
-       #endif\r
-       //add end       \r
-       }\r
+       if (!is_valid_ether_addr(dev->dev_addr))\r
+               random_ether_addr(dev->dev_addr);\r
 \r
        err = register_netdev(dev);\r
        if (err) {\r
@@ -1702,8 +1720,11 @@ rk29_vmac_suspend(struct device *dev)
                        netif_stop_queue(ndev);\r
                        netif_device_detach(ndev);\r
                        if (ap->suspending == 0) {\r
+//$_rbox_$_modify_$_chenzhi: for ethernet sleep\r
+#if 0\r
                                vmac_shutdown(ndev);\r
                                rk29_vmac_power_off(ndev);\r
+#endif\r
                                ap->suspending = 1;\r
                        }\r
                }\r
@@ -1722,6 +1743,12 @@ rk29_vmac_resume(struct device *dev)
                if (ap->open_flag == 1) {\r
                        netif_device_attach(ndev);\r
                        netif_start_queue(ndev);\r
+//$_rbox_$_modify_$_chenzhi: \r
+//$_rbox_$_modify_$_begin\r
+                       if (ap->suspending == 1) {\r
+                               ap->suspending = 0;\r
+                       }\r
+//$_rbox_$_modify_$_end\r
                }\r
        }\r
        return 0;\r