newton: update irda driver
authorlyx <lyx@rock-chips.com>
Fri, 8 Jul 2011 06:06:19 +0000 (23:06 -0700)
committerlyx <lyx@rock-chips.com>
Fri, 8 Jul 2011 06:07:20 +0000 (23:07 -0700)
support FIR mode

drivers/net/irda/bu92725guw.c
drivers/net/irda/bu92725guw.h
drivers/net/irda/rk29_ir.c

index 04fb82936233851e72739498865783fe1c5060a0..866e666e89c3886d663225244a7ad32ed3830cc8 100755 (executable)
@@ -192,31 +192,31 @@ int irda_hw_set_speed(u32 speed)
                if (mode == BU92725GUW_MIR)\r
                        curTrans_way = BU92725GUW_MIR_REV;\r
                else if (mode == BU92725GUW_FIR)\r
-                       //curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
+                       curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
                        //curTrans_way = BU92725GUW_MULTI_REV;\r
-                       curTrans_way = BU92725GUW_FIR_REV;\r
+                       //curTrans_way = BU92725GUW_FIR_REV;\r
                break;\r
        case BU92725GUW_SEND:\r
                if (mode == BU92725GUW_MIR)\r
                        curTrans_way = BU92725GUW_MIR_SEND;\r
                else if (mode == BU92725GUW_FIR)\r
-                       //curTrans_way = BU92725GUW_MULTI_SEND;\r
-                       curTrans_way = BU92725GUW_FIR_SEND;\r
+                       curTrans_way = BU92725GUW_MULTI_SEND;\r
+                       //curTrans_way = BU92725GUW_FIR_SEND;\r
                break;\r
        case BU92725GUW_MIR_REV:\r
                if (mode == BU92725GUW_SIR)\r
                        curTrans_way = BU92725GUW_REV;\r
                else if (mode == BU92725GUW_FIR)\r
-                       //curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
+                       curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
                        //curTrans_way = BU92725GUW_MULTI_REV;\r
-                       curTrans_way = BU92725GUW_FIR_REV;\r
+                       //curTrans_way = BU92725GUW_FIR_REV;\r
                break;\r
        case BU92725GUW_MIR_SEND:\r
                if (mode == BU92725GUW_SIR)\r
                        curTrans_way = BU92725GUW_SEND;\r
                else if (mode == BU92725GUW_FIR)\r
-                       //curTrans_way = BU92725GUW_MULTI_SEND;\r
-                       curTrans_way = BU92725GUW_FIR_SEND;\r
+                       curTrans_way = BU92725GUW_MULTI_SEND;\r
+                       //curTrans_way = BU92725GUW_FIR_SEND;\r
                break;\r
        case BU92725GUW_FIR_REV:\r
        case BU92725GUW_AUTO_MULTI_REV:\r
@@ -260,8 +260,8 @@ int irda_hw_tx_enable_irq(enum eTrans_Mode mode)
        else if (mode == BU92725GUW_MIR)\r
                BU92725GUW_set_trans_way(BU92725GUW_MIR_SEND);\r
        else\r
-               //BU92725GUW_set_trans_way(BU92725GUW_MULTI_SEND);\r
-               BU92725GUW_set_trans_way(BU92725GUW_FIR_SEND);\r
+               BU92725GUW_set_trans_way(BU92725GUW_MULTI_SEND);\r
+               //BU92725GUW_set_trans_way(BU92725GUW_FIR_SEND);\r
        //BU92725GUW_clr_fifo();\r
 \r
     return 0;\r
@@ -318,9 +318,9 @@ void irda_hw_set_moderx(void)
        else if (curTrans_mode == BU92725GUW_MIR)\r
                BU92725GUW_set_trans_way(BU92725GUW_MIR_REV);\r
        else\r
-               //BU92725GUW_set_trans_way(BU92725GUW_AUTO_MULTI_REV);\r
+               BU92725GUW_set_trans_way(BU92725GUW_AUTO_MULTI_REV);\r
                //BU92725GUW_set_trans_way(BU92725GUW_MULTI_REV);\r
