From 5604227bb5795d395fa3738b8af91e547e45b908 Mon Sep 17 00:00:00 2001 From: lyx Date: Thu, 7 Jul 2011 23:06:19 -0700 Subject: [PATCH] newton: update irda driver support FIR mode --- drivers/net/irda/bu92725guw.c | 105 +++++++++++++++++++--------------- drivers/net/irda/bu92725guw.h | 2 + drivers/net/irda/rk29_ir.c | 27 ++++----- 3 files changed, 74 insertions(+), 60 deletions(-) diff --git a/drivers/net/irda/bu92725guw.c b/drivers/net/irda/bu92725guw.c index 04fb82936233..866e666e89c3 100755 --- a/drivers/net/irda/bu92725guw.c +++ b/drivers/net/irda/bu92725guw.c @@ -192,31 +192,31 @@ int irda_hw_set_speed(u32 speed) if (mode == BU92725GUW_MIR) curTrans_way = BU92725GUW_MIR_REV; else if (mode == BU92725GUW_FIR) - //curTrans_way = BU92725GUW_AUTO_MULTI_REV; + curTrans_way = BU92725GUW_AUTO_MULTI_REV; //curTrans_way = BU92725GUW_MULTI_REV; - curTrans_way = BU92725GUW_FIR_REV; + //curTrans_way = BU92725GUW_FIR_REV; break; case BU92725GUW_SEND: if (mode == BU92725GUW_MIR) curTrans_way = BU92725GUW_MIR_SEND; else if (mode == BU92725GUW_FIR) - //curTrans_way = BU92725GUW_MULTI_SEND; - curTrans_way = BU92725GUW_FIR_SEND; + curTrans_way = BU92725GUW_MULTI_SEND; + //curTrans_way = BU92725GUW_FIR_SEND; break; case BU92725GUW_MIR_REV: if (mode == BU92725GUW_SIR) curTrans_way = BU92725GUW_REV; else if (mode == BU92725GUW_FIR) - //curTrans_way = BU92725GUW_AUTO_MULTI_REV; + curTrans_way = BU92725GUW_AUTO_MULTI_REV; //curTrans_way = BU92725GUW_MULTI_REV; - curTrans_way = BU92725GUW_FIR_REV; + //curTrans_way = BU92725GUW_FIR_REV; break; case BU92725GUW_MIR_SEND: if (mode == BU92725GUW_SIR) curTrans_way = BU92725GUW_SEND; else if (mode == BU92725GUW_FIR) - //curTrans_way = BU92725GUW_MULTI_SEND; - curTrans_way = BU92725GUW_FIR_SEND; + curTrans_way = BU92725GUW_MULTI_SEND; + //curTrans_way = BU92725GUW_FIR_SEND; break; case BU92725GUW_FIR_REV: case BU92725GUW_AUTO_MULTI_REV: @@ -260,8 +260,8 @@ int irda_hw_tx_enable_irq(enum eTrans_Mode mode) else if (mode == BU92725GUW_MIR) BU92725GUW_set_trans_way(BU92725GUW_MIR_SEND); else - //BU92725GUW_set_trans_way(BU92725GUW_MULTI_SEND); - BU92725GUW_set_trans_way(BU92725GUW_FIR_SEND); + BU92725GUW_set_trans_way(BU92725GUW_MULTI_SEND); + //BU92725GUW_set_trans_way(BU92725GUW_FIR_SEND); //BU92725GUW_clr_fifo(); return 0; @@ -318,9 +318,9 @@ void irda_hw_set_moderx(void) else if (curTrans_mode == BU92725GUW_MIR) BU92725GUW_set_trans_way(BU92725GUW_MIR_REV); else - //BU92725GUW_set_trans_way(BU92725GUW_AUTO_MULTI_REV); + BU92725GUW_set_trans_way(BU92725GUW_AUTO_MULTI_REV); //BU92725GUW_set_trans_way(BU92725GUW_MULTI_REV); - BU92725GUW_set_trans_way(BU92725GUW_FIR_REV); + //BU92725GUW_set_trans_way(BU92725GUW_FIR_REV); } int irda_hw_get_mode(void) @@ -392,6 +392,10 @@ u16 BU92725GUW_get_data(u8 *buf) RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__); + if (curTrans_way == BU92725GUW_MULTI_REV) { + BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_FLV_CP|REG_TRCR_RX_CON|REG_TRCR_RX_EN); + } + /* get data count from FLV or FLVII */ if ((curTrans_way == BU92725GUW_REV) || (curTrans_way == BU92725GUW_MIR_REV) || (curTrans_way == BU92725GUW_FIR_REV)) @@ -659,6 +663,34 @@ static void internal_set(u8 modeChg) val = BU92725GUW_READ_REG(REG_TRCR_ADDR); } } + + /* TRCR */ + switch (curTrans_way) { + case BU92725GUW_IDLE: + val = 0x0000; + break; + case BU92725GUW_REV: + case BU92725GUW_MIR_REV: + case BU92725GUW_FIR_REV: + val = REG_TRCR_RX_EN; + break; + case BU92725GUW_AUTO_MULTI_REV: + val = REG_TRCR_RX_EN | REG_TRCR_AUTO_FLV_CP; + break; + case BU92725GUW_MULTI_REV: + val = REG_TRCR_RX_EN | REG_TRCR_RX_CON;//FIR + break; + case BU92725GUW_SEND: + case BU92725GUW_MIR_SEND: + case BU92725GUW_FIR_SEND: + val = 0x0000; + break; + case BU92725GUW_MULTI_SEND: + val = REG_TRCR_TX_CON; + break; + } + BU92725GUW_WRITE_REG(REG_TRCR_ADDR, val); + RK29IR_DBG("REG_TRCR_ADDR: 0x%x\n", val); /* IER */ switch (curTrans_way) { @@ -676,18 +708,18 @@ static void internal_set(u8 modeChg) break; case BU92725GUW_FIR_REV: /* FIR use */ - val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF + val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF \ | REG_INT_AC | REG_INT_DECE; //IER1,2, 4, 5, 6, 7 break; case BU92725GUW_MULTI_REV: /* not used */ - val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | - REG_INT_RDOE | REG_INT_DEX | REG_INT_RDUE; //IER1,2, 4, 5, 6, 7, 8, 9, 10 + val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE\ + | REG_INT_RDOE | REG_INT_DEX | REG_INT_RDUE; //IER1,2, 4, 5, 6, 7, 8, 9, 10 break; case BU92725GUW_AUTO_MULTI_REV: /* M/FIR use */ - val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | - REG_INT_RDOE | REG_INT_DEX | REG_INT_RDE; //IER2, 4, 5, 6, 7, 8, 9, 12 + val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE\ + | REG_INT_RDOE | REG_INT_DEX | REG_INT_RDE; //IER2, 4, 5, 6, 7, 8, 9, 12 break; case BU92725GUW_SEND: /* SIR use */ @@ -704,37 +736,16 @@ static void internal_set(u8 modeChg) break; } BU92725GUW_WRITE_REG(REG_IER_ADDR, val); - RK29IR_DBG("REG_IER_ADDR: 0x%x\n", val); - - /* TRCR */ - switch (curTrans_way) { - case BU92725GUW_IDLE: - val = 0x0000; - break; - case BU92725GUW_REV: - case BU92725GUW_MIR_REV: - case BU92725GUW_FIR_REV: - val = REG_TRCR_RX_EN; - break; - case BU92725GUW_AUTO_MULTI_REV: - val = REG_TRCR_RX_EN | REG_TRCR_AUTO_FLV_CP; - break; - case BU92725GUW_MULTI_REV: - val = REG_TRCR_RX_EN | REG_TRCR_RX_CON;//FIR - break; - case BU92725GUW_SEND: - case BU92725GUW_MIR_SEND: - case BU92725GUW_FIR_SEND: - val = 0x0000; - break; - case BU92725GUW_MULTI_SEND: - val = REG_TRCR_TX_CON; - break; - } - BU92725GUW_WRITE_REG(REG_TRCR_ADDR, val); - RK29IR_DBG("REG_TRCR_ADDR: 0x%x\n", val); - + RK29IR_DBG("REG_IER_ADDR: 0x%x\n", val); } +void BU92725GUW_dump_register(void) +{ + printk("bu92725 register value:\n"); + printk("MCR: 0x%x\n", BU92725GUW_READ_REG(REG_MCR_ADDR)); + printk("FIT: 0x%x\n", BU92725GUW_READ_REG(REG_PWR_FIT_ADDR)); + printk("TRCR: 0x%x\n", BU92725GUW_READ_REG(REG_TRCR_ADDR)); + printk("IER: 0x%x\n", BU92725GUW_READ_REG(REG_IER_ADDR)); +} diff --git a/drivers/net/irda/bu92725guw.h b/drivers/net/irda/bu92725guw.h index 890fef97bd6f..1c3d941a4b56 100755 --- a/drivers/net/irda/bu92725guw.h +++ b/drivers/net/irda/bu92725guw.h @@ -216,5 +216,7 @@ extern u16 BU92725GUW_get_data(u8 *buf); /* send frame data into fifo */ extern void BU92725GUW_send_data(u8 *buf1, u16 len1, u8 *buf2, u16 len2); +/*dump register*/ +extern void BU92725GUW_dump_register(void); #endif /*__BU92725GUW_H*/ diff --git a/drivers/net/irda/rk29_ir.c b/drivers/net/irda/rk29_ir.c index 735758595bf4..802e13e19cf6 100755 --- a/drivers/net/irda/rk29_ir.c +++ b/drivers/net/irda/rk29_ir.c @@ -123,8 +123,8 @@ static int rk29_irda_set_speed(struct rk29_irda *si, int speed) si->speed = speed; - //irda_hw_set_speed(speed); - irda_hw_set_speed(1152000);//MIR + irda_hw_set_speed(speed); + //irda_hw_set_speed(1152000);//MIR rk29_irda_rx_alloc(si); local_irq_restore(flags); @@ -155,15 +155,16 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id) //disable_irq(dev->irq); /* EIR 1, 3, 11, 12 - irda_setptn |= irq_src & (REG_INT_EOFRX | REG_INT_TXE | REG_INT_WRE | REG_INT_RDE | - REG_INT_CRC | REG_INT_OE | REG_INT_FE | REG_INT_AC | - REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX) ;*/ + irda_setptn |= irq_src & (REG_INT_EOFRX | REG_INT_TXE | REG_INT_WRE | REG_INT_RDE\ + | REG_INT_CRC | REG_INT_OE | REG_INT_FE | REG_INT_AC\ + | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX) ;*/ irda_setptn = irq_src; /* error */ - if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE | - REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { + if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE + | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { RK29IR_DBG("[%s][%d]: do err\n",__FUNCTION__,__LINE__); + //BU92725GUW_dump_register(); BU92725GUW_clr_fifo(); BU92725GUW_reset(); } @@ -171,7 +172,7 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id) if (IS_FIR(si)) //FIR { RK29IR_DBG("[%s][%d]: FIR\n",__FUNCTION__,__LINE__); - if(irda_hw_get_mode() == BU92725GUW_MIR_REV) {//rx + if(irda_hw_get_mode() == BU92725GUW_AUTO_MULTI_REV) {//rx struct sk_buff *skb = si->rxskb; RK29IR_DBG("[%s][%d]: rx\n",__FUNCTION__,__LINE__); if (irda_setptn & (REG_INT_FE | REG_INT_OE | REG_INT_CRC | REG_INT_DECE)) { @@ -183,7 +184,7 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id) dev->stats.rx_errors++; } } - if (irda_setptn & FRM_EVT_RX_EOFRX) { + if (irda_setptn & (FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE)) { tmp_len = BU92725GUW_get_data(skb->data+skb->len); skb->len += tmp_len; } @@ -213,11 +214,11 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id) netif_rx(skb); } } - else if (irda_hw_get_mode() == BU92725GUW_MIR_SEND) {//tx + else if (irda_hw_get_mode() == BU92725GUW_MULTI_SEND) {//tx struct sk_buff *skb = si->txskb; si->txskb = NULL; RK29IR_DBG("[%s][%d]: tx\n",__FUNCTION__,__LINE__); - if (irda_setptn & FRM_EVT_TX_TXE) { + if (irda_setptn & (FRM_EVT_TX_TXE | FRM_EVT_TX_WRE)) { /* * Do we need to change speed? Note that we're lazy * here - we don't free the old rxskb. We don't need @@ -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); si->txskb = skb; - irda_hw_tx_enable_irq(BU92725GUW_MIR); + irda_hw_tx_enable_irq(BU92725GUW_FIR); RK29IR_DATA_DBG("[%d][%s], fir transmit data:\n", __LINE__, __FUNCTION__); for (i=0;ilen;i++) { @@ -561,7 +562,7 @@ static int rk29_irda_init_iobuf(iobuff_t *io, int size) static void rk29_irda_fir_test(struct work_struct *work) { - char send_data[4] = {0,0,0,0}; + char send_data[4] = {1,0,1,0}; irda_hw_tx_enable_irq(BU92725GUW_FIR); BU92725GUW_send_data(send_data, 4, NULL, 0); -- 2.34.1