newton: add irda suspend and resume functions
authorlyx <lyx@rock-chips.com>
Wed, 6 Jul 2011 07:53:38 +0000 (00:53 -0700)
committerlyx <lyx@rock-chips.com>
Fri, 8 Jul 2011 06:07:19 +0000 (23:07 -0700)
drivers/net/irda/bu92725guw.c
drivers/net/irda/rk29_ir.c

index 78340f7d45f5bbf8acb523dd3962d74937d12c8b..04fb82936233851e72739498865783fe1c5060a0 100755 (executable)
@@ -128,8 +128,8 @@ int irda_hw_shutdown(struct rk29_irda *si)
 //PWR/FIT (default)\r
        BU92725GUW_WRITE_REG(REG_PWR_FIT_ADDR, REG_PWR_FIT_MPW_3 | REG_PWR_FIT_FPW_2 | REG_PWR_FIT_FIT_0);\r
 \r
-//TRCR (idle, clr fifo, IrDA power down)\r
-       BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_FCLR | REG_TRCR_IRPD);\r
+//TRCR (idle, clr fifo, IrDA , rx, tx power down)\r
+       BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_FCLR | REG_TRCR_IRPD |REG_TRCR_TXPWD | REG_TRCR_RXPWD);\r
 \r
 //FTLV\r
        BU92725GUW_WRITE_REG(REG_FTLV_ADDR, 0x0000);\r
@@ -660,34 +660,6 @@ static void internal_set(u8 modeChg)
                }\r
        }\r
 \r
-       /* TRCR */\r
-       switch (curTrans_way) {\r
-       case BU92725GUW_IDLE:\r
-               val = 0x0000;\r
-               break;\r
-       case BU92725GUW_REV:\r
-       case BU92725GUW_MIR_REV: \r
-       case BU92725GUW_FIR_REV:\r
-               val = REG_TRCR_RX_EN;\r
-               break;\r
-       case BU92725GUW_AUTO_MULTI_REV:\r
-               val = REG_TRCR_RX_EN | REG_TRCR_AUTO_FLV_CP;\r
-               break;\r
-       case BU92725GUW_MULTI_REV: \r
-               val = REG_TRCR_RX_EN | REG_TRCR_RX_CON;//FIR\r
-               break;\r
-       case BU92725GUW_SEND:\r
-       case BU92725GUW_MIR_SEND:\r
-       case BU92725GUW_FIR_SEND:\r
-               val = 0x0000;\r
-               break;          \r
-       case BU92725GUW_MULTI_SEND:\r
-               val = REG_TRCR_TX_CON;\r
-               break;\r
-       }\r
-       BU92725GUW_WRITE_REG(REG_TRCR_ADDR, val);\r
-       RK29IR_DBG("REG_TRCR_ADDR: 0x%x\n", val);\r
-\r
        /* IER */\r
        switch (curTrans_way) {\r
        case BU92725GUW_IDLE:\r
@@ -734,6 +706,34 @@ static void internal_set(u8 modeChg)
        BU92725GUW_WRITE_REG(REG_IER_ADDR, val);\r
        RK29IR_DBG("REG_IER_ADDR: 0x%x\n", val);\r
        \r
+       /* TRCR */\r
+       switch (curTrans_way) {\r
+       case BU92725GUW_IDLE:\r
+               val = 0x0000;\r
+               break;\r
+       case BU92725GUW_REV:\r
+       case BU92725GUW_MIR_REV: \r
+       case BU92725GUW_FIR_REV:\r
+               val = REG_TRCR_RX_EN;\r
+               break;\r
+       case BU92725GUW_AUTO_MULTI_REV:\r
+               val = REG_TRCR_RX_EN | REG_TRCR_AUTO_FLV_CP;\r
+               break;\r
+       case BU92725GUW_MULTI_REV: \r
+               val = REG_TRCR_RX_EN | REG_TRCR_RX_CON;//FIR\r
+               break;\r
+       case BU92725GUW_SEND:\r
+       case BU92725GUW_MIR_SEND:\r
+       case BU92725GUW_FIR_SEND:\r
+               val = 0x0000;\r
+               break;          \r
+       case BU92725GUW_MULTI_SEND:\r
+               val = REG_TRCR_TX_CON;\r
+               break;\r
+       }\r
+       BU92725GUW_WRITE_REG(REG_TRCR_ADDR, val);\r
+       RK29IR_DBG("REG_TRCR_ADDR: 0x%x\n", val);\r
+       \r
 }\r
 \r
 \r
