-//$_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);
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)
{
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);
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);
}
}
+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,
};
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
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
}\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
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
/* 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
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
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