-               BU92725GUW_set_trans_way(BU92725GUW_FIR_REV);\r
+               //BU92725GUW_set_trans_way(BU92725GUW_FIR_REV);\r
 }\r
 \r
 int irda_hw_get_mode(void)\r
@@ -392,6 +392,10 @@ u16 BU92725GUW_get_data(u8 *buf)
 \r
        RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
 \r
+       if (curTrans_way == BU92725GUW_MULTI_REV) {\r
+               BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_FLV_CP|REG_TRCR_RX_CON|REG_TRCR_RX_EN);\r
+       }\r
+\r
        /* get data count from FLV or FLVII */\r
        if ((curTrans_way == BU92725GUW_REV) || (curTrans_way == BU92725GUW_MIR_REV)\r
                || (curTrans_way == BU92725GUW_FIR_REV))\r
@@ -659,6 +663,34 @@ static void internal_set(u8 modeChg)
                        val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\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
@@ -676,18 +708,18 @@ static void internal_set(u8 modeChg)
                break;\r
                \r
        case BU92725GUW_FIR_REV: /* FIR use */\r
-               val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF \r
+               val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF \\r
                        | REG_INT_AC | REG_INT_DECE; //IER1,2, 4, 5, 6, 7\r
                break;\r
                \r
        case BU92725GUW_MULTI_REV: /* not used */\r
-               val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | \r
-                         REG_INT_RDOE | REG_INT_DEX | REG_INT_RDUE; //IER1,2, 4, 5, 6, 7, 8, 9, 10\r
+               val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE\ \r
+                        | REG_INT_RDOE | REG_INT_DEX | REG_INT_RDUE; //IER1,2, 4, 5, 6, 7, 8, 9, 10\r
                break;\r
        \r
        case BU92725GUW_AUTO_MULTI_REV: /* M/FIR use */\r
-               val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | \r
-                         REG_INT_RDOE | REG_INT_DEX | REG_INT_RDE; //IER2, 4, 5, 6, 7, 8, 9, 12\r
+               val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE\\r
+                        | REG_INT_RDOE | REG_INT_DEX | REG_INT_RDE; //IER2, 4, 5, 6, 7, 8, 9, 12\r
                break;\r
                \r
        case BU92725GUW_SEND: /* SIR use */\r
@@ -704,37 +736,16 @@ static void internal_set(u8 modeChg)
                break;\r
        }\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
+       RK29IR_DBG("REG_IER_ADDR: 0x%x\n", val);        \r
 }\r
 \r
+void BU92725GUW_dump_register(void)\r
+{\r
+       printk("bu92725 register value:\n");\r
+       printk("MCR: 0x%x\n", BU92725GUW_READ_REG(REG_MCR_ADDR));\r
+       printk("FIT: 0x%x\n", BU92725GUW_READ_REG(REG_PWR_FIT_ADDR));\r
+       printk("TRCR: 0x%x\n", BU92725GUW_READ_REG(REG_TRCR_ADDR));\r
+       printk("IER: 0x%x\n", BU92725GUW_READ_REG(REG_IER_ADDR));\r
+}\r
 \r
 \r
index 890fef97bd6f7e72446e7d88fbf42c62533ec7bf..1c3d941a4b56b38c1e48ac12f9235217d915c57e 100755 (executable)
@@ -216,5 +216,7 @@ extern u16 BU92725GUW_get_data(u8 *buf);
 /* send frame data into fifo */\r
 extern void BU92725GUW_send_data(u8 *buf1, u16 len1, u8 *buf2, u16 len2);\r
 \r
+/*dump register*/\r
+extern void BU92725GUW_dump_register(void);\r
 \r
 #endif /*__BU92725GUW_H*/\r
index 735758595bf4690aa6309e6a8f8df9520552d209..802e13e19cf6f2f36291feeb82161c0b62fa9fea 100755 (executable)
@@ -123,8 +123,8 @@ static int rk29_irda_set_speed(struct rk29_irda *si, int speed)
 \r
                si->speed = speed;\r
                \r
-               //irda_hw_set_speed(speed);\r
-               irda_hw_set_speed(1152000);//MIR\r
+               irda_hw_set_speed(speed);\r
+               //irda_hw_set_speed(1152000);//MIR\r
                rk29_irda_rx_alloc(si);\r
 \r
                local_irq_restore(flags);\r