index 64fe7ea4249096a42ff7a90198f128021c5e28aa..735758595bf4690aa6309e6a8f8df9520552d209 100755 (executable)
@@ -378,6 +378,8 @@ static int rk29_irda_start(struct net_device *dev)
 err_irlap:\r
        si->open = 0;\r
        irda_hw_shutdown(si);\r
+       if (si->pdata->irda_pwr_ctl)\r
+               si->pdata->irda_pwr_ctl(0);\r
 err_startup:\r
        free_irq(dev->irq, dev);\r
 err_irq:\r
@@ -678,6 +680,78 @@ static int rk29_irda_remove(struct platform_device *pdev)
        return 0;\r
 }\r
 \r
+#ifdef CONFIG_PM\r
+/*\r
+ * Suspend the IrDA interface.\r
+ */\r
+static int rk29_irda_suspend(struct platform_device *pdev, pm_message_t state)\r
+{\r
+       struct net_device *dev = platform_get_drvdata(pdev);\r
+       struct rk29_irda *si;\r
+\r
+       if (!dev)\r
+               return 0;\r
+\r
+       si = netdev_priv(dev);\r
+       if (si->open) {\r
+               /*\r
+                * Stop the transmit queue\r
+                */\r
+               netif_device_detach(dev);\r
+               disable_irq(dev->irq);\r
+               irda_hw_shutdown(si);\r
+               if (si->pdata->irda_pwr_ctl)\r
+                       si->pdata->irda_pwr_ctl(0);\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+/*\r
+ * Resume the IrDA interface.\r
+ */\r
+static int rk29_irda_resume(struct platform_device *pdev)\r
+{\r
+       struct net_device *dev = platform_get_drvdata(pdev);\r
+       struct rk29_irda *si;\r
+\r
+       if (!dev)\r
+               return 0;\r
+\r
+       si = netdev_priv(dev);\r
+       if (si->open) {\r
+               \r
+               if (si->pdata->irda_pwr_ctl)\r
+                       si->pdata->irda_pwr_ctl(1);\r
+\r
+               /*\r
+                * If we missed a speed change, initialise at the new speed\r
+                * directly.  It is debatable whether this is actually\r
+                * required, but in the interests of continuing from where\r
+                * we left off it is desireable.  The converse argument is\r
+                * that we should re-negotiate at 9600 baud again.\r
+                */\r
+               if (si->newspeed) {\r
+                       si->speed = si->newspeed;\r
+                       si->newspeed = 0;\r
+               }\r
+               \r
+               irda_hw_startup(si);\r
+               enable_irq(dev->irq);\r
+\r
+               /*\r
+                * This automatically wakes up the queue\r
+                */\r
+               netif_device_attach(dev);\r
+       }\r
+\r
+       return 0;\r
+}\r
+#else\r
+#define rk29_irda_suspend      NULL\r
+#define rk29_irda_resume       NULL\r
+#endif\r
+\r
 \r
 static struct platform_driver irda_driver = {\r
        .driver = {\r
@@ -686,8 +760,8 @@ static struct platform_driver irda_driver = {
        },\r
        .probe = rk29_irda_probe,\r
        .remove = rk29_irda_remove,\r
-       //.suspend = rk29_irda_suspend,\r
-       //.resume = rk29_irda_resume,\r
+       .suspend = rk29_irda_suspend,\r
+       .resume = rk29_irda_resume,\r
 };\r
 \r
 static int __init irda_init(void)\r