#include <linux/platform_device.h>\r
#include <linux/slab.h>\r
#include <linux/types.h>\r
+#include <linux/wakelock.h>\r
\r
#include <mach/iomux.h>\r
#include <mach/gpio.h>\r
#include <mach/cru.h>\r
#include <mach/board.h>\r
+\r
#include "rk29_vmac.h"\r
\r
+static struct wake_lock idlelock; /* add by lyx @ 20110302 */\r
+\r
/* Register access macros */\r
#define vmac_writel(port, value, reg) \\r
writel((value), (port)->regs + reg##_OFFSET)\r
struct phy_device *phydev;\r
unsigned int temp;\r
int err = 0;\r
+ struct clk *mac_clk = NULL;\r
+ struct clk *mac_parent = NULL;\r
+ struct clk *arm_clk = NULL;\r
struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data;\r
\r
if (ap == NULL)\r
ap->shutdown = 0;\r
\r
//set rmii ref clock 50MHz\r
- clk_set_rate(clk_get(NULL, "mac_ref_div"), 50000000);\r
+ mac_clk = clk_get(NULL, "mac_ref_div");\r
+ arm_clk = clk_get(NULL, "arm_pll");\r
+ mac_parent = clk_get_parent(mac_clk);\r
+ if (arm_clk && mac_parent && (arm_clk == mac_parent))\r
+ wake_lock(&idlelock);\r
+ \r
+ clk_set_rate(mac_clk, 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
free_irq(dev->irq, dev);\r
err_free_buffers:\r
free_buffers(dev);\r
-err_out:\r
+err_out: \r
+ if (arm_clk && mac_parent && (arm_clk == mac_parent))\r
+ wake_unlock(&idlelock);\r
+\r
return err;\r
}\r
\r
{\r
struct vmac_priv *ap = netdev_priv(dev);\r
unsigned int temp;\r
+ struct clk *mac_clk = NULL;\r
+ struct clk *arm_clk = NULL;\r
+ struct clk *mac_parent = NULL;\r
struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data;\r
\r
netif_stop_queue(dev);\r
\r
free_buffers(dev);\r
\r
- //set rmii ref clock 50MHz\r
+ //phy power off\r
+ if (pdata && pdata->rmii_power_control)\r
+ pdata->rmii_power_control(0);\r
+\r
+ //clock close\r
+ mac_clk = clk_get(NULL, "mac_ref_div");\r
+ mac_parent = clk_get_parent(mac_clk); \r
+ arm_clk = clk_get(NULL, "arm_pll");\r
+\r
+ if (arm_clk && mac_parent && (arm_clk == mac_parent))\r
+ wake_unlock(&idlelock);\r
+ \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
\r
char *addrs;\r
struct netdev_hw_addr_list *list = &dev->dev_addrs;\r
\r
- printk("-----------------func %s-------------------\n", __func__);\r
+ //printk("-----------------func %s-------------------\n", __func__);\r
\r
WARN_ON(dev->mc_count == 0);\r
WARN_ON(dev->flags & IFF_ALLMULTI);\r
unsigned long flags, bitmask[2];\r
int promisc, reg;\r
\r
- printk("-----------------func %s-------------------\n", __func__);\r
+ //printk("-----------------func %s-------------------\n", __func__);\r
\r
spin_lock_irqsave(&ap->lock, flags);\r
\r
dev->irq, dev->dev_addr);\r
platform_set_drvdata(pdev, dev);\r
\r
+ wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "vmac");\r
+\r
//config rk29 vmac as rmii, 100MHz \r
if (pdata && pdata->vmac_register_set)\r
pdata->vmac_register_set();\r
struct resource *res;\r
struct rk29_vmac_platform_data *pdata = pdev->dev.platform_data;\r
\r
+ wake_lock_destroy(&idlelock);\r
+\r
//power gpio deinit, phy power off\r
if (pdata && pdata->rmii_io_deinit)\r
pdata->rmii_io_deinit();\r