@@ -155,15 +155,16 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
        //disable_irq(dev->irq);\r
    \r
         /* EIR 1, 3, 11, 12 \r
-       irda_setptn |= irq_src & (REG_INT_EOFRX | REG_INT_TXE | REG_INT_WRE | REG_INT_RDE |\r
-                                 REG_INT_CRC | REG_INT_OE | REG_INT_FE | REG_INT_AC | \r
-                                 REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX) ;*/\r
+       irda_setptn |= irq_src & (REG_INT_EOFRX | REG_INT_TXE | REG_INT_WRE | REG_INT_RDE\\r
+                                 | REG_INT_CRC | REG_INT_OE | REG_INT_FE | REG_INT_AC\\r
+                                 REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX) ;*/\r
        irda_setptn = irq_src;\r
 \r
        /* error */\r
-       if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE | \r
-               REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) {\r
+       if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE\r
+               REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) {\r
         RK29IR_DBG("[%s][%d]: do err\n",__FUNCTION__,__LINE__);\r
+               //BU92725GUW_dump_register();\r
                BU92725GUW_clr_fifo();\r
                BU92725GUW_reset();\r
     }\r
@@ -171,7 +172,7 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
     if (IS_FIR(si))  //FIR\r
     {\r
         RK29IR_DBG("[%s][%d]: FIR\n",__FUNCTION__,__LINE__);\r
-        if(irda_hw_get_mode() == BU92725GUW_MIR_REV) {//rx\r
+        if(irda_hw_get_mode() == BU92725GUW_AUTO_MULTI_REV) {//rx\r
                        struct sk_buff *skb = si->rxskb;\r
             RK29IR_DBG("[%s][%d]: rx\n",__FUNCTION__,__LINE__);\r
             if (irda_setptn & (REG_INT_FE | REG_INT_OE | REG_INT_CRC | REG_INT_DECE)) {\r
@@ -183,7 +184,7 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
                     dev->stats.rx_errors++;\r
                 }\r
             }\r
-            if (irda_setptn & FRM_EVT_RX_EOFRX) {\r
+            if (irda_setptn & (FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE)) {\r
                                tmp_len = BU92725GUW_get_data(skb->data+skb->len);\r
                                skb->len += tmp_len;                    \r
             }\r
@@ -213,11 +214,11 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
                                netif_rx(skb);\r
                        }                                               \r
         }\r
-               else if (irda_hw_get_mode() == BU92725GUW_MIR_SEND) {//tx\r
+               else if (irda_hw_get_mode() == BU92725GUW_MULTI_SEND) {//tx\r
                        struct sk_buff *skb = si->txskb;                        \r
                        si->txskb = NULL;\r
             RK29IR_DBG("[%s][%d]: tx\n",__FUNCTION__,__LINE__);\r
-            if (irda_setptn & FRM_EVT_TX_TXE) {\r
+            if (irda_setptn & (FRM_EVT_TX_TXE | FRM_EVT_TX_WRE)) {\r
                                /*\r
                                 * Do we need to change speed?  Note that we're lazy\r
                                 * here - we don't free the old rxskb.  We don't need\r
@@ -479,7 +480,7 @@ static int rk29_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
         unsigned long mtt = irda_get_mtt(skb);\r
                si->txskb = skb;\r
        \r
-          irda_hw_tx_enable_irq(BU92725GUW_MIR);\r
+          irda_hw_tx_enable_irq(BU92725GUW_FIR);\r
 \r
          RK29IR_DATA_DBG("[%d][%s], fir transmit data:\n", __LINE__, __FUNCTION__);\r
          for (i=0;i<skb->len;i++) {\r
@@ -561,7 +562,7 @@ static int rk29_irda_init_iobuf(iobuff_t *io, int size)
 \r
 static void rk29_irda_fir_test(struct work_struct *work)\r
 {\r
-       char send_data[4] = {0,0,0,0};\r
+       char send_data[4] = {1,0,1,0};\r
        irda_hw_tx_enable_irq(BU92725GUW_FIR);\r
        \r
        BU92725GUW_send_data(send_data, 4, NULL, 0);\r