{
int err;
- //set dm9161 rmii
- rk29_mux_api_set(GPIO2D3_I2S0SDI_MIICOL_NAME, GPIO2H_GPIO2D3);
- err = gpio_request(RK29_PIN2_PD3, "rmii");
- if (err) {
- gpio_free(RK29_PIN2_PD3);
- printk("-------request RK29_PIN2_PD3 fail--------\n");
- return -1;
- }
- gpio_direction_output(RK29_PIN2_PD3, GPIO_HIGH);
- gpio_set_value(RK29_PIN2_PD3, GPIO_HIGH);
-
- //rmii power on
- err = gpio_request(RK29_PIN6_PB0, "rmii_power_en");
+ //phy power gpio
+ err = gpio_request(RK29_PIN6_PB0, "phy_power_en");
if (err) {
gpio_free(RK29_PIN6_PB0);
- gpio_free(RK29_PIN2_PD3);
printk("-------request RK29_PIN6_PB0 fail--------\n");
return -1;
}
- gpio_direction_output(RK29_PIN6_PB0, GPIO_HIGH);
- gpio_set_value(RK29_PIN6_PB0, GPIO_HIGH);
+ //phy power down
+ gpio_direction_output(RK29_PIN6_PB0, GPIO_LOW);
+ gpio_set_value(RK29_PIN6_PB0, GPIO_LOW);
return 0;
}
+static int rk29_rmii_io_deinit(void)
+{
+ //phy power down
+ gpio_direction_output(RK29_PIN6_PB0, GPIO_LOW);
+ gpio_set_value(RK29_PIN6_PB0, GPIO_LOW);
+ //free
+ gpio_free(RK29_PIN6_PB0);
+ return 0;
+}
+
static int rk29_rmii_power_control(int enable)
{
if (enable) {
- //set dm9161 as rmii
- gpio_direction_output(RK29_PIN2_PD3, GPIO_HIGH);
- gpio_set_value(RK29_PIN2_PD3, GPIO_HIGH);
-
- //enable rmii power
+ //enable phy power
gpio_direction_output(RK29_PIN6_PB0, GPIO_HIGH);
gpio_set_value(RK29_PIN6_PB0, GPIO_HIGH);
-
}
else {
gpio_direction_output(RK29_PIN6_PB0, GPIO_LOW);
gpio_set_value(RK29_PIN6_PB0, GPIO_LOW);
}
-
return 0;
}
struct rk29_vmac_platform_data rk29_vmac_pdata = {
.vmac_register_set = rk29_vmac_register_set,
.rmii_io_init = rk29_rmii_io_init,
+ .rmii_io_deinit = rk29_rmii_io_deinit,
.rmii_power_control = rk29_rmii_power_control,
};
struct phy_device *phydev;\r
unsigned int temp;\r
int err = 0;\r
+ struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data;\r
\r
if (ap == NULL)\r
return -ENODEV;\r
\r
ap->shutdown = 0;\r
- \r
+ \r
+ //set rmii ref clock 50MHz\r
+ clk_set_rate(clk_get(NULL, "mac_ref_div"), 50000000);\r
+ clk_enable(clk_get(NULL,"mii_rx"));\r
+ clk_enable(clk_get(NULL,"mii_tx"));\r
+ clk_enable(clk_get(NULL,"hclk_mac"));\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(1);\r
+\r
+ msleep(1000);\r
+\r
vmac_hw_init(dev);\r
\r
/* mac address changed? */\r
{\r
struct vmac_priv *ap = netdev_priv(dev);\r
unsigned int temp;\r
+ struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data;\r
\r
netif_stop_queue(dev);\r
napi_disable(&ap->napi);\r
wmb();\r
\r
free_buffers(dev);\r
+\r
+ //set rmii ref clock 50MHz\r
+ clk_disable(clk_get(NULL,"mii_rx"));\r
+ clk_disable(clk_get(NULL,"mii_tx"));\r
+ clk_disable(clk_get(NULL,"hclk_mac"));\r
+ clk_disable(clk_get(NULL,"mac_ref"));\r
+\r
+ //phy power off\r
+ if (pdata && pdata->rmii_power_control)\r
+ pdata->rmii_power_control(0);\r
\r
return 0;\r
}\r
//config rk29 vmac as rmii, 100MHz \r
if (pdata && pdata->vmac_register_set)\r
pdata->vmac_register_set();\r
- \r
- //set rmii ref clock 50MHz\r
- sys_clk = clk_get(NULL, "mac_ref_div");////////\r
- clk_set_rate(sys_clk,50000000);\r
-\r
- sys_clk = clk_get(NULL, "mac_ref");////////\r
- clk_set_rate(sys_clk,50000000);\r
\r
- //power on\r
+ //power gpio init, phy power off default for power reduce\r
if (pdata && pdata->rmii_io_init)\r
pdata->rmii_io_init();\r
\r
struct net_device *dev;\r
struct vmac_priv *ap;\r
struct resource *res;\r
+ struct rk29_vmac_platform_data *pdata = pdev->dev.platform_data;\r
+\r
+ //power gpio deinit, phy power off\r
+ if (pdata && pdata->rmii_io_deinit)\r
+ pdata->rmii_io_deinit();\r
\r
dev = platform_get_drvdata(pdev);\r
if (!dev) {\r