//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
}\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
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
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
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
},\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