From 571c4d37d02e9dd54a65241aec549e7e0875b01b Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Sun, 26 Dec 2010 00:34:14 +0100 Subject: CAN: Reduce nesting level via code transformations. --- lib/can.c | 173 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 86 insertions(+), 87 deletions(-) (limited to 'lib') diff --git a/lib/can.c b/lib/can.c index 9fefca4..baddab3 100644 --- a/lib/can.c +++ b/lib/can.c @@ -31,9 +31,8 @@ void can_reset(u32 canport) } } -int can_init(u32 canport, - bool ttcm, bool abom, bool awum, bool nart, bool rflm, bool txfp, - u32 sjw, u32 ts1, u32 ts2, u32 brp) +int can_init(u32 canport, bool ttcm, bool abom, bool awum, bool nart, + bool rflm, bool txfp, u32 sjw, u32 ts1, u32 ts2, u32 brp) { u32 wait_ack = 0x00000000; u32 can_msr_inak_timeout = 0x0000FFFF; @@ -52,58 +51,57 @@ int can_init(u32 canport, } /* Check the acknowledge. */ - if ((CAN_MSR(canport) & CAN_MSR_INAK) != CAN_MSR_INAK) { - ret = 1; - } else { - /* Set the automatic bus-off management. */ - if (ttcm) - CAN_MCR(canport) |= CAN_MCR_TTCM; - else - CAN_MCR(canport) &= ~CAN_MCR_TTCM; - - if (abom) - CAN_MCR(canport) |= CAN_MCR_ABOM; - else - CAN_MCR(canport) &= ~CAN_MCR_ABOM; - - if (awum) - CAN_MCR(canport) |= CAN_MCR_AWUM; - else - CAN_MCR(canport) &= ~CAN_MCR_AWUM; - - if (nart) - CAN_MCR(canport) |= CAN_MCR_NART; - else - CAN_MCR(canport) &= ~CAN_MCR_NART; - - if (rflm) - CAN_MCR(canport) |= CAN_MCR_RFLM; - else - CAN_MCR(canport) &= ~CAN_MCR_RFLM; - - if (txfp) - CAN_MCR(canport) |= CAN_MCR_TXFP; - else - CAN_MCR(canport) &= ~CAN_MCR_TXFP; - - /* Set bit timings. */ - CAN_BTR(canport) = sjw | ts2 | ts1 | - (u32)(CAN_BTR_BRP_MASK & (brp - 1)); - - /* Request initialization "leave". */ - CAN_MCR(canport) &= ~CAN_MCR_INRQ; - - /* Wait for acknowledge. */ - wait_ack = 0x00000000; - while ((wait_ack != can_msr_inak_timeout) && - ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)) { - wait_ack++; - } - - if ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK) - ret = 1; + if ((CAN_MSR(canport) & CAN_MSR_INAK) != CAN_MSR_INAK) + return 1; + + /* Set the automatic bus-off management. */ + if (ttcm) + CAN_MCR(canport) |= CAN_MCR_TTCM; + else + CAN_MCR(canport) &= ~CAN_MCR_TTCM; + + if (abom) + CAN_MCR(canport) |= CAN_MCR_ABOM; + else + CAN_MCR(canport) &= ~CAN_MCR_ABOM; + + if (awum) + CAN_MCR(canport) |= CAN_MCR_AWUM; + else + CAN_MCR(canport) &= ~CAN_MCR_AWUM; + + if (nart) + CAN_MCR(canport) |= CAN_MCR_NART; + else + CAN_MCR(canport) &= ~CAN_MCR_NART; + + if (rflm) + CAN_MCR(canport) |= CAN_MCR_RFLM; + else + CAN_MCR(canport) &= ~CAN_MCR_RFLM; + + if (txfp) + CAN_MCR(canport) |= CAN_MCR_TXFP; + else + CAN_MCR(canport) &= ~CAN_MCR_TXFP; + + /* Set bit timings. */ + CAN_BTR(canport) = sjw | ts2 | ts1 | + (u32)(CAN_BTR_BRP_MASK & (brp - 1)); + + /* Request initialization "leave". */ + CAN_MCR(canport) &= ~CAN_MCR_INRQ; + + /* Wait for acknowledge. */ + wait_ack = 0x00000000; + while ((wait_ack != can_msr_inak_timeout) && + ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK)) { + wait_ack++; } + if ((CAN_MSR(canport) & CAN_MSR_INAK) == CAN_MSR_INAK) + ret = 1; + return ret; } @@ -209,42 +207,43 @@ int can_transmit(u32 canport, u32 id, bool ext, bool rtr, u8 length, u8 *data) ret = -1; } - if (ret != -1) { /* Check if we have an empty mailbox. */ - if (ext) { - /* Set extended ID. */ - CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_EXID_SHIFT; - /* Set extended ID indicator bit. */ - CAN_TIxR(canport, mailbox) |= CAN_TIxR_IDE; - } else { - /* Set standard ID. */ - CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_STID_SHIFT; - /* Unset extended ID indicator bit. */ - CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_IDE; - } - - /* Set/clear remote transmission request bit. */ - if (rtr) - CAN_TIxR(canport, mailbox) |= CAN_TIxR_RTR; /* Set */ - else - CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_RTR; /* Clear */ - - /* Set the DLC. */ - CAN_TDTxR(canport, mailbox) &= 0xFFFFFFFF0; - CAN_TDTxR(canport, mailbox) |= length & CAN_TDTxR_DLC_MASK; - - /* Set the data. */ - CAN_TDLxR(canport, mailbox) = 0; - CAN_TDHxR(canport, mailbox) = 0; - for (i = 0; (i < 4) && (i < length); i++) - CAN_TDLxR(canport, mailbox) |= (u32)data[i] << (8 * i); - for (i = 4; (i < 8) && (i < length); i++) - CAN_TDHxR(canport, mailbox) - |= (u32)data[i] << (8 * (i - 4)); - - /* Request transmission. */ - CAN_TIxR(canport, mailbox) |= CAN_TIxR_TXRQ; + /* Check if we have an empty mailbox. */ + if (ret == -1) + return ret; + + if (ext) { + /* Set extended ID. */ + CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_EXID_SHIFT; + /* Set extended ID indicator bit. */ + CAN_TIxR(canport, mailbox) |= CAN_TIxR_IDE; + } else { + /* Set standard ID. */ + CAN_TIxR(canport, mailbox) |= id << CAN_TIxR_STID_SHIFT; + /* Unset extended ID indicator bit. */ + CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_IDE; } + /* Set/clear remote transmission request bit. */ + if (rtr) + CAN_TIxR(canport, mailbox) |= CAN_TIxR_RTR; /* Set */ + else + CAN_TIxR(canport, mailbox) &= ~CAN_TIxR_RTR; /* Clear */ + + /* Set the DLC. */ + CAN_TDTxR(canport, mailbox) &= 0xFFFFFFFF0; + CAN_TDTxR(canport, mailbox) |= length & CAN_TDTxR_DLC_MASK; + + /* Set the data. */ + CAN_TDLxR(canport, mailbox) = 0; + CAN_TDHxR(canport, mailbox) = 0; + for (i = 0; (i < 4) && (i < length); i++) + CAN_TDLxR(canport, mailbox) |= (u32)data[i] << (8 * i); + for (i = 4; (i < 8) && (i < length); i++) + CAN_TDHxR(canport, mailbox) |= (u32)data[i] << (8 * (i - 4)); + + /* Request transmission. */ + CAN_TIxR(canport, mailbox) |= CAN_TIxR_TXRQ; + return ret; } -- cgit v1.2.3