rk29 vmac: add power, clock control when open or close vmac for power reduce
authorlyx <lyx@rock-chips.com>
Tue, 28 Dec 2010 06:27:53 +0000 (22:27 -0800)
committerlyx <lyx@rock-chips.com>
Tue, 28 Dec 2010 06:28:20 +0000 (22:28 -0800)
arch/arm/mach-rk29/board-rk29sdk.c
arch/arm/mach-rk29/include/mach/board.h
drivers/net/rk29_vmac.c

index 9b99fd19628fd65b99079f6ccb6f7036d7cddf47..c56d250d023cb14d51102816031cfffa102ae4dd 100755 (executable)
@@ -1324,54 +1324,48 @@ static int rk29_rmii_io_init(void)
 {
        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,
 };
 
index 93fceaf0169eced9fbb9e51aaf5e5f32288fdf7c..7a6a671f7ff566865e8299dbffd71251cdbd506b 100755 (executable)
@@ -40,6 +40,7 @@ struct rk29xx_spi_platform_data {
 struct rk29_vmac_platform_data {
        int (*vmac_register_set)(void);
        int (*rmii_io_init)(void);
+       int (*rmii_io_deinit)(void);
     int (*rmii_power_control)(int enable);
 };
 
index a1b5df3315d22d9016643be34c7dabd65fa70815..2548cffbb0b0de80f8c2dede7e556ee9e3f52825 100755 (executable)
@@ -1020,12 +1020,26 @@ int vmac_open(struct net_device *dev)
        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
@@ -1096,6 +1110,7 @@ int vmac_close(struct net_device *dev)
 {\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
@@ -1124,6 +1139,16 @@ int vmac_close(struct net_device *dev)
        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
@@ -1436,15 +1461,8 @@ static int __devinit vmac_probe(struct platform_device *pdev)
        //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
@@ -1464,6 +1482,11 @@ static int __devexit vmac_remove(struct platform_device *pdev)
        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